OSDN Git Service

mfd: twl-core: Simplify IO wrapper functions by moving common code out
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Fri, 3 Jan 2014 13:27:46 +0000 (15:27 +0200)
committerLee Jones <lee.jones@linaro.org>
Wed, 8 Jan 2014 11:36:59 +0000 (11:36 +0000)
The new twl_get_regmap() function will return a pointer to the regmap needed
for the given module.

Since both read and write function were using the same code to do the lookup
we can reuse this in both places to simplify the code.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Acked-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
drivers/mfd/twl-core.c

index 29473c2..c91cb43 100644 (file)
@@ -302,35 +302,50 @@ unsigned int twl_rev(void)
 EXPORT_SYMBOL(twl_rev);
 
 /**
- * twl_i2c_write - Writes a n bit register in TWL4030/TWL5030/TWL60X0
+ * twl_get_regmap - Get the regmap associated with the given module
  * @mod_no: module number
- * @value: an array of num_bytes+1 containing data to write
- * @reg: register address (just offset will do)
- * @num_bytes: number of bytes to transfer
  *
- * Returns the result of operation - 0 is success
+ * Returns the regmap pointer or NULL in case of failure.
  */
-int twl_i2c_write(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes)
+static struct regmap *twl_get_regmap(u8 mod_no)
 {
-       int ret;
        int sid;
        struct twl_client *twl;
 
        if (unlikely(!twl_priv || !twl_priv->ready)) {
                pr_err("%s: not initialized\n", DRIVER_NAME);
-               return -EPERM;
+               return NULL;
        }
        if (unlikely(mod_no >= twl_get_last_module())) {
                pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no);
-               return -EPERM;
+               return NULL;
        }
 
        sid = twl_priv->twl_map[mod_no].sid;
        twl = &twl_priv->twl_modules[sid];
 
-       ret = regmap_bulk_write(twl->regmap,
-                               twl_priv->twl_map[mod_no].base + reg, value,
-                               num_bytes);
+       return twl->regmap;
+}
+
+/**
+ * twl_i2c_write - Writes a n bit register in TWL4030/TWL5030/TWL60X0
+ * @mod_no: module number
+ * @value: an array of num_bytes+1 containing data to write
+ * @reg: register address (just offset will do)
+ * @num_bytes: number of bytes to transfer
+ *
+ * Returns the result of operation - 0 is success
+ */
+int twl_i2c_write(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes)
+{
+       struct regmap *regmap = twl_get_regmap(mod_no);
+       int ret;
+
+       if (!regmap)
+               return -EPERM;
+
+       ret = regmap_bulk_write(regmap, twl_priv->twl_map[mod_no].base + reg,
+                               value, num_bytes);
 
        if (ret)
                pr_err("%s: Write failed (mod %d, reg 0x%02x count %d)\n",
@@ -351,25 +366,14 @@ EXPORT_SYMBOL(twl_i2c_write);
  */
 int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes)
 {
+       struct regmap *regmap = twl_get_regmap(mod_no);
        int ret;
-       int sid;
-       struct twl_client *twl;
 
-       if (unlikely(!twl_priv || !twl_priv->ready)) {
-               pr_err("%s: not initialized\n", DRIVER_NAME);
-               return -EPERM;
-       }
-       if (unlikely(mod_no >= twl_get_last_module())) {
-               pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no);
+       if (!regmap)
                return -EPERM;
-       }
-
-       sid = twl_priv->twl_map[mod_no].sid;
-       twl = &twl_priv->twl_modules[sid];
 
-       ret = regmap_bulk_read(twl->regmap,
-                              twl_priv->twl_map[mod_no].base + reg, value,
-                              num_bytes);
+       ret = regmap_bulk_read(regmap, twl_priv->twl_map[mod_no].base + reg,
+                              value, num_bytes);
 
        if (ret)
                pr_err("%s: Read failed (mod %d, reg 0x%02x count %d)\n",