mirror of https://gitee.com/openkylin/linux.git
mfd: Add tps65910 device-tree support
Add device tree based initialization support for TI's tps65910 pmic. Signed-off-by: Rhyland Klein <rklein@nvidia.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
1291aa4573
commit
cd4209ced4
|
@ -23,6 +23,7 @@
|
||||||
#include <linux/mfd/core.h>
|
#include <linux/mfd/core.h>
|
||||||
#include <linux/regmap.h>
|
#include <linux/regmap.h>
|
||||||
#include <linux/mfd/tps65910.h>
|
#include <linux/mfd/tps65910.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
|
||||||
static struct mfd_cell tps65910s[] = {
|
static struct mfd_cell tps65910s[] = {
|
||||||
{
|
{
|
||||||
|
@ -129,6 +130,77 @@ static int __devinit tps65910_sleepinit(struct tps65910 *tps65910,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_OF
|
||||||
|
static struct of_device_id tps65910_of_match[] = {
|
||||||
|
{ .compatible = "ti,tps65910", .data = (void *)TPS65910},
|
||||||
|
{ .compatible = "ti,tps65911", .data = (void *)TPS65911},
|
||||||
|
{ },
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, tps65910_of_match);
|
||||||
|
|
||||||
|
static struct tps65910_board *tps65910_parse_dt(struct i2c_client *client,
|
||||||
|
int *chip_id)
|
||||||
|
{
|
||||||
|
struct device_node *np = client->dev.of_node;
|
||||||
|
struct tps65910_board *board_info;
|
||||||
|
unsigned int prop;
|
||||||
|
const struct of_device_id *match;
|
||||||
|
unsigned int prop_array[TPS6591X_MAX_NUM_GPIO];
|
||||||
|
int ret = 0;
|
||||||
|
int idx;
|
||||||
|
|
||||||
|
match = of_match_device(tps65910_of_match, &client->dev);
|
||||||
|
if (!match) {
|
||||||
|
dev_err(&client->dev, "Failed to find matching dt id\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*chip_id = (int)match->data;
|
||||||
|
|
||||||
|
board_info = devm_kzalloc(&client->dev, sizeof(*board_info),
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!board_info) {
|
||||||
|
dev_err(&client->dev, "Failed to allocate pdata\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = of_property_read_u32(np, "ti,vmbch-threshold", &prop);
|
||||||
|
if (!ret)
|
||||||
|
board_info->vmbch_threshold = prop;
|
||||||
|
else if (*chip_id == TPS65911)
|
||||||
|
dev_warn(&client->dev, "VMBCH-Threshold not specified");
|
||||||
|
|
||||||
|
ret = of_property_read_u32(np, "ti,vmbch2-threshold", &prop);
|
||||||
|
if (!ret)
|
||||||
|
board_info->vmbch2_threshold = prop;
|
||||||
|
else if (*chip_id == TPS65911)
|
||||||
|
dev_warn(&client->dev, "VMBCH2-Threshold not specified");
|
||||||
|
|
||||||
|
ret = of_property_read_u32_array(np, "ti,en-gpio-sleep",
|
||||||
|
prop_array, TPS6591X_MAX_NUM_GPIO);
|
||||||
|
if (!ret)
|
||||||
|
for (idx = 0; idx < ARRAY_SIZE(prop_array); idx++)
|
||||||
|
board_info->en_gpio_sleep[idx] = (prop_array[idx] != 0);
|
||||||
|
else if (ret != -EINVAL) {
|
||||||
|
dev_err(&client->dev,
|
||||||
|
"error reading property ti,en-gpio-sleep: %d\n.", ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
board_info->irq = client->irq;
|
||||||
|
board_info->irq_base = -1;
|
||||||
|
board_info->gpio_base = -1;
|
||||||
|
|
||||||
|
return board_info;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline struct tps65910_board *tps65910_parse_dt(
|
||||||
|
struct i2c_client *client)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static __devinit int tps65910_i2c_probe(struct i2c_client *i2c,
|
static __devinit int tps65910_i2c_probe(struct i2c_client *i2c,
|
||||||
const struct i2c_device_id *id)
|
const struct i2c_device_id *id)
|
||||||
|
@ -137,8 +209,13 @@ static __devinit int tps65910_i2c_probe(struct i2c_client *i2c,
|
||||||
struct tps65910_board *pmic_plat_data;
|
struct tps65910_board *pmic_plat_data;
|
||||||
struct tps65910_platform_data *init_data;
|
struct tps65910_platform_data *init_data;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
int chip_id = id->driver_data;
|
||||||
|
|
||||||
pmic_plat_data = dev_get_platdata(&i2c->dev);
|
pmic_plat_data = dev_get_platdata(&i2c->dev);
|
||||||
|
|
||||||
|
if (!pmic_plat_data && i2c->dev.of_node)
|
||||||
|
pmic_plat_data = tps65910_parse_dt(i2c, &chip_id);
|
||||||
|
|
||||||
if (!pmic_plat_data)
|
if (!pmic_plat_data)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -155,7 +232,7 @@ static __devinit int tps65910_i2c_probe(struct i2c_client *i2c,
|
||||||
i2c_set_clientdata(i2c, tps65910);
|
i2c_set_clientdata(i2c, tps65910);
|
||||||
tps65910->dev = &i2c->dev;
|
tps65910->dev = &i2c->dev;
|
||||||
tps65910->i2c_client = i2c;
|
tps65910->i2c_client = i2c;
|
||||||
tps65910->id = id->driver_data;
|
tps65910->id = chip_id;
|
||||||
mutex_init(&tps65910->io_mutex);
|
mutex_init(&tps65910->io_mutex);
|
||||||
|
|
||||||
tps65910->regmap = regmap_init_i2c(i2c, &tps65910_regmap_config);
|
tps65910->regmap = regmap_init_i2c(i2c, &tps65910_regmap_config);
|
||||||
|
@ -215,6 +292,7 @@ static struct i2c_driver tps65910_i2c_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "tps65910",
|
.name = "tps65910",
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
|
.of_match_table = of_match_ptr(tps65910_of_match),
|
||||||
},
|
},
|
||||||
.probe = tps65910_i2c_probe,
|
.probe = tps65910_i2c_probe,
|
||||||
.remove = __devexit_p(tps65910_i2c_remove),
|
.remove = __devexit_p(tps65910_i2c_remove),
|
||||||
|
|
Loading…
Reference in New Issue