]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/mfd/max8998.c
tree-wide: fix comment/printk typos
[mirror_ubuntu-bionic-kernel.git] / drivers / mfd / max8998.c
index 49c140a78ba9b260491185c88458dea4bb1b5c61..bb9977bebe782d10103a9235bd9e513bb7201f66 100644 (file)
 #include <linux/mfd/max8998.h>
 #include <linux/mfd/max8998-private.h>
 
+#define RTC_I2C_ADDR           (0x0c >> 1)
+
 static struct mfd_cell max8998_devs[] = {
        {
                .name = "max8998-pmic",
-       }
+       }, {
+               .name = "max8998-rtc",
+       },
 };
 
 int max8998_read_reg(struct i2c_client *i2c, u8 reg, u8 *dest)
@@ -80,6 +84,21 @@ int max8998_write_reg(struct i2c_client *i2c, u8 reg, u8 value)
 }
 EXPORT_SYMBOL(max8998_write_reg);
 
+int max8998_bulk_write(struct i2c_client *i2c, u8 reg, int count, u8 *buf)
+{
+       struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
+       int ret;
+
+       mutex_lock(&max8998->iolock);
+       ret = i2c_smbus_write_i2c_block_data(i2c, reg, count, buf);
+       mutex_unlock(&max8998->iolock);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+EXPORT_SYMBOL(max8998_bulk_write);
+
 int max8998_update_reg(struct i2c_client *i2c, u8 reg, u8 val, u8 mask)
 {
        struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
@@ -91,8 +110,6 @@ int max8998_update_reg(struct i2c_client *i2c, u8 reg, u8 val, u8 mask)
                u8 old_val = ret & 0xff;
                u8 new_val = (val & mask) | (old_val & (~mask));
                ret = i2c_smbus_write_byte_data(i2c, reg, new_val);
-               if (ret >= 0)
-                       ret = 0;
        }
        mutex_unlock(&max8998->iolock);
        return ret;
@@ -114,12 +131,16 @@ static int max8998_i2c_probe(struct i2c_client *i2c,
        max8998->dev = &i2c->dev;
        max8998->i2c = i2c;
        max8998->irq = i2c->irq;
+       max8998->type = id->driver_data;
        if (pdata) {
                max8998->ono = pdata->ono;
                max8998->irq_base = pdata->irq_base;
        }
        mutex_init(&max8998->iolock);
 
+       max8998->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR);
+       i2c_set_clientdata(max8998->rtc, max8998);
+
        max8998_irq_init(max8998);
 
        ret = mfd_add_devices(max8998->dev, -1,
@@ -132,6 +153,8 @@ static int max8998_i2c_probe(struct i2c_client *i2c,
 
 err:
        mfd_remove_devices(max8998->dev);
+       max8998_irq_exit(max8998);
+       i2c_unregister_device(max8998->rtc);
        kfree(max8998);
        return ret;
 }
@@ -141,14 +164,16 @@ static int max8998_i2c_remove(struct i2c_client *i2c)
        struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
 
        mfd_remove_devices(max8998->dev);
+       max8998_irq_exit(max8998);
+       i2c_unregister_device(max8998->rtc);
        kfree(max8998);
 
        return 0;
 }
 
 static const struct i2c_device_id max8998_i2c_id[] = {
-       { "max8998", 0 },
-       { "lp3974", },
+       { "max8998", TYPE_MAX8998 },
+       { "lp3974", TYPE_LP3974},
        { }
 };
 MODULE_DEVICE_TABLE(i2c, max8998_i2c_id);