regulator: fan52555: add support for fan53528 fan
This commit is contained in:
1 parent
18b308e7ed
commit
84d6d81d7e
1 file changed
+49
-5
@@ -56,6 +56,11 @@
|
||||
#define CTL_MODE_VSEL0_MODE BIT(0)
|
||||
#define CTL_MODE_VSEL1_MODE BIT(1)
|
||||
|
||||
#define FAN53528_CTL_MODE_MASK 0x3
|
||||
#define FAN53528_CTL_MODE_FPWM (BIT(1) | BIT(0))
|
||||
#define FAN53528_CTL_MODE_AUTFPWM 0x0
|
||||
#define FAN53528_VOLTAGE_MASK 0x7F
|
||||
|
||||
#define FAN53555_NVOLTAGES 64 /* Numbers of voltages */
|
||||
#define FAN53526_NVOLTAGES 128
|
||||
#define RK8602_NVOLTAGES 160
|
||||
@@ -67,6 +72,7 @@
|
||||
|
||||
enum fan53555_vendor {
|
||||
FAN53526_VENDOR_FAIRCHILD = 0,
|
||||
FAN53528_VENDOR_FAIRCHILD,
|
||||
FAN53555_VENDOR_FAIRCHILD,
|
||||
FAN53555_VENDOR_ROCKCHIP, /* RK8600, RK8601 */
|
||||
RK8602_VENDOR_ROCKCHIP, /* RK8602, RK8603 */
|
||||
@@ -161,8 +167,12 @@ static int fan53555_set_suspend_voltage(struct regulator_dev *rdev, int uV)
|
||||
ret = regulator_map_voltage_linear(rdev, uV, uV);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = regmap_update_bits(rdev->regmap, di->sleep_reg,
|
||||
di->desc.vsel_mask, ret);
|
||||
if (di->vendor == FAN53528_VENDOR_FAIRCHILD)
|
||||
ret = regmap_update_bits(rdev->regmap, di->sleep_reg,
|
||||
FAN53528_VOLTAGE_MASK, ret);
|
||||
else
|
||||
ret = regmap_update_bits(rdev->regmap, di->sleep_reg,
|
||||
di->desc.vsel_mask, ret);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
/* Cache the sleep voltage setting.
|
||||
@@ -194,11 +204,21 @@ static int fan53555_set_mode(struct regulator_dev *rdev, unsigned int mode)
|
||||
|
||||
switch (mode) {
|
||||
case REGULATOR_MODE_FAST:
|
||||
regmap_update_bits(rdev->regmap, di->mode_reg,
|
||||
di->mode_mask, di->mode_mask);
|
||||
if (di->vendor == FAN53528_VENDOR_FAIRCHILD)
|
||||
regmap_update_bits(rdev->regmap, FAN53555_CONTROL,
|
||||
FAN53528_CTL_MODE_MASK,
|
||||
FAN53528_CTL_MODE_FPWM);
|
||||
else
|
||||
regmap_update_bits(rdev->regmap, di->mode_reg,
|
||||
di->mode_mask, di->mode_mask);
|
||||
break;
|
||||
case REGULATOR_MODE_NORMAL:
|
||||
regmap_update_bits(rdev->regmap, di->vol_reg, di->mode_mask, 0);
|
||||
if (di->vendor == FAN53528_VENDOR_FAIRCHILD)
|
||||
regmap_update_bits(di->regmap, FAN53555_CONTROL,
|
||||
FAN53528_CTL_MODE_MASK,
|
||||
FAN53528_CTL_MODE_AUTFPWM);
|
||||
else
|
||||
regmap_update_bits(rdev->regmap, di->vol_reg, di->mode_mask, 0);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -212,6 +232,17 @@ static unsigned int fan53555_get_mode(struct regulator_dev *rdev)
|
||||
unsigned int val;
|
||||
int ret = 0;
|
||||
|
||||
if (di->vendor == FAN53528_VENDOR_FAIRCHILD) {
|
||||
ret = regmap_read(di->regmap, FAN53555_CONTROL, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if ((val & FAN53528_CTL_MODE_MASK) == FAN53528_CTL_MODE_FPWM)
|
||||
return REGULATOR_MODE_FAST;
|
||||
else
|
||||
return REGULATOR_MODE_NORMAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = regmap_read(rdev->regmap, di->mode_reg, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@@ -610,6 +641,13 @@ static int fan53555_regulator_register(struct fan53555_device_info *di,
|
||||
rdesc->enable_time = di->enable_time;
|
||||
rdesc->owner = THIS_MODULE;
|
||||
|
||||
if (di->vendor == FAN53528_VENDOR_FAIRCHILD) {
|
||||
rdesc->name = "fan53528-reg";
|
||||
rdesc->n_voltages = FAN53526_NVOLTAGES;
|
||||
rdesc->vsel_mask = FAN53528_VOLTAGE_MASK;
|
||||
};
|
||||
|
||||
|
||||
rdev = devm_regulator_register(di->dev, &di->desc, config);
|
||||
return PTR_ERR_OR_ZERO(rdev);
|
||||
}
|
||||
@@ -645,6 +683,9 @@ static const struct of_device_id __maybe_unused fan53555_dt_ids[] = {
|
||||
{
|
||||
.compatible = "fcs,fan53526",
|
||||
.data = (void *)FAN53526_VENDOR_FAIRCHILD,
|
||||
}, {
|
||||
.compatible = "fcs,fan53528",
|
||||
.data = (void *)FAN53528_VENDOR_FAIRCHILD,
|
||||
}, {
|
||||
.compatible = "fcs,fan53555",
|
||||
.data = (void *)FAN53555_VENDOR_FAIRCHILD
|
||||
@@ -752,6 +793,9 @@ static const struct i2c_device_id fan53555_id[] = {
|
||||
{
|
||||
.name = "fan53526",
|
||||
.driver_data = FAN53526_VENDOR_FAIRCHILD
|
||||
}, {
|
||||
.name = "fan53528",
|
||||
.driver_data = FAN53528_VENDOR_FAIRCHILD
|
||||
}, {
|
||||
.name = "fan53555",
|
||||
.driver_data = FAN53555_VENDOR_FAIRCHILD
|
||||
|
||||
Reference in new issue
Block a user