2 * tps6507x.c -- TPS6507x chip family multi-function driver
4 * Copyright (c) 2010 RidgeRun (todd.fischer@ridgerun.com)
7 * todd.fischer@ridgerun.com
11 * Using code from wm831x-*.c, wm8400-core, Wolfson Microelectronics PLC.
13 * For licencing details see kernel-base/COPYING
17 #include <linux/module.h>
18 #include <linux/moduleparam.h>
19 #include <linux/init.h>
20 #include <linux/slab.h>
21 #include <linux/i2c.h>
23 #include <linux/mfd/core.h>
24 #include <linux/mfd/tps6507x.h>
26 static const struct mfd_cell tps6507x_devs
[] = {
28 .name
= "tps6507x-pmic",
31 .name
= "tps6507x-ts",
36 static int tps6507x_i2c_read_device(struct tps6507x_dev
*tps6507x
, char reg
,
37 int bytes
, void *dest
)
39 struct i2c_client
*i2c
= tps6507x
->i2c_client
;
40 struct i2c_msg xfer
[2];
44 xfer
[0].addr
= i2c
->addr
;
50 xfer
[1].addr
= i2c
->addr
;
51 xfer
[1].flags
= I2C_M_RD
;
55 ret
= i2c_transfer(i2c
->adapter
, xfer
, 2);
64 static int tps6507x_i2c_write_device(struct tps6507x_dev
*tps6507x
, char reg
,
67 struct i2c_client
*i2c
= tps6507x
->i2c_client
;
68 /* we add 1 byte for device register */
69 u8 msg
[TPS6507X_MAX_REGISTER
+ 1];
72 if (bytes
> TPS6507X_MAX_REGISTER
)
76 memcpy(&msg
[1], src
, bytes
);
78 ret
= i2c_master_send(i2c
, msg
, bytes
+ 1);
86 static int tps6507x_i2c_probe(struct i2c_client
*i2c
)
88 struct tps6507x_dev
*tps6507x
;
90 tps6507x
= devm_kzalloc(&i2c
->dev
, sizeof(struct tps6507x_dev
),
95 i2c_set_clientdata(i2c
, tps6507x
);
96 tps6507x
->dev
= &i2c
->dev
;
97 tps6507x
->i2c_client
= i2c
;
98 tps6507x
->read_dev
= tps6507x_i2c_read_device
;
99 tps6507x
->write_dev
= tps6507x_i2c_write_device
;
101 return devm_mfd_add_devices(tps6507x
->dev
, -1, tps6507x_devs
,
102 ARRAY_SIZE(tps6507x_devs
), NULL
, 0, NULL
);
105 static const struct i2c_device_id tps6507x_i2c_id
[] = {
109 MODULE_DEVICE_TABLE(i2c
, tps6507x_i2c_id
);
112 static const struct of_device_id tps6507x_of_match
[] = {
113 {.compatible
= "ti,tps6507x", },
116 MODULE_DEVICE_TABLE(of
, tps6507x_of_match
);
119 static struct i2c_driver tps6507x_i2c_driver
= {
122 .of_match_table
= of_match_ptr(tps6507x_of_match
),
124 .probe
= tps6507x_i2c_probe
,
125 .id_table
= tps6507x_i2c_id
,
128 static int __init
tps6507x_i2c_init(void)
130 return i2c_add_driver(&tps6507x_i2c_driver
);
132 /* init early so consumer devices can complete system boot */
133 subsys_initcall(tps6507x_i2c_init
);
135 static void __exit
tps6507x_i2c_exit(void)
137 i2c_del_driver(&tps6507x_i2c_driver
);
139 module_exit(tps6507x_i2c_exit
);
141 MODULE_DESCRIPTION("TPS6507x chip family multi-function driver");
142 MODULE_LICENSE("GPL");