4 * TPS65217 chip family multi-function driver
6 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation version 2.
12 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
13 * kind, whether express or implied; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
18 #include <linux/device.h>
19 #include <linux/err.h>
20 #include <linux/init.h>
21 #include <linux/interrupt.h>
22 #include <linux/i2c.h>
23 #include <linux/irq.h>
24 #include <linux/irqdomain.h>
25 #include <linux/kernel.h>
26 #include <linux/module.h>
28 #include <linux/of_device.h>
29 #include <linux/platform_device.h>
30 #include <linux/regmap.h>
31 #include <linux/slab.h>
33 #include <linux/mfd/core.h>
34 #include <linux/mfd/tps65217.h>
36 static struct resource charger_resources
[] = {
37 DEFINE_RES_IRQ_NAMED(TPS65217_IRQ_AC
, "AC"),
38 DEFINE_RES_IRQ_NAMED(TPS65217_IRQ_USB
, "USB"),
41 static struct resource pb_resources
[] = {
42 DEFINE_RES_IRQ_NAMED(TPS65217_IRQ_PB
, "PB"),
45 static void tps65217_irq_lock(struct irq_data
*data
)
47 struct tps65217
*tps
= irq_data_get_irq_chip_data(data
);
49 mutex_lock(&tps
->irq_lock
);
52 static void tps65217_irq_sync_unlock(struct irq_data
*data
)
54 struct tps65217
*tps
= irq_data_get_irq_chip_data(data
);
57 ret
= tps65217_set_bits(tps
, TPS65217_REG_INT
, TPS65217_INT_MASK
,
58 tps
->irq_mask
, TPS65217_PROTECT_NONE
);
60 dev_err(tps
->dev
, "Failed to sync IRQ masks\n");
62 mutex_unlock(&tps
->irq_lock
);
65 static void tps65217_irq_enable(struct irq_data
*data
)
67 struct tps65217
*tps
= irq_data_get_irq_chip_data(data
);
68 u8 mask
= BIT(data
->hwirq
) << TPS65217_INT_SHIFT
;
70 tps
->irq_mask
&= ~mask
;
73 static void tps65217_irq_disable(struct irq_data
*data
)
75 struct tps65217
*tps
= irq_data_get_irq_chip_data(data
);
76 u8 mask
= BIT(data
->hwirq
) << TPS65217_INT_SHIFT
;
78 tps
->irq_mask
|= mask
;
81 static struct irq_chip tps65217_irq_chip
= {
83 .irq_bus_lock
= tps65217_irq_lock
,
84 .irq_bus_sync_unlock
= tps65217_irq_sync_unlock
,
85 .irq_enable
= tps65217_irq_enable
,
86 .irq_disable
= tps65217_irq_disable
,
89 static struct mfd_cell tps65217s
[] = {
91 .name
= "tps65217-pmic",
92 .of_compatible
= "ti,tps65217-pmic",
95 .name
= "tps65217-bl",
96 .of_compatible
= "ti,tps65217-bl",
99 .name
= "tps65217-charger",
100 .num_resources
= ARRAY_SIZE(charger_resources
),
101 .resources
= charger_resources
,
102 .of_compatible
= "ti,tps65217-charger",
105 .name
= "tps65217-pwrbutton",
106 .num_resources
= ARRAY_SIZE(pb_resources
),
107 .resources
= pb_resources
,
108 .of_compatible
= "ti,tps65217-pwrbutton",
112 static irqreturn_t
tps65217_irq_thread(int irq
, void *data
)
114 struct tps65217
*tps
= data
;
116 bool handled
= false;
120 ret
= tps65217_reg_read(tps
, TPS65217_REG_INT
, &status
);
122 dev_err(tps
->dev
, "Failed to read IRQ status: %d\n",
127 for (i
= 0; i
< TPS65217_NUM_IRQ
; i
++) {
128 if (status
& BIT(i
)) {
129 handle_nested_irq(irq_find_mapping(tps
->irq_domain
, i
));
140 static int tps65217_irq_map(struct irq_domain
*h
, unsigned int virq
,
143 struct tps65217
*tps
= h
->host_data
;
145 irq_set_chip_data(virq
, tps
);
146 irq_set_chip_and_handler(virq
, &tps65217_irq_chip
, handle_edge_irq
);
147 irq_set_nested_thread(virq
, 1);
148 irq_set_parent(virq
, tps
->irq
);
149 irq_set_noprobe(virq
);
154 static const struct irq_domain_ops tps65217_irq_domain_ops
= {
155 .map
= tps65217_irq_map
,
158 static int tps65217_irq_init(struct tps65217
*tps
, int irq
)
162 mutex_init(&tps
->irq_lock
);
165 /* Mask all interrupt sources */
166 tps
->irq_mask
= TPS65217_INT_MASK
;
167 tps65217_set_bits(tps
, TPS65217_REG_INT
, TPS65217_INT_MASK
,
168 TPS65217_INT_MASK
, TPS65217_PROTECT_NONE
);
170 tps
->irq_domain
= irq_domain_add_linear(tps
->dev
->of_node
,
171 TPS65217_NUM_IRQ
, &tps65217_irq_domain_ops
, tps
);
172 if (!tps
->irq_domain
) {
173 dev_err(tps
->dev
, "Could not create IRQ domain\n");
177 ret
= devm_request_threaded_irq(tps
->dev
, irq
, NULL
,
178 tps65217_irq_thread
, IRQF_ONESHOT
,
179 "tps65217-irq", tps
);
181 dev_err(tps
->dev
, "Failed to request IRQ %d: %d\n",
186 enable_irq_wake(irq
);
192 * tps65217_reg_read: Read a single tps65217 register.
194 * @tps: Device to read from.
195 * @reg: Register to read.
196 * @val: Contians the value
198 int tps65217_reg_read(struct tps65217
*tps
, unsigned int reg
,
201 return regmap_read(tps
->regmap
, reg
, val
);
203 EXPORT_SYMBOL_GPL(tps65217_reg_read
);
206 * tps65217_reg_write: Write a single tps65217 register.
208 * @tps65217: Device to write to.
209 * @reg: Register to write to.
210 * @val: Value to write.
211 * @level: Password protected level
213 int tps65217_reg_write(struct tps65217
*tps
, unsigned int reg
,
214 unsigned int val
, unsigned int level
)
217 unsigned int xor_reg_val
;
220 case TPS65217_PROTECT_NONE
:
221 return regmap_write(tps
->regmap
, reg
, val
);
222 case TPS65217_PROTECT_L1
:
223 xor_reg_val
= reg
^ TPS65217_PASSWORD_REGS_UNLOCK
;
224 ret
= regmap_write(tps
->regmap
, TPS65217_REG_PASSWORD
,
229 return regmap_write(tps
->regmap
, reg
, val
);
230 case TPS65217_PROTECT_L2
:
231 xor_reg_val
= reg
^ TPS65217_PASSWORD_REGS_UNLOCK
;
232 ret
= regmap_write(tps
->regmap
, TPS65217_REG_PASSWORD
,
236 ret
= regmap_write(tps
->regmap
, reg
, val
);
239 ret
= regmap_write(tps
->regmap
, TPS65217_REG_PASSWORD
,
243 return regmap_write(tps
->regmap
, reg
, val
);
248 EXPORT_SYMBOL_GPL(tps65217_reg_write
);
251 * tps65217_update_bits: Modify bits w.r.t mask, val and level.
253 * @tps65217: Device to write to.
254 * @reg: Register to read-write to.
256 * @val: Value to write.
257 * @level: Password protected level
259 static int tps65217_update_bits(struct tps65217
*tps
, unsigned int reg
,
260 unsigned int mask
, unsigned int val
, unsigned int level
)
265 ret
= tps65217_reg_read(tps
, reg
, &data
);
267 dev_err(tps
->dev
, "Read from reg 0x%x failed\n", reg
);
274 ret
= tps65217_reg_write(tps
, reg
, data
, level
);
276 dev_err(tps
->dev
, "Write for reg 0x%x failed\n", reg
);
281 int tps65217_set_bits(struct tps65217
*tps
, unsigned int reg
,
282 unsigned int mask
, unsigned int val
, unsigned int level
)
284 return tps65217_update_bits(tps
, reg
, mask
, val
, level
);
286 EXPORT_SYMBOL_GPL(tps65217_set_bits
);
288 int tps65217_clear_bits(struct tps65217
*tps
, unsigned int reg
,
289 unsigned int mask
, unsigned int level
)
291 return tps65217_update_bits(tps
, reg
, mask
, 0, level
);
293 EXPORT_SYMBOL_GPL(tps65217_clear_bits
);
295 static bool tps65217_volatile_reg(struct device
*dev
, unsigned int reg
)
298 case TPS65217_REG_INT
:
305 static const struct regmap_config tps65217_regmap_config
= {
309 .max_register
= TPS65217_REG_MAX
,
310 .volatile_reg
= tps65217_volatile_reg
,
313 static const struct of_device_id tps65217_of_match
[] = {
314 { .compatible
= "ti,tps65217"},
317 MODULE_DEVICE_TABLE(of
, tps65217_of_match
);
319 static int tps65217_probe(struct i2c_client
*client
)
321 struct tps65217
*tps
;
322 unsigned int version
;
323 bool status_off
= false;
326 status_off
= of_property_read_bool(client
->dev
.of_node
,
327 "ti,pmic-shutdown-controller");
329 tps
= devm_kzalloc(&client
->dev
, sizeof(*tps
), GFP_KERNEL
);
333 i2c_set_clientdata(client
, tps
);
334 tps
->dev
= &client
->dev
;
336 tps
->regmap
= devm_regmap_init_i2c(client
, &tps65217_regmap_config
);
337 if (IS_ERR(tps
->regmap
)) {
338 ret
= PTR_ERR(tps
->regmap
);
339 dev_err(tps
->dev
, "Failed to allocate register map: %d\n",
345 tps65217_irq_init(tps
, client
->irq
);
349 /* Don't tell children about IRQ resources which won't fire */
350 for (i
= 0; i
< ARRAY_SIZE(tps65217s
); i
++)
351 tps65217s
[i
].num_resources
= 0;
354 ret
= devm_mfd_add_devices(tps
->dev
, -1, tps65217s
,
355 ARRAY_SIZE(tps65217s
), NULL
, 0,
358 dev_err(tps
->dev
, "mfd_add_devices failed: %d\n", ret
);
362 ret
= tps65217_reg_read(tps
, TPS65217_REG_CHIPID
, &version
);
364 dev_err(tps
->dev
, "Failed to read revision register: %d\n",
369 /* Set the PMIC to shutdown on PWR_EN toggle */
371 ret
= tps65217_set_bits(tps
, TPS65217_REG_STATUS
,
372 TPS65217_STATUS_OFF
, TPS65217_STATUS_OFF
,
373 TPS65217_PROTECT_NONE
);
375 dev_warn(tps
->dev
, "unable to set the status OFF\n");
378 dev_info(tps
->dev
, "TPS65217 ID %#x version 1.%d\n",
379 (version
& TPS65217_CHIPID_CHIP_MASK
) >> 4,
380 version
& TPS65217_CHIPID_REV_MASK
);
385 static int tps65217_remove(struct i2c_client
*client
)
387 struct tps65217
*tps
= i2c_get_clientdata(client
);
391 for (i
= 0; i
< TPS65217_NUM_IRQ
; i
++) {
392 virq
= irq_find_mapping(tps
->irq_domain
, i
);
394 irq_dispose_mapping(virq
);
397 irq_domain_remove(tps
->irq_domain
);
398 tps
->irq_domain
= NULL
;
403 static const struct i2c_device_id tps65217_id_table
[] = {
404 {"tps65217", TPS65217
},
407 MODULE_DEVICE_TABLE(i2c
, tps65217_id_table
);
409 static struct i2c_driver tps65217_driver
= {
412 .of_match_table
= tps65217_of_match
,
414 .id_table
= tps65217_id_table
,
415 .probe_new
= tps65217_probe
,
416 .remove
= tps65217_remove
,
419 static int __init
tps65217_init(void)
421 return i2c_add_driver(&tps65217_driver
);
423 subsys_initcall(tps65217_init
);
425 static void __exit
tps65217_exit(void)
427 i2c_del_driver(&tps65217_driver
);
429 module_exit(tps65217_exit
);
431 MODULE_AUTHOR("AnilKumar Ch <anilkumar@ti.com>");
432 MODULE_DESCRIPTION("TPS65217 chip family multi-function driver");
433 MODULE_LICENSE("GPL v2");