Skip to content

Commit a57743b

Browse files
andredalexandrebelloni
authored andcommitted
rtc: s5m: prepare for external regmap
The Samsung S2MPG10 PMIC is not connected via I2C as this driver assumes, hence this driver's current approach of creating an I2C-based regmap doesn't work for it, and this driver should use the regmap provided by the parent (core) driver instead for that PMIC. To prepare this driver for s2mpg support, restructure the code to only create a regmap if one isn't provided by the parent. No functional changes, since the parent doesn't provide a regmap for any of the PMICs currently supported by this driver. Having this change separate will simply make the addition of S2MPG10 support more self-contained, without additional restructuring. Reviewed-by: Krzysztof Kozlowski <[email protected]> Signed-off-by: André Draszik <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexandre Belloni <[email protected]>
1 parent 002cc0e commit a57743b

File tree

1 file changed

+45
-36
lines changed

1 file changed

+45
-36
lines changed

drivers/rtc/rtc-s5m.c

Lines changed: 45 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -640,52 +640,61 @@ static int s5m_rtc_probe(struct platform_device *pdev)
640640
enum sec_device_type device_type =
641641
platform_get_device_id(pdev)->driver_data;
642642
struct s5m_rtc_info *info;
643-
struct i2c_client *i2c;
644-
const struct regmap_config *regmap_cfg;
645643
int ret, alarm_irq;
646644

647645
info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
648646
if (!info)
649647
return -ENOMEM;
650648

651-
switch (device_type) {
652-
case S2MPS15X:
653-
regmap_cfg = &s2mps14_rtc_regmap_config;
654-
info->regs = &s2mps15_rtc_regs;
655-
alarm_irq = S2MPS14_IRQ_RTCA0;
656-
break;
657-
case S2MPS14X:
658-
regmap_cfg = &s2mps14_rtc_regmap_config;
659-
info->regs = &s2mps14_rtc_regs;
660-
alarm_irq = S2MPS14_IRQ_RTCA0;
661-
break;
662-
case S2MPS13X:
663-
regmap_cfg = &s2mps14_rtc_regmap_config;
664-
info->regs = &s2mps13_rtc_regs;
665-
alarm_irq = S2MPS14_IRQ_RTCA0;
666-
break;
667-
case S5M8767X:
668-
regmap_cfg = &s5m_rtc_regmap_config;
669-
info->regs = &s5m_rtc_regs;
670-
alarm_irq = S5M8767_IRQ_RTCA1;
671-
break;
672-
default:
649+
info->regmap = dev_get_regmap(pdev->dev.parent, "rtc");
650+
if (!info->regmap) {
651+
const struct regmap_config *regmap_cfg;
652+
struct i2c_client *i2c;
653+
654+
switch (device_type) {
655+
case S2MPS15X:
656+
regmap_cfg = &s2mps14_rtc_regmap_config;
657+
info->regs = &s2mps15_rtc_regs;
658+
alarm_irq = S2MPS14_IRQ_RTCA0;
659+
break;
660+
case S2MPS14X:
661+
regmap_cfg = &s2mps14_rtc_regmap_config;
662+
info->regs = &s2mps14_rtc_regs;
663+
alarm_irq = S2MPS14_IRQ_RTCA0;
664+
break;
665+
case S2MPS13X:
666+
regmap_cfg = &s2mps14_rtc_regmap_config;
667+
info->regs = &s2mps13_rtc_regs;
668+
alarm_irq = S2MPS14_IRQ_RTCA0;
669+
break;
670+
case S5M8767X:
671+
regmap_cfg = &s5m_rtc_regmap_config;
672+
info->regs = &s5m_rtc_regs;
673+
alarm_irq = S5M8767_IRQ_RTCA1;
674+
break;
675+
default:
676+
return dev_err_probe(&pdev->dev, -ENODEV,
677+
"Unsupported device type %d\n",
678+
device_type);
679+
}
680+
681+
i2c = devm_i2c_new_dummy_device(&pdev->dev,
682+
s5m87xx->i2c->adapter,
683+
RTC_I2C_ADDR);
684+
if (IS_ERR(i2c))
685+
return dev_err_probe(&pdev->dev, PTR_ERR(i2c),
686+
"Failed to allocate I2C\n");
687+
688+
info->regmap = devm_regmap_init_i2c(i2c, regmap_cfg);
689+
if (IS_ERR(info->regmap))
690+
return dev_err_probe(&pdev->dev, PTR_ERR(info->regmap),
691+
"Failed to allocate regmap\n");
692+
} else {
673693
return dev_err_probe(&pdev->dev, -ENODEV,
674-
"Device type %d is not supported by RTC driver\n",
694+
"Unsupported device type %d\n",
675695
device_type);
676696
}
677697

678-
i2c = devm_i2c_new_dummy_device(&pdev->dev, s5m87xx->i2c->adapter,
679-
RTC_I2C_ADDR);
680-
if (IS_ERR(i2c))
681-
return dev_err_probe(&pdev->dev, PTR_ERR(i2c),
682-
"Failed to allocate I2C for RTC\n");
683-
684-
info->regmap = devm_regmap_init_i2c(i2c, regmap_cfg);
685-
if (IS_ERR(info->regmap))
686-
return dev_err_probe(&pdev->dev, PTR_ERR(info->regmap),
687-
"Failed to allocate RTC register map\n");
688-
689698
info->dev = &pdev->dev;
690699
info->s5m87xx = s5m87xx;
691700
info->device_type = device_type;

0 commit comments

Comments
 (0)