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 static inline int rt5025_read_device(struct i2c_client *i2c,
20 int reg, int bytes, void *dest)
24 ret = i2c_smbus_read_i2c_block_data(i2c, reg, bytes, dest);
26 ret = i2c_smbus_read_byte_data(i2c, reg);
29 *(unsigned char *)dest = (unsigned char)ret;
35 int rt5025_reg_block_read(struct i2c_client *i2c, \
36 int reg, int bytes, void *dest)
38 return rt5025_read_device(i2c, reg, bytes, dest);
40 EXPORT_SYMBOL(rt5025_reg_block_read);
42 int rt5025_reg_read(struct i2c_client *i2c, int reg)
44 struct rt5025_chip* chip = i2c_get_clientdata(i2c);
46 RTINFO("I2C Read (client : 0x%x) reg = 0x%x\n",
47 (unsigned int)i2c,(unsigned int)reg);
48 mutex_lock(&chip->io_lock);
49 ret = i2c_smbus_read_byte_data(i2c, reg);
50 mutex_unlock(&chip->io_lock);
53 EXPORT_SYMBOL(rt5025_reg_read);
55 int rt5025_reg_write(struct i2c_client *i2c, int reg, unsigned char data)
57 struct rt5025_chip* chip = i2c_get_clientdata(i2c);
59 printk("%s,line=%d\n", __func__,__LINE__);
61 // RTINFO("I2C Write (client : 0x%x) reg = 0x%x, data = 0x%x\n",
62 // (unsigned int)i2c,(unsigned int)reg,(unsigned int)data);
63 mutex_lock(&chip->io_lock);
64 printk("%s,line=%d \n", __func__,__LINE__);
66 ret = i2c_smbus_write_byte_data(i2c, reg, data);
67 mutex_unlock(&chip->io_lock);
68 printk("%s,line=%d %d \n", __func__,__LINE__,ret);
72 EXPORT_SYMBOL(rt5025_reg_write);
74 int rt5025_reg_read(struct i2c_client *i2c, int reg)
76 struct i2c_adapter *adap;
77 struct i2c_msg msgs[2];
89 msgs[0].addr = i2c->addr;
91 msgs[0].flags = i2c->flags;
93 msgs[0].scl_rate = 200*1000;
96 msgs[1].addr = i2c->addr;
97 msgs[1].flags = i2c->flags | I2C_M_RD;
99 msgs[1].scl_rate = 200*1000;
100 ret = i2c_transfer(adap, msgs, 2);
102 // printk("***run in %s %d msgs[1].buf = %d\n",__FUNCTION__,__LINE__,*(msgs[1].buf));
106 EXPORT_SYMBOL(rt5025_reg_read);
108 int rt5025_reg_write(struct i2c_client *i2c, int reg, unsigned char data)
113 struct i2c_adapter *adap;
124 msg.addr = i2c->addr;
125 msg.buf = &tx_buf[0];
127 msg.flags = i2c->flags;
128 msg.scl_rate = 200*1000;
130 ret = i2c_transfer(adap, &msg, 1);
133 EXPORT_SYMBOL(rt5025_reg_write);
135 int rt5025_assign_bits(struct i2c_client *i2c, int reg,
136 unsigned char mask, unsigned char data)
138 struct rt5025_chip *chip = i2c_get_clientdata(i2c);
141 mutex_lock(&chip->io_lock);
143 ret = rt5025_read_device(i2c, reg, 1, &value);
148 value |= (data&mask);
149 ret = rt5025_reg_write(i2c,reg,value);
151 mutex_unlock(&chip->io_lock);
154 EXPORT_SYMBOL(rt5025_assign_bits);
156 int rt5025_set_bits(struct i2c_client *i2c, int reg,
159 return rt5025_assign_bits(i2c,reg,mask,mask);
161 EXPORT_SYMBOL(rt5025_set_bits);
163 int rt5025_clr_bits(struct i2c_client *i2c, int reg,
166 return rt5025_assign_bits(i2c,reg,mask,0);
168 EXPORT_SYMBOL(rt5025_clr_bits);
170 static int __devinit rt5025_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
172 struct rt5025_platform_data *pdata = client->dev.platform_data;
173 struct rt5025_chip *chip;
180 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
184 chip->irq = client->irq;
186 chip->dev = &client->dev;
189 if (pdata->event_callback)
191 chip->event_callback = kzalloc(sizeof(struct rt5025_event_callback), GFP_KERNEL);
192 memcpy(chip->event_callback, pdata->event_callback, sizeof(struct rt5025_event_callback));
196 i2c_set_clientdata(client, chip);
197 mutex_init(&chip->io_lock);
199 rt5025_read_device(client,0x00,1,&val);
201 printk("The PMIC is not RT5025\n");
204 ret = rt5025_core_init(chip, pdata);
206 dev_err(chip->dev, "rt5025_core_init_fail\n");
208 pr_info("RT5025 Initialize successfully\n");
210 if (pdata && pdata->pre_init) {
211 ret = pdata->pre_init(chip);
213 dev_err(chip->dev, "pre_init() failed: %d\n", ret);
217 if (pdata && pdata->post_init) {
218 ret = pdata->post_init();
220 dev_err(chip->dev, "post_init() failed: %d\n", ret);
228 static int __devexit rt5025_i2c_remove(struct i2c_client *client)
230 struct rt5025_chip *chip = i2c_get_clientdata(client);
231 rt5025_core_deinit(chip);
233 if (chip->event_callback)
234 kfree(chip->event_callback);a
240 static int rt5025_i2c_suspend(struct i2c_client *client, pm_message_t mesg)
242 struct rt5025_chip *chip = i2c_get_clientdata(client);
247 static int rt5025_i2c_resume(struct i2c_client *client)
249 struct rt5025_chip *chip = i2c_get_clientdata(client);
254 static const struct i2c_device_id rt5025_id_table[] = {
255 { RT5025_DEVICE_NAME, 0 },
258 MODULE_DEVICE_TABLE(i2c, rt5025_id_table);
260 static struct i2c_driver rt5025_driver = {
262 .name = RT5025_DEVICE_NAME,
263 .owner = THIS_MODULE,
265 .probe = rt5025_i2c_probe,
266 .remove = __devexit_p(rt5025_i2c_remove),
267 .suspend = rt5025_i2c_suspend,
268 .resume = rt5025_i2c_resume,
269 .id_table = rt5025_id_table,
272 static int __init rt5025_i2c_init(void)
276 ret = i2c_add_driver(&rt5025_driver);
278 pr_err("Failed to register RT5025 I2C driver: %d\n", ret);
281 subsys_initcall_sync(rt5025_i2c_init);
283 static void __exit rt5025_i2c_exit(void)
285 i2c_del_driver(&rt5025_driver);
287 module_exit(rt5025_i2c_exit);
289 MODULE_LICENSE("GPL v2");
290 MODULE_DESCRIPTION("I2C Driver for Richtek RT5025");
291 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com>");