]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/mfd/max8925-i2c.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[mv-sheeva.git] / drivers / mfd / max8925-i2c.c
index 942068e730f9760476a94f79388bfb9312891796..d9fd8785da4d76a78a9e9a95661d1f93c7d46e72 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/i2c.h>
 #include <linux/mfd/max8925.h>
+#include <linux/slab.h>
+
+#define RTC_I2C_ADDR           0x68
+#define ADC_I2C_ADDR           0x47
 
 static inline int max8925_read_device(struct i2c_client *i2c,
                                      int reg, int bytes, void *dest)
 {
-       unsigned char data;
-       unsigned char *buf;
        int ret;
 
-       buf = kzalloc(bytes + 1, GFP_KERNEL);
-       if (!buf)
-               return -ENOMEM;
-
-       data = (unsigned char)reg;
-       ret = i2c_master_send(i2c, &data, 1);
-       if (ret < 0)
-               return ret;
-
-       ret = i2c_master_recv(i2c, buf, bytes + 1);
-       if (ret < 0)
-               return ret;
-       memcpy(dest, buf, bytes);
-       return 0;
+       if (bytes > 1)
+               ret = i2c_smbus_read_i2c_block_data(i2c, reg, bytes, dest);
+       else {
+               ret = i2c_smbus_read_byte_data(i2c, reg);
+               if (ret < 0)
+                       return ret;
+               *(unsigned char *)dest = (unsigned char)ret;
+       }
+       return ret;
 }
 
 static inline int max8925_write_device(struct i2c_client *i2c,
@@ -55,7 +52,7 @@ static inline int max8925_write_device(struct i2c_client *i2c,
 int max8925_reg_read(struct i2c_client *i2c, int reg)
 {
        struct max8925_chip *chip = i2c_get_clientdata(i2c);
-       unsigned char data;
+       unsigned char data = 0;
        int ret;
 
        mutex_lock(&chip->io_lock);
@@ -134,7 +131,7 @@ EXPORT_SYMBOL(max8925_set_bits);
 
 static const struct i2c_device_id max8925_id_table[] = {
        { "max8925", 0 },
-       {}
+       { },
 };
 MODULE_DEVICE_TABLE(i2c, max8925_id_table);
 
@@ -142,27 +139,28 @@ static int __devinit max8925_probe(struct i2c_client *client,
                                   const struct i2c_device_id *id)
 {
        struct max8925_platform_data *pdata = client->dev.platform_data;
-       struct max8925_chip *chip;
+       static struct max8925_chip *chip;
 
        if (!pdata) {
                pr_info("%s: platform data is missing\n", __func__);
                return -EINVAL;
        }
-       if ((pdata->chip_id <= MAX8925_INVALID)
-               || (pdata->chip_id >= MAX8925_MAX)) {
-               pr_info("#%s: wrong chip identification\n", __func__);
-               return -EINVAL;
-       }
 
        chip = kzalloc(sizeof(struct max8925_chip), GFP_KERNEL);
        if (chip == NULL)
                return -ENOMEM;
        chip->i2c = client;
-       chip->chip_id = pdata->chip_id;
-       i2c_set_clientdata(client, chip);
        chip->dev = &client->dev;
-       mutex_init(&chip->io_lock);
+       i2c_set_clientdata(client, chip);
        dev_set_drvdata(chip->dev, chip);
+       mutex_init(&chip->io_lock);
+
+       chip->rtc = i2c_new_dummy(chip->i2c->adapter, RTC_I2C_ADDR);
+       i2c_set_clientdata(chip->rtc, chip);
+
+       chip->adc = i2c_new_dummy(chip->i2c->adapter, ADC_I2C_ADDR);
+       i2c_set_clientdata(chip->adc, chip);
+
        max8925_device_init(chip, pdata);
 
        return 0;
@@ -173,7 +171,11 @@ static int __devexit max8925_remove(struct i2c_client *client)
        struct max8925_chip *chip = i2c_get_clientdata(client);
 
        max8925_device_exit(chip);
-       i2c_set_clientdata(client, NULL);
+       i2c_unregister_device(chip->adc);
+       i2c_unregister_device(chip->rtc);
+       i2c_set_clientdata(chip->adc, NULL);
+       i2c_set_clientdata(chip->rtc, NULL);
+       i2c_set_clientdata(chip->i2c, NULL);
        kfree(chip);
        return 0;
 }