Commit e81b594c authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'regmap-v4.3' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap

Pull regmap updates from Mark Brown:
 "This has been a busy release for regmap.

  By far the biggest set of changes here are those from Markus Pargmann
  which implement support for block transfers in smbus devices.  This
  required quite a bit of refactoring but leaves us better able to
  handle odd restrictions that controllers may have and with better
  performance on smbus.

  Other new features include:

   - Fix interactions with lockdep for nested regmaps (eg, when a device
     using regmap is connected to a bus where the bus controller has a
     separate regmap).  Lockdep's default class identification is too
     crude to work without help.

   - Support for must write bitfield operations, useful for operations
     which require writing a bit to trigger them from Kuniori Morimoto.

   - Support for delaying during register patch application from Nariman
     Poushin.

   - Support for overriding cache state via the debugfs implementation
     from Richard Fitzgerald"

* tag 'regmap-v4.3' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap: (25 commits)
  regmap: fix a NULL pointer dereference in __regmap_init
  regmap: Support bulk reads for devices without raw formatting
  regmap-i2c: Add smbus i2c block support
  regmap: Add raw_write/read checks for max_raw_write/read sizes
  regmap: regmap max_raw_read/write getter functions
  regmap: Introduce max_raw_read/write for regmap_bulk_read/write
  regmap: Add missing comments about struct regmap_bus
  regmap: No multi_write support if bus->write does not exist
  regmap: Split use_single_rw internally into use_single_read/write
  regmap: Fix regmap_bulk_write for bus writes
  regmap: regmap_raw_read return error on !bus->read
  regulator: core: Print at debug level on debugfs creation failure
  regmap: Fix regmap_can_raw_write check
  regmap: fix typos in regmap.c
  regmap: Fix integertypes for register address and value
  regmap: Move documentation to regmap.h
  regmap: Use different lockdep class for each regmap init call
  thermal: sti: Add parentheses around bridge->ops->regmap_init call
  mfd: vexpress: Add parentheses around bridge->ops->regmap_init call
  regmap: debugfs: Fix misuse of IS_ENABLED
  ...
parents fa815580 072502a6
...@@ -139,11 +139,17 @@ struct regmap { ...@@ -139,11 +139,17 @@ struct regmap {
struct reg_sequence *patch; struct reg_sequence *patch;
int patch_regs; int patch_regs;
/* if set, converts bulk rw to single rw */ /* if set, converts bulk read to single read */
bool use_single_rw; bool use_single_read;
/* if set, converts bulk read to single read */
bool use_single_write;
/* if set, the device supports multi write mode */ /* if set, the device supports multi write mode */
bool can_multi_write; bool can_multi_write;
/* if set, raw reads/writes are limited to this size */
size_t max_raw_read;
size_t max_raw_write;
struct rb_root range_tree; struct rb_root range_tree;
void *selector_work_buf; /* Scratch buffer used for selector */ void *selector_work_buf; /* Scratch buffer used for selector */
}; };
......
...@@ -729,7 +729,7 @@ int regcache_sync_block(struct regmap *map, void *block, ...@@ -729,7 +729,7 @@ int regcache_sync_block(struct regmap *map, void *block,
unsigned int block_base, unsigned int start, unsigned int block_base, unsigned int start,
unsigned int end) unsigned int end)
{ {
if (regmap_can_raw_write(map) && !map->use_single_rw) if (regmap_can_raw_write(map) && !map->use_single_write)
return regcache_sync_block_raw(map, block, cache_present, return regcache_sync_block_raw(map, block, cache_present,
block_base, start, end); block_base, start, end);
else else
......
...@@ -78,37 +78,24 @@ static const struct regmap_bus ac97_regmap_bus = { ...@@ -78,37 +78,24 @@ static const struct regmap_bus ac97_regmap_bus = {
.reg_read = regmap_ac97_reg_read, .reg_read = regmap_ac97_reg_read,
}; };
/** struct regmap *__regmap_init_ac97(struct snd_ac97 *ac97,
* regmap_init_ac97(): Initialise AC'97 register map const struct regmap_config *config,
* struct lock_class_key *lock_key,
* @ac97: Device that will be interacted with const char *lock_name)
* @config: Configuration for register map
*
* The return value will be an ERR_PTR() on error or a valid pointer to
* a struct regmap.
*/
struct regmap *regmap_init_ac97(struct snd_ac97 *ac97,
const struct regmap_config *config)
{ {
return regmap_init(&ac97->dev, &ac97_regmap_bus, ac97, config); return __regmap_init(&ac97->dev, &ac97_regmap_bus, ac97, config,
lock_key, lock_name);
} }
EXPORT_SYMBOL_GPL(regmap_init_ac97); EXPORT_SYMBOL_GPL(__regmap_init_ac97);
/** struct regmap *__devm_regmap_init_ac97(struct snd_ac97 *ac97,
* devm_regmap_init_ac97(): Initialise AC'97 register map const struct regmap_config *config,
* struct lock_class_key *lock_key,
* @ac97: Device that will be interacted with const char *lock_name)
* @config: Configuration for register map
*
* The return value will be an ERR_PTR() on error or a valid pointer
* to a struct regmap. The regmap will be automatically freed by the
* device management code.
*/
struct regmap *devm_regmap_init_ac97(struct snd_ac97 *ac97,
const struct regmap_config *config)
{ {
return devm_regmap_init(&ac97->dev, &ac97_regmap_bus, ac97, config); return __devm_regmap_init(&ac97->dev, &ac97_regmap_bus, ac97, config,
lock_key, lock_name);
} }
EXPORT_SYMBOL_GPL(devm_regmap_init_ac97); EXPORT_SYMBOL_GPL(__devm_regmap_init_ac97);
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
...@@ -469,6 +469,87 @@ static const struct file_operations regmap_access_fops = { ...@@ -469,6 +469,87 @@ static const struct file_operations regmap_access_fops = {
.llseek = default_llseek, .llseek = default_llseek,
}; };
static ssize_t regmap_cache_only_write_file(struct file *file,
const char __user *user_buf,
size_t count, loff_t *ppos)
{
struct regmap *map = container_of(file->private_data,
struct regmap, cache_only);
ssize_t result;
bool was_enabled, require_sync = false;
int err;
map->lock(map->lock_arg);
was_enabled = map->cache_only;
result = debugfs_write_file_bool(file, user_buf, count, ppos);
if (result < 0) {
map->unlock(map->lock_arg);
return result;
}
if (map->cache_only && !was_enabled) {
dev_warn(map->dev, "debugfs cache_only=Y forced\n");
add_taint(TAINT_USER, LOCKDEP_STILL_OK);
} else if (!map->cache_only && was_enabled) {
dev_warn(map->dev, "debugfs cache_only=N forced: syncing cache\n");
require_sync = true;
}
map->unlock(map->lock_arg);
if (require_sync) {
err = regcache_sync(map);
if (err)
dev_err(map->dev, "Failed to sync cache %d\n", err);
}
return result;
}
static const struct file_operations regmap_cache_only_fops = {
.open = simple_open,
.read = debugfs_read_file_bool,
.write = regmap_cache_only_write_file,
};
static ssize_t regmap_cache_bypass_write_file(struct file *file,
const char __user *user_buf,
size_t count, loff_t *ppos)
{
struct regmap *map = container_of(file->private_data,
struct regmap, cache_bypass);
ssize_t result;
bool was_enabled;
map->lock(map->lock_arg);
was_enabled = map->cache_bypass;
result = debugfs_write_file_bool(file, user_buf, count, ppos);
if (result < 0)
goto out;
if (map->cache_bypass && !was_enabled) {
dev_warn(map->dev, "debugfs cache_bypass=Y forced\n");
add_taint(TAINT_USER, LOCKDEP_STILL_OK);
} else if (!map->cache_bypass && was_enabled) {
dev_warn(map->dev, "debugfs cache_bypass=N forced\n");
}
out:
map->unlock(map->lock_arg);
return result;
}
static const struct file_operations regmap_cache_bypass_fops = {
.open = simple_open,
.read = debugfs_read_file_bool,
.write = regmap_cache_bypass_write_file,
};
void regmap_debugfs_init(struct regmap *map, const char *name) void regmap_debugfs_init(struct regmap *map, const char *name)
{ {
struct rb_node *next; struct rb_node *next;
...@@ -518,10 +599,11 @@ void regmap_debugfs_init(struct regmap *map, const char *name) ...@@ -518,10 +599,11 @@ void regmap_debugfs_init(struct regmap *map, const char *name)
if (map->max_register || regmap_readable(map, 0)) { if (map->max_register || regmap_readable(map, 0)) {
umode_t registers_mode; umode_t registers_mode;
if (IS_ENABLED(REGMAP_ALLOW_WRITE_DEBUGFS)) #if defined(REGMAP_ALLOW_WRITE_DEBUGFS)
registers_mode = 0600; registers_mode = 0600;
else #else
registers_mode = 0400; registers_mode = 0400;
#endif
debugfs_create_file("registers", registers_mode, map->debugfs, debugfs_create_file("registers", registers_mode, map->debugfs,
map, &regmap_map_fops); map, &regmap_map_fops);
...@@ -530,12 +612,13 @@ void regmap_debugfs_init(struct regmap *map, const char *name) ...@@ -530,12 +612,13 @@ void regmap_debugfs_init(struct regmap *map, const char *name)
} }
if (map->cache_type) { if (map->cache_type) {
debugfs_create_bool("cache_only", 0400, map->debugfs, debugfs_create_file("cache_only", 0600, map->debugfs,
&map->cache_only); &map->cache_only, &regmap_cache_only_fops);
debugfs_create_bool("cache_dirty", 0400, map->debugfs, debugfs_create_bool("cache_dirty", 0400, map->debugfs,
&map->cache_dirty); &map->cache_dirty);
debugfs_create_bool("cache_bypass", 0400, map->debugfs, debugfs_create_file("cache_bypass", 0600, map->debugfs,
&map->cache_bypass); &map->cache_bypass,
&regmap_cache_bypass_fops);
} }
next = rb_first(&map->range_tree); next = rb_first(&map->range_tree);
......
...@@ -209,11 +209,60 @@ static struct regmap_bus regmap_i2c = { ...@@ -209,11 +209,60 @@ static struct regmap_bus regmap_i2c = {
.val_format_endian_default = REGMAP_ENDIAN_BIG, .val_format_endian_default = REGMAP_ENDIAN_BIG,
}; };
static int regmap_i2c_smbus_i2c_write(void *context, const void *data,
size_t count)
{
struct device *dev = context;
struct i2c_client *i2c = to_i2c_client(dev);
if (count < 1)
return -EINVAL;
if (count >= I2C_SMBUS_BLOCK_MAX)
return -E2BIG;
--count;
return i2c_smbus_write_i2c_block_data(i2c, ((u8 *)data)[0], count,
((u8 *)data + 1));
}
static int regmap_i2c_smbus_i2c_read(void *context, const void *reg,
size_t reg_size, void *val,
size_t val_size)
{
struct device *dev = context;
struct i2c_client *i2c = to_i2c_client(dev);
int ret;
if (reg_size != 1 || val_size < 1)
return -EINVAL;
if (val_size >= I2C_SMBUS_BLOCK_MAX)
return -E2BIG;
ret = i2c_smbus_read_i2c_block_data(i2c, ((u8 *)reg)[0], val_size, val);
if (ret == val_size)
return 0;
else if (ret < 0)
return ret;
else
return -EIO;
}
static struct regmap_bus regmap_i2c_smbus_i2c_block = {
.write = regmap_i2c_smbus_i2c_write,
.read = regmap_i2c_smbus_i2c_read,
.max_raw_read = I2C_SMBUS_BLOCK_MAX,
.max_raw_write = I2C_SMBUS_BLOCK_MAX,
};
static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c, static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c,
const struct regmap_config *config) const struct regmap_config *config)
{ {
if (i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C)) if (i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C))
return &regmap_i2c; return &regmap_i2c;
else if (config->reg_bits == 8 &&
i2c_check_functionality(i2c->adapter,
I2C_FUNC_SMBUS_I2C_BLOCK))
return &regmap_i2c_smbus_i2c_block;
else if (config->val_bits == 16 && config->reg_bits == 8 && else if (config->val_bits == 16 && config->reg_bits == 8 &&
i2c_check_functionality(i2c->adapter, i2c_check_functionality(i2c->adapter,
I2C_FUNC_SMBUS_WORD_DATA)) I2C_FUNC_SMBUS_WORD_DATA))
...@@ -233,47 +282,34 @@ static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c, ...@@ -233,47 +282,34 @@ static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c,
return ERR_PTR(-ENOTSUPP); return ERR_PTR(-ENOTSUPP);
} }
/** struct regmap *__regmap_init_i2c(struct i2c_client *i2c,
* regmap_init_i2c(): Initialise register map const struct regmap_config *config,
* struct lock_class_key *lock_key,
* @i2c: Device that will be interacted with const char *lock_name)
* @config: Configuration for register map
*
* The return value will be an ERR_PTR() on error or a valid pointer to
* a struct regmap.
*/
struct regmap *regmap_init_i2c(struct i2c_client *i2c,
const struct regmap_config *config)
{ {
const struct regmap_bus *bus = regmap_get_i2c_bus(i2c, config); const struct regmap_bus *bus = regmap_get_i2c_bus(i2c, config);
if (IS_ERR(bus)) if (IS_ERR(bus))
return ERR_CAST(bus); return ERR_CAST(bus);
return regmap_init(&i2c->dev, bus, &i2c->dev, config); return __regmap_init(&i2c->dev, bus, &i2c->dev, config,
lock_key, lock_name);
} }
EXPORT_SYMBOL_GPL(regmap_init_i2c); EXPORT_SYMBOL_GPL(__regmap_init_i2c);
/** struct regmap *__devm_regmap_init_i2c(struct i2c_client *i2c,
* devm_regmap_init_i2c(): Initialise managed register map const struct regmap_config *config,
* struct lock_class_key *lock_key,
* @i2c: Device that will be interacted with const char *lock_name)
* @config: Configuration for register map
*
* The return value will be an ERR_PTR() on error or a valid pointer
* to a struct regmap. The regmap will be automatically freed by the
* device management code.
*/
struct regmap *devm_regmap_init_i2c(struct i2c_client *i2c,
const struct regmap_config *config)
{ {
const struct regmap_bus *bus = regmap_get_i2c_bus(i2c, config); const struct regmap_bus *bus = regmap_get_i2c_bus(i2c, config);
if (IS_ERR(bus)) if (IS_ERR(bus))
return ERR_CAST(bus); return ERR_CAST(bus);
return devm_regmap_init(&i2c->dev, bus, &i2c->dev, config); return __devm_regmap_init(&i2c->dev, bus, &i2c->dev, config,
lock_key, lock_name);
} }
EXPORT_SYMBOL_GPL(devm_regmap_init_i2c); EXPORT_SYMBOL_GPL(__devm_regmap_init_i2c);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -209,7 +209,7 @@ static irqreturn_t regmap_irq_thread(int irq, void *d) ...@@ -209,7 +209,7 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
* Read in the statuses, using a single bulk read if possible * Read in the statuses, using a single bulk read if possible
* in order to reduce the I/O overheads. * in order to reduce the I/O overheads.
*/ */
if (!map->use_single_rw && map->reg_stride == 1 && if (!map->use_single_read && map->reg_stride == 1 &&
data->irq_reg_stride == 1) { data->irq_reg_stride == 1) {
u8 *buf8 = data->status_reg_buf; u8 *buf8 = data->status_reg_buf;
u16 *buf16 = data->status_reg_buf; u16 *buf16 = data->status_reg_buf;
...@@ -398,7 +398,7 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags, ...@@ -398,7 +398,7 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
else else
d->irq_reg_stride = 1; d->irq_reg_stride = 1;
if (!map->use_single_rw && map->reg_stride == 1 && if (!map->use_single_read && map->reg_stride == 1 &&
d->irq_reg_stride == 1) { d->irq_reg_stride == 1) {
d->status_reg_buf = kmalloc(map->format.val_bytes * d->status_reg_buf = kmalloc(map->format.val_bytes *
chip->num_regs, GFP_KERNEL); chip->num_regs, GFP_KERNEL);
......
...@@ -296,20 +296,11 @@ static struct regmap_mmio_context *regmap_mmio_gen_context(struct device *dev, ...@@ -296,20 +296,11 @@ static struct regmap_mmio_context *regmap_mmio_gen_context(struct device *dev,
return ERR_PTR(ret); return ERR_PTR(ret);
} }
/** struct regmap *__regmap_init_mmio_clk(struct device *dev, const char *clk_id,
* regmap_init_mmio_clk(): Initialise register map with register clock void __iomem *regs,
* const struct regmap_config *config,
* @dev: Device that will be interacted with struct lock_class_key *lock_key,
* @clk_id: register clock consumer ID const char *lock_name)
* @regs: Pointer to memory-mapped IO region
* @config: Configuration for register map
*
* The return value will be an ERR_PTR() on error or a valid pointer to
* a struct regmap.
*/
struct regmap *regmap_init_mmio_clk(struct device *dev, const char *clk_id,
void __iomem *regs,
const struct regmap_config *config)
{ {
struct regmap_mmio_context *ctx; struct regmap_mmio_context *ctx;
...@@ -317,25 +308,17 @@ struct regmap *regmap_init_mmio_clk(struct device *dev, const char *clk_id, ...@@ -317,25 +308,17 @@ struct regmap *regmap_init_mmio_clk(struct device *dev, const char *clk_id,
if (IS_ERR(ctx)) if (IS_ERR(ctx))
return ERR_CAST(ctx); return ERR_CAST(ctx);
return regmap_init(dev, &regmap_mmio, ctx, config); return __regmap_init(dev, &regmap_mmio, ctx, config,
lock_key, lock_name);
} }
EXPORT_SYMBOL_GPL(regmap_init_mmio_clk); EXPORT_SYMBOL_GPL(__regmap_init_mmio_clk);
/** struct regmap *__devm_regmap_init_mmio_clk(struct device *dev,
* devm_regmap_init_mmio_clk(): Initialise managed register map with clock const char *clk_id,
* void __iomem *regs,
* @dev: Device that will be interacted with const struct regmap_config *config,
* @clk_id: register clock consumer ID struct lock_class_key *lock_key,
* @regs: Pointer to memory-mapped IO region const char *lock_name)
* @config: Configuration for register map
*
* The return value will be an ERR_PTR() on error or a valid pointer
* to a struct regmap. The regmap will be automatically freed by the
* device management code.
*/
struct regmap *devm_regmap_init_mmio_clk(struct device *dev, const char *clk_id,
void __iomem *regs,
const struct regmap_config *config)
{ {
struct regmap_mmio_context *ctx; struct regmap_mmio_context *ctx;
...@@ -343,8 +326,9 @@ struct regmap *devm_regmap_init_mmio_clk(struct device *dev, const char *clk_id, ...@@ -343,8 +326,9 @@ struct regmap *devm_regmap_init_mmio_clk(struct device *dev, const char *clk_id,
if (IS_ERR(ctx)) if (IS_ERR(ctx))
return ERR_CAST(ctx); return ERR_CAST(ctx);
return devm_regmap_init(dev, &regmap_mmio, ctx, config); return __devm_regmap_init(dev, &regmap_mmio, ctx, config,
lock_key, lock_name);
} }
EXPORT_SYMBOL_GPL(devm_regmap_init_mmio_clk); EXPORT_SYMBOL_GPL(__devm_regmap_init_mmio_clk);
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
...@@ -113,37 +113,24 @@ static struct regmap_bus regmap_spi = { ...@@ -113,37 +113,24 @@ static struct regmap_bus regmap_spi = {
.val_format_endian_default = REGMAP_ENDIAN_BIG, .val_format_endian_default = REGMAP_ENDIAN_BIG,
}; };
/** struct regmap *__regmap_init_spi(struct spi_device *spi,
* regmap_init_spi(): Initialise register map const struct regmap_config *config,
* struct lock_class_key *lock_key,
* @spi: Device that will be interacted with const char *lock_name)
* @config: Configuration for register map
*
* The return value will be an ERR_PTR() on error or a valid pointer to
* a struct regmap.
*/
struct regmap *regmap_init_spi(struct spi_device *spi,
const struct regmap_config *config)
{ {
return regmap_init(&spi->dev, &regmap_spi, &spi->dev, config); return __regmap_init(&spi->dev, &regmap_spi, &spi->dev, config,
lock_key, lock_name);
} }
EXPORT_SYMBOL_GPL(regmap_init_spi); EXPORT_SYMBOL_GPL(__regmap_init_spi);
/** struct regmap *__devm_regmap_init_spi(struct spi_device *spi,
* devm_regmap_init_spi(): Initialise register map const struct regmap_config *config,
* struct lock_class_key *lock_key,
* @spi: Device that will be interacted with const char *lock_name)
* @config: Configuration for register map
*
* The return value will be an ERR_PTR() on error or a valid pointer
* to a struct regmap. The map will be automatically freed by the
* device management code.
*/
struct regmap *devm_regmap_init_spi(struct spi_device *spi,
const struct regmap_config *config)
{ {
return devm_regmap_init(&spi->dev, &regmap_spi, &spi->dev, config); return __devm_regmap_init(&spi->dev, &regmap_spi, &spi->dev, config,
lock_key, lock_name);
} }
EXPORT_SYMBOL_GPL(devm_regmap_init_spi); EXPORT_SYMBOL_GPL(__devm_regmap_init_spi);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -91,36 +91,25 @@ static struct regmap_bus regmap_spmi_base = { ...@@ -91,36 +91,25 @@ static struct regmap_bus regmap_spmi_base = {
.val_format_endian_default = REGMAP_ENDIAN_NATIVE, .val_format_endian_default = REGMAP_ENDIAN_NATIVE,
}; };
/** struct regmap *__regmap_init_spmi_base(struct spmi_device *sdev,
* regmap_init_spmi_base(): Create regmap for the Base register space const struct regmap_config *config,
* @sdev: SPMI device that will be interacted with struct lock_class_key *lock_key,
* @config: Configuration for register map const char *lock_name)
*
* The return value will be an ERR_PTR() on error or a valid pointer to
* a struct regmap.
*/
struct regmap *regmap_init_spmi_base(struct spmi_device *sdev,
const struct regmap_config *config)
{ {
return regmap_init(&sdev->dev, &regmap_spmi_base, sdev, config); return __regmap_init(&sdev->dev, &regmap_spmi_base, sdev, config,
lock_key, lock_name);
} }
EXPORT_SYMBOL_GPL(regmap_init_spmi_base); EXPORT_SYMBOL_GPL(__regmap_init_spmi_base);
/** struct regmap *__devm_regmap_init_spmi_base(struct spmi_device *sdev,
* devm_regmap_init_spmi_base(): Create managed regmap for Base register space const struct regmap_config *config,
* @sdev: SPMI device that will be interacted with struct lock_class_key *lock_key,
* @config: Configuration for register map const char *lock_name)
*
* The return value will be an ERR_PTR() on error or a valid pointer
* to a struct regmap. The regmap will be automatically freed by the
* device management code.
*/
struct regmap *devm_regmap_init_spmi_base(struct spmi_device *sdev,
const struct regmap_config *config)
{ {
return devm_regmap_init(&sdev->dev, &regmap_spmi_base, sdev, config); return __devm_regmap_init(&sdev->dev, &regmap_spmi_base, sdev, config,
lock_key, lock_name);
} }
EXPORT_SYMBOL_GPL(devm_regmap_init_spmi_base); EXPORT_SYMBOL_GPL(__devm_regmap_init_spmi_base);
static int regmap_spmi_ext_read(void *context, static int regmap_spmi_ext_read(void *context,
const void *reg, size_t reg_size, const void *reg, size_t reg_size,
...@@ -222,35 +211,24 @@ static struct regmap_bus regmap_spmi_ext = { ...@@ -222,35 +211,24 @@ static struct regmap_bus regmap_spmi_ext = {
.val_format_endian_default = REGMAP_ENDIAN_NATIVE, .val_format_endian_default = REGMAP_ENDIAN_NATIVE,
}; };
/** struct regmap *__regmap_init_spmi_ext(struct spmi_device *sdev,
* regmap_init_spmi_ext(): Create regmap for Ext register space const struct regmap_config *config,
* @sdev: Device that will be interacted with struct lock_class_key *lock_key,
* @config: Configuration for register map const char *lock_name)
*
* The return value will be an ERR_PTR() on error or a valid pointer to
* a struct regmap.
*/
struct regmap *regmap_init_spmi_ext(struct spmi_device *sdev,
const struct regmap_config *config)
{ {
return regmap_init(&sdev->dev, &regmap_spmi_ext, sdev, config); return __regmap_init(&sdev->dev, &regmap_spmi_ext, sdev, config,
lock_key, lock_name);
} }
EXPORT_SYMBOL_GPL(regmap_init_spmi_ext); EXPORT_SYMBOL_GPL(__regmap_init_spmi_ext);
/** struct regmap *__devm_regmap_init_spmi_ext(struct spmi_device *sdev,
* devm_regmap_init_spmi_ext(): Create managed regmap for Ext register space const struct regmap_config *config,
* @sdev: SPMI device that will be interacted with struct lock_class_key *lock_key,
* @config: Configuration for register map const char *lock_name)
*
* The return value will be an ERR_PTR() on error or a valid pointer
* to a struct regmap. The regmap will be automatically freed by the
* device management code.
*/
struct regmap *devm_regmap_init_spmi_ext(struct spmi_device *sdev,
const struct regmap_config *config)
{ {
return devm_regmap_init(&sdev->dev, &regmap_spmi_ext, sdev, config); return __devm_regmap_init(&sdev->dev, &regmap_spmi_ext, sdev, config,
lock_key, lock_name);
} }
EXPORT_SYMBOL_GPL(devm_regmap_init_spmi_ext); EXPORT_SYMBOL_GPL(__devm_regmap_init_spmi_ext);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
This diff is collapsed.
...@@ -107,7 +107,7 @@ struct regmap *devm_regmap_init_vexpress_config(struct device *dev) ...@@ -107,7 +107,7 @@ struct regmap *devm_regmap_init_vexpress_config(struct device *dev)
if (!res) if (!res)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
regmap = bridge->ops->regmap_init(dev, bridge->context); regmap = (bridge->ops->regmap_init)(dev, bridge->context);
if (IS_ERR(regmap)) { if (IS_ERR(regmap)) {
devres_free(res); devres_free(res);
return regmap; return regmap;
......
...@@ -1262,7 +1262,7 @@ static struct regulator *create_regulator(struct regulator_dev *rdev, ...@@ -1262,7 +1262,7 @@ static struct regulator *create_regulator(struct regulator_dev *rdev,
regulator->debugfs = debugfs_create_dir(regulator->supply_name, regulator->debugfs = debugfs_create_dir(regulator->supply_name,
rdev->debugfs); rdev->debugfs);
if (!regulator->debugfs) { if (!regulator->debugfs) {
rdev_warn(rdev, "Failed to create debugfs directory\n"); rdev_dbg(rdev, "Failed to create debugfs directory\n");
} else { } else {
debugfs_create_u32("uA_load", 0444, regulator->debugfs, debugfs_create_u32("uA_load", 0444, regulator->debugfs,
&regulator->uA_load); &regulator->uA_load);
......
...@@ -214,7 +214,7 @@ int st_thermal_register(struct platform_device *pdev, ...@@ -214,7 +214,7 @@ int st_thermal_register(struct platform_device *pdev,
sensor->ops = sensor->cdata->ops; sensor->ops = sensor->cdata->ops;
ret = sensor->ops->regmap_init(sensor); ret = (sensor->ops->regmap_init)(sensor);
if (ret) if (ret)
return ret; return ret;
......
...@@ -435,8 +435,8 @@ struct dentry *debugfs_create_atomic_t(const char *name, umode_t mode, ...@@ -435,8 +435,8 @@ struct dentry *debugfs_create_atomic_t(const char *name, umode_t mode,
} }
EXPORT_SYMBOL_GPL(debugfs_create_atomic_t); EXPORT_SYMBOL_GPL(debugfs_create_atomic_t);
static ssize_t read_file_bool(struct file *file, char __user *user_buf, ssize_t debugfs_read_file_bool(struct file *file, char __user *user_buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
char buf[3]; char buf[3];
u32 *val = file->private_data; u32 *val = file->private_data;
...@@ -449,9 +449,10 @@ static ssize_t read_file_bool(struct file *file, char __user *user_buf, ...@@ -449,9 +449,10 @@ static ssize_t read_file_bool(struct file *file, char __user *user_buf,
buf[2] = 0x00; buf[2] = 0x00;
return simple_read_from_buffer(user_buf, count, ppos, buf, 2); return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
} }
EXPORT_SYMBOL_GPL(debugfs_read_file_bool);
static ssize_t write_file_bool(struct file *file, const char __user *user_buf, ssize_t debugfs_write_file_bool(struct file *file, const char __user *user_buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
char buf[32]; char buf[32];
size_t buf_size; size_t buf_size;
...@@ -468,10 +469,11 @@ static ssize_t write_file_bool(struct file *file, const char __user *user_buf, ...@@ -468,10 +469,11 @@ static ssize_t write_file_bool(struct file *file, const char __user *user_buf,
return count; return count;
} }
EXPORT_SYMBOL_GPL(debugfs_write_file_bool);
static const struct file_operations fops_bool = { static const struct file_operations fops_bool = {
.read = read_file_bool, .read = debugfs_read_file_bool,
.write = write_file_bool, .write = debugfs_write_file_bool,
.open = simple_open, .open = simple_open,
.llseek = default_llseek, .llseek = default_llseek,
}; };
......
...@@ -116,6 +116,12 @@ struct dentry *debugfs_create_devm_seqfile(struct device *dev, const char *name, ...@@ -116,6 +116,12 @@ struct dentry *debugfs_create_devm_seqfile(struct device *dev, const char *name,
bool debugfs_initialized(void); bool debugfs_initialized(void);
ssize_t debugfs_read_file_bool(struct file *file, char __user *user_buf,
size_t count, loff_t *ppos);
ssize_t debugfs_write_file_bool(struct file *file, const char __user *user_buf,
size_t count, loff_t *ppos);
#else #else
#include <linux/err.h> #include <linux/err.h>
...@@ -282,6 +288,20 @@ static inline struct dentry *debugfs_create_devm_seqfile(struct device *dev, ...@@ -282,6 +288,20 @@ static inline struct dentry *debugfs_create_devm_seqfile(struct device *dev,
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
} }
static inline ssize_t debugfs_read_file_bool(struct file *file,
char __user *user_buf,
size_t count, loff_t *ppos)
{
return -ENODEV;
}
static inline ssize_t debugfs_write_file_bool(struct file *file,
const char __user *user_buf,
size_t count, loff_t *ppos)
{
return -ENODEV;
}
#endif #endif
#endif #endif
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment