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 #define RTC_I2C_ADDR 0x68
18 #define ADC_I2C_ADDR 0x47
20 static inline int max8925_read_device(struct i2c_client
*i2c
,
21 int reg
, int bytes
, void *dest
)
26 ret
= i2c_smbus_read_i2c_block_data(i2c
, reg
, bytes
, dest
);
28 ret
= i2c_smbus_read_byte_data(i2c
, reg
);
31 *(unsigned char *)dest
= (unsigned char)ret
;
36 static inline int max8925_write_device(struct i2c_client
*i2c
,
37 int reg
, int bytes
, void *src
)
39 unsigned char buf
[bytes
+ 1];
42 buf
[0] = (unsigned char)reg
;
43 memcpy(&buf
[1], src
, bytes
);
45 ret
= i2c_master_send(i2c
, buf
, bytes
+ 1);
51 int max8925_reg_read(struct i2c_client
*i2c
, int reg
)
53 struct max8925_chip
*chip
= i2c_get_clientdata(i2c
);
54 unsigned char data
= 0;
57 mutex_lock(&chip
->io_lock
);
58 ret
= max8925_read_device(i2c
, reg
, 1, &data
);
59 mutex_unlock(&chip
->io_lock
);
66 EXPORT_SYMBOL(max8925_reg_read
);
68 int max8925_reg_write(struct i2c_client
*i2c
, int reg
,
71 struct max8925_chip
*chip
= i2c_get_clientdata(i2c
);
74 mutex_lock(&chip
->io_lock
);
75 ret
= max8925_write_device(i2c
, reg
, 1, &data
);
76 mutex_unlock(&chip
->io_lock
);
80 EXPORT_SYMBOL(max8925_reg_write
);
82 int max8925_bulk_read(struct i2c_client
*i2c
, int reg
,
83 int count
, unsigned char *buf
)
85 struct max8925_chip
*chip
= i2c_get_clientdata(i2c
);
88 mutex_lock(&chip
->io_lock
);
89 ret
= max8925_read_device(i2c
, reg
, count
, buf
);
90 mutex_unlock(&chip
->io_lock
);
94 EXPORT_SYMBOL(max8925_bulk_read
);
96 int max8925_bulk_write(struct i2c_client
*i2c
, int reg
,
97 int count
, unsigned char *buf
)
99 struct max8925_chip
*chip
= i2c_get_clientdata(i2c
);
102 mutex_lock(&chip
->io_lock
);
103 ret
= max8925_write_device(i2c
, reg
, count
, buf
);
104 mutex_unlock(&chip
->io_lock
);
108 EXPORT_SYMBOL(max8925_bulk_write
);
110 int max8925_set_bits(struct i2c_client
*i2c
, int reg
,
111 unsigned char mask
, unsigned char data
)
113 struct max8925_chip
*chip
= i2c_get_clientdata(i2c
);
117 mutex_lock(&chip
->io_lock
);
118 ret
= max8925_read_device(i2c
, reg
, 1, &value
);
123 ret
= max8925_write_device(i2c
, reg
, 1, &value
);
125 mutex_unlock(&chip
->io_lock
);
128 EXPORT_SYMBOL(max8925_set_bits
);
131 static const struct i2c_device_id max8925_id_table
[] = {
135 MODULE_DEVICE_TABLE(i2c
, max8925_id_table
);
137 static int __devinit
max8925_probe(struct i2c_client
*client
,
138 const struct i2c_device_id
*id
)
140 struct max8925_platform_data
*pdata
= client
->dev
.platform_data
;
141 static struct max8925_chip
*chip
;
144 pr_info("%s: platform data is missing\n", __func__
);
148 chip
= kzalloc(sizeof(struct max8925_chip
), GFP_KERNEL
);
152 chip
->dev
= &client
->dev
;
153 i2c_set_clientdata(client
, chip
);
154 dev_set_drvdata(chip
->dev
, chip
);
155 mutex_init(&chip
->io_lock
);
157 chip
->rtc
= i2c_new_dummy(chip
->i2c
->adapter
, RTC_I2C_ADDR
);
158 i2c_set_clientdata(chip
->rtc
, chip
);
160 chip
->adc
= i2c_new_dummy(chip
->i2c
->adapter
, ADC_I2C_ADDR
);
161 i2c_set_clientdata(chip
->adc
, chip
);
163 max8925_device_init(chip
, pdata
);
168 static int __devexit
max8925_remove(struct i2c_client
*client
)
170 struct max8925_chip
*chip
= i2c_get_clientdata(client
);
172 max8925_device_exit(chip
);
173 i2c_unregister_device(chip
->adc
);
174 i2c_unregister_device(chip
->rtc
);
175 i2c_set_clientdata(chip
->adc
, NULL
);
176 i2c_set_clientdata(chip
->rtc
, NULL
);
177 i2c_set_clientdata(chip
->i2c
, NULL
);
182 static struct i2c_driver max8925_driver
= {
185 .owner
= THIS_MODULE
,
187 .probe
= max8925_probe
,
188 .remove
= __devexit_p(max8925_remove
),
189 .id_table
= max8925_id_table
,
192 static int __init
max8925_i2c_init(void)
196 ret
= i2c_add_driver(&max8925_driver
);
198 pr_err("Failed to register MAX8925 I2C driver: %d\n", ret
);
201 subsys_initcall(max8925_i2c_init
);
203 static void __exit
max8925_i2c_exit(void)
205 i2c_del_driver(&max8925_driver
);
207 module_exit(max8925_i2c_exit
);
209 MODULE_DESCRIPTION("I2C Driver for Maxim 8925");
210 MODULE_AUTHOR("Haojian Zhuang <haojian.zhuang@marvell.com>");
211 MODULE_LICENSE("GPL");