2 * drivers/mfd/rt5036-i2c.c
3 * Source file for Richtek RT5036
5 * Copyright (C) 2014 Richtek Technology Corp.
6 * 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; either version 2
11 * of the License, or (at your option) any later version.
14 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/init.h>
17 #include <linux/i2c.h>
18 #include <linux/mutex.h>
20 #include <linux/mfd/rt5036/rt5036.h>
22 static inline int rt5036_read_device(struct i2c_client *i2c,
23 int reg, int bytes, void *dest)
28 ret = i2c_smbus_read_i2c_block_data(i2c, reg, bytes, dest);
30 ret = i2c_smbus_read_byte_data(i2c, reg);
33 *(unsigned char *)dest = (unsigned char)ret;
38 int rt5036_reg_block_read(struct i2c_client *i2c,
39 int reg, int bytes, void *dest)
41 return rt5036_read_device(i2c, reg, bytes, dest);
43 EXPORT_SYMBOL(rt5036_reg_block_read);
45 static inline int rt5036_write_device(struct i2c_client *i2c,
46 int reg, int bytes, void *dest)
51 ret = i2c_smbus_write_i2c_block_data(i2c, reg, bytes, dest);
53 ret = i2c_smbus_write_byte_data(i2c, reg, *(u8 *) dest);
60 int rt5036_reg_block_write(struct i2c_client *i2c,
61 int reg, int bytes, void *dest)
63 return rt5036_write_device(i2c, reg, bytes, dest);
65 EXPORT_SYMBOL(rt5036_reg_block_write);
67 int rt5036_reg_read(struct i2c_client *i2c, int reg)
71 RTINFO("I2C Read (client : 0x%x) reg = 0x%x\n",
72 (unsigned int)i2c, (unsigned int)reg);
73 ret = i2c_smbus_read_byte_data(i2c, reg);
76 EXPORT_SYMBOL(rt5036_reg_read);
78 int rt5036_reg_write(struct i2c_client *i2c, int reg, unsigned char data)
82 RTINFO("I2C Write (client : 0x%x) reg = 0x%x, data = 0x%x\n",
83 (unsigned int)i2c, (unsigned int)reg, (unsigned int)data);
84 ret = i2c_smbus_write_byte_data(i2c, reg, data);
87 EXPORT_SYMBOL(rt5036_reg_write);
89 int rt5036_assign_bits(struct i2c_client *i2c, int reg,
90 unsigned char mask, unsigned char data)
95 ret = rt5036_read_device(i2c, reg, 1, &value);
100 value |= (data & mask);
101 ret = i2c_smbus_write_byte_data(i2c, reg, value);
105 EXPORT_SYMBOL(rt5036_assign_bits);
107 int rt5036_set_bits(struct i2c_client *i2c, int reg, unsigned char mask)
109 return rt5036_assign_bits(i2c, reg, mask, mask);
111 EXPORT_SYMBOL(rt5036_set_bits);
113 int rt5036_clr_bits(struct i2c_client *i2c, int reg, unsigned char mask)
115 return rt5036_assign_bits(i2c, reg, mask, 0);
117 EXPORT_SYMBOL(rt5036_clr_bits);
119 static int rt_parse_dt(struct rt5036_chip *chip, struct device *dev)
125 static int rt_parse_pdata(struct rt5036_chip *chip,
132 static int rt5036_i2c_probe(struct i2c_client *client,
133 const struct i2c_device_id *id)
135 struct rt5036_platform_data *pdata = client->dev.platform_data;
136 struct rt5036_chip *chip;
137 bool use_dt = client->dev.of_node;
140 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
145 mutex_init(&chip->io_lock);
146 i2c_set_clientdata(client, chip);
148 val = rt5036_reg_read(client, RT5036_REG_DEVID);
154 dev_err(&client->dev, "id 0x%02x is not correct\n",
159 val = rt5036_reg_read(client, RT5036_REG_ONOFFEVENT);
160 dev_info(&client->dev, "last onoff event %02x\n", val);
161 /*set ldo lsw vrc to default enable*/
162 rt5036_reg_write(client, 0x4D, 0xF0);
163 rt5036_reg_write(client, 0x7D, 0xF0);
164 rt5036_reg_write(client, 0x85, 0xCC);
168 rt_parse_dt(chip, &client->dev);
171 dev_err(&client->dev, "no platform data included\n");
175 rt_parse_pdata(chip, &client->dev);
178 ret = rt5036_core_init(&client->dev, pdata);
184 if (pdata && pdata->pre_init) {
185 ret = pdata->pre_init(chip);
187 dev_err(&client->dev, "pre_init() failed: %d\n", ret);
189 if (pdata && pdata->post_init) {
190 ret = pdata->post_init();
192 dev_err(&client->dev, "post_init() failed: %d\n", ret);
194 dev_info(&client->dev, "driver successfully loaded\n");
200 static int rt5036_i2c_remove(struct i2c_client *client)
203 rt5036_core_deinit(&client->dev);
207 static int rt5036_i2c_suspend(struct device *dev)
209 struct i2c_client *i2c = container_of(dev, struct i2c_client, dev);
210 struct rt5036_chip *chip = i2c_get_clientdata(i2c);
217 static int rt5036_i2c_resume(struct device *dev)
219 struct i2c_client *i2c = container_of(dev, struct i2c_client, dev);
220 struct rt5036_chip *chip = i2c_get_clientdata(i2c);
227 static const struct dev_pm_ops rt5036_pm_ops = {
228 .suspend = rt5036_i2c_suspend,
229 .resume = rt5036_i2c_resume,
232 static const struct i2c_device_id rt5036_id_table[] = {
233 {RT5036_DEV_NAME, 0},
236 MODULE_DEVICE_TABLE(i2c, rt5036_id_table);
238 static const struct of_device_id rt_match_table[] = {
239 {.compatible = "rt,rt5036",},
243 static struct i2c_driver rt5036_driver = {
245 .name = RT5036_DEV_NAME,
246 .owner = THIS_MODULE,
247 .pm = &rt5036_pm_ops,
248 .of_match_table = rt_match_table,
250 .probe = rt5036_i2c_probe,
251 .remove = rt5036_i2c_remove,
252 .id_table = rt5036_id_table,
255 static int __init rt5036_i2c_init(void)
257 return i2c_add_driver(&rt5036_driver);
259 subsys_initcall_sync(rt5036_i2c_init);
261 static void __exit rt5036_i2c_exit(void)
263 i2c_del_driver(&rt5036_driver);
265 module_exit(rt5036_i2c_exit);
267 MODULE_LICENSE("GPL");
268 MODULE_DESCRIPTION("I2C Driver for Richtek RT5036");
269 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com>");
270 MODULE_VERSION(RT5036_DRV_VER);