2 * I2C driver for Maxim MAX8925
4 * Copyright (C) 2009 Marvell International Ltd.
5 * Haojian Zhuang <haojian.zhuang@marvell.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/platform_device.h>
14 #include <linux/i2c.h>
15 #include <linux/mfd/max8925.h>
17 static inline int max8925_read_device(struct i2c_client *i2c,
18 int reg, int bytes, void *dest)
24 buf = kzalloc(bytes + 1, GFP_KERNEL);
28 data = (unsigned char)reg;
29 ret = i2c_master_send(i2c, &data, 1);
33 ret = i2c_master_recv(i2c, buf, bytes + 1);
36 memcpy(dest, buf, bytes);
40 static inline int max8925_write_device(struct i2c_client *i2c,
41 int reg, int bytes, void *src)
43 unsigned char buf[bytes + 1];
46 buf[0] = (unsigned char)reg;
47 memcpy(&buf[1], src, bytes);
49 ret = i2c_master_send(i2c, buf, bytes + 1);
55 int max8925_reg_read(struct i2c_client *i2c, int reg)
57 struct max8925_chip *chip = i2c_get_clientdata(i2c);
61 mutex_lock(&chip->io_lock);
62 ret = max8925_read_device(i2c, reg, 1, &data);
63 mutex_unlock(&chip->io_lock);
70 EXPORT_SYMBOL(max8925_reg_read);
72 int max8925_reg_write(struct i2c_client *i2c, int reg,
75 struct max8925_chip *chip = i2c_get_clientdata(i2c);
78 mutex_lock(&chip->io_lock);
79 ret = max8925_write_device(i2c, reg, 1, &data);
80 mutex_unlock(&chip->io_lock);
84 EXPORT_SYMBOL(max8925_reg_write);
86 int max8925_bulk_read(struct i2c_client *i2c, int reg,
87 int count, unsigned char *buf)
89 struct max8925_chip *chip = i2c_get_clientdata(i2c);
92 mutex_lock(&chip->io_lock);
93 ret = max8925_read_device(i2c, reg, count, buf);
94 mutex_unlock(&chip->io_lock);
98 EXPORT_SYMBOL(max8925_bulk_read);
100 int max8925_bulk_write(struct i2c_client *i2c, int reg,
101 int count, unsigned char *buf)
103 struct max8925_chip *chip = i2c_get_clientdata(i2c);
106 mutex_lock(&chip->io_lock);
107 ret = max8925_write_device(i2c, reg, count, buf);
108 mutex_unlock(&chip->io_lock);
112 EXPORT_SYMBOL(max8925_bulk_write);
114 int max8925_set_bits(struct i2c_client *i2c, int reg,
115 unsigned char mask, unsigned char data)
117 struct max8925_chip *chip = i2c_get_clientdata(i2c);
121 mutex_lock(&chip->io_lock);
122 ret = max8925_read_device(i2c, reg, 1, &value);
127 ret = max8925_write_device(i2c, reg, 1, &value);
129 mutex_unlock(&chip->io_lock);
132 EXPORT_SYMBOL(max8925_set_bits);
135 static const struct i2c_device_id max8925_id_table[] = {
139 MODULE_DEVICE_TABLE(i2c, max8925_id_table);
141 static int __devinit max8925_probe(struct i2c_client *client,
142 const struct i2c_device_id *id)
144 struct max8925_platform_data *pdata = client->dev.platform_data;
145 struct max8925_chip *chip;
148 pr_info("%s: platform data is missing\n", __func__);
151 if ((pdata->chip_id <= MAX8925_INVALID)
152 || (pdata->chip_id >= MAX8925_MAX)) {
153 pr_info("#%s: wrong chip identification\n", __func__);
157 chip = kzalloc(sizeof(struct max8925_chip), GFP_KERNEL);
161 chip->chip_id = pdata->chip_id;
162 i2c_set_clientdata(client, chip);
163 chip->dev = &client->dev;
164 mutex_init(&chip->io_lock);
165 dev_set_drvdata(chip->dev, chip);
166 max8925_device_init(chip, pdata);
171 static int __devexit max8925_remove(struct i2c_client *client)
173 struct max8925_chip *chip = i2c_get_clientdata(client);
175 max8925_device_exit(chip);
176 i2c_set_clientdata(client, NULL);
181 static struct i2c_driver max8925_driver = {
184 .owner = THIS_MODULE,
186 .probe = max8925_probe,
187 .remove = __devexit_p(max8925_remove),
188 .id_table = max8925_id_table,
191 static int __init max8925_i2c_init(void)
195 ret = i2c_add_driver(&max8925_driver);
197 pr_err("Failed to register MAX8925 I2C driver: %d\n", ret);
200 subsys_initcall(max8925_i2c_init);
202 static void __exit max8925_i2c_exit(void)
204 i2c_del_driver(&max8925_driver);
206 module_exit(max8925_i2c_exit);
208 MODULE_DESCRIPTION("I2C Driver for Maxim 8925");
209 MODULE_AUTHOR("Haojian Zhuang <haojian.zhuang@marvell.com>");
210 MODULE_LICENSE("GPL");