Merge series "Use raw spinlocks in the ls-extirq driver" from Vladimir Oltean <vladim...
[platform/kernel/linux-rpi.git] / drivers / base / regmap / regmap.c
index d851070..21a0c25 100644 (file)
@@ -243,6 +243,16 @@ static void regmap_format_7_9_write(struct regmap *map,
        *out = cpu_to_be16((reg << 9) | val);
 }
 
+static void regmap_format_7_17_write(struct regmap *map,
+                                   unsigned int reg, unsigned int val)
+{
+       u8 *out = map->work_buf;
+
+       out[2] = val;
+       out[1] = val >> 8;
+       out[0] = (val >> 16) | (reg << 1);
+}
+
 static void regmap_format_10_14_write(struct regmap *map,
                                    unsigned int reg, unsigned int val)
 {
@@ -910,6 +920,9 @@ struct regmap *__regmap_init(struct device *dev,
                case 9:
                        map->format.format_write = regmap_format_7_9_write;
                        break;
+               case 17:
+                       map->format.format_write = regmap_format_7_17_write;
+                       break;
                default:
                        goto err_hwlock;
                }
@@ -1138,10 +1151,10 @@ skip_format_initialization:
                /* Make sure, that this register range has no selector
                   or data window within its boundary */
                for (j = 0; j < config->num_ranges; j++) {
-                       unsigned sel_reg = config->ranges[j].selector_reg;
-                       unsigned win_min = config->ranges[j].window_start;
-                       unsigned win_max = win_min +
-                                          config->ranges[j].window_len - 1;
+                       unsigned int sel_reg = config->ranges[j].selector_reg;
+                       unsigned int win_min = config->ranges[j].window_start;
+                       unsigned int win_max = win_min +
+                                              config->ranges[j].window_len - 1;
 
                        /* Allow data window inside its own virtual range */
                        if (j == i)
@@ -1310,7 +1323,7 @@ EXPORT_SYMBOL_GPL(devm_regmap_field_alloc);
  */
 int regmap_field_bulk_alloc(struct regmap *regmap,
                            struct regmap_field **rm_field,
-                           struct reg_field *reg_field,
+                           const struct reg_field *reg_field,
                            int num_fields)
 {
        struct regmap_field *rf;
@@ -1346,7 +1359,7 @@ EXPORT_SYMBOL_GPL(regmap_field_bulk_alloc);
 int devm_regmap_field_bulk_alloc(struct device *dev,
                                 struct regmap *regmap,
                                 struct regmap_field **rm_field,
-                                struct reg_field *reg_field,
+                                const struct reg_field *reg_field,
                                 int num_fields)
 {
        struct regmap_field *rf;
@@ -1521,6 +1534,8 @@ void regmap_exit(struct regmap *map)
                mutex_destroy(&map->mutex);
        kfree_const(map->name);
        kfree(map->patch);
+       if (map->bus && map->bus->free_on_exit)
+               kfree(map->bus);
        kfree(map);
 }
 EXPORT_SYMBOL_GPL(regmap_exit);
@@ -1677,7 +1692,7 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg,
                        if (ret) {
                                dev_err(map->dev,
                                        "Error in caching of register: %x ret: %d\n",
-                                       reg + i, ret);
+                                       reg + regmap_get_offset(map, i), ret);
                                return ret;
                        }
                }