mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
mfd: max96752f: mark 0x0050 & 0x0073 register as non-volatile
Fixes: 4f64073a92 ("mfd: MAX96752F: add stream id for each link")
Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
Change-Id: I8a7bbce97363120fadf3bc2d4f27be7d02cc50aa
This commit is contained in:
@@ -36,6 +36,8 @@ static bool max96752f_volatile_reg(struct device *dev, unsigned int reg)
|
||||
{
|
||||
switch (reg) {
|
||||
case 0x0002:
|
||||
case 0x0050:
|
||||
case 0x0073:
|
||||
case 0x0140:
|
||||
case 0x01ce:
|
||||
case 0x0203 ... 0x022f:
|
||||
@@ -46,7 +48,7 @@ static bool max96752f_volatile_reg(struct device *dev, unsigned int reg)
|
||||
}
|
||||
|
||||
static const struct reg_default max96752f_reg_defaults[] = {
|
||||
{ 0x0002, 0x47 },
|
||||
{ 0x0002, 0x47 }, { 0x0050, 0x00 }, { 0x0073, 0x30 },
|
||||
{ 0x0140, 0x21 },
|
||||
{ 0x01ce, 0x06 },
|
||||
{ 0x0203, 0x84 }, { 0x0204, 0xa1 }, { 0x0205, 0x41 },
|
||||
@@ -75,21 +77,21 @@ static const struct regmap_config max96752f_regmap_config = {
|
||||
.reg_defaults = max96752f_reg_defaults,
|
||||
.num_reg_defaults = ARRAY_SIZE(max96752f_reg_defaults),
|
||||
.cache_type = REGCACHE_RBTREE,
|
||||
.use_single_write = true,
|
||||
};
|
||||
|
||||
static const unsigned short addr_list[] = {
|
||||
0x48, 0x4a, 0x4c, 0x68, 0x6a, 0x6c, 0x28, 0x2a, I2C_CLIENT_END
|
||||
};
|
||||
|
||||
void max96752f_regcache_sync(struct max96752f *max96752f)
|
||||
static void max96752f_check_addr(struct max96752f *max96752f)
|
||||
{
|
||||
struct i2c_client *client = max96752f->client;
|
||||
u16 addr = client->addr;
|
||||
u32 id;
|
||||
int i, ret;
|
||||
|
||||
regcache_cache_only(max96752f->regmap, false);
|
||||
if (!regmap_read(max96752f->regmap, 0x000d, &id))
|
||||
return;
|
||||
|
||||
for (i = 0; addr_list[i] != I2C_CLIENT_END; i++) {
|
||||
client->addr = addr_list[i];
|
||||
@@ -104,11 +106,13 @@ void max96752f_regcache_sync(struct max96752f *max96752f)
|
||||
}
|
||||
|
||||
client->addr = addr;
|
||||
}
|
||||
|
||||
regmap_update_bits(max96752f->regmap, 0x0050, STR_SEL,
|
||||
FIELD_PREP(STR_SEL, max96752f->stream_id));
|
||||
regmap_update_bits(max96752f->regmap, 0x0073, TX_SRC_ID,
|
||||
FIELD_PREP(TX_SRC_ID, max96752f->stream_id));
|
||||
void max96752f_regcache_sync(struct max96752f *max96752f)
|
||||
{
|
||||
regcache_cache_only(max96752f->regmap, false);
|
||||
|
||||
max96752f_check_addr(max96752f);
|
||||
|
||||
regcache_sync(max96752f->regmap);
|
||||
}
|
||||
@@ -120,6 +124,7 @@ static int max96752f_i2c_probe(struct i2c_client *client)
|
||||
struct device_node *child;
|
||||
struct max96752f *max96752f;
|
||||
unsigned int nr = 0;
|
||||
u32 stream_id;
|
||||
int ret;
|
||||
|
||||
for_each_available_child_of_node(dev->of_node, child) {
|
||||
@@ -141,7 +146,7 @@ static int max96752f_i2c_probe(struct i2c_client *client)
|
||||
max96752f->dev = dev;
|
||||
max96752f->client = client;
|
||||
|
||||
ret = device_property_read_u32(dev->parent, "reg", &max96752f->stream_id);
|
||||
ret = device_property_read_u32(dev->parent, "reg", &stream_id);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "failed to get gmsl id\n");
|
||||
|
||||
@@ -153,8 +158,14 @@ static int max96752f_i2c_probe(struct i2c_client *client)
|
||||
return dev_err_probe(dev, PTR_ERR(max96752f->regmap),
|
||||
"failed to initialize regmap\n");
|
||||
|
||||
max96752f_check_addr(max96752f);
|
||||
|
||||
regmap_update_bits(max96752f->regmap, 0x0050, STR_SEL,
|
||||
FIELD_PREP(STR_SEL, stream_id));
|
||||
regmap_update_bits(max96752f->regmap, 0x0073, TX_SRC_ID,
|
||||
FIELD_PREP(TX_SRC_ID, stream_id));
|
||||
|
||||
regcache_mark_dirty(max96752f->regmap);
|
||||
regcache_cache_only(max96752f->regmap, true);
|
||||
|
||||
ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, max96752f_devs,
|
||||
ARRAY_SIZE(max96752f_devs), NULL, 0, NULL);
|
||||
|
||||
@@ -105,7 +105,6 @@ struct max96752f {
|
||||
struct regmap *regmap;
|
||||
struct i2c_client *client;
|
||||
struct i2c_mux_core *muxc;
|
||||
u32 stream_id;
|
||||
};
|
||||
|
||||
void max96752f_regcache_sync(struct max96752f *max96752f);
|
||||
|
||||
Reference in New Issue
Block a user