aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd
diff options
context:
space:
mode:
authorRhyland Klein <rklein@nvidia.com>2012-05-11 05:36:26 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2012-05-20 11:26:58 -0400
commitcd4209ced4d3936cfe51b7b8833260457e2d9995 (patch)
tree8b9604bef9c11813fcbec2e3d02aee2ed071f451 /drivers/mfd
parent1291aa457324e149bbda19bd637b4b8ec8f04bcb (diff)
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>
Diffstat (limited to 'drivers/mfd')
-rw-r--r--drivers/mfd/tps65910.c80
1 files changed, 79 insertions, 1 deletions
diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c
index 7dffbe1a50c6..a00c09ea0793 100644
--- a/drivers/mfd/tps65910.c
+++ b/drivers/mfd/tps65910.c
@@ -23,6 +23,7 @@
23#include <linux/mfd/core.h> 23#include <linux/mfd/core.h>
24#include <linux/regmap.h> 24#include <linux/regmap.h>
25#include <linux/mfd/tps65910.h> 25#include <linux/mfd/tps65910.h>
26#include <linux/of_device.h>
26 27
27static struct mfd_cell tps65910s[] = { 28static struct mfd_cell tps65910s[] = {
28 { 29 {
@@ -129,6 +130,77 @@ err_sleep_init:
129 return ret; 130 return ret;
130} 131}
131 132
133#ifdef CONFIG_OF
134static struct of_device_id tps65910_of_match[] = {
135 { .compatible = "ti,tps65910", .data = (void *)TPS65910},
136 { .compatible = "ti,tps65911", .data = (void *)TPS65911},
137 { },
138};
139MODULE_DEVICE_TABLE(of, tps65910_of_match);
140
141static struct tps65910_board *tps65910_parse_dt(struct i2c_client *client,
142 int *chip_id)
143{
144 struct device_node *np = client->dev.of_node;
145 struct tps65910_board *board_info;
146 unsigned int prop;
147 const struct of_device_id *match;
148 unsigned int prop_array[TPS6591X_MAX_NUM_GPIO];
149 int ret = 0;
150 int idx;
151
152 match = of_match_device(tps65910_of_match, &client->dev);
153 if (!match) {
154 dev_err(&client->dev, "Failed to find matching dt id\n");
155 return NULL;
156 }
157
158 *chip_id = (int)match->data;
159
160 board_info = devm_kzalloc(&client->dev, sizeof(*board_info),
161 GFP_KERNEL);
162 if (!board_info) {
163 dev_err(&client->dev, "Failed to allocate pdata\n");
164 return NULL;
165 }
166
167 ret = of_property_read_u32(np, "ti,vmbch-threshold", &prop);
168 if (!ret)
169 board_info->vmbch_threshold = prop;
170 else if (*chip_id == TPS65911)
171 dev_warn(&client->dev, "VMBCH-Threshold not specified");
172
173 ret = of_property_read_u32(np, "ti,vmbch2-threshold", &prop);
174 if (!ret)
175 board_info->vmbch2_threshold = prop;
176 else if (*chip_id == TPS65911)
177 dev_warn(&client->dev, "VMBCH2-Threshold not specified");
178
179 ret = of_property_read_u32_array(np, "ti,en-gpio-sleep",
180 prop_array, TPS6591X_MAX_NUM_GPIO);
181 if (!ret)
182 for (idx = 0; idx < ARRAY_SIZE(prop_array); idx++)
183 board_info->en_gpio_sleep[idx] = (prop_array[idx] != 0);
184 else if (ret != -EINVAL) {
185 dev_err(&client->dev,
186 "error reading property ti,en-gpio-sleep: %d\n.", ret);
187 return NULL;
188 }
189
190
191 board_info->irq = client->irq;
192 board_info->irq_base = -1;
193 board_info->gpio_base = -1;
194
195 return board_info;
196}
197#else
198static inline struct tps65910_board *tps65910_parse_dt(
199 struct i2c_client *client)
200{
201 return NULL;
202}
203#endif
132 204
133static __devinit int tps65910_i2c_probe(struct i2c_client *i2c, 205static __devinit int tps65910_i2c_probe(struct i2c_client *i2c,
134 const struct i2c_device_id *id) 206 const struct i2c_device_id *id)
@@ -137,8 +209,13 @@ static __devinit int tps65910_i2c_probe(struct i2c_client *i2c,
137 struct tps65910_board *pmic_plat_data; 209 struct tps65910_board *pmic_plat_data;
138 struct tps65910_platform_data *init_data; 210 struct tps65910_platform_data *init_data;
139 int ret = 0; 211 int ret = 0;
212 int chip_id = id->driver_data;
140 213
141 pmic_plat_data = dev_get_platdata(&i2c->dev); 214 pmic_plat_data = dev_get_platdata(&i2c->dev);
215
216 if (!pmic_plat_data && i2c->dev.of_node)
217 pmic_plat_data = tps65910_parse_dt(i2c, &chip_id);
218
142 if (!pmic_plat_data) 219 if (!pmic_plat_data)
143 return -EINVAL; 220 return -EINVAL;
144 221
@@ -155,7 +232,7 @@ static __devinit int tps65910_i2c_probe(struct i2c_client *i2c,
155 i2c_set_clientdata(i2c, tps65910); 232 i2c_set_clientdata(i2c, tps65910);
156 tps65910->dev = &i2c->dev; 233 tps65910->dev = &i2c->dev;
157 tps65910->i2c_client = i2c; 234 tps65910->i2c_client = i2c;
158 tps65910->id = id->driver_data; 235 tps65910->id = chip_id;
159 mutex_init(&tps65910->io_mutex); 236 mutex_init(&tps65910->io_mutex);
160 237
161 tps65910->regmap = regmap_init_i2c(i2c, &tps65910_regmap_config); 238 tps65910->regmap = regmap_init_i2c(i2c, &tps65910_regmap_config);
@@ -215,6 +292,7 @@ static struct i2c_driver tps65910_i2c_driver = {
215 .driver = { 292 .driver = {
216 .name = "tps65910", 293 .name = "tps65910",
217 .owner = THIS_MODULE, 294 .owner = THIS_MODULE,
295 .of_match_table = of_match_ptr(tps65910_of_match),
218 }, 296 },
219 .probe = tps65910_i2c_probe, 297 .probe = tps65910_i2c_probe,
220 .remove = __devexit_p(tps65910_i2c_remove), 298 .remove = __devexit_p(tps65910_i2c_remove),