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)
66 struct rt5025_chip *chip = i2c_get_clientdata(i2c);
69 RTINFO("I2C Read (client : 0x%x) reg = 0x%x\n",
70 (unsigned int) i2c, (unsigned int) reg);
71 mutex_lock(&chip->io_lock);
72 ret = i2c_smbus_read_byte_data(i2c, reg);
73 mutex_unlock(&chip->io_lock);
76 EXPORT_SYMBOL(rt5025_reg_read);
78 int rt5025_reg_write(struct i2c_client *i2c, int reg, unsigned char data)
80 struct rt5025_chip *chip = i2c_get_clientdata(i2c);
83 RTINFO("I2C Write (client : 0x%x) reg = 0x%x, data = 0x%x\n",
84 (unsigned int) i2c, (unsigned int) reg, (unsigned int) data);
85 mutex_lock(&chip->io_lock);
86 ret = i2c_smbus_write_byte_data(i2c, reg, data);
87 mutex_unlock(&chip->io_lock);
90 EXPORT_SYMBOL(rt5025_reg_write);
92 int rt5025_assign_bits(struct i2c_client *i2c, int reg,
93 unsigned char mask, unsigned char data)
95 struct rt5025_chip *chip = i2c_get_clientdata(i2c);
99 mutex_lock(&chip->io_lock);
101 ret = rt5025_read_device(i2c, reg, 1, &value);
106 value |= (data&mask);
107 ret = i2c_smbus_write_byte_data(i2c, reg, value);
109 mutex_unlock(&chip->io_lock);
112 EXPORT_SYMBOL(rt5025_assign_bits);
114 int rt5025_set_bits(struct i2c_client *i2c, int reg,
117 return rt5025_assign_bits(i2c, reg, mask, mask);
119 EXPORT_SYMBOL(rt5025_set_bits);
121 int rt5025_clr_bits(struct i2c_client *i2c, int reg,
124 return rt5025_assign_bits(i2c, reg, mask, 0);
126 EXPORT_SYMBOL(rt5025_clr_bits);
128 static int rt_parse_dt(struct rt5025_chip *chip, struct device *dev)
133 static int rt_parse_pdata(struct rt5025_chip *chip, struct device *dev)
138 static int rt5025_i2c_probe(struct i2c_client *client,
139 const struct i2c_device_id *id)
141 struct rt5025_platform_data *pdata = client->dev.platform_data;
142 struct rt5025_chip *chip;
143 bool use_dt = client->dev.of_node;
147 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
152 rt_parse_dt(chip, &client->dev);
158 rt_parse_pdata(chip, &client->dev);
162 chip->dev = &client->dev;
163 mutex_init(&chip->io_lock);
164 i2c_set_clientdata(client, chip);
166 rt5025_read_device(client, 0x20, 1, &val);
167 RTINFO("off event = %d\n", val);
169 rt5025_read_device(client, 0x00, 1, &val);
171 dev_info(&client->dev, "The PMIC is not RT5025\n");
175 ret = rt5025_core_init(chip, pdata);
177 dev_err(&client->dev, "rt5025_core_init_fail\n");
181 dev_info(&client->dev, "driver successfully probed\n");
182 if (pdata && pdata->pre_init) {
183 ret = pdata->pre_init(chip);
185 dev_err(chip->dev, "pre_init() failed: %d\n", ret);
188 if (pdata && pdata->post_init) {
189 ret = pdata->post_init();
191 dev_err(chip->dev, "post_init() failed: %d\n", ret);
199 static int rt5025_i2c_remove(struct i2c_client *client)
201 struct rt5025_chip *chip = i2c_get_clientdata(client);
203 rt5025_core_deinit(chip);
204 dev_info(&client->dev, "%s\n", __func__);
208 static int rt5025_i2c_suspend(struct i2c_client *client, pm_message_t mesg)
210 struct rt5025_chip *chip = i2c_get_clientdata(client);
217 static int rt5025_i2c_resume(struct i2c_client *client)
219 struct rt5025_chip *chip = i2c_get_clientdata(client);
226 static const struct i2c_device_id rt5025_id_table[] = {
227 { RT5025_DEV_NAME, 0 },
230 MODULE_DEVICE_TABLE(i2c, rt5025_id_table);
232 static struct of_device_id rt_match_table[] = {
233 { .compatible = "rt,rt5025",},
237 static struct i2c_driver rt5025_i2c_driver = {
239 .name = RT5025_DEV_NAME,
240 .owner = THIS_MODULE,
241 .of_match_table = rt_match_table,
243 .probe = rt5025_i2c_probe,
244 .remove = rt5025_i2c_remove,
245 .suspend = rt5025_i2c_suspend,
246 .resume = rt5025_i2c_resume,
247 .id_table = rt5025_id_table,
250 static int rt5025_i2c_init(void)
252 return i2c_add_driver(&rt5025_i2c_driver);
254 subsys_initcall_sync(rt5025_i2c_init);
256 static void rt5025_i2c_exit(void)
258 i2c_del_driver(&rt5025_i2c_driver);
260 module_exit(rt5025_i2c_exit);
262 MODULE_LICENSE("GPL");
263 MODULE_DESCRIPTION("I2C Driver for Richtek RT5025");
264 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com>");
265 MODULE_VERSION(RT5025_DRV_VER);