rtc: isl1208: Add support for the built-in RTC on the PMIC RAA215300
authorBiju Das <biju.das.jz@bp.renesas.com>
Fri, 23 Jun 2023 14:09:48 +0000 (15:09 +0100)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Sun, 25 Jun 2023 22:58:21 +0000 (00:58 +0200)
The built-in RTC found on PMIC RAA215300 is the same as ISL1208.
However, the external oscillator bit is inverted on PMIC version
0x11. The PMIC driver detects PMIC version and instantiates the
RTC device based on i2c_device_id.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://lore.kernel.org/r/20230623140948.384762-11-biju.das.jz@bp.renesas.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/rtc/rtc-isl1208.c

index e9ec567..b0712b4 100644 (file)
@@ -74,6 +74,7 @@ struct isl1208_config {
        unsigned int    nvmem_length;
        unsigned        has_tamper:1;
        unsigned        has_timestamp:1;
+       unsigned        has_inverted_osc_bit:1;
 };
 
 static const struct isl1208_config config_isl1208 = {
@@ -100,11 +101,19 @@ static const struct isl1208_config config_isl1219 = {
        .has_timestamp = true
 };
 
+static const struct isl1208_config config_raa215300_a0 = {
+       .nvmem_length = 2,
+       .has_tamper = false,
+       .has_timestamp = false,
+       .has_inverted_osc_bit = true
+};
+
 static const struct i2c_device_id isl1208_id[] = {
        { "isl1208", .driver_data = (kernel_ulong_t)&config_isl1208 },
        { "isl1209", .driver_data = (kernel_ulong_t)&config_isl1209 },
        { "isl1218", .driver_data = (kernel_ulong_t)&config_isl1218 },
        { "isl1219", .driver_data = (kernel_ulong_t)&config_isl1219 },
+       { "raa215300_a0", .driver_data = (kernel_ulong_t)&config_raa215300_a0 },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, isl1208_id);
@@ -895,6 +904,9 @@ isl1208_probe(struct i2c_client *client)
                return sr;
        }
 
+       if (isl1208->config->has_inverted_osc_bit)
+               xtosb_val = !xtosb_val;
+
        rc = isl1208_set_xtoscb(client, sr, xtosb_val);
        if (rc)
                return rc;