mfd: bcm590xx: Add support for multiple device types + BCM59054 compatible
authorArtur Weber <aweber.kernel@gmail.com>
Thu, 15 May 2025 14:16:30 +0000 (16:16 +0200)
committerLee Jones <lee@kernel.org>
Thu, 22 May 2025 09:56:49 +0000 (10:56 +0100)
The BCM59054 is another chip from the BCM590xx line of PMUs, commonly
used on devices with the BCM21664/BCM23550 chipsets.

Prepare the BCM590xx driver for supporting other devices by adding the
PMUID register values for supported chip types and store them in the
MFD data struct as "pmu_id". (These will be checked against the actual
PMUID register values in a later commit.)

Then, add a DT compatible for the BCM59054, and provide the PMU ID as
OF match data.

Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
Reviewed-by: Stanislav Jakubek <stano.jakubek@gmail.com>
Link: https://lore.kernel.org/r/20250515-bcm59054-v9-3-14ba0ea2ea5b@gmail.com
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/mfd/bcm590xx.c
include/linux/mfd/bcm590xx.h

index 8b56786..4620eed 100644 (file)
@@ -50,6 +50,8 @@ static int bcm590xx_i2c_probe(struct i2c_client *i2c_pri)
        bcm590xx->dev = &i2c_pri->dev;
        bcm590xx->i2c_pri = i2c_pri;
 
+       bcm590xx->pmu_id = (uintptr_t) of_device_get_match_data(bcm590xx->dev);
+
        bcm590xx->regmap_pri = devm_regmap_init_i2c(i2c_pri,
                                                 &bcm590xx_regmap_config_pri);
        if (IS_ERR(bcm590xx->regmap_pri)) {
@@ -91,12 +93,20 @@ err:
 }
 
 static const struct of_device_id bcm590xx_of_match[] = {
-       { .compatible = "brcm,bcm59056" },
+       {
+               .compatible = "brcm,bcm59054",
+               .data = (void *)BCM590XX_PMUID_BCM59054,
+       },
+       {
+               .compatible = "brcm,bcm59056",
+               .data = (void *)BCM590XX_PMUID_BCM59056,
+       },
        { }
 };
 MODULE_DEVICE_TABLE(of, bcm590xx_of_match);
 
 static const struct i2c_device_id bcm590xx_i2c_id[] = {
+       { "bcm59054" },
        { "bcm59056" },
        { }
 };
index 6b8791d..76c30e6 100644 (file)
 #include <linux/i2c.h>
 #include <linux/regmap.h>
 
+/* PMU ID register values; also used as device type */
+#define BCM590XX_PMUID_BCM59054                0x54
+#define BCM590XX_PMUID_BCM59056                0x56
+
 /* max register address */
 #define BCM590XX_MAX_REGISTER_PRI      0xe7
 #define BCM590XX_MAX_REGISTER_SEC      0xf0
@@ -24,6 +28,9 @@ struct bcm590xx {
        struct regmap *regmap_pri;
        struct regmap *regmap_sec;
        unsigned int id;
+
+       /* PMU ID value; also used as device type */
+       u8 pmu_id;
 };
 
 #endif /*  __LINUX_MFD_BCM590XX_H */