regcache.c (c0cc6fe1d09e3f1baecbdf8922473c8e7d3a5317) regcache.c (f01ee60fffa4dc6c77122121233a793f7f696e67)
1/*
2 * Register cache access API
3 *
4 * Copyright 2011 Wolfson Microelectronics plc
5 *
6 * Author: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 45 unchanged lines hidden (view full) ---

54 map->reg_defaults_raw = tmp_buf;
55 map->cache_free = 1;
56 }
57
58 /* calculate the size of reg_defaults */
59 for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++) {
60 val = regcache_get_val(map->reg_defaults_raw,
61 i, map->cache_word_size);
1/*
2 * Register cache access API
3 *
4 * Copyright 2011 Wolfson Microelectronics plc
5 *
6 * Author: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 45 unchanged lines hidden (view full) ---

54 map->reg_defaults_raw = tmp_buf;
55 map->cache_free = 1;
56 }
57
58 /* calculate the size of reg_defaults */
59 for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++) {
60 val = regcache_get_val(map->reg_defaults_raw,
61 i, map->cache_word_size);
62 if (regmap_volatile(map, i))
62 if (regmap_volatile(map, i * map->reg_stride))
63 continue;
64 count++;
65 }
66
67 map->reg_defaults = kmalloc(count * sizeof(struct reg_default),
68 GFP_KERNEL);
69 if (!map->reg_defaults) {
70 ret = -ENOMEM;
71 goto err_free;
72 }
73
74 /* fill the reg_defaults */
75 map->num_reg_defaults = count;
76 for (i = 0, j = 0; i < map->num_reg_defaults_raw; i++) {
77 val = regcache_get_val(map->reg_defaults_raw,
78 i, map->cache_word_size);
63 continue;
64 count++;
65 }
66
67 map->reg_defaults = kmalloc(count * sizeof(struct reg_default),
68 GFP_KERNEL);
69 if (!map->reg_defaults) {
70 ret = -ENOMEM;
71 goto err_free;
72 }
73
74 /* fill the reg_defaults */
75 map->num_reg_defaults = count;
76 for (i = 0, j = 0; i < map->num_reg_defaults_raw; i++) {
77 val = regcache_get_val(map->reg_defaults_raw,
78 i, map->cache_word_size);
79 if (regmap_volatile(map, i))
79 if (regmap_volatile(map, i * map->reg_stride))
80 continue;
80 continue;
81 map->reg_defaults[j].reg = i;
81 map->reg_defaults[j].reg = i * map->reg_stride;
82 map->reg_defaults[j].def = val;
83 j++;
84 }
85
86 return 0;
87
88err_free:
89 if (map->cache_free)
90 kfree(map->reg_defaults_raw);
91
92 return ret;
93}
94
95int regcache_init(struct regmap *map, const struct regmap_config *config)
96{
97 int ret;
98 int i;
99 void *tmp_buf;
100
82 map->reg_defaults[j].def = val;
83 j++;
84 }
85
86 return 0;
87
88err_free:
89 if (map->cache_free)
90 kfree(map->reg_defaults_raw);
91
92 return ret;
93}
94
95int regcache_init(struct regmap *map, const struct regmap_config *config)
96{
97 int ret;
98 int i;
99 void *tmp_buf;
100
101 for (i = 0; i < config->num_reg_defaults; i++)
102 if (config->reg_defaults[i].reg % map->reg_stride)
103 return -EINVAL;
104
101 if (map->cache_type == REGCACHE_NONE) {
102 map->cache_bypass = true;
103 return 0;
104 }
105
106 for (i = 0; i < ARRAY_SIZE(cache_types); i++)
107 if (cache_types[i]->type == map->cache_type)
108 break;

--- 164 unchanged lines hidden (view full) ---

273 trace_regcache_sync(map->dev, name, "start");
274
275 if (!map->cache_dirty)
276 goto out;
277
278 /* Apply any patch first */
279 map->cache_bypass = 1;
280 for (i = 0; i < map->patch_regs; i++) {
105 if (map->cache_type == REGCACHE_NONE) {
106 map->cache_bypass = true;
107 return 0;
108 }
109
110 for (i = 0; i < ARRAY_SIZE(cache_types); i++)
111 if (cache_types[i]->type == map->cache_type)
112 break;

--- 164 unchanged lines hidden (view full) ---

277 trace_regcache_sync(map->dev, name, "start");
278
279 if (!map->cache_dirty)
280 goto out;
281
282 /* Apply any patch first */
283 map->cache_bypass = 1;
284 for (i = 0; i < map->patch_regs; i++) {
285 if (map->patch[i].reg % map->reg_stride) {
286 ret = -EINVAL;
287 goto out;
288 }
281 ret = _regmap_write(map, map->patch[i].reg, map->patch[i].def);
282 if (ret != 0) {
283 dev_err(map->dev, "Failed to write %x = %x: %d\n",
284 map->patch[i].reg, map->patch[i].def, ret);
285 goto out;
286 }
287 }
288 map->cache_bypass = 0;

--- 203 unchanged lines hidden ---
289 ret = _regmap_write(map, map->patch[i].reg, map->patch[i].def);
290 if (ret != 0) {
291 dev_err(map->dev, "Failed to write %x = %x: %d\n",
292 map->patch[i].reg, map->patch[i].def, ret);
293 goto out;
294 }
295 }
296 map->cache_bypass = 0;

--- 203 unchanged lines hidden ---