mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
regulator: Updates for v3.8
A fairly quiet release again, a couple of relatively small new features
and a bunch of driver specific work including yet more code elimination
and fixes from Axel Lin.
- Addidion of linear_min_sel for offsetting linear selectors in the
helpers.
- Support for continuous voltage ranges for regulators with extremely
high resolution.
- Drivers for AS3711, DA9055, MAX9873, TPS51632, TPS80031 and ARM vexpress.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)
iQIcBAABAgAGBQJQxyvhAAoJELSic+t+oim9F90P+QEQl/gNYmusoGbUmmgnybft
hHmxpJXKhUSMSm7Lju3FLBhA7+gGnm1baWhOBGWMKM5iawlpHSUcognO2LRwRRiT
d54RS6+J5vUR6AE/w4EEaIBPcgg6kAXpwe9Q22EAfJTPTndTjSuKu8HikKkMw89H
RX964WKPfJDBrNBxfcJMWyQUR+89q3BcXk3oKWK5RTGJ+TvjvPnNd66/or5x+a7A
H9xov93MMWBiS59MxUeAO7DTIOZg2p3TIPHlUFW3hoobbOe0EWdvqkpDJYW75ss9
53B/pO/wsct6yVu86zD8MGo0Uzu7NE3zZoR2q0EflPHV+A5U6DiOS+jW6hk+0v/B
gUhreHiCNZ8veHzLujAuuESGeZG8W5qtavMI2em3eeIkGNogBMiAjwZqNfOWce/+
G3wVdpKhdGFXa4zmlD5yfOeXpjXb3agSP8i0hG/pVkDuok6KU/BnzTOi+m6uagdF
GfJJI4fgoa0s02H/AicVMY2NOFBeQWPuyGTFA73tsUa0uhSPYlf0nZdIkmDYN3QX
r8az6j0p3JRpvQEcADezdzcSGU6ulx5UljZn089kFDulIumjRM4fcbPWIeednvYg
P3+CUmpE/xktPuohTg/si/KiJiUS/gIw2FHGrGp3TpcmoXFgcI9uKu/F2OGCZfGT
t2ZqLsA6vn06Cvweml2/
=2d65
-----END PGP SIGNATURE-----
Merge tag 'regulator-3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator
Pull regulator updates from Mark Brown:
"A fairly quiet release again, a couple of relatively small new
features and a bunch of driver specific work including yet more code
elimination and fixes from Axel Lin.
- Addidion of linear_min_sel for offsetting linear selectors in the
helpers.
- Support for continuous voltage ranges for regulators with extremely
high resolution.
- Drivers for AS3711, DA9055, MAX9873, TPS51632, TPS80031 and ARM
vexpress."
Fix up trivial conflict (due to typo fix) in palmas-regulator.c
* tag 'regulator-3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator: (80 commits)
regulator: core: Fix logic to determinate if regulator can change voltage
regulator: s5m8767: Fix to work even if no DVS gpio present
regulator: s5m8767: Fix to read the first DVS register.
regulator: s5m8767: Fix to work when platform registers less regulators
regulator: gpio-regulator: gpio_set_value should use cansleep
regulator: gpio-regulator: Fix logical error in for() loop
regulator: anatop: Use regulator_[get|set]_voltage_sel_regmap
regulator: anatop: Use linear_min_sel with linear mapping
regulator: max1586: Implement get_voltage_sel callback
regulator: lp8788-buck: Kill _gpio_request function
regulator: tps80031: Convert tps80031_ldo_ops to linear_min_sel and list_voltage_linear
regulator: lp8788-ldo: Remove val array in lp8788_config_ldo_enable_mode
regulator: gpio-regulator: Add ifdef CONFIG_OF guard for regulator_gpio_of_match
regulator: palmas: Convert palmas_ops_smps to regulator_[get|set]_voltage_sel_regmap
regulator: palmas: Return raw register values as the selectors in [get|set]_voltage_sel
regulators: add regulator_can_change_voltage() function
regulator: tps51632: Ensure [base|max]_voltage_uV pdata settings are valid
regulator: wm831x-dcdc: Add MODULE_ALIAS for wm831x-boostp
regulator: wm831x-dcdc: Ensure selected voltage falls within requested range
regulator: tps51632: Use linear_min_sel and regulator_[map|list]_voltage_linear
...
This commit is contained in:
commit
8b0cab1495
85 changed files with 4772 additions and 775 deletions
|
|
@ -211,7 +211,6 @@ config MFD_TPS6586X
|
|||
depends on I2C=y && GENERIC_HARDIRQS
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
depends on REGULATOR
|
||||
help
|
||||
If you say yes here you get support for the TPS6586X series of
|
||||
Power Management chips.
|
||||
|
|
|
|||
|
|
@ -21,8 +21,10 @@
|
|||
* This driver is based on max8998.c
|
||||
*/
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/module.h>
|
||||
|
|
@ -47,6 +49,13 @@ static struct mfd_cell max8997_devs[] = {
|
|||
{ .name = "max8997-led", .id = 2 },
|
||||
};
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct of_device_id __devinitdata max8997_pmic_dt_match[] = {
|
||||
{ .compatible = "maxim,max8997-pmic", .data = TYPE_MAX8997 },
|
||||
{},
|
||||
};
|
||||
#endif
|
||||
|
||||
int max8997_read_reg(struct i2c_client *i2c, u8 reg, u8 *dest)
|
||||
{
|
||||
struct max8997_dev *max8997 = i2c_get_clientdata(i2c);
|
||||
|
|
@ -123,6 +132,58 @@ int max8997_update_reg(struct i2c_client *i2c, u8 reg, u8 val, u8 mask)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(max8997_update_reg);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
/*
|
||||
* Only the common platform data elements for max8997 are parsed here from the
|
||||
* device tree. Other sub-modules of max8997 such as pmic, rtc and others have
|
||||
* to parse their own platform data elements from device tree.
|
||||
*
|
||||
* The max8997 platform data structure is instantiated here and the drivers for
|
||||
* the sub-modules need not instantiate another instance while parsing their
|
||||
* platform data.
|
||||
*/
|
||||
static struct max8997_platform_data *max8997_i2c_parse_dt_pdata(
|
||||
struct device *dev)
|
||||
{
|
||||
struct max8997_platform_data *pd;
|
||||
|
||||
pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
|
||||
if (!pd) {
|
||||
dev_err(dev, "could not allocate memory for pdata\n");
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
pd->ono = irq_of_parse_and_map(dev->of_node, 1);
|
||||
|
||||
/*
|
||||
* ToDo: the 'wakeup' member in the platform data is more of a linux
|
||||
* specfic information. Hence, there is no binding for that yet and
|
||||
* not parsed here.
|
||||
*/
|
||||
|
||||
return pd;
|
||||
}
|
||||
#else
|
||||
static struct max8997_platform_data *max8997_i2c_parse_dt_pdata(
|
||||
struct device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int max8997_i2c_get_driver_data(struct i2c_client *i2c,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
#ifdef CONFIG_OF
|
||||
if (i2c->dev.of_node) {
|
||||
const struct of_device_id *match;
|
||||
match = of_match_node(max8997_pmic_dt_match, i2c->dev.of_node);
|
||||
return (int)match->data;
|
||||
}
|
||||
#endif
|
||||
return (int)id->driver_data;
|
||||
}
|
||||
|
||||
static int max8997_i2c_probe(struct i2c_client *i2c,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
|
|
@ -137,12 +198,21 @@ static int max8997_i2c_probe(struct i2c_client *i2c,
|
|||
i2c_set_clientdata(i2c, max8997);
|
||||
max8997->dev = &i2c->dev;
|
||||
max8997->i2c = i2c;
|
||||
max8997->type = id->driver_data;
|
||||
max8997->type = max8997_i2c_get_driver_data(i2c, id);
|
||||
max8997->irq = i2c->irq;
|
||||
|
||||
if (max8997->dev->of_node) {
|
||||
pdata = max8997_i2c_parse_dt_pdata(max8997->dev);
|
||||
if (IS_ERR(pdata)) {
|
||||
ret = PTR_ERR(pdata);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
if (!pdata)
|
||||
goto err;
|
||||
|
||||
max8997->pdata = pdata;
|
||||
max8997->ono = pdata->ono;
|
||||
|
||||
mutex_init(&max8997->iolock);
|
||||
|
|
@ -434,6 +504,7 @@ static struct i2c_driver max8997_i2c_driver = {
|
|||
.name = "max8997",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &max8997_pm,
|
||||
.of_match_table = of_match_ptr(max8997_pmic_dt_match),
|
||||
},
|
||||
.probe = max8997_i2c_probe,
|
||||
.remove = max8997_i2c_remove,
|
||||
|
|
|
|||
|
|
@ -24,8 +24,6 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/regulator/of_regulator.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/mfd/tps6586x.h>
|
||||
|
|
@ -98,6 +96,9 @@ static struct mfd_cell tps6586x_cell[] = {
|
|||
{
|
||||
.name = "tps6586x-gpio",
|
||||
},
|
||||
{
|
||||
.name = "tps6586x-pmic",
|
||||
},
|
||||
{
|
||||
.name = "tps6586x-rtc",
|
||||
},
|
||||
|
|
@ -350,80 +351,19 @@ failed:
|
|||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct of_regulator_match tps6586x_matches[] = {
|
||||
{ .name = "sys", .driver_data = (void *)TPS6586X_ID_SYS },
|
||||
{ .name = "sm0", .driver_data = (void *)TPS6586X_ID_SM_0 },
|
||||
{ .name = "sm1", .driver_data = (void *)TPS6586X_ID_SM_1 },
|
||||
{ .name = "sm2", .driver_data = (void *)TPS6586X_ID_SM_2 },
|
||||
{ .name = "ldo0", .driver_data = (void *)TPS6586X_ID_LDO_0 },
|
||||
{ .name = "ldo1", .driver_data = (void *)TPS6586X_ID_LDO_1 },
|
||||
{ .name = "ldo2", .driver_data = (void *)TPS6586X_ID_LDO_2 },
|
||||
{ .name = "ldo3", .driver_data = (void *)TPS6586X_ID_LDO_3 },
|
||||
{ .name = "ldo4", .driver_data = (void *)TPS6586X_ID_LDO_4 },
|
||||
{ .name = "ldo5", .driver_data = (void *)TPS6586X_ID_LDO_5 },
|
||||
{ .name = "ldo6", .driver_data = (void *)TPS6586X_ID_LDO_6 },
|
||||
{ .name = "ldo7", .driver_data = (void *)TPS6586X_ID_LDO_7 },
|
||||
{ .name = "ldo8", .driver_data = (void *)TPS6586X_ID_LDO_8 },
|
||||
{ .name = "ldo9", .driver_data = (void *)TPS6586X_ID_LDO_9 },
|
||||
{ .name = "ldo_rtc", .driver_data = (void *)TPS6586X_ID_LDO_RTC },
|
||||
};
|
||||
|
||||
static struct tps6586x_platform_data *tps6586x_parse_dt(struct i2c_client *client)
|
||||
{
|
||||
const unsigned int num = ARRAY_SIZE(tps6586x_matches);
|
||||
struct device_node *np = client->dev.of_node;
|
||||
struct tps6586x_platform_data *pdata;
|
||||
struct tps6586x_subdev_info *devs;
|
||||
struct device_node *regs;
|
||||
const char *sys_rail_name = NULL;
|
||||
unsigned int count;
|
||||
unsigned int i, j;
|
||||
int err;
|
||||
|
||||
regs = of_find_node_by_name(np, "regulators");
|
||||
if (!regs)
|
||||
return NULL;
|
||||
|
||||
err = of_regulator_match(&client->dev, regs, tps6586x_matches, num);
|
||||
if (err < 0) {
|
||||
of_node_put(regs);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
of_node_put(regs);
|
||||
count = err;
|
||||
|
||||
devs = devm_kzalloc(&client->dev, count * sizeof(*devs), GFP_KERNEL);
|
||||
if (!devs)
|
||||
return NULL;
|
||||
|
||||
for (i = 0, j = 0; i < num && j < count; i++) {
|
||||
struct regulator_init_data *reg_idata;
|
||||
|
||||
if (!tps6586x_matches[i].init_data)
|
||||
continue;
|
||||
|
||||
reg_idata = tps6586x_matches[i].init_data;
|
||||
devs[j].name = "tps6586x-regulator";
|
||||
devs[j].platform_data = tps6586x_matches[i].init_data;
|
||||
devs[j].id = (int)tps6586x_matches[i].driver_data;
|
||||
if (devs[j].id == TPS6586X_ID_SYS)
|
||||
sys_rail_name = reg_idata->constraints.name;
|
||||
|
||||
if ((devs[j].id == TPS6586X_ID_LDO_5) ||
|
||||
(devs[j].id == TPS6586X_ID_LDO_RTC))
|
||||
reg_idata->supply_regulator = sys_rail_name;
|
||||
|
||||
devs[j].of_node = tps6586x_matches[i].of_node;
|
||||
j++;
|
||||
}
|
||||
|
||||
pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata)
|
||||
if (!pdata) {
|
||||
dev_err(&client->dev, "Memory allocation failed\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pdata->num_subdevs = count;
|
||||
pdata->subdevs = devs;
|
||||
pdata->num_subdevs = 0;
|
||||
pdata->subdevs = NULL;
|
||||
pdata->gpio_base = -1;
|
||||
pdata->irq_base = -1;
|
||||
pdata->pm_off = of_property_read_bool(np, "ti,system-power-controller");
|
||||
|
|
|
|||
|
|
@ -258,6 +258,7 @@ static const struct reg_default wm5102_reg_default[] = {
|
|||
{ 0x00000154, 0x0000 }, /* R340 - Rate Estimator 3 */
|
||||
{ 0x00000155, 0x0000 }, /* R341 - Rate Estimator 4 */
|
||||
{ 0x00000156, 0x0000 }, /* R342 - Rate Estimator 5 */
|
||||
{ 0x00000161, 0x0000 }, /* R353 - Dynamic Frequency Scaling 1 */
|
||||
{ 0x00000171, 0x0000 }, /* R369 - FLL1 Control 1 */
|
||||
{ 0x00000172, 0x0008 }, /* R370 - FLL1 Control 2 */
|
||||
{ 0x00000173, 0x0018 }, /* R371 - FLL1 Control 3 */
|
||||
|
|
@ -1047,6 +1048,7 @@ static bool wm5102_readable_register(struct device *dev, unsigned int reg)
|
|||
case ARIZONA_RATE_ESTIMATOR_3:
|
||||
case ARIZONA_RATE_ESTIMATOR_4:
|
||||
case ARIZONA_RATE_ESTIMATOR_5:
|
||||
case ARIZONA_DYNAMIC_FREQUENCY_SCALING_1:
|
||||
case ARIZONA_FLL1_CONTROL_1:
|
||||
case ARIZONA_FLL1_CONTROL_2:
|
||||
case ARIZONA_FLL1_CONTROL_3:
|
||||
|
|
@ -1079,6 +1081,7 @@ static bool wm5102_readable_register(struct device *dev, unsigned int reg)
|
|||
case ARIZONA_FLL2_GPIO_CLOCK:
|
||||
case ARIZONA_MIC_CHARGE_PUMP_1:
|
||||
case ARIZONA_LDO1_CONTROL_1:
|
||||
case ARIZONA_LDO1_CONTROL_2:
|
||||
case ARIZONA_LDO2_CONTROL_1:
|
||||
case ARIZONA_MIC_BIAS_CTRL_1:
|
||||
case ARIZONA_MIC_BIAS_CTRL_2:
|
||||
|
|
|
|||
Loading…
Reference in a new issue