Skip to content

Commit 3e1e4a5

Browse files
krzktorvalds
authored andcommitted
mfd/rtc: s5m: fix register updating by adding regmap for RTC
Rename old regmap field of "struct sec_pmic_dev" to "regmap_pmic" and add new regmap for RTC. On S5M8767A registers were not properly updated and read due to usage of the same regmap as the PMIC. This could be observed in various hangs, e.g. in infinite loop during waiting for UDR field change. On this chip family the RTC has different I2C address than PMIC so additional regmap is needed. Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Reviewed-by: Mark Brown <broonie@linaro.org> Acked-by: Sangbeom Kim <sbkim73@samsung.com> Cc: Samuel Ortiz <sameo@linux.intel.com> Cc: Lee Jones <lee.jones@linaro.org> Cc: Liam Girdwood <lgirdwood@gmail.com> Cc: Alessandro Zummo <a.zummo@towertech.it> Cc: Marek Szyprowski <m.szyprowski@samsung.com> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 222ead7 commit 3e1e4a5

5 files changed

Lines changed: 29 additions & 14 deletions

File tree

drivers/mfd/sec-core.c

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,31 +81,31 @@ static struct of_device_id sec_dt_match[] = {
8181

8282
int sec_reg_read(struct sec_pmic_dev *sec_pmic, u8 reg, void *dest)
8383
{
84-
return regmap_read(sec_pmic->regmap, reg, dest);
84+
return regmap_read(sec_pmic->regmap_pmic, reg, dest);
8585
}
8686
EXPORT_SYMBOL_GPL(sec_reg_read);
8787

8888
int sec_bulk_read(struct sec_pmic_dev *sec_pmic, u8 reg, int count, u8 *buf)
8989
{
90-
return regmap_bulk_read(sec_pmic->regmap, reg, buf, count);
90+
return regmap_bulk_read(sec_pmic->regmap_pmic, reg, buf, count);
9191
}
9292
EXPORT_SYMBOL_GPL(sec_bulk_read);
9393

9494
int sec_reg_write(struct sec_pmic_dev *sec_pmic, u8 reg, u8 value)
9595
{
96-
return regmap_write(sec_pmic->regmap, reg, value);
96+
return regmap_write(sec_pmic->regmap_pmic, reg, value);
9797
}
9898
EXPORT_SYMBOL_GPL(sec_reg_write);
9999

100100
int sec_bulk_write(struct sec_pmic_dev *sec_pmic, u8 reg, int count, u8 *buf)
101101
{
102-
return regmap_raw_write(sec_pmic->regmap, reg, buf, count);
102+
return regmap_raw_write(sec_pmic->regmap_pmic, reg, buf, count);
103103
}
104104
EXPORT_SYMBOL_GPL(sec_bulk_write);
105105

106106
int sec_reg_update(struct sec_pmic_dev *sec_pmic, u8 reg, u8 val, u8 mask)
107107
{
108-
return regmap_update_bits(sec_pmic->regmap, reg, mask, val);
108+
return regmap_update_bits(sec_pmic->regmap_pmic, reg, mask, val);
109109
}
110110
EXPORT_SYMBOL_GPL(sec_reg_update);
111111

@@ -166,6 +166,11 @@ static struct regmap_config s5m8767_regmap_config = {
166166
.cache_type = REGCACHE_FLAT,
167167
};
168168

169+
static const struct regmap_config sec_rtc_regmap_config = {
170+
.reg_bits = 8,
171+
.val_bits = 8,
172+
};
173+
169174
#ifdef CONFIG_OF
170175
/*
171176
* Only the common platform data elements for s5m8767 are parsed here from the
@@ -266,9 +271,9 @@ static int sec_pmic_probe(struct i2c_client *i2c,
266271
break;
267272
}
268273

269-
sec_pmic->regmap = devm_regmap_init_i2c(i2c, regmap);
270-
if (IS_ERR(sec_pmic->regmap)) {
271-
ret = PTR_ERR(sec_pmic->regmap);
274+
sec_pmic->regmap_pmic = devm_regmap_init_i2c(i2c, regmap);
275+
if (IS_ERR(sec_pmic->regmap_pmic)) {
276+
ret = PTR_ERR(sec_pmic->regmap_pmic);
272277
dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
273278
ret);
274279
return ret;
@@ -277,6 +282,15 @@ static int sec_pmic_probe(struct i2c_client *i2c,
277282
sec_pmic->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR);
278283
i2c_set_clientdata(sec_pmic->rtc, sec_pmic);
279284

285+
sec_pmic->regmap_rtc = devm_regmap_init_i2c(sec_pmic->rtc,
286+
&sec_rtc_regmap_config);
287+
if (IS_ERR(sec_pmic->regmap_rtc)) {
288+
ret = PTR_ERR(sec_pmic->regmap_rtc);
289+
dev_err(&i2c->dev, "Failed to allocate RTC register map: %d\n",
290+
ret);
291+
return ret;
292+
}
293+
280294
if (pdata && pdata->cfg_pmic_irq)
281295
pdata->cfg_pmic_irq();
282296

drivers/mfd/sec-irq.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,19 +280,19 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
280280

281281
switch (type) {
282282
case S5M8763X:
283-
ret = regmap_add_irq_chip(sec_pmic->regmap, sec_pmic->irq,
283+
ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
284284
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
285285
sec_pmic->irq_base, &s5m8763_irq_chip,
286286
&sec_pmic->irq_data);
287287
break;
288288
case S5M8767X:
289-
ret = regmap_add_irq_chip(sec_pmic->regmap, sec_pmic->irq,
289+
ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
290290
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
291291
sec_pmic->irq_base, &s5m8767_irq_chip,
292292
&sec_pmic->irq_data);
293293
break;
294294
case S2MPS11X:
295-
ret = regmap_add_irq_chip(sec_pmic->regmap, sec_pmic->irq,
295+
ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
296296
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
297297
sec_pmic->irq_base, &s2mps11_irq_chip,
298298
&sec_pmic->irq_data);

drivers/regulator/s5m8767.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -925,7 +925,7 @@ static int s5m8767_pmic_probe(struct platform_device *pdev)
925925
config.dev = s5m8767->dev;
926926
config.init_data = pdata->regulators[i].initdata;
927927
config.driver_data = s5m8767;
928-
config.regmap = iodev->regmap;
928+
config.regmap = iodev->regmap_pmic;
929929
config.of_node = pdata->regulators[i].reg_node;
930930

931931
rdev[i] = devm_regulator_register(&pdev->dev, &regulators[id],

drivers/rtc/rtc-s5m.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ static int s5m_rtc_probe(struct platform_device *pdev)
567567

568568
info->dev = &pdev->dev;
569569
info->s5m87xx = s5m87xx;
570-
info->regmap = s5m87xx->regmap;
570+
info->regmap = s5m87xx->regmap_rtc;
571571
info->device_type = s5m87xx->device_type;
572572
info->wtsr_smpl = s5m87xx->wtsr_smpl;
573573

include/linux/mfd/samsung/core.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ enum sec_device_type {
3939
struct sec_pmic_dev {
4040
struct device *dev;
4141
struct sec_platform_data *pdata;
42-
struct regmap *regmap;
42+
struct regmap *regmap_pmic;
43+
struct regmap *regmap_rtc;
4344
struct i2c_client *i2c;
4445
struct i2c_client *rtc;
4546

0 commit comments

Comments
 (0)