power: fan53555: add support for Silergy SYR82X and SYR83X
authorVasily Khoruzhick <anarsoul@gmail.com>
Sat, 16 Nov 2019 19:32:03 +0000 (11:32 -0800)
committerKever Yang <kever.yang@rock-chips.com>
Sat, 23 Nov 2019 14:29:49 +0000 (22:29 +0800)
SYR82X and SYR83X are almost identical to FAN53555, the only difference
is different die ID and revision, voltage ranges and steps.

Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
Tested-by: Anand Moon <linux.amoon@gmail.com>
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
drivers/power/pmic/fan53555.c
drivers/power/regulator/fan53555.c
include/power/fan53555.h [new file with mode: 0644]

index 1ca59c5f0c587b33d457ed9f95e3ee7638a4436f..11304d2146af436d5de47be9071c1e2f52a25b6c 100644 (file)
@@ -8,6 +8,7 @@
 #include <dm/device-internal.h>
 #include <dm/lists.h>
 #include <i2c.h>
+#include <power/fan53555.h>
 #include <power/pmic.h>
 #include <power/regulator.h>
 
@@ -58,7 +59,7 @@ static int pmic_fan53555_bind(struct udevice *dev)
                return -ENOENT;
        }
 
-       return device_bind_with_driver_data(dev, drv, "SW", 0,
+       return device_bind_with_driver_data(dev, drv, "SW", dev->driver_data,
                                            dev_ofnode(dev), &child);
 };
 
@@ -69,7 +70,9 @@ static struct dm_pmic_ops pmic_fan53555_ops = {
 };
 
 static const struct udevice_id pmic_fan53555_match[] = {
-       { .compatible = "fcs,fan53555" },
+       { .compatible = "fcs,fan53555", .data = FAN53555_VENDOR_FAIRCHILD, },
+       { .compatible = "silergy,syr827", .data = FAN53555_VENDOR_SILERGY, },
+       { .compatible = "silergy,syr828", .data = FAN53555_VENDOR_SILERGY, },
        { },
 };
 
index dbd55023779777df6dbd387be3e5a840fefcbdaf..9c48b262162c59a58677e69864b4e2b85ffb4936 100644 (file)
@@ -10,6 +10,7 @@
 #include <fdtdec.h>
 #include <i2c.h>
 #include <asm/gpio.h>
+#include <power/fan53555.h>
 #include <power/pmic.h>
 #include <power/regulator.h>
 
  * See http://www.onsemi.com/pub/Collateral/FAN53555-D.pdf for details.
  */
 static const struct {
+       unsigned int vendor;
        u8 die_id;
        u8 die_rev;
+       bool check_rev;
        u32 vsel_min;
        u32 vsel_step;
 } ic_types[] = {
-       { 0x0, 0x3, 600000, 10000 },  /* Option 00 */
-       { 0x0, 0xf, 800000, 10000 },  /* Option 13 */
-       { 0x0, 0xc, 600000, 12500 },  /* Option 23 */
-       { 0x1, 0x3, 600000, 10000 },  /* Option 01 */
-       { 0x3, 0x3, 600000, 10000 },  /* Option 03 */
-       { 0x4, 0xf, 603000, 12826 },  /* Option 04 */
-       { 0x5, 0x3, 600000, 10000 },  /* Option 05 */
-       { 0x8, 0x1, 600000, 10000 },  /* Option 08 */
-       { 0x8, 0xf, 600000, 10000 },  /* Option 08 */
-       { 0xc, 0xf, 603000, 12826 },  /* Option 09 */
+       /* Option 00 */
+       { FAN53555_VENDOR_FAIRCHILD, 0x0, 0x3, true,  600000, 10000 },
+       /* Option 13 */
+       { FAN53555_VENDOR_FAIRCHILD, 0x0, 0xf, true,  800000, 10000 },
+       /* Option 23 */
+       { FAN53555_VENDOR_FAIRCHILD, 0x0, 0xc, true,  600000, 12500 },
+       /* Option 01 */
+       { FAN53555_VENDOR_FAIRCHILD, 0x1, 0x3, true,  600000, 10000 },
+       /* Option 03 */
+       { FAN53555_VENDOR_FAIRCHILD, 0x3, 0x3, true,  600000, 10000 },
+       /* Option 04 */
+       { FAN53555_VENDOR_FAIRCHILD, 0x4, 0xf, true,  603000, 12826 },
+       /* Option 05 */
+       { FAN53555_VENDOR_FAIRCHILD, 0x5, 0x3, true,  600000, 10000 },
+       /* Option 08 */
+       { FAN53555_VENDOR_FAIRCHILD, 0x8, 0x1, true,  600000, 10000 },
+       /* Option 08 */
+       { FAN53555_VENDOR_FAIRCHILD, 0x8, 0xf, true,  600000, 10000 },
+       /* Option 09 */
+       { FAN53555_VENDOR_FAIRCHILD, 0xc, 0xf, true,  603000, 12826 },
+       /* SYL82X */
+       { FAN53555_VENDOR_SILERGY,   0x8, 0x0, false, 712500, 12500 },
+       /* SYL83X */
+       { FAN53555_VENDOR_SILERGY,   0x9, 0x0, false, 712500, 12500 },
 };
 
 /* I2C-accessible byte-sized registers */
@@ -152,10 +169,14 @@ static int fan53555_voltages_setup(struct udevice *dev)
 
        /* Init voltage range and step */
        for (i = 0; i < ARRAY_SIZE(ic_types); ++i) {
+               if (ic_types[i].vendor != priv->vendor)
+                       continue;
+
                if (ic_types[i].die_id != priv->die_id)
                        continue;
 
-               if (ic_types[i].die_rev != priv->die_rev)
+               if (ic_types[i].check_rev &&
+                   ic_types[i].die_rev != priv->die_rev)
                        continue;
 
                priv->vsel_min = ic_types[i].vsel_min;
@@ -193,7 +214,7 @@ static int fan53555_probe(struct udevice *dev)
                return ID2;
 
        /* extract vendor, die_id and die_rev */
-       priv->vendor = bitfield_extract(ID1, 5, 3);
+       priv->vendor = dev->driver_data;
        priv->die_id = ID1 & GENMASK(3, 0);
        priv->die_rev = ID2 & GENMASK(3, 0);
 
diff --git a/include/power/fan53555.h b/include/power/fan53555.h
new file mode 100644 (file)
index 0000000..c039f06
--- /dev/null
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2019 Vasily Khoruzhick <anarsoul@gmail.com>
+ */
+
+#ifndef _FAN53555_H_
+#define _FAN53555_H_
+
+enum fan53555_vendor {
+       FAN53555_VENDOR_FAIRCHILD,
+       FAN53555_VENDOR_SILERGY,
+};
+
+#endif