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/of_device.h>
24 #include <linux/mfd/core.h>
25 #include <linux/mfd/tps6507x.h>
27 static const struct mfd_cell tps6507x_devs
[] = {
29 .name
= "tps6507x-pmic",
32 .name
= "tps6507x-ts",
37 static int tps6507x_i2c_read_device(struct tps6507x_dev
*tps6507x
, char reg
,
38 int bytes
, void *dest
)
40 struct i2c_client
*i2c
= tps6507x
->i2c_client
;
41 struct i2c_msg xfer
[2];
45 xfer
[0].addr
= i2c
->addr
;
51 xfer
[1].addr
= i2c
->addr
;
52 xfer
[1].flags
= I2C_M_RD
;
56 ret
= i2c_transfer(i2c
->adapter
, xfer
, 2);
65 static int tps6507x_i2c_write_device(struct tps6507x_dev
*tps6507x
, char reg
,
68 struct i2c_client
*i2c
= tps6507x
->i2c_client
;
69 /* we add 1 byte for device register */
70 u8 msg
[TPS6507X_MAX_REGISTER
+ 1];
73 if (bytes
> TPS6507X_MAX_REGISTER
)
77 memcpy(&msg
[1], src
, bytes
);
79 ret
= i2c_master_send(i2c
, msg
, bytes
+ 1);
87 static int tps6507x_i2c_probe(struct i2c_client
*i2c
,
88 const struct i2c_device_id
*id
)
90 struct tps6507x_dev
*tps6507x
;
92 tps6507x
= devm_kzalloc(&i2c
->dev
, sizeof(struct tps6507x_dev
),
97 i2c_set_clientdata(i2c
, tps6507x
);
98 tps6507x
->dev
= &i2c
->dev
;
99 tps6507x
->i2c_client
= i2c
;
100 tps6507x
->read_dev
= tps6507x_i2c_read_device
;
101 tps6507x
->write_dev
= tps6507x_i2c_write_device
;
103 return mfd_add_devices(tps6507x
->dev
, -1, tps6507x_devs
,
104 ARRAY_SIZE(tps6507x_devs
), NULL
, 0, NULL
);
107 static int tps6507x_i2c_remove(struct i2c_client
*i2c
)
109 struct tps6507x_dev
*tps6507x
= i2c_get_clientdata(i2c
);
111 mfd_remove_devices(tps6507x
->dev
);
115 static const struct i2c_device_id tps6507x_i2c_id
[] = {
119 MODULE_DEVICE_TABLE(i2c
, tps6507x_i2c_id
);
122 static const struct of_device_id tps6507x_of_match
[] = {
123 {.compatible
= "ti,tps6507x", },
126 MODULE_DEVICE_TABLE(of
, tps6507x_of_match
);
129 static struct i2c_driver tps6507x_i2c_driver
= {
132 .of_match_table
= of_match_ptr(tps6507x_of_match
),
134 .probe
= tps6507x_i2c_probe
,
135 .remove
= tps6507x_i2c_remove
,
136 .id_table
= tps6507x_i2c_id
,
139 static int __init
tps6507x_i2c_init(void)
141 return i2c_add_driver(&tps6507x_i2c_driver
);
143 /* init early so consumer devices can complete system boot */
144 subsys_initcall(tps6507x_i2c_init
);
146 static void __exit
tps6507x_i2c_exit(void)
148 i2c_del_driver(&tps6507x_i2c_driver
);
150 module_exit(tps6507x_i2c_exit
);
152 MODULE_DESCRIPTION("TPS6507x chip family multi-function driver");
153 MODULE_LICENSE("GPL");