mirror of https://gitee.com/openkylin/linux.git
Merge remote-tracking branches 'regmap/topic/lockdep' and 'regmap/topic/seq-delay' into regmap-next
This commit is contained in:
commit
072502a67c
|
@ -136,7 +136,7 @@ struct regmap {
|
|||
/* if set, the HW registers are known to match map->reg_defaults */
|
||||
bool no_sync_defaults;
|
||||
|
||||
struct reg_default *patch;
|
||||
struct reg_sequence *patch;
|
||||
int patch_regs;
|
||||
|
||||
/* if set, converts bulk read to single read */
|
||||
|
|
|
@ -78,37 +78,24 @@ static const struct regmap_bus ac97_regmap_bus = {
|
|||
.reg_read = regmap_ac97_reg_read,
|
||||
};
|
||||
|
||||
/**
|
||||
* regmap_init_ac97(): Initialise AC'97 register map
|
||||
*
|
||||
* @ac97: Device that will be interacted with
|
||||
* @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)
|
||||
struct regmap *__regmap_init_ac97(struct snd_ac97 *ac97,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
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);
|
||||
|
||||
/**
|
||||
* devm_regmap_init_ac97(): Initialise AC'97 register map
|
||||
*
|
||||
* @ac97: Device that will be interacted with
|
||||
* @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)
|
||||
struct regmap *__devm_regmap_init_ac97(struct snd_ac97 *ac97,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
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");
|
||||
|
|
|
@ -282,47 +282,34 @@ static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c,
|
|||
return ERR_PTR(-ENOTSUPP);
|
||||
}
|
||||
|
||||
/**
|
||||
* regmap_init_i2c(): Initialise register map
|
||||
*
|
||||
* @i2c: Device that will be interacted with
|
||||
* @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)
|
||||
struct regmap *__regmap_init_i2c(struct i2c_client *i2c,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
const struct regmap_bus *bus = regmap_get_i2c_bus(i2c, config);
|
||||
|
||||
if (IS_ERR(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);
|
||||
|
||||
/**
|
||||
* devm_regmap_init_i2c(): Initialise managed register map
|
||||
*
|
||||
* @i2c: Device that will be interacted with
|
||||
* @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)
|
||||
struct regmap *__devm_regmap_init_i2c(struct i2c_client *i2c,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
const struct regmap_bus *bus = regmap_get_i2c_bus(i2c, config);
|
||||
|
||||
if (IS_ERR(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");
|
||||
|
|
|
@ -296,20 +296,11 @@ static struct regmap_mmio_context *regmap_mmio_gen_context(struct device *dev,
|
|||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
/**
|
||||
* regmap_init_mmio_clk(): Initialise register map with register clock
|
||||
*
|
||||
* @dev: Device that will be interacted with
|
||||
* @clk_id: register clock consumer ID
|
||||
* @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 *__regmap_init_mmio_clk(struct device *dev, const char *clk_id,
|
||||
void __iomem *regs,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
struct regmap_mmio_context *ctx;
|
||||
|
||||
|
@ -317,25 +308,17 @@ struct regmap *regmap_init_mmio_clk(struct device *dev, const char *clk_id,
|
|||
if (IS_ERR(ctx))
|
||||
return ERR_CAST(ctx);
|
||||
|
||||
return regmap_init(dev, ®map_mmio, ctx, config);
|
||||
return __regmap_init(dev, ®map_mmio, ctx, config,
|
||||
lock_key, lock_name);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_init_mmio_clk);
|
||||
EXPORT_SYMBOL_GPL(__regmap_init_mmio_clk);
|
||||
|
||||
/**
|
||||
* devm_regmap_init_mmio_clk(): Initialise managed register map with clock
|
||||
*
|
||||
* @dev: Device that will be interacted with
|
||||
* @clk_id: register clock consumer ID
|
||||
* @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. 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 *__devm_regmap_init_mmio_clk(struct device *dev,
|
||||
const char *clk_id,
|
||||
void __iomem *regs,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
struct regmap_mmio_context *ctx;
|
||||
|
||||
|
@ -343,8 +326,9 @@ struct regmap *devm_regmap_init_mmio_clk(struct device *dev, const char *clk_id,
|
|||
if (IS_ERR(ctx))
|
||||
return ERR_CAST(ctx);
|
||||
|
||||
return devm_regmap_init(dev, ®map_mmio, ctx, config);
|
||||
return __devm_regmap_init(dev, ®map_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");
|
||||
|
|
|
@ -113,37 +113,24 @@ static struct regmap_bus regmap_spi = {
|
|||
.val_format_endian_default = REGMAP_ENDIAN_BIG,
|
||||
};
|
||||
|
||||
/**
|
||||
* regmap_init_spi(): Initialise register map
|
||||
*
|
||||
* @spi: Device that will be interacted with
|
||||
* @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)
|
||||
struct regmap *__regmap_init_spi(struct spi_device *spi,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
return regmap_init(&spi->dev, ®map_spi, &spi->dev, config);
|
||||
return __regmap_init(&spi->dev, ®map_spi, &spi->dev, config,
|
||||
lock_key, lock_name);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_init_spi);
|
||||
EXPORT_SYMBOL_GPL(__regmap_init_spi);
|
||||
|
||||
/**
|
||||
* devm_regmap_init_spi(): Initialise register map
|
||||
*
|
||||
* @spi: Device that will be interacted with
|
||||
* @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)
|
||||
struct regmap *__devm_regmap_init_spi(struct spi_device *spi,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
return devm_regmap_init(&spi->dev, ®map_spi, &spi->dev, config);
|
||||
return __devm_regmap_init(&spi->dev, ®map_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");
|
||||
|
|
|
@ -91,36 +91,25 @@ static struct regmap_bus regmap_spmi_base = {
|
|||
.val_format_endian_default = REGMAP_ENDIAN_NATIVE,
|
||||
};
|
||||
|
||||
/**
|
||||
* regmap_init_spmi_base(): Create regmap for the Base register space
|
||||
* @sdev: SPMI device that will be interacted with
|
||||
* @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_spmi_base(struct spmi_device *sdev,
|
||||
const struct regmap_config *config)
|
||||
struct regmap *__regmap_init_spmi_base(struct spmi_device *sdev,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
return regmap_init(&sdev->dev, ®map_spmi_base, sdev, config);
|
||||
return __regmap_init(&sdev->dev, ®map_spmi_base, sdev, config,
|
||||
lock_key, lock_name);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_init_spmi_base);
|
||||
EXPORT_SYMBOL_GPL(__regmap_init_spmi_base);
|
||||
|
||||
/**
|
||||
* devm_regmap_init_spmi_base(): Create managed regmap for Base register space
|
||||
* @sdev: SPMI device that will be interacted with
|
||||
* @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_spmi_base(struct spmi_device *sdev,
|
||||
const struct regmap_config *config)
|
||||
struct regmap *__devm_regmap_init_spmi_base(struct spmi_device *sdev,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
return devm_regmap_init(&sdev->dev, ®map_spmi_base, sdev, config);
|
||||
return __devm_regmap_init(&sdev->dev, ®map_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,
|
||||
const void *reg, size_t reg_size,
|
||||
|
@ -222,35 +211,24 @@ static struct regmap_bus regmap_spmi_ext = {
|
|||
.val_format_endian_default = REGMAP_ENDIAN_NATIVE,
|
||||
};
|
||||
|
||||
/**
|
||||
* regmap_init_spmi_ext(): Create regmap for Ext register space
|
||||
* @sdev: Device that will be interacted with
|
||||
* @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_spmi_ext(struct spmi_device *sdev,
|
||||
const struct regmap_config *config)
|
||||
struct regmap *__regmap_init_spmi_ext(struct spmi_device *sdev,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
return regmap_init(&sdev->dev, ®map_spmi_ext, sdev, config);
|
||||
return __regmap_init(&sdev->dev, ®map_spmi_ext, sdev, config,
|
||||
lock_key, lock_name);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_init_spmi_ext);
|
||||
EXPORT_SYMBOL_GPL(__regmap_init_spmi_ext);
|
||||
|
||||
/**
|
||||
* devm_regmap_init_spmi_ext(): Create managed regmap for Ext register space
|
||||
* @sdev: SPMI device that will be interacted with
|
||||
* @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_spmi_ext(struct spmi_device *sdev,
|
||||
const struct regmap_config *config)
|
||||
struct regmap *__devm_regmap_init_spmi_ext(struct spmi_device *sdev,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
return devm_regmap_init(&sdev->dev, ®map_spmi_ext, sdev, config);
|
||||
return __devm_regmap_init(&sdev->dev, ®map_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");
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/of.h>
|
||||
#include <linux/rbtree.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include "trace.h"
|
||||
|
@ -518,22 +519,12 @@ enum regmap_endian regmap_get_val_endian(struct device *dev,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_get_val_endian);
|
||||
|
||||
/**
|
||||
* regmap_init(): Initialise register map
|
||||
*
|
||||
* @dev: Device that will be interacted with
|
||||
* @bus: Bus-specific callbacks to use with device
|
||||
* @bus_context: Data passed to bus-specific callbacks
|
||||
* @config: Configuration for register map
|
||||
*
|
||||
* The return value will be an ERR_PTR() on error or a valid pointer to
|
||||
* a struct regmap. This function should generally not be called
|
||||
* directly, it should be called by bus-specific init functions.
|
||||
*/
|
||||
struct regmap *regmap_init(struct device *dev,
|
||||
const struct regmap_bus *bus,
|
||||
void *bus_context,
|
||||
const struct regmap_config *config)
|
||||
struct regmap *__regmap_init(struct device *dev,
|
||||
const struct regmap_bus *bus,
|
||||
void *bus_context,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
struct regmap *map;
|
||||
int ret = -EINVAL;
|
||||
|
@ -559,10 +550,14 @@ struct regmap *regmap_init(struct device *dev,
|
|||
spin_lock_init(&map->spinlock);
|
||||
map->lock = regmap_lock_spinlock;
|
||||
map->unlock = regmap_unlock_spinlock;
|
||||
lockdep_set_class_and_name(&map->spinlock,
|
||||
lock_key, lock_name);
|
||||
} else {
|
||||
mutex_init(&map->mutex);
|
||||
map->lock = regmap_lock_mutex;
|
||||
map->unlock = regmap_unlock_mutex;
|
||||
lockdep_set_class_and_name(&map->mutex,
|
||||
lock_key, lock_name);
|
||||
}
|
||||
map->lock_arg = map;
|
||||
}
|
||||
|
@ -907,30 +902,19 @@ struct regmap *regmap_init(struct device *dev,
|
|||
err:
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_init);
|
||||
EXPORT_SYMBOL_GPL(__regmap_init);
|
||||
|
||||
static void devm_regmap_release(struct device *dev, void *res)
|
||||
{
|
||||
regmap_exit(*(struct regmap **)res);
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_regmap_init(): Initialise managed register map
|
||||
*
|
||||
* @dev: Device that will be interacted with
|
||||
* @bus: Bus-specific callbacks to use with device
|
||||
* @bus_context: Data passed to bus-specific callbacks
|
||||
* @config: Configuration for register map
|
||||
*
|
||||
* The return value will be an ERR_PTR() on error or a valid pointer
|
||||
* to a struct regmap. This function should generally not be called
|
||||
* directly, it should be called by bus-specific init functions. The
|
||||
* map will be automatically freed by the device management code.
|
||||
*/
|
||||
struct regmap *devm_regmap_init(struct device *dev,
|
||||
const struct regmap_bus *bus,
|
||||
void *bus_context,
|
||||
const struct regmap_config *config)
|
||||
struct regmap *__devm_regmap_init(struct device *dev,
|
||||
const struct regmap_bus *bus,
|
||||
void *bus_context,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name)
|
||||
{
|
||||
struct regmap **ptr, *regmap;
|
||||
|
||||
|
@ -938,7 +922,8 @@ struct regmap *devm_regmap_init(struct device *dev,
|
|||
if (!ptr)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
regmap = regmap_init(dev, bus, bus_context, config);
|
||||
regmap = __regmap_init(dev, bus, bus_context, config,
|
||||
lock_key, lock_name);
|
||||
if (!IS_ERR(regmap)) {
|
||||
*ptr = regmap;
|
||||
devres_add(dev, ptr);
|
||||
|
@ -948,7 +933,7 @@ struct regmap *devm_regmap_init(struct device *dev,
|
|||
|
||||
return regmap;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_regmap_init);
|
||||
EXPORT_SYMBOL_GPL(__devm_regmap_init);
|
||||
|
||||
static void regmap_field_init(struct regmap_field *rm_field,
|
||||
struct regmap *regmap, struct reg_field reg_field)
|
||||
|
@ -1827,7 +1812,7 @@ EXPORT_SYMBOL_GPL(regmap_bulk_write);
|
|||
* relative. The page register has been written if that was necessary.
|
||||
*/
|
||||
static int _regmap_raw_multi_reg_write(struct regmap *map,
|
||||
const struct reg_default *regs,
|
||||
const struct reg_sequence *regs,
|
||||
size_t num_regs)
|
||||
{
|
||||
int ret;
|
||||
|
@ -1884,17 +1869,19 @@ static unsigned int _regmap_register_page(struct regmap *map,
|
|||
}
|
||||
|
||||
static int _regmap_range_multi_paged_reg_write(struct regmap *map,
|
||||
struct reg_default *regs,
|
||||
struct reg_sequence *regs,
|
||||
size_t num_regs)
|
||||
{
|
||||
int ret;
|
||||
int i, n;
|
||||
struct reg_default *base;
|
||||
struct reg_sequence *base;
|
||||
unsigned int this_page = 0;
|
||||
unsigned int page_change = 0;
|
||||
/*
|
||||
* the set of registers are not neccessarily in order, but
|
||||
* since the order of write must be preserved this algorithm
|
||||
* chops the set each time the page changes
|
||||
* chops the set each time the page changes. This also applies
|
||||
* if there is a delay required at any point in the sequence.
|
||||
*/
|
||||
base = regs;
|
||||
for (i = 0, n = 0; i < num_regs; i++, n++) {
|
||||
|
@ -1910,16 +1897,48 @@ static int _regmap_range_multi_paged_reg_write(struct regmap *map,
|
|||
this_page = win_page;
|
||||
if (win_page != this_page) {
|
||||
this_page = win_page;
|
||||
page_change = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we have both a page change and a delay make sure to
|
||||
* write the regs and apply the delay before we change the
|
||||
* page.
|
||||
*/
|
||||
|
||||
if (page_change || regs[i].delay_us) {
|
||||
|
||||
/* For situations where the first write requires
|
||||
* a delay we need to make sure we don't call
|
||||
* raw_multi_reg_write with n=0
|
||||
* This can't occur with page breaks as we
|
||||
* never write on the first iteration
|
||||
*/
|
||||
if (regs[i].delay_us && i == 0)
|
||||
n = 1;
|
||||
|
||||
ret = _regmap_raw_multi_reg_write(map, base, n);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
if (regs[i].delay_us)
|
||||
udelay(regs[i].delay_us);
|
||||
|
||||
base += n;
|
||||
n = 0;
|
||||
}
|
||||
ret = _regmap_select_page(map, &base[n].reg, range, 1);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
if (page_change) {
|
||||
ret = _regmap_select_page(map,
|
||||
&base[n].reg,
|
||||
range, 1);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
page_change = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
if (n > 0)
|
||||
return _regmap_raw_multi_reg_write(map, base, n);
|
||||
|
@ -1927,7 +1946,7 @@ static int _regmap_range_multi_paged_reg_write(struct regmap *map,
|
|||
}
|
||||
|
||||
static int _regmap_multi_reg_write(struct regmap *map,
|
||||
const struct reg_default *regs,
|
||||
const struct reg_sequence *regs,
|
||||
size_t num_regs)
|
||||
{
|
||||
int i;
|
||||
|
@ -1938,6 +1957,9 @@ static int _regmap_multi_reg_write(struct regmap *map,
|
|||
ret = _regmap_write(map, regs[i].reg, regs[i].def);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
if (regs[i].delay_us)
|
||||
udelay(regs[i].delay_us);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1977,10 +1999,14 @@ static int _regmap_multi_reg_write(struct regmap *map,
|
|||
for (i = 0; i < num_regs; i++) {
|
||||
unsigned int reg = regs[i].reg;
|
||||
struct regmap_range_node *range;
|
||||
|
||||
/* Coalesce all the writes between a page break or a delay
|
||||
* in a sequence
|
||||
*/
|
||||
range = _regmap_range_lookup(map, reg);
|
||||
if (range) {
|
||||
size_t len = sizeof(struct reg_default)*num_regs;
|
||||
struct reg_default *base = kmemdup(regs, len,
|
||||
if (range || regs[i].delay_us) {
|
||||
size_t len = sizeof(struct reg_sequence)*num_regs;
|
||||
struct reg_sequence *base = kmemdup(regs, len,
|
||||
GFP_KERNEL);
|
||||
if (!base)
|
||||
return -ENOMEM;
|
||||
|
@ -2013,7 +2039,7 @@ static int _regmap_multi_reg_write(struct regmap *map,
|
|||
* A value of zero will be returned on success, a negative errno will be
|
||||
* returned in error cases.
|
||||
*/
|
||||
int regmap_multi_reg_write(struct regmap *map, const struct reg_default *regs,
|
||||
int regmap_multi_reg_write(struct regmap *map, const struct reg_sequence *regs,
|
||||
int num_regs)
|
||||
{
|
||||
int ret;
|
||||
|
@ -2046,7 +2072,7 @@ EXPORT_SYMBOL_GPL(regmap_multi_reg_write);
|
|||
* be returned in error cases.
|
||||
*/
|
||||
int regmap_multi_reg_write_bypassed(struct regmap *map,
|
||||
const struct reg_default *regs,
|
||||
const struct reg_sequence *regs,
|
||||
int num_regs)
|
||||
{
|
||||
int ret;
|
||||
|
@ -2726,10 +2752,10 @@ EXPORT_SYMBOL_GPL(regmap_async_complete);
|
|||
* The caller must ensure that this function cannot be called
|
||||
* concurrently with either itself or regcache_sync().
|
||||
*/
|
||||
int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
|
||||
int regmap_register_patch(struct regmap *map, const struct reg_sequence *regs,
|
||||
int num_regs)
|
||||
{
|
||||
struct reg_default *p;
|
||||
struct reg_sequence *p;
|
||||
int ret;
|
||||
bool bypass;
|
||||
|
||||
|
@ -2738,7 +2764,7 @@ int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
|
|||
return 0;
|
||||
|
||||
p = krealloc(map->patch,
|
||||
sizeof(struct reg_default) * (map->patch_regs + num_regs),
|
||||
sizeof(struct reg_sequence) * (map->patch_regs + num_regs),
|
||||
GFP_KERNEL);
|
||||
if (p) {
|
||||
memcpy(p + map->patch_regs, regs, num_regs * sizeof(*regs));
|
||||
|
|
|
@ -107,7 +107,7 @@ struct regmap *devm_regmap_init_vexpress_config(struct device *dev)
|
|||
if (!res)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
regmap = bridge->ops->regmap_init(dev, bridge->context);
|
||||
regmap = (bridge->ops->regmap_init)(dev, bridge->context);
|
||||
if (IS_ERR(regmap)) {
|
||||
devres_free(res);
|
||||
return regmap;
|
||||
|
|
|
@ -54,7 +54,7 @@ static struct adv7511 *encoder_to_adv7511(struct drm_encoder *encoder)
|
|||
}
|
||||
|
||||
/* ADI recommended values for proper operation. */
|
||||
static const struct reg_default adv7511_fixed_registers[] = {
|
||||
static const struct reg_sequence adv7511_fixed_registers[] = {
|
||||
{ 0x98, 0x03 },
|
||||
{ 0x9a, 0xe0 },
|
||||
{ 0x9c, 0x30 },
|
||||
|
|
|
@ -313,14 +313,14 @@ static void drv260x_close(struct input_dev *input)
|
|||
gpiod_set_value(haptics->enable_gpio, 0);
|
||||
}
|
||||
|
||||
static const struct reg_default drv260x_lra_cal_regs[] = {
|
||||
static const struct reg_sequence drv260x_lra_cal_regs[] = {
|
||||
{ DRV260X_MODE, DRV260X_AUTO_CAL },
|
||||
{ DRV260X_CTRL3, DRV260X_NG_THRESH_2 },
|
||||
{ DRV260X_FEEDBACK_CTRL, DRV260X_FB_REG_LRA_MODE |
|
||||
DRV260X_BRAKE_FACTOR_4X | DRV260X_LOOP_GAIN_HIGH },
|
||||
};
|
||||
|
||||
static const struct reg_default drv260x_lra_init_regs[] = {
|
||||
static const struct reg_sequence drv260x_lra_init_regs[] = {
|
||||
{ DRV260X_MODE, DRV260X_RT_PLAYBACK },
|
||||
{ DRV260X_A_TO_V_CTRL, DRV260X_AUDIO_HAPTICS_PEAK_20MS |
|
||||
DRV260X_AUDIO_HAPTICS_FILTER_125HZ },
|
||||
|
@ -337,7 +337,7 @@ static const struct reg_default drv260x_lra_init_regs[] = {
|
|||
{ DRV260X_CTRL4, DRV260X_AUTOCAL_TIME_500MS },
|
||||
};
|
||||
|
||||
static const struct reg_default drv260x_erm_cal_regs[] = {
|
||||
static const struct reg_sequence drv260x_erm_cal_regs[] = {
|
||||
{ DRV260X_MODE, DRV260X_AUTO_CAL },
|
||||
{ DRV260X_A_TO_V_MIN_INPUT, DRV260X_AUDIO_HAPTICS_MIN_IN_VOLT },
|
||||
{ DRV260X_A_TO_V_MAX_INPUT, DRV260X_AUDIO_HAPTICS_MAX_IN_VOLT },
|
||||
|
|
|
@ -132,7 +132,7 @@ static void drv2665_close(struct input_dev *input)
|
|||
"Failed to enter standby mode: %d\n", error);
|
||||
}
|
||||
|
||||
static const struct reg_default drv2665_init_regs[] = {
|
||||
static const struct reg_sequence drv2665_init_regs[] = {
|
||||
{ DRV2665_CTRL_2, 0 | DRV2665_10_MS_IDLE_TOUT },
|
||||
{ DRV2665_CTRL_1, DRV2665_25_VPP_GAIN },
|
||||
};
|
||||
|
|
|
@ -262,14 +262,14 @@ static void drv2667_close(struct input_dev *input)
|
|||
"Failed to enter standby mode: %d\n", error);
|
||||
}
|
||||
|
||||
static const struct reg_default drv2667_init_regs[] = {
|
||||
static const struct reg_sequence drv2667_init_regs[] = {
|
||||
{ DRV2667_CTRL_2, 0 },
|
||||
{ DRV2667_CTRL_1, DRV2667_25_VPP_GAIN },
|
||||
{ DRV2667_WV_SEQ_0, 1 },
|
||||
{ DRV2667_WV_SEQ_1, 0 }
|
||||
};
|
||||
|
||||
static const struct reg_default drv2667_page1_init[] = {
|
||||
static const struct reg_sequence drv2667_page1_init[] = {
|
||||
{ DRV2667_RAM_HDR_SZ, 0x05 },
|
||||
{ DRV2667_RAM_START_HI, 0x80 },
|
||||
{ DRV2667_RAM_START_LO, 0x06 },
|
||||
|
|
|
@ -392,7 +392,7 @@ static int wm5102_apply_hardware_patch(struct arizona *arizona)
|
|||
* Register patch to some of the CODECs internal write sequences
|
||||
* to ensure a clean exit from the low power sleep state.
|
||||
*/
|
||||
static const struct reg_default wm5110_sleep_patch[] = {
|
||||
static const struct reg_sequence wm5110_sleep_patch[] = {
|
||||
{ 0x337A, 0xC100 },
|
||||
{ 0x337B, 0x0041 },
|
||||
{ 0x3300, 0xA210 },
|
||||
|
|
|
@ -86,7 +86,7 @@ static const struct reg_default twl6040_defaults[] = {
|
|||
{ 0x2E, 0x00 }, /* REG_STATUS (ro) */
|
||||
};
|
||||
|
||||
static struct reg_default twl6040_patch[] = {
|
||||
static struct reg_sequence twl6040_patch[] = {
|
||||
/*
|
||||
* Select I2C bus access to dual access registers
|
||||
* Interrupt register is cleared on read
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#define WM5102_NUM_AOD_ISR 2
|
||||
#define WM5102_NUM_ISR 5
|
||||
|
||||
static const struct reg_default wm5102_reva_patch[] = {
|
||||
static const struct reg_sequence wm5102_reva_patch[] = {
|
||||
{ 0x80, 0x0003 },
|
||||
{ 0x221, 0x0090 },
|
||||
{ 0x211, 0x0014 },
|
||||
|
@ -57,7 +57,7 @@ static const struct reg_default wm5102_reva_patch[] = {
|
|||
{ 0x80, 0x0000 },
|
||||
};
|
||||
|
||||
static const struct reg_default wm5102_revb_patch[] = {
|
||||
static const struct reg_sequence wm5102_revb_patch[] = {
|
||||
{ 0x19, 0x0001 },
|
||||
{ 0x80, 0x0003 },
|
||||
{ 0x081, 0xE022 },
|
||||
|
@ -80,7 +80,7 @@ static const struct reg_default wm5102_revb_patch[] = {
|
|||
/* We use a function so we can use ARRAY_SIZE() */
|
||||
int wm5102_patch(struct arizona *arizona)
|
||||
{
|
||||
const struct reg_default *wm5102_patch;
|
||||
const struct reg_sequence *wm5102_patch;
|
||||
int patch_size;
|
||||
|
||||
switch (arizona->rev) {
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#define WM5110_NUM_AOD_ISR 2
|
||||
#define WM5110_NUM_ISR 5
|
||||
|
||||
static const struct reg_default wm5110_reva_patch[] = {
|
||||
static const struct reg_sequence wm5110_reva_patch[] = {
|
||||
{ 0x80, 0x3 },
|
||||
{ 0x44, 0x20 },
|
||||
{ 0x45, 0x40 },
|
||||
|
@ -134,7 +134,7 @@ static const struct reg_default wm5110_reva_patch[] = {
|
|||
{ 0x209, 0x002A },
|
||||
};
|
||||
|
||||
static const struct reg_default wm5110_revb_patch[] = {
|
||||
static const struct reg_sequence wm5110_revb_patch[] = {
|
||||
{ 0x80, 0x3 },
|
||||
{ 0x36e, 0x0210 },
|
||||
{ 0x370, 0x0210 },
|
||||
|
@ -224,7 +224,7 @@ static const struct reg_default wm5110_revb_patch[] = {
|
|||
{ 0x80, 0x0 },
|
||||
};
|
||||
|
||||
static const struct reg_default wm5110_revd_patch[] = {
|
||||
static const struct reg_sequence wm5110_revd_patch[] = {
|
||||
{ 0x80, 0x3 },
|
||||
{ 0x80, 0x3 },
|
||||
{ 0x393, 0x27 },
|
||||
|
|
|
@ -243,21 +243,21 @@ static int wm8994_ldo_in_use(struct wm8994_pdata *pdata, int ldo)
|
|||
}
|
||||
#endif
|
||||
|
||||
static const struct reg_default wm8994_revc_patch[] = {
|
||||
static const struct reg_sequence wm8994_revc_patch[] = {
|
||||
{ 0x102, 0x3 },
|
||||
{ 0x56, 0x3 },
|
||||
{ 0x817, 0x0 },
|
||||
{ 0x102, 0x0 },
|
||||
};
|
||||
|
||||
static const struct reg_default wm8958_reva_patch[] = {
|
||||
static const struct reg_sequence wm8958_reva_patch[] = {
|
||||
{ 0x102, 0x3 },
|
||||
{ 0xcb, 0x81 },
|
||||
{ 0x817, 0x0 },
|
||||
{ 0x102, 0x0 },
|
||||
};
|
||||
|
||||
static const struct reg_default wm1811_reva_patch[] = {
|
||||
static const struct reg_sequence wm1811_reva_patch[] = {
|
||||
{ 0x102, 0x3 },
|
||||
{ 0x56, 0xc07 },
|
||||
{ 0x5d, 0x7e },
|
||||
|
@ -326,7 +326,7 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
|
|||
{
|
||||
struct wm8994_pdata *pdata;
|
||||
struct regmap_config *regmap_config;
|
||||
const struct reg_default *regmap_patch = NULL;
|
||||
const struct reg_sequence *regmap_patch = NULL;
|
||||
const char *devname;
|
||||
int ret, i, patch_regs = 0;
|
||||
int pulls = 0;
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
#include "arizona.h"
|
||||
|
||||
static const struct reg_default wm8997_reva_patch[] = {
|
||||
static const struct reg_sequence wm8997_reva_patch[] = {
|
||||
{ 0x80, 0x0003 },
|
||||
{ 0x214, 0x0008 },
|
||||
{ 0x458, 0x0000 },
|
||||
|
|
|
@ -214,7 +214,7 @@ int st_thermal_register(struct platform_device *pdev,
|
|||
|
||||
sensor->ops = sensor->cdata->ops;
|
||||
|
||||
ret = sensor->ops->regmap_init(sensor);
|
||||
ret = (sensor->ops->regmap_init)(sensor);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/rbtree.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/lockdep.h>
|
||||
|
||||
struct module;
|
||||
struct device;
|
||||
|
@ -50,6 +51,20 @@ struct reg_default {
|
|||
unsigned int def;
|
||||
};
|
||||
|
||||
/**
|
||||
* Register/value pairs for sequences of writes with an optional delay in
|
||||
* microseconds to be applied after each write.
|
||||
*
|
||||
* @reg: Register address.
|
||||
* @def: Register value.
|
||||
* @delay_us: Delay to be applied after the register write in microseconds
|
||||
*/
|
||||
struct reg_sequence {
|
||||
unsigned int reg;
|
||||
unsigned int def;
|
||||
unsigned int delay_us;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_REGMAP
|
||||
|
||||
enum regmap_endian {
|
||||
|
@ -331,45 +346,182 @@ struct regmap_bus {
|
|||
size_t max_raw_write;
|
||||
};
|
||||
|
||||
struct regmap *regmap_init(struct device *dev,
|
||||
const struct regmap_bus *bus,
|
||||
void *bus_context,
|
||||
const struct regmap_config *config);
|
||||
/*
|
||||
* __regmap_init functions.
|
||||
*
|
||||
* These functions take a lock key and name parameter, and should not be called
|
||||
* directly. Instead, use the regmap_init macros that generate a key and name
|
||||
* for each call.
|
||||
*/
|
||||
struct regmap *__regmap_init(struct device *dev,
|
||||
const struct regmap_bus *bus,
|
||||
void *bus_context,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
struct regmap *__regmap_init_i2c(struct i2c_client *i2c,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
struct regmap *__regmap_init_spi(struct spi_device *dev,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
struct regmap *__regmap_init_spmi_base(struct spmi_device *dev,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
struct regmap *__regmap_init_spmi_ext(struct spmi_device *dev,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
struct regmap *__regmap_init_mmio_clk(struct device *dev, const char *clk_id,
|
||||
void __iomem *regs,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
struct regmap *__regmap_init_ac97(struct snd_ac97 *ac97,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
|
||||
struct regmap *__devm_regmap_init(struct device *dev,
|
||||
const struct regmap_bus *bus,
|
||||
void *bus_context,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
struct regmap *__devm_regmap_init_i2c(struct i2c_client *i2c,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
struct regmap *__devm_regmap_init_spi(struct spi_device *dev,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
struct regmap *__devm_regmap_init_spmi_base(struct spmi_device *dev,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
struct regmap *__devm_regmap_init_spmi_ext(struct spmi_device *dev,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
struct regmap *__devm_regmap_init_mmio_clk(struct device *dev,
|
||||
const char *clk_id,
|
||||
void __iomem *regs,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
struct regmap *__devm_regmap_init_ac97(struct snd_ac97 *ac97,
|
||||
const struct regmap_config *config,
|
||||
struct lock_class_key *lock_key,
|
||||
const char *lock_name);
|
||||
|
||||
/*
|
||||
* Wrapper for regmap_init macros to include a unique lockdep key and name
|
||||
* for each call. No-op if CONFIG_LOCKDEP is not set.
|
||||
*
|
||||
* @fn: Real function to call (in the form __[*_]regmap_init[_*])
|
||||
* @name: Config variable name (#config in the calling macro)
|
||||
**/
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
#define __regmap_lockdep_wrapper(fn, name, ...) \
|
||||
( \
|
||||
({ \
|
||||
static struct lock_class_key _key; \
|
||||
fn(__VA_ARGS__, &_key, \
|
||||
KBUILD_BASENAME ":" \
|
||||
__stringify(__LINE__) ":" \
|
||||
"(" name ")->lock"); \
|
||||
}) \
|
||||
)
|
||||
#else
|
||||
#define __regmap_lockdep_wrapper(fn, name, ...) fn(__VA_ARGS__, NULL, NULL)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* regmap_init(): Initialise register map
|
||||
*
|
||||
* @dev: Device that will be interacted with
|
||||
* @bus: Bus-specific callbacks to use with device
|
||||
* @bus_context: Data passed to bus-specific callbacks
|
||||
* @config: Configuration for register map
|
||||
*
|
||||
* The return value will be an ERR_PTR() on error or a valid pointer to
|
||||
* a struct regmap. This function should generally not be called
|
||||
* directly, it should be called by bus-specific init functions.
|
||||
*/
|
||||
#define regmap_init(dev, bus, bus_context, config) \
|
||||
__regmap_lockdep_wrapper(__regmap_init, #config, \
|
||||
dev, bus, bus_context, config)
|
||||
int regmap_attach_dev(struct device *dev, struct regmap *map,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *regmap_init_i2c(struct i2c_client *i2c,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *regmap_init_spi(struct spi_device *dev,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *regmap_init_spmi_base(struct spmi_device *dev,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *regmap_init_spmi_ext(struct spmi_device *dev,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *regmap_init_mmio_clk(struct device *dev, const char *clk_id,
|
||||
void __iomem *regs,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *regmap_init_ac97(struct snd_ac97 *ac97,
|
||||
const struct regmap_config *config);
|
||||
const struct regmap_config *config);
|
||||
|
||||
struct regmap *devm_regmap_init(struct device *dev,
|
||||
const struct regmap_bus *bus,
|
||||
void *bus_context,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *devm_regmap_init_i2c(struct i2c_client *i2c,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *devm_regmap_init_spi(struct spi_device *dev,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *devm_regmap_init_spmi_base(struct spmi_device *dev,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *devm_regmap_init_spmi_ext(struct spmi_device *dev,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *devm_regmap_init_mmio_clk(struct device *dev, const char *clk_id,
|
||||
void __iomem *regs,
|
||||
const struct regmap_config *config);
|
||||
struct regmap *devm_regmap_init_ac97(struct snd_ac97 *ac97,
|
||||
const struct regmap_config *config);
|
||||
/**
|
||||
* regmap_init_i2c(): Initialise register map
|
||||
*
|
||||
* @i2c: Device that will be interacted with
|
||||
* @config: Configuration for register map
|
||||
*
|
||||
* The return value will be an ERR_PTR() on error or a valid pointer to
|
||||
* a struct regmap.
|
||||
*/
|
||||
#define regmap_init_i2c(i2c, config) \
|
||||
__regmap_lockdep_wrapper(__regmap_init_i2c, #config, \
|
||||
i2c, config)
|
||||
|
||||
bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
|
||||
/**
|
||||
* regmap_init_spi(): Initialise register map
|
||||
*
|
||||
* @spi: Device that will be interacted with
|
||||
* @config: Configuration for register map
|
||||
*
|
||||
* The return value will be an ERR_PTR() on error or a valid pointer to
|
||||
* a struct regmap.
|
||||
*/
|
||||
#define regmap_init_spi(dev, config) \
|
||||
__regmap_lockdep_wrapper(__regmap_init_spi, #config, \
|
||||
dev, config)
|
||||
|
||||
/**
|
||||
* regmap_init_spmi_base(): Create regmap for the Base register space
|
||||
* @sdev: SPMI device that will be interacted with
|
||||
* @config: Configuration for register map
|
||||
*
|
||||
* The return value will be an ERR_PTR() on error or a valid pointer to
|
||||
* a struct regmap.
|
||||
*/
|
||||
#define regmap_init_spmi_base(dev, config) \
|
||||
__regmap_lockdep_wrapper(__regmap_init_spmi_base, #config, \
|
||||
dev, config)
|
||||
|
||||
/**
|
||||
* regmap_init_spmi_ext(): Create regmap for Ext register space
|
||||
* @sdev: Device that will be interacted with
|
||||
* @config: Configuration for register map
|
||||
*
|
||||
* The return value will be an ERR_PTR() on error or a valid pointer to
|
||||
* a struct regmap.
|
||||
*/
|
||||
#define regmap_init_spmi_ext(dev, config) \
|
||||
__regmap_lockdep_wrapper(__regmap_init_spmi_ext, #config, \
|
||||
dev, config)
|
||||
|
||||
/**
|
||||
* regmap_init_mmio_clk(): Initialise register map with register clock
|
||||
*
|
||||
* @dev: Device that will be interacted with
|
||||
* @clk_id: register clock consumer ID
|
||||
* @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.
|
||||
*/
|
||||
#define regmap_init_mmio_clk(dev, clk_id, regs, config) \
|
||||
__regmap_lockdep_wrapper(__regmap_init_mmio_clk, #config, \
|
||||
dev, clk_id, regs, config)
|
||||
|
||||
/**
|
||||
* regmap_init_mmio(): Initialise register map
|
||||
|
@ -381,12 +533,109 @@ bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
|
|||
* The return value will be an ERR_PTR() on error or a valid pointer to
|
||||
* a struct regmap.
|
||||
*/
|
||||
static inline struct regmap *regmap_init_mmio(struct device *dev,
|
||||
void __iomem *regs,
|
||||
const struct regmap_config *config)
|
||||
{
|
||||
return regmap_init_mmio_clk(dev, NULL, regs, config);
|
||||
}
|
||||
#define regmap_init_mmio(dev, regs, config) \
|
||||
regmap_init_mmio_clk(dev, NULL, regs, config)
|
||||
|
||||
/**
|
||||
* regmap_init_ac97(): Initialise AC'97 register map
|
||||
*
|
||||
* @ac97: Device that will be interacted with
|
||||
* @config: Configuration for register map
|
||||
*
|
||||
* The return value will be an ERR_PTR() on error or a valid pointer to
|
||||
* a struct regmap.
|
||||
*/
|
||||
#define regmap_init_ac97(ac97, config) \
|
||||
__regmap_lockdep_wrapper(__regmap_init_ac97, #config, \
|
||||
ac97, config)
|
||||
bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
|
||||
|
||||
/**
|
||||
* devm_regmap_init(): Initialise managed register map
|
||||
*
|
||||
* @dev: Device that will be interacted with
|
||||
* @bus: Bus-specific callbacks to use with device
|
||||
* @bus_context: Data passed to bus-specific callbacks
|
||||
* @config: Configuration for register map
|
||||
*
|
||||
* The return value will be an ERR_PTR() on error or a valid pointer
|
||||
* to a struct regmap. This function should generally not be called
|
||||
* directly, it should be called by bus-specific init functions. The
|
||||
* map will be automatically freed by the device management code.
|
||||
*/
|
||||
#define devm_regmap_init(dev, bus, bus_context, config) \
|
||||
__regmap_lockdep_wrapper(__devm_regmap_init, #config, \
|
||||
dev, bus, bus_context, config)
|
||||
|
||||
/**
|
||||
* devm_regmap_init_i2c(): Initialise managed register map
|
||||
*
|
||||
* @i2c: Device that will be interacted with
|
||||
* @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.
|
||||
*/
|
||||
#define devm_regmap_init_i2c(i2c, config) \
|
||||
__regmap_lockdep_wrapper(__devm_regmap_init_i2c, #config, \
|
||||
i2c, config)
|
||||
|
||||
/**
|
||||
* devm_regmap_init_spi(): Initialise register map
|
||||
*
|
||||
* @spi: Device that will be interacted with
|
||||
* @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.
|
||||
*/
|
||||
#define devm_regmap_init_spi(dev, config) \
|
||||
__regmap_lockdep_wrapper(__devm_regmap_init_spi, #config, \
|
||||
dev, config)
|
||||
|
||||
/**
|
||||
* devm_regmap_init_spmi_base(): Create managed regmap for Base register space
|
||||
* @sdev: SPMI device that will be interacted with
|
||||
* @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.
|
||||
*/
|
||||
#define devm_regmap_init_spmi_base(dev, config) \
|
||||
__regmap_lockdep_wrapper(__devm_regmap_init_spmi_base, #config, \
|
||||
dev, config)
|
||||
|
||||
/**
|
||||
* devm_regmap_init_spmi_ext(): Create managed regmap for Ext register space
|
||||
* @sdev: SPMI device that will be interacted with
|
||||
* @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.
|
||||
*/
|
||||
#define devm_regmap_init_spmi_ext(dev, config) \
|
||||
__regmap_lockdep_wrapper(__devm_regmap_init_spmi_ext, #config, \
|
||||
dev, config)
|
||||
|
||||
/**
|
||||
* devm_regmap_init_mmio_clk(): Initialise managed register map with clock
|
||||
*
|
||||
* @dev: Device that will be interacted with
|
||||
* @clk_id: register clock consumer ID
|
||||
* @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. The regmap will be automatically freed by the
|
||||
* device management code.
|
||||
*/
|
||||
#define devm_regmap_init_mmio_clk(dev, clk_id, regs, config) \
|
||||
__regmap_lockdep_wrapper(__devm_regmap_init_mmio_clk, #config, \
|
||||
dev, clk_id, regs, config)
|
||||
|
||||
/**
|
||||
* devm_regmap_init_mmio(): Initialise managed register map
|
||||
|
@ -399,12 +648,22 @@ static inline struct regmap *regmap_init_mmio(struct device *dev,
|
|||
* to a struct regmap. The regmap will be automatically freed by the
|
||||
* device management code.
|
||||
*/
|
||||
static inline struct regmap *devm_regmap_init_mmio(struct device *dev,
|
||||
void __iomem *regs,
|
||||
const struct regmap_config *config)
|
||||
{
|
||||
return devm_regmap_init_mmio_clk(dev, NULL, regs, config);
|
||||
}
|
||||
#define devm_regmap_init_mmio(dev, regs, config) \
|
||||
devm_regmap_init_mmio_clk(dev, NULL, regs, config)
|
||||
|
||||
/**
|
||||
* devm_regmap_init_ac97(): Initialise AC'97 register map
|
||||
*
|
||||
* @ac97: Device that will be interacted with
|
||||
* @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.
|
||||
*/
|
||||
#define devm_regmap_init_ac97(ac97, config) \
|
||||
__regmap_lockdep_wrapper(__devm_regmap_init_ac97, #config, \
|
||||
ac97, config)
|
||||
|
||||
void regmap_exit(struct regmap *map);
|
||||
int regmap_reinit_cache(struct regmap *map,
|
||||
|
@ -417,10 +676,10 @@ int regmap_raw_write(struct regmap *map, unsigned int reg,
|
|||
const void *val, size_t val_len);
|
||||
int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
|
||||
size_t val_count);
|
||||
int regmap_multi_reg_write(struct regmap *map, const struct reg_default *regs,
|
||||
int regmap_multi_reg_write(struct regmap *map, const struct reg_sequence *regs,
|
||||
int num_regs);
|
||||
int regmap_multi_reg_write_bypassed(struct regmap *map,
|
||||
const struct reg_default *regs,
|
||||
const struct reg_sequence *regs,
|
||||
int num_regs);
|
||||
int regmap_raw_write_async(struct regmap *map, unsigned int reg,
|
||||
const void *val, size_t val_len);
|
||||
|
@ -461,7 +720,7 @@ void regcache_mark_dirty(struct regmap *map);
|
|||
bool regmap_check_range_table(struct regmap *map, unsigned int reg,
|
||||
const struct regmap_access_table *table);
|
||||
|
||||
int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
|
||||
int regmap_register_patch(struct regmap *map, const struct reg_sequence *regs,
|
||||
int num_regs);
|
||||
int regmap_parse_val(struct regmap *map, const void *buf,
|
||||
unsigned int *val);
|
||||
|
|
|
@ -1366,7 +1366,7 @@ static void arizona_wm5102_set_dac_comp(struct snd_soc_codec *codec,
|
|||
{
|
||||
struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
|
||||
struct arizona *arizona = priv->arizona;
|
||||
struct reg_default dac_comp[] = {
|
||||
struct reg_sequence dac_comp[] = {
|
||||
{ 0x80, 0x3 },
|
||||
{ ARIZONA_DAC_COMP_1, 0 },
|
||||
{ ARIZONA_DAC_COMP_2, 0 },
|
||||
|
|
|
@ -276,7 +276,7 @@ static const struct snd_soc_codec_driver soc_codec_dev_cs35l32 = {
|
|||
};
|
||||
|
||||
/* Current and threshold powerup sequence Pg37 in datasheet */
|
||||
static const struct reg_default cs35l32_monitor_patch[] = {
|
||||
static const struct reg_sequence cs35l32_monitor_patch[] = {
|
||||
|
||||
{ 0x00, 0x99 },
|
||||
{ 0x48, 0x17 },
|
||||
|
|
|
@ -1118,7 +1118,7 @@ static const struct snd_soc_codec_driver soc_codec_dev_cs42l52 = {
|
|||
};
|
||||
|
||||
/* Current and threshold powerup sequence Pg37 */
|
||||
static const struct reg_default cs42l52_threshold_patch[] = {
|
||||
static const struct reg_sequence cs42l52_threshold_patch[] = {
|
||||
|
||||
{ 0x00, 0x99 },
|
||||
{ 0x3E, 0xBA },
|
||||
|
|
|
@ -1182,7 +1182,7 @@ static struct snd_soc_codec_driver soc_codec_dev_da7210 = {
|
|||
|
||||
#if IS_ENABLED(CONFIG_I2C)
|
||||
|
||||
static struct reg_default da7210_regmap_i2c_patch[] = {
|
||||
static struct reg_sequence da7210_regmap_i2c_patch[] = {
|
||||
|
||||
/* System controller master disable */
|
||||
{ DA7210_STARTUP1, 0x00 },
|
||||
|
@ -1269,7 +1269,7 @@ static struct i2c_driver da7210_i2c_driver = {
|
|||
|
||||
#if defined(CONFIG_SPI_MASTER)
|
||||
|
||||
static struct reg_default da7210_regmap_spi_patch[] = {
|
||||
static struct reg_sequence da7210_regmap_spi_patch[] = {
|
||||
/* Dummy read to give two pulses over nCS for SPI */
|
||||
{ DA7210_AUX2, 0x00 },
|
||||
{ DA7210_AUX2, 0x00 },
|
||||
|
|
|
@ -51,7 +51,7 @@ static const struct regmap_range_cfg rt5640_ranges[] = {
|
|||
.window_len = 0x1, },
|
||||
};
|
||||
|
||||
static const struct reg_default init_list[] = {
|
||||
static const struct reg_sequence init_list[] = {
|
||||
{RT5640_PR_BASE + 0x3d, 0x3600},
|
||||
{RT5640_PR_BASE + 0x12, 0x0aa8},
|
||||
{RT5640_PR_BASE + 0x14, 0x0aaa},
|
||||
|
|
|
@ -54,7 +54,7 @@ static const struct regmap_range_cfg rt5645_ranges[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static const struct reg_default init_list[] = {
|
||||
static const struct reg_sequence init_list[] = {
|
||||
{RT5645_PR_BASE + 0x3d, 0x3600},
|
||||
{RT5645_PR_BASE + 0x1c, 0xfd20},
|
||||
{RT5645_PR_BASE + 0x20, 0x611f},
|
||||
|
@ -63,7 +63,7 @@ static const struct reg_default init_list[] = {
|
|||
};
|
||||
#define RT5645_INIT_REG_LEN ARRAY_SIZE(init_list)
|
||||
|
||||
static const struct reg_default rt5650_init_list[] = {
|
||||
static const struct reg_sequence rt5650_init_list[] = {
|
||||
{0xf6, 0x0100},
|
||||
};
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ static const struct regmap_range_cfg rt5651_ranges[] = {
|
|||
.window_len = 0x1, },
|
||||
};
|
||||
|
||||
static struct reg_default init_list[] = {
|
||||
static struct reg_sequence init_list[] = {
|
||||
{RT5651_PR_BASE + 0x3d, 0x3e00},
|
||||
};
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ static const struct regmap_range_cfg rt5670_ranges[] = {
|
|||
.window_len = 0x1, },
|
||||
};
|
||||
|
||||
static const struct reg_default init_list[] = {
|
||||
static const struct reg_sequence init_list[] = {
|
||||
{ RT5670_PR_BASE + 0x14, 0x9a8a },
|
||||
{ RT5670_PR_BASE + 0x38, 0x3ba1 },
|
||||
{ RT5670_PR_BASE + 0x3d, 0x3640 },
|
||||
|
|
|
@ -54,7 +54,7 @@ static const struct regmap_range_cfg rt5677_ranges[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static const struct reg_default init_list[] = {
|
||||
static const struct reg_sequence init_list[] = {
|
||||
{RT5677_ASRC_12, 0x0018},
|
||||
{RT5677_PR_BASE + 0x3d, 0x364d},
|
||||
{RT5677_PR_BASE + 0x17, 0x4fc0},
|
||||
|
|
|
@ -1668,7 +1668,7 @@ static const struct i2c_device_id aic3x_i2c_id[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(i2c, aic3x_i2c_id);
|
||||
|
||||
static const struct reg_default aic3007_class_d[] = {
|
||||
static const struct reg_sequence aic3007_class_d[] = {
|
||||
/* Class-D speaker driver init; datasheet p. 46 */
|
||||
{ AIC3X_PAGE_SELECT, 0x0D },
|
||||
{ 0xD, 0x0D },
|
||||
|
|
|
@ -897,7 +897,7 @@ static bool wm2200_readable_register(struct device *dev, unsigned int reg)
|
|||
}
|
||||
}
|
||||
|
||||
static const struct reg_default wm2200_reva_patch[] = {
|
||||
static const struct reg_sequence wm2200_reva_patch[] = {
|
||||
{ 0x07, 0x0003 },
|
||||
{ 0x102, 0x0200 },
|
||||
{ 0x203, 0x0084 },
|
||||
|
|
|
@ -1247,7 +1247,7 @@ static const struct snd_soc_dapm_route wm5100_dapm_routes[] = {
|
|||
{ "PWM2", NULL, "PWM2 Driver" },
|
||||
};
|
||||
|
||||
static const struct reg_default wm5100_reva_patches[] = {
|
||||
static const struct reg_sequence wm5100_reva_patches[] = {
|
||||
{ WM5100_AUDIO_IF_1_10, 0 },
|
||||
{ WM5100_AUDIO_IF_1_11, 1 },
|
||||
{ WM5100_AUDIO_IF_1_12, 2 },
|
||||
|
|
|
@ -3495,7 +3495,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8962 = {
|
|||
};
|
||||
|
||||
/* Improve power consumption for IN4 DC measurement mode */
|
||||
static const struct reg_default wm8962_dc_measure[] = {
|
||||
static const struct reg_sequence wm8962_dc_measure[] = {
|
||||
{ 0xfd, 0x1 },
|
||||
{ 0xcc, 0x40 },
|
||||
{ 0xfd, 0 },
|
||||
|
|
|
@ -1595,7 +1595,7 @@ static int wm8993_resume(struct snd_soc_codec *codec)
|
|||
#endif
|
||||
|
||||
/* Tune DC servo configuration */
|
||||
static struct reg_default wm8993_regmap_patch[] = {
|
||||
static struct reg_sequence wm8993_regmap_patch[] = {
|
||||
{ 0x44, 3 },
|
||||
{ 0x56, 3 },
|
||||
{ 0x44, 0 },
|
||||
|
|
Loading…
Reference in New Issue