From ea08eeccae9297f7aabd2ef7f0c2517ac4549acc Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Tue, 20 Feb 2024 01:18:26 +0000
Subject: [PATCH] write in 30M
---
kernel/drivers/regulator/fan53555.c | 538 ++++++++++++++++++++++++++---------------------------------
1 files changed, 237 insertions(+), 301 deletions(-)
diff --git a/kernel/drivers/regulator/fan53555.c b/kernel/drivers/regulator/fan53555.c
index 192c2ed..4860a6b 100644
--- a/kernel/drivers/regulator/fan53555.c
+++ b/kernel/drivers/regulator/fan53555.c
@@ -1,45 +1,36 @@
-/*
- * FAN53555 Fairchild Digitally Programmable TinyBuck Regulator Driver.
- *
- * Supported Part Numbers:
- * FAN53555UC00X/01X/03X/04X/05X
- *
- * Copyright (c) 2012 Marvell Technology Ltd.
- * Yunfan Zhang <yfzhang@marvell.com>
- *
- * This package is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- */
-#include <linux/module.h>
-#include <linux/param.h>
+// SPDX-License-Identifier: GPL-2.0
+//
+// FAN53555 Fairchild Digitally Programmable TinyBuck Regulator Driver.
+//
+// Supported Part Numbers:
+// FAN53555UC00X/01X/03X/04X/05X
+//
+// Copyright (c) 2012 Marvell Technology Ltd.
+// Yunfan Zhang <yfzhang@marvell.com>
+
+#include <linux/bits.h>
#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/param.h>
#include <linux/platform_device.h>
+#include <linux/regmap.h>
#include <linux/regulator/driver.h>
+#include <linux/regulator/fan53555.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/of_regulator.h>
-#include <linux/of_device.h>
-#include <linux/i2c.h>
#include <linux/slab.h>
-#include <linux/regmap.h>
-#include <linux/regulator/fan53555.h>
-#include <linux/gpio.h>
-#include <linux/of_gpio.h>
/* Voltage setting */
#define FAN53555_VSEL0 0x00
#define FAN53555_VSEL1 0x01
-#define RK860X_VSEL0 0x06
-#define RK860X_VSEL1 0x07
-#define RK860X_MAX_SET 0x08
-
-#define TCS452X_VSEL0 0x11
-#define TCS452X_VSEL1 0x10
-#define TCS452X_TIME 0x13
-#define TCS452X_COMMAND 0x14
-#define TCS452X_LIMCONF 0x16
+#define TCS4525_VSEL0 0x11
+#define TCS4525_VSEL1 0x10
+#define TCS4525_TIME 0x13
+#define TCS4525_COMMAND 0x14
+#define TCS4525_LIMCONF 0x16
/* Control register */
#define FAN53555_CONTROL 0x02
@@ -53,7 +44,6 @@
/* VSEL bit definitions */
#define VSEL_BUCK_EN (1 << 7)
#define VSEL_MODE (1 << 6)
-#define VSEL_NSEL_MASK 0x3F
/* Chip ID and Verison */
#define DIE_ID 0x0F /* ID1 */
#define DIE_REV 0x0F /* ID2 */
@@ -62,25 +52,31 @@
#define CTL_SLEW_MASK (0x7 << 4)
#define CTL_SLEW_SHIFT 4
#define CTL_RESET (1 << 2)
+#define CTL_MODE_VSEL0_MODE BIT(0)
+#define CTL_MODE_VSEL1_MODE BIT(1)
-#define RK_VSEL_NSEL_MASK 0xff
+#define FAN53555_NVOLTAGES 64 /* Numbers of voltages */
+#define FAN53526_NVOLTAGES 128
-#define TCS_VSEL_NSEL_MASK 0x7f
#define TCS_VSEL0_MODE (1 << 7)
#define TCS_VSEL1_MODE (1 << 6)
#define TCS_SLEW_SHIFT 3
#define TCS_SLEW_MASK (0x3 < 3)
-#define FAN53555_NVOLTAGES_64 64 /* Numbers of voltages */
-#define FAN53555_NVOLTAGES_127 127 /* Numbers of voltages */
-#define FAN53555_NVOLTAGES_160 160 /* Numbers of voltages */
-
enum fan53555_vendor {
- FAN53555_VENDOR_FAIRCHILD = 0,
- FAN53555_VENDOR_RK,
+ FAN53526_VENDOR_FAIRCHILD = 0,
+ FAN53555_VENDOR_FAIRCHILD,
FAN53555_VENDOR_SILERGY,
- FAN53555_VENDOR_TCS,
+ FAN53526_VENDOR_TCS,
+};
+
+enum {
+ FAN53526_CHIP_ID_01 = 1,
+};
+
+enum {
+ FAN53526_CHIP_REV_08 = 8,
};
/* IC Type */
@@ -94,6 +90,14 @@
FAN53555_CHIP_ID_08 = 8,
};
+enum {
+ TCS4525_CHIP_ID_12 = 12,
+};
+
+enum {
+ TCS4526_CHIP_ID_00 = 0,
+};
+
/* IC mask revision */
enum {
FAN53555_CHIP_REV_00 = 0x3,
@@ -102,6 +106,7 @@
enum {
SILERGY_SYR82X = 8,
+ SILERGY_SYR83X = 9,
};
struct fan53555_device_info {
@@ -109,7 +114,6 @@
struct regmap *regmap;
struct device *dev;
struct regulator_desc desc;
- struct regulator_dev *rdev;
struct regulator_init_data *regulator;
/* IC Type and Rev */
int chip_id;
@@ -117,50 +121,26 @@
/* Voltage setting register */
unsigned int vol_reg;
unsigned int sleep_reg;
- unsigned int en_reg;
- unsigned int sleep_en_reg;
- unsigned int mode_reg;
- unsigned int vol_mask;
- unsigned int mode_mask;
- unsigned int slew_reg;
- unsigned int slew_mask;
- unsigned int slew_shift;
/* Voltage range and step(linear) */
unsigned int vsel_min;
unsigned int vsel_step;
- unsigned int n_voltages;
- /* Voltage slew rate limiting */
- unsigned int slew_rate;
+ unsigned int vsel_count;
+ /* Mode */
+ unsigned int mode_reg;
+ unsigned int mode_mask;
/* Sleep voltage cache */
unsigned int sleep_vol_cache;
- struct gpio_desc *vsel_gpio;
- unsigned int sleep_vsel_id;
+ /* Slew rate */
+ unsigned int slew_reg;
+ unsigned int slew_mask;
+ unsigned int slew_shift;
+ unsigned int slew_rate;
};
static unsigned int fan53555_map_mode(unsigned int mode)
{
return mode == REGULATOR_MODE_FAST ?
REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
-}
-
-static int fan53555_get_voltage(struct regulator_dev *rdev)
-{
- struct fan53555_device_info *di = rdev_get_drvdata(rdev);
- unsigned int val;
- int ret;
-
- if (di->vendor == FAN53555_VENDOR_RK) {
- ret = regmap_read(di->regmap, RK860X_MAX_SET, &val);
- if (ret < 0)
- return ret;
- ret = regulator_get_voltage_sel_regmap(rdev);
- if (ret > val)
- return val;
- } else {
- ret = regulator_get_voltage_sel_regmap(rdev);
- }
-
- return ret;
}
static int fan53555_set_suspend_voltage(struct regulator_dev *rdev, int uV)
@@ -173,8 +153,8 @@
ret = regulator_map_voltage_linear(rdev, uV, uV);
if (ret < 0)
return ret;
- ret = regmap_update_bits(di->regmap, di->sleep_reg,
- di->vol_mask, ret);
+ ret = regmap_update_bits(rdev->regmap, di->sleep_reg,
+ di->desc.vsel_mask, ret);
if (ret < 0)
return ret;
/* Cache the sleep voltage setting.
@@ -188,7 +168,7 @@
{
struct fan53555_device_info *di = rdev_get_drvdata(rdev);
- return regmap_update_bits(di->regmap, di->sleep_en_reg,
+ return regmap_update_bits(rdev->regmap, di->sleep_reg,
VSEL_BUCK_EN, VSEL_BUCK_EN);
}
@@ -196,70 +176,8 @@
{
struct fan53555_device_info *di = rdev_get_drvdata(rdev);
- return regmap_update_bits(di->regmap, di->sleep_en_reg,
+ return regmap_update_bits(rdev->regmap, di->sleep_reg,
VSEL_BUCK_EN, 0);
-}
-
-static int fan53555_resume(struct regulator_dev *rdev)
-{
- int ret;
-
- if (!rdev->constraints->state_mem.changeable)
- return 0;
-
- ret = fan53555_set_suspend_enable(rdev);
- if (ret)
- return ret;
-
- return regulator_suspend_enable(rdev, PM_SUSPEND_MEM);
-}
-
-static int fan53555_set_enable(struct regulator_dev *rdev)
-{
- struct fan53555_device_info *di = rdev_get_drvdata(rdev);
-
- if (di->vsel_gpio) {
- gpiod_set_raw_value(di->vsel_gpio, !di->sleep_vsel_id);
- return 0;
- }
-
- return regmap_update_bits(di->regmap, di->en_reg,
- VSEL_BUCK_EN, VSEL_BUCK_EN);
-}
-
-static int fan53555_set_disable(struct regulator_dev *rdev)
-{
- struct fan53555_device_info *di = rdev_get_drvdata(rdev);
-
- if (di->vsel_gpio) {
- gpiod_set_raw_value(di->vsel_gpio, di->sleep_vsel_id);
- return 0;
- }
-
- return regmap_update_bits(di->regmap, di->en_reg,
- VSEL_BUCK_EN, 0);
-}
-
-static int fan53555_is_enabled(struct regulator_dev *rdev)
-{
- struct fan53555_device_info *di = rdev_get_drvdata(rdev);
- unsigned int val;
- int ret = 0;
-
- if (di->vsel_gpio) {
- if (di->sleep_vsel_id)
- return !gpiod_get_raw_value(di->vsel_gpio);
- else
- return gpiod_get_raw_value(di->vsel_gpio);
- }
-
- ret = regmap_read(di->regmap, di->en_reg, &val);
- if (ret < 0)
- return ret;
- if (val & VSEL_BUCK_EN)
- return 1;
- else
- return 0;
}
static int fan53555_set_mode(struct regulator_dev *rdev, unsigned int mode)
@@ -268,11 +186,11 @@
switch (mode) {
case REGULATOR_MODE_FAST:
- regmap_update_bits(di->regmap, di->mode_reg,
+ regmap_update_bits(rdev->regmap, di->mode_reg,
di->mode_mask, di->mode_mask);
break;
case REGULATOR_MODE_NORMAL:
- regmap_update_bits(di->regmap, di->mode_reg, di->mode_mask, 0);
+ regmap_update_bits(rdev->regmap, di->vol_reg, di->mode_mask, 0);
break;
default:
return -EINVAL;
@@ -286,7 +204,7 @@
unsigned int val;
int ret = 0;
- ret = regmap_read(di->regmap, di->mode_reg, &val);
+ ret = regmap_read(rdev->regmap, di->mode_reg, &val);
if (ret < 0)
return ret;
if (val & di->mode_mask)
@@ -321,13 +239,13 @@
int slew_rate_n;
switch (di->vendor) {
+ case FAN53526_VENDOR_FAIRCHILD:
case FAN53555_VENDOR_FAIRCHILD:
- case FAN53555_VENDOR_RK:
case FAN53555_VENDOR_SILERGY:
slew_rate_t = slew_rates;
slew_rate_n = ARRAY_SIZE(slew_rates);
break;
- case FAN53555_VENDOR_TCS:
+ case FAN53526_VENDOR_TCS:
slew_rate_t = tcs_slew_rates;
slew_rate_n = ARRAY_SIZE(tcs_slew_rates);
break;
@@ -347,27 +265,57 @@
return -EINVAL;
}
- return regmap_update_bits(di->regmap, di->slew_reg,
+ return regmap_update_bits(rdev->regmap, di->slew_reg,
di->slew_mask, regval << di->slew_shift);
}
static const struct regulator_ops fan53555_regulator_ops = {
.set_voltage_sel = regulator_set_voltage_sel_regmap,
- .get_voltage_sel = fan53555_get_voltage,
+ .get_voltage_sel = regulator_get_voltage_sel_regmap,
.set_voltage_time_sel = regulator_set_voltage_time_sel,
.map_voltage = regulator_map_voltage_linear,
.list_voltage = regulator_list_voltage_linear,
.set_suspend_voltage = fan53555_set_suspend_voltage,
- .enable = fan53555_set_enable,
- .disable = fan53555_set_disable,
- .is_enabled = fan53555_is_enabled,
+ .enable = regulator_enable_regmap,
+ .disable = regulator_disable_regmap,
+ .is_enabled = regulator_is_enabled_regmap,
.set_mode = fan53555_set_mode,
.get_mode = fan53555_get_mode,
.set_ramp_delay = fan53555_set_ramp,
.set_suspend_enable = fan53555_set_suspend_enable,
.set_suspend_disable = fan53555_set_suspend_disable,
- .resume = fan53555_resume,
};
+
+static int fan53526_voltages_setup_fairchild(struct fan53555_device_info *di)
+{
+ /* Init voltage range and step */
+ switch (di->chip_id) {
+ case FAN53526_CHIP_ID_01:
+ switch (di->chip_rev) {
+ case FAN53526_CHIP_REV_08:
+ di->vsel_min = 600000;
+ di->vsel_step = 6250;
+ break;
+ default:
+ dev_err(di->dev,
+ "Chip ID %d with rev %d not supported!\n",
+ di->chip_id, di->chip_rev);
+ return -EINVAL;
+ }
+ break;
+ default:
+ dev_err(di->dev,
+ "Chip ID %d not supported!\n", di->chip_id);
+ return -EINVAL;
+ }
+
+ di->slew_reg = FAN53555_CONTROL;
+ di->slew_mask = CTL_SLEW_MASK;
+ di->slew_shift = CTL_SLEW_SHIFT;
+ di->vsel_count = FAN53526_NVOLTAGES;
+
+ return 0;
+}
static int fan53555_voltages_setup_fairchild(struct fan53555_device_info *di)
{
@@ -406,58 +354,10 @@
"Chip ID %d not supported!\n", di->chip_id);
return -EINVAL;
}
- di->vol_mask = VSEL_NSEL_MASK;
- di->mode_reg = di->vol_reg;
- di->mode_mask = VSEL_MODE;
di->slew_reg = FAN53555_CONTROL;
di->slew_mask = CTL_SLEW_MASK;
di->slew_shift = CTL_SLEW_SHIFT;
- di->n_voltages = FAN53555_NVOLTAGES_64;
-
- return 0;
-}
-
-static int fan53555_voltages_setup_rk(struct fan53555_device_info *di,
- struct fan53555_platform_data *pdata)
-{
- int ret = 0, val;
-
- if (di->sleep_vsel_id) {
- di->sleep_reg = RK860X_VSEL1;
- di->vol_reg = RK860X_VSEL0;
- di->mode_reg = FAN53555_VSEL0;
- di->en_reg = FAN53555_VSEL0;
- di->sleep_en_reg = FAN53555_VSEL1;
- } else {
- di->sleep_reg = RK860X_VSEL0;
- di->vol_reg = RK860X_VSEL1;
- di->mode_reg = FAN53555_VSEL1;
- di->en_reg = FAN53555_VSEL1;
- di->sleep_en_reg = FAN53555_VSEL0;
- }
-
- di->mode_mask = VSEL_MODE;
- di->vol_mask = RK_VSEL_NSEL_MASK;
- di->slew_reg = FAN53555_CONTROL;
- di->slew_mask = CTL_SLEW_MASK;
- di->slew_shift = CTL_SLEW_SHIFT;
-
- /* Init voltage range and step */
- di->vsel_min = 500000;
- di->vsel_step = 6250;
- di->n_voltages = FAN53555_NVOLTAGES_160;
-
- if (pdata->limit_volt) {
- if (pdata->limit_volt < di->vsel_min ||
- pdata->limit_volt > 1500000)
- pdata->limit_volt = 1500000;
- val = (pdata->limit_volt - di->vsel_min) / di->vsel_step;
- ret = regmap_write(di->regmap, RK860X_MAX_SET, val);
- if (ret < 0) {
- dev_err(di->dev, "Failed to set limit voltage!\n");
- return ret;
- }
- }
+ di->vsel_count = FAN53555_NVOLTAGES;
return 0;
}
@@ -467,6 +367,7 @@
/* Init voltage range and step */
switch (di->chip_id) {
case SILERGY_SYR82X:
+ case SILERGY_SYR83X:
di->vsel_min = 712500;
di->vsel_step = 12500;
break;
@@ -475,43 +376,32 @@
"Chip ID %d not supported!\n", di->chip_id);
return -EINVAL;
}
- di->vol_mask = VSEL_NSEL_MASK;
- di->mode_reg = di->vol_reg;
- di->mode_mask = VSEL_MODE;
- di->slew_reg = FAN53555_CONTROL;
di->slew_reg = FAN53555_CONTROL;
di->slew_mask = CTL_SLEW_MASK;
di->slew_shift = CTL_SLEW_SHIFT;
- di->n_voltages = FAN53555_NVOLTAGES_64;
+ di->vsel_count = FAN53555_NVOLTAGES;
return 0;
}
-static int fan53555_voltages_setup_tcs(struct fan53555_device_info *di)
+static int fan53526_voltages_setup_tcs(struct fan53555_device_info *di)
{
- if (di->sleep_vsel_id) {
- di->sleep_reg = TCS452X_VSEL1;
- di->vol_reg = TCS452X_VSEL0;
- di->mode_mask = TCS_VSEL0_MODE;
- } else {
- di->sleep_reg = TCS452X_VSEL0;
- di->vol_reg = TCS452X_VSEL1;
- di->mode_mask = TCS_VSEL1_MODE;
+ switch (di->chip_id) {
+ case TCS4525_CHIP_ID_12:
+ case TCS4526_CHIP_ID_00:
+ di->slew_reg = TCS4525_TIME;
+ di->slew_mask = TCS_SLEW_MASK;
+ di->slew_shift = TCS_SLEW_SHIFT;
+
+ /* Init voltage range and step */
+ di->vsel_min = 600000;
+ di->vsel_step = 6250;
+ di->vsel_count = FAN53526_NVOLTAGES;
+ break;
+ default:
+ dev_err(di->dev, "Chip ID %d not supported!\n", di->chip_id);
+ return -EINVAL;
}
-
- di->mode_reg = TCS452X_COMMAND;
- di->vol_mask = TCS_VSEL_NSEL_MASK;
- di->slew_reg = TCS452X_TIME;
- di->slew_mask = TCS_SLEW_MASK;
- di->slew_shift = TCS_SLEW_MASK;
-
- /* Init voltage range and step */
- di->vsel_min = 600000;
- di->vsel_step = 6250;
- di->n_voltages = FAN53555_NVOLTAGES_127;
-
- di->en_reg = di->vol_reg;
- di->sleep_en_reg = di->sleep_reg;
return 0;
}
@@ -527,35 +417,93 @@
int ret = 0;
/* Setup voltage control register */
- switch (pdata->sleep_vsel_id) {
- case FAN53555_VSEL_ID_0:
- di->sleep_reg = FAN53555_VSEL0;
- di->vol_reg = FAN53555_VSEL1;
+ switch (di->vendor) {
+ case FAN53526_VENDOR_FAIRCHILD:
+ case FAN53555_VENDOR_FAIRCHILD:
+ case FAN53555_VENDOR_SILERGY:
+ switch (pdata->sleep_vsel_id) {
+ case FAN53555_VSEL_ID_0:
+ di->sleep_reg = FAN53555_VSEL0;
+ di->vol_reg = FAN53555_VSEL1;
+ break;
+ case FAN53555_VSEL_ID_1:
+ di->sleep_reg = FAN53555_VSEL1;
+ di->vol_reg = FAN53555_VSEL0;
+ break;
+ default:
+ dev_err(di->dev, "Invalid VSEL ID!\n");
+ return -EINVAL;
+ }
break;
- case FAN53555_VSEL_ID_1:
- di->sleep_reg = FAN53555_VSEL1;
- di->vol_reg = FAN53555_VSEL0;
+ case FAN53526_VENDOR_TCS:
+ switch (pdata->sleep_vsel_id) {
+ case FAN53555_VSEL_ID_0:
+ di->sleep_reg = TCS4525_VSEL0;
+ di->vol_reg = TCS4525_VSEL1;
+ break;
+ case FAN53555_VSEL_ID_1:
+ di->sleep_reg = TCS4525_VSEL1;
+ di->vol_reg = TCS4525_VSEL0;
+ break;
+ default:
+ dev_err(di->dev, "Invalid VSEL ID!\n");
+ return -EINVAL;
+ }
break;
default:
- dev_err(di->dev, "Invalid VSEL ID!\n");
+ dev_err(di->dev, "vendor %d not supported!\n", di->vendor);
return -EINVAL;
}
- di->en_reg = di->vol_reg;
- di->sleep_en_reg = di->sleep_reg;
-
+ /* Setup mode control register */
switch (di->vendor) {
+ case FAN53526_VENDOR_FAIRCHILD:
+ di->mode_reg = FAN53555_CONTROL;
+
+ switch (pdata->sleep_vsel_id) {
+ case FAN53555_VSEL_ID_0:
+ di->mode_mask = CTL_MODE_VSEL1_MODE;
+ break;
+ case FAN53555_VSEL_ID_1:
+ di->mode_mask = CTL_MODE_VSEL0_MODE;
+ break;
+ }
+ break;
+ case FAN53555_VENDOR_FAIRCHILD:
+ case FAN53555_VENDOR_SILERGY:
+ di->mode_reg = di->vol_reg;
+ di->mode_mask = VSEL_MODE;
+ break;
+ case FAN53526_VENDOR_TCS:
+ di->mode_reg = TCS4525_COMMAND;
+
+ switch (pdata->sleep_vsel_id) {
+ case FAN53555_VSEL_ID_0:
+ di->mode_mask = TCS_VSEL1_MODE;
+ break;
+ case FAN53555_VSEL_ID_1:
+ di->mode_mask = TCS_VSEL0_MODE;
+ break;
+ }
+ break;
+ default:
+ dev_err(di->dev, "vendor %d not supported!\n", di->vendor);
+ return -EINVAL;
+ }
+
+ /* Setup voltage range */
+ switch (di->vendor) {
+ case FAN53526_VENDOR_FAIRCHILD:
+ ret = fan53526_voltages_setup_fairchild(di);
+ break;
case FAN53555_VENDOR_FAIRCHILD:
ret = fan53555_voltages_setup_fairchild(di);
- break;
- case FAN53555_VENDOR_RK:
- ret = fan53555_voltages_setup_rk(di, pdata);
break;
case FAN53555_VENDOR_SILERGY:
ret = fan53555_voltages_setup_silergy(di);
break;
- case FAN53555_VENDOR_TCS:
- ret = fan53555_voltages_setup_tcs(di);
+ case FAN53526_VENDOR_TCS:
+ ret = fan53526_voltages_setup_tcs(di);
break;
default:
dev_err(di->dev, "vendor %d not supported!\n", di->vendor);
@@ -569,23 +517,23 @@
struct regulator_config *config)
{
struct regulator_desc *rdesc = &di->desc;
+ struct regulator_dev *rdev;
rdesc->name = "fan53555-reg";
rdesc->supply_name = "vin";
rdesc->ops = &fan53555_regulator_ops;
rdesc->type = REGULATOR_VOLTAGE;
- rdesc->n_voltages = di->n_voltages;
- rdesc->enable_reg = di->en_reg;
+ rdesc->n_voltages = di->vsel_count;
+ rdesc->enable_reg = di->vol_reg;
rdesc->enable_mask = VSEL_BUCK_EN;
rdesc->min_uV = di->vsel_min;
rdesc->uV_step = di->vsel_step;
rdesc->vsel_reg = di->vol_reg;
- rdesc->vsel_mask = di->vol_mask;
+ rdesc->vsel_mask = di->vsel_count - 1;
rdesc->owner = THIS_MODULE;
- rdesc->enable_time = 400;
- di->rdev = devm_regulator_register(di->dev, &di->desc, config);
- return PTR_ERR_OR_ZERO(di->rdev);
+ rdev = devm_regulator_register(di->dev, &di->desc, config);
+ return PTR_ERR_OR_ZERO(rdev);
}
static const struct regmap_config fan53555_regmap_config = {
@@ -598,7 +546,7 @@
const struct regulator_desc *desc)
{
struct fan53555_platform_data *pdata;
- int ret, flag, limit_volt;
+ int ret;
u32 tmp;
pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
@@ -606,43 +554,22 @@
return NULL;
pdata->regulator = of_get_regulator_init_data(dev, np, desc);
- pdata->regulator->constraints.initial_state = PM_SUSPEND_MEM;
-
- if (!(of_property_read_u32(np, "limit-microvolt", &limit_volt)))
- pdata->limit_volt = limit_volt;
ret = of_property_read_u32(np, "fcs,suspend-voltage-selector",
&tmp);
if (!ret)
pdata->sleep_vsel_id = tmp;
- if (pdata->sleep_vsel_id)
- flag = GPIOD_OUT_LOW;
- else
- flag = GPIOD_OUT_HIGH;
-
- pdata->vsel_gpio =
- devm_gpiod_get_index_optional(dev, "vsel", 0,
- flag);
- if (IS_ERR(pdata->vsel_gpio)) {
- ret = PTR_ERR(pdata->vsel_gpio);
- dev_err(dev, "failed to get vesl gpio (%d)\n", ret);
- pdata->vsel_gpio = NULL;
- }
-
return pdata;
}
-static const struct of_device_id fan53555_dt_ids[] = {
+static const struct of_device_id __maybe_unused fan53555_dt_ids[] = {
{
+ .compatible = "fcs,fan53526",
+ .data = (void *)FAN53526_VENDOR_FAIRCHILD,
+ }, {
.compatible = "fcs,fan53555",
.data = (void *)FAN53555_VENDOR_FAIRCHILD
- }, {
- .compatible = "rockchip,rk8603",
- .data = (void *)FAN53555_VENDOR_RK,
- }, {
- .compatible = "rockchip,rk8604",
- .data = (void *)FAN53555_VENDOR_RK,
}, {
.compatible = "silergy,syr827",
.data = (void *)FAN53555_VENDOR_SILERGY,
@@ -650,8 +577,14 @@
.compatible = "silergy,syr828",
.data = (void *)FAN53555_VENDOR_SILERGY,
}, {
- .compatible = "tcs,tcs452x", /* tcs4525/4526 */
- .data = (void *)FAN53555_VENDOR_TCS
+ .compatible = "tcs,tcs4525",
+ .data = (void *)FAN53526_VENDOR_TCS
+ }, {
+ .compatible = "tcs,tcs4526",
+ .data = (void *)FAN53526_VENDOR_TCS
+ }, {
+ .compatible = "tcs,tcs452x",
+ .data = (void *)FAN53526_VENDOR_TCS
},
{ }
};
@@ -664,6 +597,7 @@
struct fan53555_device_info *di;
struct fan53555_platform_data *pdata;
struct regulator_config config = { };
+ struct regmap *regmap;
unsigned int val;
int ret;
@@ -683,9 +617,6 @@
return -ENODEV;
}
- di->vsel_gpio = pdata->vsel_gpio;
- di->sleep_vsel_id = pdata->sleep_vsel_id;
-
di->regulator = pdata->regulator;
if (client->dev.of_node) {
di->vendor =
@@ -693,32 +624,35 @@
} else {
/* if no ramp constraint set, get the pdata ramp_delay */
if (!di->regulator->constraints.ramp_delay) {
- int slew_idx = (pdata->slew_rate & 0x7)
- ? pdata->slew_rate : 0;
+ if (pdata->slew_rate >= ARRAY_SIZE(slew_rates)) {
+ dev_err(&client->dev, "Invalid slew_rate\n");
+ return -EINVAL;
+ }
di->regulator->constraints.ramp_delay
- = slew_rates[slew_idx];
+ = slew_rates[pdata->slew_rate];
}
di->vendor = id->driver_data;
}
- di->regmap = devm_regmap_init_i2c(client, &fan53555_regmap_config);
- if (IS_ERR(di->regmap)) {
+ regmap = devm_regmap_init_i2c(client, &fan53555_regmap_config);
+ if (IS_ERR(regmap)) {
dev_err(&client->dev, "Failed to allocate regmap!\n");
- return PTR_ERR(di->regmap);
+ return PTR_ERR(regmap);
}
+ di->regmap = regmap;
di->dev = &client->dev;
i2c_set_clientdata(client, di);
/* Get chip ID */
- ret = regmap_read(di->regmap, FAN53555_ID1, &val);
+ ret = regmap_read(regmap, FAN53555_ID1, &val);
if (ret < 0) {
dev_err(&client->dev, "Failed to get chip ID!\n");
return ret;
}
di->chip_id = val & DIE_ID;
/* Get chip revision */
- ret = regmap_read(di->regmap, FAN53555_ID2, &val);
+ ret = regmap_read(regmap, FAN53555_ID2, &val);
if (ret < 0) {
dev_err(&client->dev, "Failed to get chip Rev!\n");
return ret;
@@ -735,7 +669,7 @@
/* Register regulator */
config.dev = di->dev;
config.init_data = di->regulator;
- config.regmap = di->regmap;
+ config.regmap = regmap;
config.driver_data = di;
config.of_node = np;
@@ -757,13 +691,12 @@
switch (di->vendor) {
case FAN53555_VENDOR_FAIRCHILD:
- case FAN53555_VENDOR_RK:
case FAN53555_VENDOR_SILERGY:
ret = regmap_update_bits(di->regmap, di->slew_reg,
CTL_RESET, CTL_RESET);
break;
- case FAN53555_VENDOR_TCS:
- ret = regmap_update_bits(di->regmap, TCS452X_LIMCONF,
+ case FAN53526_VENDOR_TCS:
+ ret = regmap_update_bits(di->regmap, TCS4525_LIMCONF,
CTL_RESET, CTL_RESET);
/*
* the device can't return 'ack' during the reset,
@@ -785,14 +718,11 @@
static const struct i2c_device_id fan53555_id[] = {
{
+ .name = "fan53526",
+ .driver_data = FAN53526_VENDOR_FAIRCHILD
+ }, {
.name = "fan53555",
.driver_data = FAN53555_VENDOR_FAIRCHILD
- }, {
- .name = "rk8603",
- .driver_data = FAN53555_VENDOR_RK
- }, {
- .name = "rk8604",
- .driver_data = FAN53555_VENDOR_RK
}, {
.name = "syr827",
.driver_data = FAN53555_VENDOR_SILERGY
@@ -800,8 +730,14 @@
.name = "syr828",
.driver_data = FAN53555_VENDOR_SILERGY
}, {
+ .name = "tcs4525",
+ .driver_data = FAN53526_VENDOR_TCS
+ }, {
+ .name = "tcs4526",
+ .driver_data = FAN53526_VENDOR_TCS
+ }, {
.name = "tcs452x",
- .driver_data = FAN53555_VENDOR_TCS
+ .driver_data = FAN53526_VENDOR_TCS
},
{ },
};
--
Gitblit v1.6.2