Merge branch 'x86-fpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[firefly-linux-kernel-4.4.55.git] / drivers / regulator / fan53555.c
index fa29ba052841a7e2571f9c96bf23c1c4e8fe927c..f8e4257aef923d16f32f969e3e74e2e1fb55c6ff 100644 (file)
 
 #define FAN53555_NVOLTAGES     64      /* Numbers of voltages */
 
+enum fan53555_vendor {
+       FAN53555_VENDOR_FAIRCHILD = 0,
+       FAN53555_VENDOR_SILERGY,
+};
+
 /* IC Type */
 enum {
        FAN53555_CHIP_ID_00 = 0,
@@ -62,7 +67,12 @@ enum {
        FAN53555_CHIP_ID_05,
 };
 
+enum {
+       SILERGY_SYR82X = 8,
+};
+
 struct fan53555_device_info {
+       enum fan53555_vendor vendor;
        struct regmap *regmap;
        struct device *dev;
        struct regulator_desc desc;
@@ -183,6 +193,47 @@ static struct regulator_ops fan53555_regulator_ops = {
        .set_ramp_delay = fan53555_set_ramp,
 };
 
+static int fan53555_voltages_setup_fairchild(struct fan53555_device_info *di)
+{
+       /* Init voltage range and step */
+       switch (di->chip_id) {
+       case FAN53555_CHIP_ID_00:
+       case FAN53555_CHIP_ID_01:
+       case FAN53555_CHIP_ID_03:
+       case FAN53555_CHIP_ID_05:
+               di->vsel_min = 600000;
+               di->vsel_step = 10000;
+               break;
+       case FAN53555_CHIP_ID_04:
+               di->vsel_min = 603000;
+               di->vsel_step = 12826;
+               break;
+       default:
+               dev_err(di->dev,
+                       "Chip ID %d not supported!\n", di->chip_id);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int fan53555_voltages_setup_silergy(struct fan53555_device_info *di)
+{
+       /* Init voltage range and step */
+       switch (di->chip_id) {
+       case SILERGY_SYR82X:
+               di->vsel_min = 712500;
+               di->vsel_step = 12500;
+               break;
+       default:
+               dev_err(di->dev,
+                       "Chip ID %d not supported!\n", di->chip_id);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 /* For 00,01,03,05 options:
  * VOUT = 0.60V + NSELx * 10mV, from 0.60 to 1.23V.
  * For 04 option:
@@ -191,6 +242,8 @@ static struct regulator_ops fan53555_regulator_ops = {
 static int fan53555_device_setup(struct fan53555_device_info *di,
                                struct fan53555_platform_data *pdata)
 {
+       int ret = 0;
+
        /* Setup voltage control register */
        switch (pdata->sleep_vsel_id) {
        case FAN53555_VSEL_ID_0:
@@ -205,26 +258,20 @@ static int fan53555_device_setup(struct fan53555_device_info *di,
                dev_err(di->dev, "Invalid VSEL ID!\n");
                return -EINVAL;
        }
-       /* Init voltage range and step */
-       switch (di->chip_id) {
-       case FAN53555_CHIP_ID_00:
-       case FAN53555_CHIP_ID_01:
-       case FAN53555_CHIP_ID_03:
-       case FAN53555_CHIP_ID_05:
-               di->vsel_min = 600000;
-               di->vsel_step = 10000;
+
+       switch (di->vendor) {
+       case FAN53555_VENDOR_FAIRCHILD:
+               ret = fan53555_voltages_setup_fairchild(di);
                break;
-       case FAN53555_CHIP_ID_04:
-               di->vsel_min = 603000;
-               di->vsel_step = 12826;
+       case FAN53555_VENDOR_SILERGY:
+               ret = fan53555_voltages_setup_silergy(di);
                break;
        default:
-               dev_err(di->dev,
-                       "Chip ID[%d]\n not supported!\n", di->chip_id);
+               dev_err(di->dev, "vendor %d not supported!\n", di->vendor);
                return -EINVAL;
        }
 
-       return 0;
+       return ret;
 }
 
 static int fan53555_regulator_register(struct fan53555_device_info *di,
@@ -278,6 +325,13 @@ static struct fan53555_platform_data *fan53555_parse_dt(struct device *dev,
 static const struct of_device_id fan53555_dt_ids[] = {
        {
                .compatible = "fcs,fan53555",
+               .data = (void *)FAN53555_VENDOR_FAIRCHILD
+       }, {
+               .compatible = "silergy,syr827",
+               .data = (void *)FAN53555_VENDOR_SILERGY,
+       }, {
+               .compatible = "silergy,syr828",
+               .data = (void *)FAN53555_VENDOR_SILERGY,
        },
        { }
 };
@@ -307,7 +361,17 @@ static int fan53555_regulator_probe(struct i2c_client *client,
        if (!di)
                return -ENOMEM;
 
-       if (!client->dev.of_node) {
+       di->regulator = pdata->regulator;
+       if (client->dev.of_node) {
+               const struct of_device_id *match;
+
+               match = of_match_device(of_match_ptr(fan53555_dt_ids),
+                                       &client->dev);
+               if (!match)
+                       return -ENODEV;
+
+               di->vendor = (unsigned long) match->data;
+       } else {
                /* if no ramp constraint set, get the pdata ramp_delay */
                if (!di->regulator->constraints.ramp_delay) {
                        int slew_idx = (pdata->slew_rate & 0x7)
@@ -316,6 +380,8 @@ static int fan53555_regulator_probe(struct i2c_client *client,
                        di->regulator->constraints.ramp_delay
                                                = slew_rates[slew_idx];
                }
+
+               di->vendor = id->driver_data;
        }
 
        di->regmap = devm_regmap_init_i2c(client, &fan53555_regmap_config);
@@ -324,7 +390,6 @@ static int fan53555_regulator_probe(struct i2c_client *client,
                return PTR_ERR(di->regmap);
        }
        di->dev = &client->dev;
-       di->regulator = pdata->regulator;
        i2c_set_clientdata(client, di);
        /* Get chip ID */
        ret = regmap_read(di->regmap, FAN53555_ID1, &val);
@@ -363,7 +428,13 @@ static int fan53555_regulator_probe(struct i2c_client *client,
 }
 
 static const struct i2c_device_id fan53555_id[] = {
-       {"fan53555", -1},
+       {
+               .name = "fan53555",
+               .driver_data = FAN53555_VENDOR_FAIRCHILD
+       }, {
+               .name = "syr82x",
+               .driver_data = FAN53555_VENDOR_SILERGY
+       },
        { },
 };