1 /* drivers/mfd/rt5025-i2c.c
2 * I2C Driver for Richtek RT5025
3 * Multi function device - multi functional baseband PMIC
5 * Copyright (C) 2014 Richtek Technology Corp.
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; 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/i2c.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)
25 ret = i2c_smbus_read_i2c_block_data(i2c, reg, bytes, dest);
27 ret = i2c_smbus_read_byte_data(i2c, reg);
30 *(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 static inline int rt5025_write_device(struct i2c_client *i2c,
43 int reg, int bytes, void *dest)
48 ret = i2c_smbus_write_i2c_block_data(i2c, reg, bytes, dest);
50 ret = i2c_smbus_write_byte_data(i2c, reg, *(u8 *)dest);
57 int rt5025_reg_block_write(struct i2c_client *i2c, \
58 int reg, int bytes, void *dest)
60 return rt5025_write_device(i2c, reg, bytes, dest);
62 EXPORT_SYMBOL(rt5025_reg_block_write);
64 int rt5025_reg_read(struct i2c_client *i2c, int reg)
68 RTINFO("I2C Read (client : 0x%x) reg = 0x%x\n",
69 (unsigned int) i2c, (unsigned int) reg);
70 ret = i2c_smbus_read_byte_data(i2c, reg);
73 EXPORT_SYMBOL(rt5025_reg_read);
75 int rt5025_reg_write(struct i2c_client *i2c, int reg, unsigned char data)
79 RTINFO("I2C Write (client : 0x%x) reg = 0x%x, data = 0x%x\n",
80 (unsigned int) i2c, (unsigned int) reg, (unsigned int) data);
81 ret = i2c_smbus_write_byte_data(i2c, reg, data);
84 EXPORT_SYMBOL(rt5025_reg_write);
86 int rt5025_assign_bits(struct i2c_client *i2c, int reg,
87 unsigned char mask, unsigned char data)
92 ret = rt5025_read_device(i2c, reg, 1, &value);
98 ret = i2c_smbus_write_byte_data(i2c, reg, value);
102 EXPORT_SYMBOL(rt5025_assign_bits);
104 int rt5025_set_bits(struct i2c_client *i2c, int reg,
107 return rt5025_assign_bits(i2c, reg, mask, mask);
109 EXPORT_SYMBOL(rt5025_set_bits);
111 int rt5025_clr_bits(struct i2c_client *i2c, int reg,
114 return rt5025_assign_bits(i2c, reg, mask, 0);
116 EXPORT_SYMBOL(rt5025_clr_bits);
118 static int rt_parse_dt(struct rt5025_chip *chip, struct device *dev)
123 static int rt_parse_pdata(struct rt5025_chip *chip, struct device *dev)
128 static int rt5025_i2c_probe(struct i2c_client *client,
129 const struct i2c_device_id *id)
131 struct rt5025_platform_data *pdata = client->dev.platform_data;
132 struct rt5025_chip *chip;
133 bool use_dt = client->dev.of_node;
137 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
142 rt_parse_dt(chip, &client->dev);
148 rt_parse_pdata(chip, &client->dev);
152 chip->dev = &client->dev;
153 mutex_init(&chip->io_lock);
154 i2c_set_clientdata(client, chip);
156 rt5025_read_device(client, 0x20, 1, &val);
157 RTINFO("off event = %d\n", val);
159 rt5025_read_device(client, 0x00, 1, &val);
161 dev_info(&client->dev, "The PMIC is not RT5025\n");
165 ret = rt5025_core_init(chip, pdata);
167 dev_err(&client->dev, "rt5025_core_init_fail\n");
171 dev_info(&client->dev, "driver successfully probed\n");
172 if (pdata && pdata->pre_init) {
173 ret = pdata->pre_init(chip);
175 dev_err(chip->dev, "pre_init() failed: %d\n", ret);
178 if (pdata && pdata->post_init) {
179 ret = pdata->post_init();
181 dev_err(chip->dev, "post_init() failed: %d\n", ret);
189 static int rt5025_i2c_remove(struct i2c_client *client)
191 struct rt5025_chip *chip = i2c_get_clientdata(client);
193 rt5025_core_deinit(chip);
194 dev_info(&client->dev, "%s\n", __func__);
198 static int rt5025_i2c_suspend(struct device *dev)
200 struct i2c_client *i2c = container_of(dev, struct i2c_client, dev);
201 struct rt5025_chip *chip = i2c_get_clientdata(i2c);
208 static int rt5025_i2c_resume(struct device *dev)
210 struct i2c_client *i2c = container_of(dev, struct i2c_client, dev);
211 struct rt5025_chip *chip = i2c_get_clientdata(i2c);
218 static const struct dev_pm_ops rt5025_pm_ops = {
219 .suspend = rt5025_i2c_suspend,
220 .resume = rt5025_i2c_resume,
223 static const struct i2c_device_id rt5025_id_table[] = {
224 { RT5025_DEV_NAME, 0 },
227 MODULE_DEVICE_TABLE(i2c, rt5025_id_table);
229 static struct of_device_id rt_match_table[] = {
230 { .compatible = "rt,rt5025",},
234 static struct i2c_driver rt5025_i2c_driver = {
236 .name = RT5025_DEV_NAME,
237 .owner = THIS_MODULE,
238 .pm = &rt5025_pm_ops,
239 .of_match_table = rt_match_table,
241 .probe = rt5025_i2c_probe,
242 .remove = rt5025_i2c_remove,
243 .id_table = rt5025_id_table,
246 static int rt5025_i2c_init(void)
248 return i2c_add_driver(&rt5025_i2c_driver);
250 subsys_initcall_sync(rt5025_i2c_init);
252 static void rt5025_i2c_exit(void)
254 i2c_del_driver(&rt5025_i2c_driver);
256 module_exit(rt5025_i2c_exit);
258 MODULE_LICENSE("GPL");
259 MODULE_DESCRIPTION("I2C Driver for Richtek RT5025");
260 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com>");
261 MODULE_VERSION(RT5025_DRV_VER);