Merge remote-tracking branch 'regmap/fix/raw' into regmap-linus
[cascardo/linux.git] / drivers / base / regmap / regcache.c
index 45ae91e..5c5090b 100644 (file)
@@ -100,15 +100,25 @@ int regcache_init(struct regmap *map, const struct regmap_config *config)
        int i;
        void *tmp_buf;
 
-       for (i = 0; i < config->num_reg_defaults; i++)
-               if (config->reg_defaults[i].reg % map->reg_stride)
-                       return -EINVAL;
-
        if (map->cache_type == REGCACHE_NONE) {
+               if (config->reg_defaults || config->num_reg_defaults_raw)
+                       dev_warn(map->dev,
+                                "No cache used with register defaults set!\n");
+
                map->cache_bypass = true;
                return 0;
        }
 
+       if (config->reg_defaults && !config->num_reg_defaults) {
+               dev_err(map->dev,
+                        "Register defaults are set without the number!\n");
+               return -EINVAL;
+       }
+
+       for (i = 0; i < config->num_reg_defaults; i++)
+               if (config->reg_defaults[i].reg % map->reg_stride)
+                       return -EINVAL;
+
        for (i = 0; i < ARRAY_SIZE(cache_types); i++)
                if (cache_types[i]->type == map->cache_type)
                        break;
@@ -138,8 +148,6 @@ int regcache_init(struct regmap *map, const struct regmap_config *config)
         * a copy of it.
         */
        if (config->reg_defaults) {
-               if (!map->num_reg_defaults)
-                       return -EINVAL;
                tmp_buf = kmemdup(config->reg_defaults, map->num_reg_defaults *
                                  sizeof(struct reg_default), GFP_KERNEL);
                if (!tmp_buf)
@@ -535,19 +543,30 @@ bool regcache_set_val(struct regmap *map, void *base, unsigned int idx,
        switch (map->cache_word_size) {
        case 1: {
                u8 *cache = base;
+
                cache[idx] = val;
                break;
        }
        case 2: {
                u16 *cache = base;
+
                cache[idx] = val;
                break;
        }
        case 4: {
                u32 *cache = base;
+
+               cache[idx] = val;
+               break;
+       }
+#ifdef CONFIG_64BIT
+       case 8: {
+               u64 *cache = base;
+
                cache[idx] = val;
                break;
        }
+#endif
        default:
                BUG();
        }
@@ -568,16 +587,26 @@ unsigned int regcache_get_val(struct regmap *map, const void *base,
        switch (map->cache_word_size) {
        case 1: {
                const u8 *cache = base;
+
                return cache[idx];
        }
        case 2: {
                const u16 *cache = base;
+
                return cache[idx];
        }
        case 4: {
                const u32 *cache = base;
+
+               return cache[idx];
+       }
+#ifdef CONFIG_64BIT
+       case 8: {
+               const u64 *cache = base;
+
                return cache[idx];
        }
+#endif
        default:
                BUG();
        }