]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
mfd: Append additional read write on 88pm860x
authorHaojian Zhuang <haojian.zhuang@marvell.com>
Mon, 7 Mar 2011 15:43:16 +0000 (23:43 +0800)
committerSamuel Ortiz <sameo@linux.intel.com>
Wed, 23 Mar 2011 09:42:07 +0000 (10:42 +0100)
Append the additional read/write operation on 88pm860x for accessing
test page in 88PM860x.

Signed-off-by: Haojian Zhuang <haojian.zhuang@marvell.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/88pm860x-i2c.c
include/linux/mfd/88pm860x.h

index bc02e6b21608be1ee4a0fcf4e52e3e6e7f383982..e017dc88622ada48f145457585e5fc376a6d155e 100644 (file)
@@ -126,6 +126,109 @@ out:
 }
 EXPORT_SYMBOL(pm860x_set_bits);
 
+int pm860x_page_reg_read(struct i2c_client *i2c, int reg)
+{
+       struct pm860x_chip *chip = i2c_get_clientdata(i2c);
+       unsigned char zero = 0;
+       unsigned char data;
+       int ret;
+
+       mutex_lock(&chip->io_lock);
+       pm860x_write_device(i2c, 0xFA, 0, &zero);
+       pm860x_write_device(i2c, 0xFB, 0, &zero);
+       pm860x_write_device(i2c, 0xFF, 0, &zero);
+       ret = pm860x_read_device(i2c, reg, 1, &data);
+       if (ret >= 0)
+               ret = (int)data;
+       pm860x_write_device(i2c, 0xFE, 0, &zero);
+       pm860x_write_device(i2c, 0xFC, 0, &zero);
+       mutex_unlock(&chip->io_lock);
+       return ret;
+}
+EXPORT_SYMBOL(pm860x_page_reg_read);
+
+int pm860x_page_reg_write(struct i2c_client *i2c, int reg,
+                         unsigned char data)
+{
+       struct pm860x_chip *chip = i2c_get_clientdata(i2c);
+       unsigned char zero;
+       int ret;
+
+       mutex_lock(&chip->io_lock);
+       pm860x_write_device(i2c, 0xFA, 0, &zero);
+       pm860x_write_device(i2c, 0xFB, 0, &zero);
+       pm860x_write_device(i2c, 0xFF, 0, &zero);
+       ret = pm860x_write_device(i2c, reg, 1, &data);
+       pm860x_write_device(i2c, 0xFE, 0, &zero);
+       pm860x_write_device(i2c, 0xFC, 0, &zero);
+       mutex_unlock(&chip->io_lock);
+       return ret;
+}
+EXPORT_SYMBOL(pm860x_page_reg_write);
+
+int pm860x_page_bulk_read(struct i2c_client *i2c, int reg,
+                         int count, unsigned char *buf)
+{
+       struct pm860x_chip *chip = i2c_get_clientdata(i2c);
+       unsigned char zero = 0;
+       int ret;
+
+       mutex_lock(&chip->io_lock);
+       pm860x_write_device(i2c, 0xFA, 0, &zero);
+       pm860x_write_device(i2c, 0xFB, 0, &zero);
+       pm860x_write_device(i2c, 0xFF, 0, &zero);
+       ret = pm860x_read_device(i2c, reg, count, buf);
+       pm860x_write_device(i2c, 0xFE, 0, &zero);
+       pm860x_write_device(i2c, 0xFC, 0, &zero);
+       mutex_unlock(&chip->io_lock);
+       return ret;
+}
+EXPORT_SYMBOL(pm860x_page_bulk_read);
+
+int pm860x_page_bulk_write(struct i2c_client *i2c, int reg,
+                          int count, unsigned char *buf)
+{
+       struct pm860x_chip *chip = i2c_get_clientdata(i2c);
+       unsigned char zero = 0;
+       int ret;
+
+       mutex_lock(&chip->io_lock);
+       pm860x_write_device(i2c, 0xFA, 0, &zero);
+       pm860x_write_device(i2c, 0xFB, 0, &zero);
+       pm860x_write_device(i2c, 0xFF, 0, &zero);
+       ret = pm860x_write_device(i2c, reg, count, buf);
+       pm860x_write_device(i2c, 0xFE, 0, &zero);
+       pm860x_write_device(i2c, 0xFC, 0, &zero);
+       mutex_unlock(&chip->io_lock);
+       return ret;
+}
+EXPORT_SYMBOL(pm860x_page_bulk_write);
+
+int pm860x_page_set_bits(struct i2c_client *i2c, int reg,
+                        unsigned char mask, unsigned char data)
+{
+       struct pm860x_chip *chip = i2c_get_clientdata(i2c);
+       unsigned char zero;
+       unsigned char value;
+       int ret;
+
+       mutex_lock(&chip->io_lock);
+       pm860x_write_device(i2c, 0xFA, 0, &zero);
+       pm860x_write_device(i2c, 0xFB, 0, &zero);
+       pm860x_write_device(i2c, 0xFF, 0, &zero);
+       ret = pm860x_read_device(i2c, reg, 1, &value);
+       if (ret < 0)
+               goto out;
+       value &= ~mask;
+       value |= data;
+       ret = pm860x_write_device(i2c, reg, 1, &value);
+out:
+       pm860x_write_device(i2c, 0xFE, 0, &zero);
+       pm860x_write_device(i2c, 0xFC, 0, &zero);
+       mutex_unlock(&chip->io_lock);
+       return ret;
+}
+EXPORT_SYMBOL(pm860x_page_set_bits);
 
 static const struct i2c_device_id pm860x_id_table[] = {
        { "88PM860x", 0 },
index a6f6f81efecea567dfbe5f7fd49dd231bb98bec1..8fba7972ff5f782f57c4db2609e70a847f308f89 100644 (file)
@@ -368,6 +368,14 @@ extern int pm860x_bulk_read(struct i2c_client *, int, int, unsigned char *);
 extern int pm860x_bulk_write(struct i2c_client *, int, int, unsigned char *);
 extern int pm860x_set_bits(struct i2c_client *, int, unsigned char,
                           unsigned char);
+extern int pm860x_page_reg_read(struct i2c_client *, int);
+extern int pm860x_page_reg_write(struct i2c_client *, int, unsigned char);
+extern int pm860x_page_bulk_read(struct i2c_client *, int, int,
+                                unsigned char *);
+extern int pm860x_page_bulk_write(struct i2c_client *, int, int,
+                                 unsigned char *);
+extern int pm860x_page_set_bits(struct i2c_client *, int, unsigned char,
+                               unsigned char);
 
 extern int pm860x_device_init(struct pm860x_chip *chip,
                              struct pm860x_platform_data *pdata) __devinit ;