Skip to content

Commit

Permalink
regulator: fan53555: add support for Silergy SYR82x regulators
Browse files Browse the repository at this point in the history
Silergy SYR82x regulators share the exact same functionality and register layout
as the Fairchild FAN53555 regulators. Therefore extend the driver to add
support for them.

Both types use the same vendor id in their ID1 register, so it's not possible
to distinguish them automatically.

Similarly, the types also do not match. Type 8 used by the SYR827 and SYR828
start at 712.5mV and increment in 12.5mv steps, while the FAN53555 type 8
starts at 600mV and increments in 10mV steps.

Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Heiko Stuebner authored and Mark Brown committed Sep 16, 2014
1 parent 91f23d8 commit ee30928
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 16 deletions.
2 changes: 1 addition & 1 deletion Documentation/devicetree/bindings/regulator/fan53555.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Binding for Fairchild FAN53555 regulators

Required properties:
- compatible: "fcs,fan53555"
- compatible: one of "fcs,fan53555", "silergy,syr827", "silergy,syr828"
- reg: I2C address

Optional properties:
Expand Down
1 change: 1 addition & 0 deletions Documentation/devicetree/bindings/vendor-prefixes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ sil Silicon Image
silabs Silicon Laboratories
simtek
sii Seiko Instruments, Inc.
silergy Silergy Corp.
sirf SiRF Technology, Inc.
smsc Standard Microsystems Corporation
snps Synopsys, Inc.
Expand Down
102 changes: 87 additions & 15 deletions drivers/regulator/fan53555.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@

#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,
Expand All @@ -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;
Expand Down Expand Up @@ -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:
Expand All @@ -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:
Expand All @@ -205,26 +258,21 @@ 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);
"vendor %d not supported!\n", di->chip_id);
return -EINVAL;
}

return 0;
return ret;
}

static int fan53555_regulator_register(struct fan53555_device_info *di,
Expand Down Expand Up @@ -278,6 +326,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,
},
{ }
};
Expand Down Expand Up @@ -307,7 +362,16 @@ static int fan53555_regulator_probe(struct i2c_client *client,
if (!di)
return -ENOMEM;

if (!client->dev.of_node) {
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 = (int) 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)
Expand All @@ -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);
Expand Down Expand Up @@ -363,7 +429,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
},
{ },
};

Expand Down

0 comments on commit ee30928

Please sign in to comment.