1 /* drivers/mfd/rt5025-i2c.c
2 * I2C Driver for Richtek RT5025
3 * Multi function device - multi functional baseband PMIC
6 * Author: CY Huang <cy_huang@richtek.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/i2c.h>
16 #include <linux/slab.h>
17 #include <linux/mfd/rt5025.h>
19 #define ROCKCHIP_I2C_RATE (200*1000)
21 static inline int rt5025_read_device(struct i2c_client *i2c,
22 int reg, int bytes, void *dest)
26 unsigned char reg_addr = reg;
27 struct i2c_msg i2c_msg[2];
28 i2c_msg[0].addr = i2c->addr;
29 i2c_msg[0].flags = i2c->flags;
31 i2c_msg[0].buf = ®_addr;
32 i2c_msg[0].scl_rate = ROCKCHIP_I2C_RATE;
33 i2c_msg[1].addr = i2c->addr;
34 i2c_msg[1].flags = i2c->flags | I2C_M_RD;
35 i2c_msg[1].len = bytes;
36 i2c_msg[1].buf = dest;
37 i2c_msg[1].scl_rate = ROCKCHIP_I2C_RATE;
38 ret = i2c_transfer(i2c->adapter, i2c_msg, 2);
42 ret = i2c_smbus_read_i2c_block_data(i2c, reg, bytes, dest);
44 ret = i2c_smbus_read_byte_data(i2c, reg);
47 *(unsigned char *)dest = (unsigned char)ret;
53 int rt5025_reg_block_read(struct i2c_client *i2c, \
54 int reg, int bytes, void *dest)
56 return rt5025_read_device(i2c, reg, bytes, dest);
58 EXPORT_SYMBOL(rt5025_reg_block_read);
60 static inline int rt5025_write_device(struct i2c_client *i2c,
61 int reg, int bytes, void *dest)
65 struct i2c_msg i2c_msg;
66 char *tx_buf = (char*)kmalloc(bytes+1, GFP_KERNEL);
68 memcpy(tx_buf+1, dest, bytes);
69 i2c_msg.addr = i2c->addr;
70 i2c_msg.flags = i2c->flags;
71 i2c_msg.len = bytes + 1;
73 i2c_msg.scl_rate = ROCKCHIP_I2C_RATE;
74 ret = i2c_transfer(i2c->adapter, &i2c_msg, 1);
79 ret = i2c_smbus_write_i2c_block_data(i2c, reg, bytes, dest);
81 ret = i2c_smbus_write_byte_data(i2c, reg, dest);
84 *(unsigned char *)dest = (unsigned char)ret;
90 int rt5025_reg_block_write(struct i2c_client *i2c, \
91 int reg, int bytes, void *dest)
93 return rt5025_write_device(i2c, reg, bytes, dest);
95 EXPORT_SYMBOL(rt5025_reg_block_write);
97 int rt5025_reg_read(struct i2c_client *i2c, int reg)
99 struct rt5025_chip* chip = i2c_get_clientdata(i2c);
102 unsigned char reg_addr = reg;
103 unsigned char reg_data = 0;
104 struct i2c_msg i2c_msg[2];
105 RTINFO("I2C Read (client : 0x%x) reg = 0x%x\n",
106 (unsigned int)i2c,(unsigned int)reg);
107 mutex_lock(&chip->io_lock);
108 i2c_msg[0].addr = i2c->addr;
109 i2c_msg[0].flags = i2c->flags;
111 i2c_msg[0].buf = ®_addr;
112 i2c_msg[0].scl_rate = ROCKCHIP_I2C_RATE;
113 i2c_msg[1].addr = i2c->addr;
114 i2c_msg[1].flags = i2c->flags | I2C_M_RD;
116 i2c_msg[1].buf = ®_data;
117 i2c_msg[1].scl_rate = ROCKCHIP_I2C_RATE;
118 ret = i2c_transfer(i2c->adapter, i2c_msg, 2);
119 mutex_unlock(&chip->io_lock);
121 RTINFO("I2C Read (client : 0x%x) reg = 0x%x\n",
122 (unsigned int)i2c,(unsigned int)reg);
123 mutex_lock(&chip->io_lock);
124 ret = i2c_smbus_read_byte_data(i2c, reg);
125 mutex_unlock(&chip->io_lock);
129 EXPORT_SYMBOL(rt5025_reg_read);
131 int rt5025_reg_write(struct i2c_client *i2c, int reg, unsigned char data)
133 struct rt5025_chip* chip = i2c_get_clientdata(i2c);
136 unsigned char xfer_data[2];
137 struct i2c_msg i2c_msg;
138 RTINFO("I2C Write (client : 0x%x) reg = 0x%x, data = 0x%x\n",
139 (unsigned int)i2c,(unsigned int)reg,(unsigned int)data);
142 mutex_lock(&chip->io_lock);
143 i2c_msg.addr = i2c->addr;
144 i2c_msg.flags = i2c->flags;
146 i2c_msg.buf = xfer_data;
147 i2c_msg.scl_rate = ROCKCHIP_I2C_RATE;
148 ret = i2c_transfer(i2c->adapter, &i2c_msg, 1);
149 mutex_unlock(&chip->io_lock);
151 RTINFO("I2C Write (client : 0x%x) reg = 0x%x, data = 0x%x\n",
152 (unsigned int)i2c,(unsigned int)reg,(unsigned int)data);
153 mutex_lock(&chip->io_lock);
154 ret = i2c_smbus_write_byte_data(i2c, reg, data);
155 mutex_unlock(&chip->io_lock);
160 EXPORT_SYMBOL(rt5025_reg_write);
162 int rt5025_assign_bits(struct i2c_client *i2c, int reg,
163 unsigned char mask, unsigned char data)
165 struct rt5025_chip *chip = i2c_get_clientdata(i2c);
169 struct i2c_msg i2c_msg;
170 u8 xfer_data[2] = {0};
171 mutex_lock(&chip->io_lock);
172 ret = rt5025_read_device(i2c, reg, 1, &value);
177 value |= (data&mask);
179 xfer_data[1] = value;
180 i2c_msg.addr = i2c->addr;
181 i2c_msg.flags = i2c->flags;
183 i2c_msg.buf = xfer_data;
184 i2c_msg.scl_rate = ROCKCHIP_I2C_RATE;
185 ret = i2c_transfer(i2c->adapter, &i2c_msg, 1);
187 mutex_lock(&chip->io_lock);
189 ret = rt5025_read_device(i2c, reg, 1, &value);
194 value |= (data&mask);
195 ret = i2c_smbus_write_byte_data(i2c,reg,value);
198 mutex_unlock(&chip->io_lock);
201 EXPORT_SYMBOL(rt5025_assign_bits);
203 int rt5025_set_bits(struct i2c_client *i2c, int reg,
206 return rt5025_assign_bits(i2c,reg,mask,mask);
208 EXPORT_SYMBOL(rt5025_set_bits);
210 int rt5025_clr_bits(struct i2c_client *i2c, int reg,
213 return rt5025_assign_bits(i2c,reg,mask,0);
215 EXPORT_SYMBOL(rt5025_clr_bits);
217 static int __devinit rt5025_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
219 struct rt5025_platform_data *pdata = client->dev.platform_data;
220 struct rt5025_chip *chip;
227 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
231 chip->irq = client->irq;
233 chip->dev = &client->dev;
236 if (pdata->event_callback)
238 chip->event_callback = kzalloc(sizeof(struct rt5025_event_callback), GFP_KERNEL);
239 memcpy(chip->event_callback, pdata->event_callback, sizeof(struct rt5025_event_callback));
243 i2c_set_clientdata(client, chip);
244 mutex_init(&chip->io_lock);
246 rt5025_read_device(client,0x00,1,&val);
248 printk("The PMIC is not RT5025\n");
251 ret = rt5025_core_init(chip, pdata);
253 dev_err(chip->dev, "rt5025_core_init_fail\n");
255 pr_info("RT5025 Initialize successfully\n");
257 if (pdata && pdata->pre_init) {
258 ret = pdata->pre_init(chip);
260 dev_err(chip->dev, "pre_init() failed: %d\n", ret);
264 if (pdata && pdata->post_init) {
265 ret = pdata->post_init();
267 dev_err(chip->dev, "post_init() failed: %d\n", ret);
275 static int __devexit rt5025_i2c_remove(struct i2c_client *client)
277 struct rt5025_chip *chip = i2c_get_clientdata(client);
278 rt5025_core_deinit(chip);
280 if (chip->event_callback)
281 kfree(chip->event_callback);
287 static int rt5025_i2c_suspend(struct i2c_client *client, pm_message_t mesg)
289 struct rt5025_chip *chip = i2c_get_clientdata(client);
294 static int rt5025_i2c_resume(struct i2c_client *client)
296 struct rt5025_chip *chip = i2c_get_clientdata(client);
301 static const struct i2c_device_id rt5025_id_table[] = {
302 { RT5025_DEVICE_NAME, 0 },
305 MODULE_DEVICE_TABLE(i2c, rt5025_id_table);
307 static struct i2c_driver rt5025_driver = {
309 .name = RT5025_DEVICE_NAME,
310 .owner = THIS_MODULE,
312 .probe = rt5025_i2c_probe,
313 .remove = __devexit_p(rt5025_i2c_remove),
314 .suspend = rt5025_i2c_suspend,
315 .resume = rt5025_i2c_resume,
316 .id_table = rt5025_id_table,
319 static int __init rt5025_i2c_init(void)
323 ret = i2c_add_driver(&rt5025_driver);
325 pr_err("Failed to register RT5025 I2C driver: %d\n", ret);
328 subsys_initcall_sync(rt5025_i2c_init);
330 static void __exit rt5025_i2c_exit(void)
332 i2c_del_driver(&rt5025_driver);
334 module_exit(rt5025_i2c_exit);
336 MODULE_LICENSE("GPL v2");
337 MODULE_DESCRIPTION("I2C Driver for Richtek RT5025");
338 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com>");