2 * tps65910.c -- TI TPS6591x
4 * Copyright 2010 Texas Instruments Inc.
6 * Author: Graeme Gregory <gg@slimlogic.co.uk>
7 * Author: Jorge Eduardo Candelaria <jedu@slimlogic.co.uk>
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation; either version 2 of the License, or (at your
12 * option) any later version.
16 #include <linux/module.h>
17 #include <linux/moduleparam.h>
18 #include <linux/init.h>
19 #include <linux/err.h>
20 #include <linux/slab.h>
21 #include <linux/i2c.h>
22 #include <linux/gpio.h>
23 #include <linux/mfd/core.h>
24 #include <linux/regmap.h>
25 #include <linux/mfd/tps65910.h>
27 static struct mfd_cell tps65910s
[] = {
29 .name
= "tps65910-pmic",
32 .name
= "tps65910-rtc",
35 .name
= "tps65910-power",
40 static int tps65910_i2c_read(struct tps65910
*tps65910
, u8 reg
,
41 int bytes
, void *dest
)
43 return regmap_bulk_read(tps65910
->regmap
, reg
, dest
, bytes
);
46 static int tps65910_i2c_write(struct tps65910
*tps65910
, u8 reg
,
49 return regmap_bulk_write(tps65910
->regmap
, reg
, src
, bytes
);
52 int tps65910_set_bits(struct tps65910
*tps65910
, u8 reg
, u8 mask
)
54 return regmap_update_bits(tps65910
->regmap
, reg
, mask
, mask
);
56 EXPORT_SYMBOL_GPL(tps65910_set_bits
);
58 int tps65910_clear_bits(struct tps65910
*tps65910
, u8 reg
, u8 mask
)
60 return regmap_update_bits(tps65910
->regmap
, reg
, mask
, 0);
62 EXPORT_SYMBOL_GPL(tps65910_clear_bits
);
64 static bool is_volatile_reg(struct device
*dev
, unsigned int reg
)
66 struct tps65910
*tps65910
= dev_get_drvdata(dev
);
69 * Caching all regulator registers.
70 * All regualator register address range is same for
71 * TPS65910 and TPS65911
73 if ((reg
>= TPS65910_VIO
) && (reg
<= TPS65910_VDAC
)) {
74 /* Check for non-existing register */
75 if (tps65910_chip_id(tps65910
) == TPS65910
)
76 if ((reg
== TPS65911_VDDCTRL_OP
) ||
77 (reg
== TPS65911_VDDCTRL_SR
))
84 static const struct regmap_config tps65910_regmap_config
= {
87 .volatile_reg
= is_volatile_reg
,
88 .max_register
= TPS65910_MAX_REGISTER
,
89 .num_reg_defaults_raw
= TPS65910_MAX_REGISTER
,
90 .cache_type
= REGCACHE_RBTREE
,
93 static int tps65910_i2c_probe(struct i2c_client
*i2c
,
94 const struct i2c_device_id
*id
)
96 struct tps65910
*tps65910
;
97 struct tps65910_board
*pmic_plat_data
;
98 struct tps65910_platform_data
*init_data
;
101 pmic_plat_data
= dev_get_platdata(&i2c
->dev
);
105 init_data
= kzalloc(sizeof(struct tps65910_platform_data
), GFP_KERNEL
);
106 if (init_data
== NULL
)
109 tps65910
= kzalloc(sizeof(struct tps65910
), GFP_KERNEL
);
110 if (tps65910
== NULL
) {
115 i2c_set_clientdata(i2c
, tps65910
);
116 tps65910
->dev
= &i2c
->dev
;
117 tps65910
->i2c_client
= i2c
;
118 tps65910
->id
= id
->driver_data
;
119 tps65910
->read
= tps65910_i2c_read
;
120 tps65910
->write
= tps65910_i2c_write
;
121 mutex_init(&tps65910
->io_mutex
);
123 tps65910
->regmap
= regmap_init_i2c(i2c
, &tps65910_regmap_config
);
124 if (IS_ERR(tps65910
->regmap
)) {
125 ret
= PTR_ERR(tps65910
->regmap
);
126 dev_err(&i2c
->dev
, "regmap initialization failed: %d\n", ret
);
130 ret
= mfd_add_devices(tps65910
->dev
, -1,
131 tps65910s
, ARRAY_SIZE(tps65910s
),
136 init_data
->irq
= pmic_plat_data
->irq
;
137 init_data
->irq_base
= pmic_plat_data
->irq_base
;
139 tps65910_gpio_init(tps65910
, pmic_plat_data
->gpio_base
);
141 tps65910_irq_init(tps65910
, init_data
->irq
, init_data
);
147 regmap_exit(tps65910
->regmap
);
154 static int tps65910_i2c_remove(struct i2c_client
*i2c
)
156 struct tps65910
*tps65910
= i2c_get_clientdata(i2c
);
158 tps65910_irq_exit(tps65910
);
159 mfd_remove_devices(tps65910
->dev
);
160 regmap_exit(tps65910
->regmap
);
166 static const struct i2c_device_id tps65910_i2c_id
[] = {
167 { "tps65910", TPS65910
},
168 { "tps65911", TPS65911
},
171 MODULE_DEVICE_TABLE(i2c
, tps65910_i2c_id
);
174 static struct i2c_driver tps65910_i2c_driver
= {
177 .owner
= THIS_MODULE
,
179 .probe
= tps65910_i2c_probe
,
180 .remove
= tps65910_i2c_remove
,
181 .id_table
= tps65910_i2c_id
,
184 static int __init
tps65910_i2c_init(void)
186 return i2c_add_driver(&tps65910_i2c_driver
);
188 /* init early so consumer devices can complete system boot */
189 subsys_initcall(tps65910_i2c_init
);
191 static void __exit
tps65910_i2c_exit(void)
193 i2c_del_driver(&tps65910_i2c_driver
);
195 module_exit(tps65910_i2c_exit
);
197 MODULE_AUTHOR("Graeme Gregory <gg@slimlogic.co.uk>");
198 MODULE_AUTHOR("Jorge Eduardo Candelaria <jedu@slimlogic.co.uk>");
199 MODULE_DESCRIPTION("TPS6591x chip family multi-function driver");
200 MODULE_LICENSE("GPL");