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>
22 #include <linux/of_device.h>
23 #include <linux/mfd/core.h>
24 #include <linux/mfd/tps6507x.h>
26 static 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
,
87 const struct i2c_device_id
*id
)
89 struct tps6507x_dev
*tps6507x
;
91 tps6507x
= devm_kzalloc(&i2c
->dev
, sizeof(struct tps6507x_dev
),
96 i2c_set_clientdata(i2c
, tps6507x
);
97 tps6507x
->dev
= &i2c
->dev
;
98 tps6507x
->i2c_client
= i2c
;
99 tps6507x
->read_dev
= tps6507x_i2c_read_device
;
100 tps6507x
->write_dev
= tps6507x_i2c_write_device
;
102 return mfd_add_devices(tps6507x
->dev
, -1, tps6507x_devs
,
103 ARRAY_SIZE(tps6507x_devs
), NULL
, 0, NULL
);
106 static int tps6507x_i2c_remove(struct i2c_client
*i2c
)
108 struct tps6507x_dev
*tps6507x
= i2c_get_clientdata(i2c
);
110 mfd_remove_devices(tps6507x
->dev
);
114 static const struct i2c_device_id tps6507x_i2c_id
[] = {
118 MODULE_DEVICE_TABLE(i2c
, tps6507x_i2c_id
);
121 static struct of_device_id tps6507x_of_match
[] = {
122 {.compatible
= "ti,tps6507x", },
125 MODULE_DEVICE_TABLE(of
, tps6507x_of_match
);
128 static struct i2c_driver tps6507x_i2c_driver
= {
131 .owner
= THIS_MODULE
,
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");