]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/mfd/tps6586x.c
Merge tag 'char-misc-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[karo-tx-linux.git] / drivers / mfd / tps6586x.c
1 /*
2  * Core driver for TI TPS6586x PMIC family
3  *
4  * Copyright (c) 2010 CompuLab Ltd.
5  * Mike Rapoport <mike@compulab.co.il>
6  *
7  * Based on da903x.c.
8  * Copyright (C) 2008 Compulab, Ltd.
9  * Mike Rapoport <mike@compulab.co.il>
10  * Copyright (C) 2006-2008 Marvell International Ltd.
11  * Eric Miao <eric.miao@marvell.com>
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License version 2 as
15  * published by the Free Software Foundation.
16  */
17
18 #include <linux/interrupt.h>
19 #include <linux/irq.h>
20 #include <linux/kernel.h>
21 #include <linux/module.h>
22 #include <linux/mutex.h>
23 #include <linux/slab.h>
24 #include <linux/err.h>
25 #include <linux/i2c.h>
26 #include <linux/regmap.h>
27 #include <linux/regulator/of_regulator.h>
28 #include <linux/regulator/machine.h>
29
30 #include <linux/mfd/core.h>
31 #include <linux/mfd/tps6586x.h>
32
33 /* interrupt control registers */
34 #define TPS6586X_INT_ACK1       0xb5
35 #define TPS6586X_INT_ACK2       0xb6
36 #define TPS6586X_INT_ACK3       0xb7
37 #define TPS6586X_INT_ACK4       0xb8
38
39 /* interrupt mask registers */
40 #define TPS6586X_INT_MASK1      0xb0
41 #define TPS6586X_INT_MASK2      0xb1
42 #define TPS6586X_INT_MASK3      0xb2
43 #define TPS6586X_INT_MASK4      0xb3
44 #define TPS6586X_INT_MASK5      0xb4
45
46 /* device id */
47 #define TPS6586X_VERSIONCRC     0xcd
48
49 /* Maximum register */
50 #define TPS6586X_MAX_REGISTER   (TPS6586X_VERSIONCRC + 1)
51
52 struct tps6586x_irq_data {
53         u8      mask_reg;
54         u8      mask_mask;
55 };
56
57 #define TPS6586X_IRQ(_reg, _mask)                               \
58         {                                                       \
59                 .mask_reg = (_reg) - TPS6586X_INT_MASK1,        \
60                 .mask_mask = (_mask),                           \
61         }
62
63 static const struct tps6586x_irq_data tps6586x_irqs[] = {
64         [TPS6586X_INT_PLDO_0]   = TPS6586X_IRQ(TPS6586X_INT_MASK1, 1 << 0),
65         [TPS6586X_INT_PLDO_1]   = TPS6586X_IRQ(TPS6586X_INT_MASK1, 1 << 1),
66         [TPS6586X_INT_PLDO_2]   = TPS6586X_IRQ(TPS6586X_INT_MASK1, 1 << 2),
67         [TPS6586X_INT_PLDO_3]   = TPS6586X_IRQ(TPS6586X_INT_MASK1, 1 << 3),
68         [TPS6586X_INT_PLDO_4]   = TPS6586X_IRQ(TPS6586X_INT_MASK1, 1 << 4),
69         [TPS6586X_INT_PLDO_5]   = TPS6586X_IRQ(TPS6586X_INT_MASK1, 1 << 5),
70         [TPS6586X_INT_PLDO_6]   = TPS6586X_IRQ(TPS6586X_INT_MASK1, 1 << 6),
71         [TPS6586X_INT_PLDO_7]   = TPS6586X_IRQ(TPS6586X_INT_MASK1, 1 << 7),
72         [TPS6586X_INT_COMP_DET] = TPS6586X_IRQ(TPS6586X_INT_MASK4, 1 << 0),
73         [TPS6586X_INT_ADC]      = TPS6586X_IRQ(TPS6586X_INT_MASK2, 1 << 1),
74         [TPS6586X_INT_PLDO_8]   = TPS6586X_IRQ(TPS6586X_INT_MASK2, 1 << 2),
75         [TPS6586X_INT_PLDO_9]   = TPS6586X_IRQ(TPS6586X_INT_MASK2, 1 << 3),
76         [TPS6586X_INT_PSM_0]    = TPS6586X_IRQ(TPS6586X_INT_MASK2, 1 << 4),
77         [TPS6586X_INT_PSM_1]    = TPS6586X_IRQ(TPS6586X_INT_MASK2, 1 << 5),
78         [TPS6586X_INT_PSM_2]    = TPS6586X_IRQ(TPS6586X_INT_MASK2, 1 << 6),
79         [TPS6586X_INT_PSM_3]    = TPS6586X_IRQ(TPS6586X_INT_MASK2, 1 << 7),
80         [TPS6586X_INT_RTC_ALM1] = TPS6586X_IRQ(TPS6586X_INT_MASK5, 1 << 4),
81         [TPS6586X_INT_ACUSB_OVP] = TPS6586X_IRQ(TPS6586X_INT_MASK5, 0x03),
82         [TPS6586X_INT_USB_DET]  = TPS6586X_IRQ(TPS6586X_INT_MASK5, 1 << 2),
83         [TPS6586X_INT_AC_DET]   = TPS6586X_IRQ(TPS6586X_INT_MASK5, 1 << 3),
84         [TPS6586X_INT_BAT_DET]  = TPS6586X_IRQ(TPS6586X_INT_MASK3, 1 << 0),
85         [TPS6586X_INT_CHG_STAT] = TPS6586X_IRQ(TPS6586X_INT_MASK4, 0xfc),
86         [TPS6586X_INT_CHG_TEMP] = TPS6586X_IRQ(TPS6586X_INT_MASK3, 0x06),
87         [TPS6586X_INT_PP]       = TPS6586X_IRQ(TPS6586X_INT_MASK3, 0xf0),
88         [TPS6586X_INT_RESUME]   = TPS6586X_IRQ(TPS6586X_INT_MASK5, 1 << 5),
89         [TPS6586X_INT_LOW_SYS]  = TPS6586X_IRQ(TPS6586X_INT_MASK5, 1 << 6),
90         [TPS6586X_INT_RTC_ALM2] = TPS6586X_IRQ(TPS6586X_INT_MASK4, 1 << 1),
91 };
92
93 static struct mfd_cell tps6586x_cell[] = {
94         {
95                 .name = "tps6586x-gpio",
96         },
97         {
98                 .name = "tps6586x-rtc",
99         },
100         {
101                 .name = "tps6586x-onkey",
102         },
103 };
104
105 struct tps6586x {
106         struct device           *dev;
107         struct i2c_client       *client;
108         struct regmap           *regmap;
109
110         struct irq_chip         irq_chip;
111         struct mutex            irq_lock;
112         int                     irq_base;
113         u32                     irq_en;
114         u8                      mask_reg[5];
115 };
116
117 static inline struct tps6586x *dev_to_tps6586x(struct device *dev)
118 {
119         return i2c_get_clientdata(to_i2c_client(dev));
120 }
121
122 int tps6586x_write(struct device *dev, int reg, uint8_t val)
123 {
124         struct tps6586x *tps6586x = dev_to_tps6586x(dev);
125
126         return regmap_write(tps6586x->regmap, reg, val);
127 }
128 EXPORT_SYMBOL_GPL(tps6586x_write);
129
130 int tps6586x_writes(struct device *dev, int reg, int len, uint8_t *val)
131 {
132         struct tps6586x *tps6586x = dev_to_tps6586x(dev);
133
134         return regmap_bulk_write(tps6586x->regmap, reg, val, len);
135 }
136 EXPORT_SYMBOL_GPL(tps6586x_writes);
137
138 int tps6586x_read(struct device *dev, int reg, uint8_t *val)
139 {
140         struct tps6586x *tps6586x = dev_to_tps6586x(dev);
141         unsigned int rval;
142         int ret;
143
144         ret = regmap_read(tps6586x->regmap, reg, &rval);
145         if (!ret)
146                 *val = rval;
147         return ret;
148 }
149 EXPORT_SYMBOL_GPL(tps6586x_read);
150
151 int tps6586x_reads(struct device *dev, int reg, int len, uint8_t *val)
152 {
153         struct tps6586x *tps6586x = dev_to_tps6586x(dev);
154
155         return regmap_bulk_read(tps6586x->regmap, reg, val, len);
156 }
157 EXPORT_SYMBOL_GPL(tps6586x_reads);
158
159 int tps6586x_set_bits(struct device *dev, int reg, uint8_t bit_mask)
160 {
161         struct tps6586x *tps6586x = dev_to_tps6586x(dev);
162
163         return regmap_update_bits(tps6586x->regmap, reg, bit_mask, bit_mask);
164 }
165 EXPORT_SYMBOL_GPL(tps6586x_set_bits);
166
167 int tps6586x_clr_bits(struct device *dev, int reg, uint8_t bit_mask)
168 {
169         struct tps6586x *tps6586x = dev_to_tps6586x(dev);
170
171         return regmap_update_bits(tps6586x->regmap, reg, bit_mask, 0);
172 }
173 EXPORT_SYMBOL_GPL(tps6586x_clr_bits);
174
175 int tps6586x_update(struct device *dev, int reg, uint8_t val, uint8_t mask)
176 {
177         struct tps6586x *tps6586x = dev_to_tps6586x(dev);
178
179         return regmap_update_bits(tps6586x->regmap, reg, mask, val);
180 }
181 EXPORT_SYMBOL_GPL(tps6586x_update);
182
183 static int __remove_subdev(struct device *dev, void *unused)
184 {
185         platform_device_unregister(to_platform_device(dev));
186         return 0;
187 }
188
189 static int tps6586x_remove_subdevs(struct tps6586x *tps6586x)
190 {
191         return device_for_each_child(tps6586x->dev, NULL, __remove_subdev);
192 }
193
194 static void tps6586x_irq_lock(struct irq_data *data)
195 {
196         struct tps6586x *tps6586x = irq_data_get_irq_chip_data(data);
197
198         mutex_lock(&tps6586x->irq_lock);
199 }
200
201 static void tps6586x_irq_enable(struct irq_data *irq_data)
202 {
203         struct tps6586x *tps6586x = irq_data_get_irq_chip_data(irq_data);
204         unsigned int __irq = irq_data->irq - tps6586x->irq_base;
205         const struct tps6586x_irq_data *data = &tps6586x_irqs[__irq];
206
207         tps6586x->mask_reg[data->mask_reg] &= ~data->mask_mask;
208         tps6586x->irq_en |= (1 << __irq);
209 }
210
211 static void tps6586x_irq_disable(struct irq_data *irq_data)
212 {
213         struct tps6586x *tps6586x = irq_data_get_irq_chip_data(irq_data);
214
215         unsigned int __irq = irq_data->irq - tps6586x->irq_base;
216         const struct tps6586x_irq_data *data = &tps6586x_irqs[__irq];
217
218         tps6586x->mask_reg[data->mask_reg] |= data->mask_mask;
219         tps6586x->irq_en &= ~(1 << __irq);
220 }
221
222 static void tps6586x_irq_sync_unlock(struct irq_data *data)
223 {
224         struct tps6586x *tps6586x = irq_data_get_irq_chip_data(data);
225         int i;
226
227         for (i = 0; i < ARRAY_SIZE(tps6586x->mask_reg); i++) {
228                 int ret;
229                 ret = tps6586x_write(tps6586x->dev,
230                                             TPS6586X_INT_MASK1 + i,
231                                             tps6586x->mask_reg[i]);
232                 WARN_ON(ret);
233         }
234
235         mutex_unlock(&tps6586x->irq_lock);
236 }
237
238 static irqreturn_t tps6586x_irq(int irq, void *data)
239 {
240         struct tps6586x *tps6586x = data;
241         u32 acks;
242         int ret = 0;
243
244         ret = tps6586x_reads(tps6586x->dev, TPS6586X_INT_ACK1,
245                              sizeof(acks), (uint8_t *)&acks);
246
247         if (ret < 0) {
248                 dev_err(tps6586x->dev, "failed to read interrupt status\n");
249                 return IRQ_NONE;
250         }
251
252         acks = le32_to_cpu(acks);
253
254         while (acks) {
255                 int i = __ffs(acks);
256
257                 if (tps6586x->irq_en & (1 << i))
258                         handle_nested_irq(tps6586x->irq_base + i);
259
260                 acks &= ~(1 << i);
261         }
262
263         return IRQ_HANDLED;
264 }
265
266 static int __devinit tps6586x_irq_init(struct tps6586x *tps6586x, int irq,
267                                        int irq_base)
268 {
269         int i, ret;
270         u8 tmp[4];
271
272         if (!irq_base) {
273                 dev_warn(tps6586x->dev, "No interrupt support on IRQ base\n");
274                 return -EINVAL;
275         }
276
277         mutex_init(&tps6586x->irq_lock);
278         for (i = 0; i < 5; i++) {
279                 tps6586x->mask_reg[i] = 0xff;
280                 tps6586x_write(tps6586x->dev, TPS6586X_INT_MASK1 + i, 0xff);
281         }
282
283         tps6586x_reads(tps6586x->dev, TPS6586X_INT_ACK1, sizeof(tmp), tmp);
284
285         tps6586x->irq_base = irq_base;
286
287         tps6586x->irq_chip.name = "tps6586x";
288         tps6586x->irq_chip.irq_enable = tps6586x_irq_enable;
289         tps6586x->irq_chip.irq_disable = tps6586x_irq_disable;
290         tps6586x->irq_chip.irq_bus_lock = tps6586x_irq_lock;
291         tps6586x->irq_chip.irq_bus_sync_unlock = tps6586x_irq_sync_unlock;
292
293         for (i = 0; i < ARRAY_SIZE(tps6586x_irqs); i++) {
294                 int __irq = i + tps6586x->irq_base;
295                 irq_set_chip_data(__irq, tps6586x);
296                 irq_set_chip_and_handler(__irq, &tps6586x->irq_chip,
297                                          handle_simple_irq);
298                 irq_set_nested_thread(__irq, 1);
299 #ifdef CONFIG_ARM
300                 set_irq_flags(__irq, IRQF_VALID);
301 #endif
302         }
303
304         ret = request_threaded_irq(irq, NULL, tps6586x_irq, IRQF_ONESHOT,
305                                    "tps6586x", tps6586x);
306
307         if (!ret) {
308                 device_init_wakeup(tps6586x->dev, 1);
309                 enable_irq_wake(irq);
310         }
311
312         return ret;
313 }
314
315 static int __devinit tps6586x_add_subdevs(struct tps6586x *tps6586x,
316                                           struct tps6586x_platform_data *pdata)
317 {
318         struct tps6586x_subdev_info *subdev;
319         struct platform_device *pdev;
320         int i, ret = 0;
321
322         for (i = 0; i < pdata->num_subdevs; i++) {
323                 subdev = &pdata->subdevs[i];
324
325                 pdev = platform_device_alloc(subdev->name, subdev->id);
326                 if (!pdev) {
327                         ret = -ENOMEM;
328                         goto failed;
329                 }
330
331                 pdev->dev.parent = tps6586x->dev;
332                 pdev->dev.platform_data = subdev->platform_data;
333                 pdev->dev.of_node = subdev->of_node;
334
335                 ret = platform_device_add(pdev);
336                 if (ret) {
337                         platform_device_put(pdev);
338                         goto failed;
339                 }
340         }
341         return 0;
342
343 failed:
344         tps6586x_remove_subdevs(tps6586x);
345         return ret;
346 }
347
348 #ifdef CONFIG_OF
349 static struct of_regulator_match tps6586x_matches[] = {
350         { .name = "sys",     .driver_data = (void *)TPS6586X_ID_SYS     },
351         { .name = "sm0",     .driver_data = (void *)TPS6586X_ID_SM_0    },
352         { .name = "sm1",     .driver_data = (void *)TPS6586X_ID_SM_1    },
353         { .name = "sm2",     .driver_data = (void *)TPS6586X_ID_SM_2    },
354         { .name = "ldo0",    .driver_data = (void *)TPS6586X_ID_LDO_0   },
355         { .name = "ldo1",    .driver_data = (void *)TPS6586X_ID_LDO_1   },
356         { .name = "ldo2",    .driver_data = (void *)TPS6586X_ID_LDO_2   },
357         { .name = "ldo3",    .driver_data = (void *)TPS6586X_ID_LDO_3   },
358         { .name = "ldo4",    .driver_data = (void *)TPS6586X_ID_LDO_4   },
359         { .name = "ldo5",    .driver_data = (void *)TPS6586X_ID_LDO_5   },
360         { .name = "ldo6",    .driver_data = (void *)TPS6586X_ID_LDO_6   },
361         { .name = "ldo7",    .driver_data = (void *)TPS6586X_ID_LDO_7   },
362         { .name = "ldo8",    .driver_data = (void *)TPS6586X_ID_LDO_8   },
363         { .name = "ldo9",    .driver_data = (void *)TPS6586X_ID_LDO_9   },
364         { .name = "ldo_rtc", .driver_data = (void *)TPS6586X_ID_LDO_RTC },
365 };
366
367 static struct tps6586x_platform_data *tps6586x_parse_dt(struct i2c_client *client)
368 {
369         const unsigned int num = ARRAY_SIZE(tps6586x_matches);
370         struct device_node *np = client->dev.of_node;
371         struct tps6586x_platform_data *pdata;
372         struct tps6586x_subdev_info *devs;
373         struct device_node *regs;
374         const char *sys_rail_name = NULL;
375         unsigned int count;
376         unsigned int i, j;
377         int err;
378
379         regs = of_find_node_by_name(np, "regulators");
380         if (!regs)
381                 return NULL;
382
383         err = of_regulator_match(&client->dev, regs, tps6586x_matches, num);
384         if (err < 0) {
385                 of_node_put(regs);
386                 return NULL;
387         }
388
389         of_node_put(regs);
390         count = err;
391
392         devs = devm_kzalloc(&client->dev, count * sizeof(*devs), GFP_KERNEL);
393         if (!devs)
394                 return NULL;
395
396         for (i = 0, j = 0; i < num && j < count; i++) {
397                 struct regulator_init_data *reg_idata;
398
399                 if (!tps6586x_matches[i].init_data)
400                         continue;
401
402                 reg_idata  = tps6586x_matches[i].init_data;
403                 devs[j].name = "tps6586x-regulator";
404                 devs[j].platform_data = tps6586x_matches[i].init_data;
405                 devs[j].id = (int)tps6586x_matches[i].driver_data;
406                 if (devs[j].id == TPS6586X_ID_SYS)
407                         sys_rail_name = reg_idata->constraints.name;
408
409                 if ((devs[j].id == TPS6586X_ID_LDO_5) ||
410                         (devs[j].id == TPS6586X_ID_LDO_RTC))
411                         reg_idata->supply_regulator = sys_rail_name;
412
413                 devs[j].of_node = tps6586x_matches[i].of_node;
414                 j++;
415         }
416
417         pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
418         if (!pdata)
419                 return NULL;
420
421         pdata->num_subdevs = count;
422         pdata->subdevs = devs;
423         pdata->gpio_base = -1;
424         pdata->irq_base = -1;
425
426         return pdata;
427 }
428
429 static struct of_device_id tps6586x_of_match[] = {
430         { .compatible = "ti,tps6586x", },
431         { },
432 };
433 #else
434 static struct tps6586x_platform_data *tps6586x_parse_dt(struct i2c_client *client)
435 {
436         return NULL;
437 }
438 #endif
439
440 static bool is_volatile_reg(struct device *dev, unsigned int reg)
441 {
442         /* Cache all interrupt mask register */
443         if ((reg >= TPS6586X_INT_MASK1) && (reg <= TPS6586X_INT_MASK5))
444                 return false;
445
446         return true;
447 }
448
449 static const struct regmap_config tps6586x_regmap_config = {
450         .reg_bits = 8,
451         .val_bits = 8,
452         .max_register = TPS6586X_MAX_REGISTER - 1,
453         .volatile_reg = is_volatile_reg,
454         .cache_type = REGCACHE_RBTREE,
455 };
456
457 static int __devinit tps6586x_i2c_probe(struct i2c_client *client,
458                                         const struct i2c_device_id *id)
459 {
460         struct tps6586x_platform_data *pdata = client->dev.platform_data;
461         struct tps6586x *tps6586x;
462         int ret;
463
464         if (!pdata && client->dev.of_node)
465                 pdata = tps6586x_parse_dt(client);
466
467         if (!pdata) {
468                 dev_err(&client->dev, "tps6586x requires platform data\n");
469                 return -ENOTSUPP;
470         }
471
472         ret = i2c_smbus_read_byte_data(client, TPS6586X_VERSIONCRC);
473         if (ret < 0) {
474                 dev_err(&client->dev, "Chip ID read failed: %d\n", ret);
475                 return -EIO;
476         }
477
478         dev_info(&client->dev, "VERSIONCRC is %02x\n", ret);
479
480         tps6586x = devm_kzalloc(&client->dev, sizeof(*tps6586x), GFP_KERNEL);
481         if (tps6586x == NULL) {
482                 dev_err(&client->dev, "memory for tps6586x alloc failed\n");
483                 return -ENOMEM;
484         }
485
486         tps6586x->client = client;
487         tps6586x->dev = &client->dev;
488         i2c_set_clientdata(client, tps6586x);
489
490         tps6586x->regmap = devm_regmap_init_i2c(client,
491                                         &tps6586x_regmap_config);
492         if (IS_ERR(tps6586x->regmap)) {
493                 ret = PTR_ERR(tps6586x->regmap);
494                 dev_err(&client->dev, "regmap init failed: %d\n", ret);
495                 return ret;
496         }
497
498
499         if (client->irq) {
500                 ret = tps6586x_irq_init(tps6586x, client->irq,
501                                         pdata->irq_base);
502                 if (ret) {
503                         dev_err(&client->dev, "IRQ init failed: %d\n", ret);
504                         return ret;
505                 }
506         }
507
508         ret = mfd_add_devices(tps6586x->dev, -1,
509                               tps6586x_cell, ARRAY_SIZE(tps6586x_cell),
510                               NULL, 0, NULL);
511         if (ret < 0) {
512                 dev_err(&client->dev, "mfd_add_devices failed: %d\n", ret);
513                 goto err_mfd_add;
514         }
515
516         ret = tps6586x_add_subdevs(tps6586x, pdata);
517         if (ret) {
518                 dev_err(&client->dev, "add devices failed: %d\n", ret);
519                 goto err_add_devs;
520         }
521
522         return 0;
523
524 err_add_devs:
525         mfd_remove_devices(tps6586x->dev);
526 err_mfd_add:
527         if (client->irq)
528                 free_irq(client->irq, tps6586x);
529         return ret;
530 }
531
532 static int __devexit tps6586x_i2c_remove(struct i2c_client *client)
533 {
534         struct tps6586x *tps6586x = i2c_get_clientdata(client);
535
536         tps6586x_remove_subdevs(tps6586x);
537         mfd_remove_devices(tps6586x->dev);
538         if (client->irq)
539                 free_irq(client->irq, tps6586x);
540         return 0;
541 }
542
543 static const struct i2c_device_id tps6586x_id_table[] = {
544         { "tps6586x", 0 },
545         { },
546 };
547 MODULE_DEVICE_TABLE(i2c, tps6586x_id_table);
548
549 static struct i2c_driver tps6586x_driver = {
550         .driver = {
551                 .name   = "tps6586x",
552                 .owner  = THIS_MODULE,
553                 .of_match_table = of_match_ptr(tps6586x_of_match),
554         },
555         .probe          = tps6586x_i2c_probe,
556         .remove         = __devexit_p(tps6586x_i2c_remove),
557         .id_table       = tps6586x_id_table,
558 };
559
560 static int __init tps6586x_init(void)
561 {
562         return i2c_add_driver(&tps6586x_driver);
563 }
564 subsys_initcall(tps6586x_init);
565
566 static void __exit tps6586x_exit(void)
567 {
568         i2c_del_driver(&tps6586x_driver);
569 }
570 module_exit(tps6586x_exit);
571
572 MODULE_DESCRIPTION("TPS6586X core driver");
573 MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
574 MODULE_LICENSE("GPL");