]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/base/regmap/regcache.c
regmap: rbtree: Reduce number of nodes, take 2
[karo-tx-linux.git] / drivers / base / regmap / regcache.c
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
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12
13 #include <linux/slab.h>
14 #include <linux/export.h>
15 #include <linux/device.h>
16 #include <trace/events/regmap.h>
17 #include <linux/bsearch.h>
18 #include <linux/sort.h>
19
20 #include "internal.h"
21
22 static const struct regcache_ops *cache_types[] = {
23         &regcache_rbtree_ops,
24         &regcache_lzo_ops,
25         &regcache_flat_ops,
26 };
27
28 static int regcache_hw_init(struct regmap *map)
29 {
30         int i, j;
31         int ret;
32         int count;
33         unsigned int val;
34         void *tmp_buf;
35
36         if (!map->num_reg_defaults_raw)
37                 return -EINVAL;
38
39         if (!map->reg_defaults_raw) {
40                 u32 cache_bypass = map->cache_bypass;
41                 dev_warn(map->dev, "No cache defaults, reading back from HW\n");
42
43                 /* Bypass the cache access till data read from HW*/
44                 map->cache_bypass = 1;
45                 tmp_buf = kmalloc(map->cache_size_raw, GFP_KERNEL);
46                 if (!tmp_buf)
47                         return -EINVAL;
48                 ret = regmap_raw_read(map, 0, tmp_buf,
49                                       map->num_reg_defaults_raw);
50                 map->cache_bypass = cache_bypass;
51                 if (ret < 0) {
52                         kfree(tmp_buf);
53                         return ret;
54                 }
55                 map->reg_defaults_raw = tmp_buf;
56                 map->cache_free = 1;
57         }
58
59         /* calculate the size of reg_defaults */
60         for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++) {
61                 val = regcache_get_val(map, map->reg_defaults_raw, 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, map->reg_defaults_raw, i);
78                 if (regmap_volatile(map, i * map->reg_stride))
79                         continue;
80                 map->reg_defaults[j].reg = i * map->reg_stride;
81                 map->reg_defaults[j].def = val;
82                 j++;
83         }
84
85         return 0;
86
87 err_free:
88         if (map->cache_free)
89                 kfree(map->reg_defaults_raw);
90
91         return ret;
92 }
93
94 int regcache_init(struct regmap *map, const struct regmap_config *config)
95 {
96         int ret;
97         int i;
98         void *tmp_buf;
99
100         for (i = 0; i < config->num_reg_defaults; i++)
101                 if (config->reg_defaults[i].reg % map->reg_stride)
102                         return -EINVAL;
103
104         if (map->cache_type == REGCACHE_NONE) {
105                 map->cache_bypass = true;
106                 return 0;
107         }
108
109         for (i = 0; i < ARRAY_SIZE(cache_types); i++)
110                 if (cache_types[i]->type == map->cache_type)
111                         break;
112
113         if (i == ARRAY_SIZE(cache_types)) {
114                 dev_err(map->dev, "Could not match compress type: %d\n",
115                         map->cache_type);
116                 return -EINVAL;
117         }
118
119         map->num_reg_defaults = config->num_reg_defaults;
120         map->num_reg_defaults_raw = config->num_reg_defaults_raw;
121         map->reg_defaults_raw = config->reg_defaults_raw;
122         map->cache_word_size = DIV_ROUND_UP(config->val_bits, 8);
123         map->cache_size_raw = map->cache_word_size * config->num_reg_defaults_raw;
124         map->cache_present = NULL;
125         map->cache_present_nbits = 0;
126
127         map->cache = NULL;
128         map->cache_ops = cache_types[i];
129
130         if (!map->cache_ops->read ||
131             !map->cache_ops->write ||
132             !map->cache_ops->name)
133                 return -EINVAL;
134
135         /* We still need to ensure that the reg_defaults
136          * won't vanish from under us.  We'll need to make
137          * a copy of it.
138          */
139         if (config->reg_defaults) {
140                 if (!map->num_reg_defaults)
141                         return -EINVAL;
142                 tmp_buf = kmemdup(config->reg_defaults, map->num_reg_defaults *
143                                   sizeof(struct reg_default), GFP_KERNEL);
144                 if (!tmp_buf)
145                         return -ENOMEM;
146                 map->reg_defaults = tmp_buf;
147         } else if (map->num_reg_defaults_raw) {
148                 /* Some devices such as PMICs don't have cache defaults,
149                  * we cope with this by reading back the HW registers and
150                  * crafting the cache defaults by hand.
151                  */
152                 ret = regcache_hw_init(map);
153                 if (ret < 0)
154                         return ret;
155         }
156
157         if (!map->max_register)
158                 map->max_register = map->num_reg_defaults_raw;
159
160         if (map->cache_ops->init) {
161                 dev_dbg(map->dev, "Initializing %s cache\n",
162                         map->cache_ops->name);
163                 ret = map->cache_ops->init(map);
164                 if (ret)
165                         goto err_free;
166         }
167         return 0;
168
169 err_free:
170         kfree(map->reg_defaults);
171         if (map->cache_free)
172                 kfree(map->reg_defaults_raw);
173
174         return ret;
175 }
176
177 void regcache_exit(struct regmap *map)
178 {
179         if (map->cache_type == REGCACHE_NONE)
180                 return;
181
182         BUG_ON(!map->cache_ops);
183
184         kfree(map->cache_present);
185         kfree(map->reg_defaults);
186         if (map->cache_free)
187                 kfree(map->reg_defaults_raw);
188
189         if (map->cache_ops->exit) {
190                 dev_dbg(map->dev, "Destroying %s cache\n",
191                         map->cache_ops->name);
192                 map->cache_ops->exit(map);
193         }
194 }
195
196 /**
197  * regcache_read: Fetch the value of a given register from the cache.
198  *
199  * @map: map to configure.
200  * @reg: The register index.
201  * @value: The value to be returned.
202  *
203  * Return a negative value on failure, 0 on success.
204  */
205 int regcache_read(struct regmap *map,
206                   unsigned int reg, unsigned int *value)
207 {
208         int ret;
209
210         if (map->cache_type == REGCACHE_NONE)
211                 return -ENOSYS;
212
213         BUG_ON(!map->cache_ops);
214
215         if (!regmap_volatile(map, reg)) {
216                 ret = map->cache_ops->read(map, reg, value);
217
218                 if (ret == 0)
219                         trace_regmap_reg_read_cache(map->dev, reg, *value);
220
221                 return ret;
222         }
223
224         return -EINVAL;
225 }
226
227 /**
228  * regcache_write: Set the value of a given register in the cache.
229  *
230  * @map: map to configure.
231  * @reg: The register index.
232  * @value: The new register value.
233  *
234  * Return a negative value on failure, 0 on success.
235  */
236 int regcache_write(struct regmap *map,
237                    unsigned int reg, unsigned int value)
238 {
239         if (map->cache_type == REGCACHE_NONE)
240                 return 0;
241
242         BUG_ON(!map->cache_ops);
243
244         if (!regmap_volatile(map, reg))
245                 return map->cache_ops->write(map, reg, value);
246
247         return 0;
248 }
249
250 static int regcache_default_sync(struct regmap *map, unsigned int min,
251                                  unsigned int max)
252 {
253         unsigned int reg;
254
255         for (reg = min; reg <= max; reg++) {
256                 unsigned int val;
257                 int ret;
258
259                 if (regmap_volatile(map, reg))
260                         continue;
261
262                 ret = regcache_read(map, reg, &val);
263                 if (ret)
264                         return ret;
265
266                 /* Is this the hardware default?  If so skip. */
267                 ret = regcache_lookup_reg(map, reg);
268                 if (ret >= 0 && val == map->reg_defaults[ret].def)
269                         continue;
270
271                 map->cache_bypass = 1;
272                 ret = _regmap_write(map, reg, val);
273                 map->cache_bypass = 0;
274                 if (ret)
275                         return ret;
276                 dev_dbg(map->dev, "Synced register %#x, value %#x\n", reg, val);
277         }
278
279         return 0;
280 }
281
282 /**
283  * regcache_sync: Sync the register cache with the hardware.
284  *
285  * @map: map to configure.
286  *
287  * Any registers that should not be synced should be marked as
288  * volatile.  In general drivers can choose not to use the provided
289  * syncing functionality if they so require.
290  *
291  * Return a negative value on failure, 0 on success.
292  */
293 int regcache_sync(struct regmap *map)
294 {
295         int ret = 0;
296         unsigned int i;
297         const char *name;
298         unsigned int bypass;
299
300         BUG_ON(!map->cache_ops);
301
302         map->lock(map->lock_arg);
303         /* Remember the initial bypass state */
304         bypass = map->cache_bypass;
305         dev_dbg(map->dev, "Syncing %s cache\n",
306                 map->cache_ops->name);
307         name = map->cache_ops->name;
308         trace_regcache_sync(map->dev, name, "start");
309
310         if (!map->cache_dirty)
311                 goto out;
312
313         /* Apply any patch first */
314         map->cache_bypass = 1;
315         for (i = 0; i < map->patch_regs; i++) {
316                 if (map->patch[i].reg % map->reg_stride) {
317                         ret = -EINVAL;
318                         goto out;
319                 }
320                 ret = _regmap_write(map, map->patch[i].reg, map->patch[i].def);
321                 if (ret != 0) {
322                         dev_err(map->dev, "Failed to write %x = %x: %d\n",
323                                 map->patch[i].reg, map->patch[i].def, ret);
324                         goto out;
325                 }
326         }
327         map->cache_bypass = 0;
328
329         if (map->cache_ops->sync)
330                 ret = map->cache_ops->sync(map, 0, map->max_register);
331         else
332                 ret = regcache_default_sync(map, 0, map->max_register);
333
334         if (ret == 0)
335                 map->cache_dirty = false;
336
337 out:
338         trace_regcache_sync(map->dev, name, "stop");
339         /* Restore the bypass state */
340         map->cache_bypass = bypass;
341         map->unlock(map->lock_arg);
342
343         return ret;
344 }
345 EXPORT_SYMBOL_GPL(regcache_sync);
346
347 /**
348  * regcache_sync_region: Sync part  of the register cache with the hardware.
349  *
350  * @map: map to sync.
351  * @min: first register to sync
352  * @max: last register to sync
353  *
354  * Write all non-default register values in the specified region to
355  * the hardware.
356  *
357  * Return a negative value on failure, 0 on success.
358  */
359 int regcache_sync_region(struct regmap *map, unsigned int min,
360                          unsigned int max)
361 {
362         int ret = 0;
363         const char *name;
364         unsigned int bypass;
365
366         BUG_ON(!map->cache_ops);
367
368         map->lock(map->lock_arg);
369
370         /* Remember the initial bypass state */
371         bypass = map->cache_bypass;
372
373         name = map->cache_ops->name;
374         dev_dbg(map->dev, "Syncing %s cache from %d-%d\n", name, min, max);
375
376         trace_regcache_sync(map->dev, name, "start region");
377
378         if (!map->cache_dirty)
379                 goto out;
380
381         if (map->cache_ops->sync)
382                 ret = map->cache_ops->sync(map, min, max);
383         else
384                 ret = regcache_default_sync(map, min, max);
385
386 out:
387         trace_regcache_sync(map->dev, name, "stop region");
388         /* Restore the bypass state */
389         map->cache_bypass = bypass;
390         map->unlock(map->lock_arg);
391
392         return ret;
393 }
394 EXPORT_SYMBOL_GPL(regcache_sync_region);
395
396 /**
397  * regcache_drop_region: Discard part of the register cache
398  *
399  * @map: map to operate on
400  * @min: first register to discard
401  * @max: last register to discard
402  *
403  * Discard part of the register cache.
404  *
405  * Return a negative value on failure, 0 on success.
406  */
407 int regcache_drop_region(struct regmap *map, unsigned int min,
408                          unsigned int max)
409 {
410         unsigned int reg;
411         int ret = 0;
412
413         if (!map->cache_present && !(map->cache_ops && map->cache_ops->drop))
414                 return -EINVAL;
415
416         map->lock(map->lock_arg);
417
418         trace_regcache_drop_region(map->dev, min, max);
419
420         if (map->cache_present)
421                 for (reg = min; reg < max + 1; reg++)
422                         clear_bit(reg, map->cache_present);
423
424         if (map->cache_ops && map->cache_ops->drop)
425                 ret = map->cache_ops->drop(map, min, max);
426
427         map->unlock(map->lock_arg);
428
429         return ret;
430 }
431 EXPORT_SYMBOL_GPL(regcache_drop_region);
432
433 /**
434  * regcache_cache_only: Put a register map into cache only mode
435  *
436  * @map: map to configure
437  * @cache_only: flag if changes should be written to the hardware
438  *
439  * When a register map is marked as cache only writes to the register
440  * map API will only update the register cache, they will not cause
441  * any hardware changes.  This is useful for allowing portions of
442  * drivers to act as though the device were functioning as normal when
443  * it is disabled for power saving reasons.
444  */
445 void regcache_cache_only(struct regmap *map, bool enable)
446 {
447         map->lock(map->lock_arg);
448         WARN_ON(map->cache_bypass && enable);
449         map->cache_only = enable;
450         trace_regmap_cache_only(map->dev, enable);
451         map->unlock(map->lock_arg);
452 }
453 EXPORT_SYMBOL_GPL(regcache_cache_only);
454
455 /**
456  * regcache_mark_dirty: Mark the register cache as dirty
457  *
458  * @map: map to mark
459  *
460  * Mark the register cache as dirty, for example due to the device
461  * having been powered down for suspend.  If the cache is not marked
462  * as dirty then the cache sync will be suppressed.
463  */
464 void regcache_mark_dirty(struct regmap *map)
465 {
466         map->lock(map->lock_arg);
467         map->cache_dirty = true;
468         map->unlock(map->lock_arg);
469 }
470 EXPORT_SYMBOL_GPL(regcache_mark_dirty);
471
472 /**
473  * regcache_cache_bypass: Put a register map into cache bypass mode
474  *
475  * @map: map to configure
476  * @cache_bypass: flag if changes should not be written to the hardware
477  *
478  * When a register map is marked with the cache bypass option, writes
479  * to the register map API will only update the hardware and not the
480  * the cache directly.  This is useful when syncing the cache back to
481  * the hardware.
482  */
483 void regcache_cache_bypass(struct regmap *map, bool enable)
484 {
485         map->lock(map->lock_arg);
486         WARN_ON(map->cache_only && enable);
487         map->cache_bypass = enable;
488         trace_regmap_cache_bypass(map->dev, enable);
489         map->unlock(map->lock_arg);
490 }
491 EXPORT_SYMBOL_GPL(regcache_cache_bypass);
492
493 int regcache_set_reg_present(struct regmap *map, unsigned int reg)
494 {
495         unsigned long *cache_present;
496         unsigned int cache_present_size;
497         unsigned int nregs;
498         int i;
499
500         nregs = reg + 1;
501         cache_present_size = BITS_TO_LONGS(nregs);
502         cache_present_size *= sizeof(long);
503
504         if (!map->cache_present) {
505                 cache_present = kmalloc(cache_present_size, GFP_KERNEL);
506                 if (!cache_present)
507                         return -ENOMEM;
508                 bitmap_zero(cache_present, nregs);
509                 map->cache_present = cache_present;
510                 map->cache_present_nbits = nregs;
511         }
512
513         if (nregs > map->cache_present_nbits) {
514                 cache_present = krealloc(map->cache_present,
515                                          cache_present_size, GFP_KERNEL);
516                 if (!cache_present)
517                         return -ENOMEM;
518                 for (i = 0; i < nregs; i++)
519                         if (i >= map->cache_present_nbits)
520                                 clear_bit(i, cache_present);
521                 map->cache_present = cache_present;
522                 map->cache_present_nbits = nregs;
523         }
524
525         set_bit(reg, map->cache_present);
526         return 0;
527 }
528
529 bool regcache_set_val(struct regmap *map, void *base, unsigned int idx,
530                       unsigned int val)
531 {
532         if (regcache_get_val(map, base, idx) == val)
533                 return true;
534
535         /* Use device native format if possible */
536         if (map->format.format_val) {
537                 map->format.format_val(base + (map->cache_word_size * idx),
538                                        val, 0);
539                 return false;
540         }
541
542         switch (map->cache_word_size) {
543         case 1: {
544                 u8 *cache = base;
545                 cache[idx] = val;
546                 break;
547         }
548         case 2: {
549                 u16 *cache = base;
550                 cache[idx] = val;
551                 break;
552         }
553         case 4: {
554                 u32 *cache = base;
555                 cache[idx] = val;
556                 break;
557         }
558         default:
559                 BUG();
560         }
561         return false;
562 }
563
564 unsigned int regcache_get_val(struct regmap *map, const void *base,
565                               unsigned int idx)
566 {
567         if (!base)
568                 return -EINVAL;
569
570         /* Use device native format if possible */
571         if (map->format.parse_val)
572                 return map->format.parse_val(regcache_get_val_addr(map, base,
573                                                                    idx));
574
575         switch (map->cache_word_size) {
576         case 1: {
577                 const u8 *cache = base;
578                 return cache[idx];
579         }
580         case 2: {
581                 const u16 *cache = base;
582                 return cache[idx];
583         }
584         case 4: {
585                 const u32 *cache = base;
586                 return cache[idx];
587         }
588         default:
589                 BUG();
590         }
591         /* unreachable */
592         return -1;
593 }
594
595 static int regcache_default_cmp(const void *a, const void *b)
596 {
597         const struct reg_default *_a = a;
598         const struct reg_default *_b = b;
599
600         return _a->reg - _b->reg;
601 }
602
603 int regcache_lookup_reg(struct regmap *map, unsigned int reg)
604 {
605         struct reg_default key;
606         struct reg_default *r;
607
608         key.reg = reg;
609         key.def = 0;
610
611         r = bsearch(&key, map->reg_defaults, map->num_reg_defaults,
612                     sizeof(struct reg_default), regcache_default_cmp);
613
614         if (r)
615                 return r - map->reg_defaults;
616         else
617                 return -ENOENT;
618 }
619
620 static int regcache_sync_block_single(struct regmap *map, void *block,
621                                       unsigned int block_base,
622                                       unsigned int start, unsigned int end)
623 {
624         unsigned int i, regtmp, val;
625         int ret;
626
627         for (i = start; i < end; i++) {
628                 regtmp = block_base + (i * map->reg_stride);
629
630                 if (!regcache_reg_present(map, regtmp))
631                         continue;
632
633                 val = regcache_get_val(map, block, i);
634
635                 /* Is this the hardware default?  If so skip. */
636                 ret = regcache_lookup_reg(map, regtmp);
637                 if (ret >= 0 && val == map->reg_defaults[ret].def)
638                         continue;
639
640                 map->cache_bypass = 1;
641
642                 ret = _regmap_write(map, regtmp, val);
643
644                 map->cache_bypass = 0;
645                 if (ret != 0)
646                         return ret;
647                 dev_dbg(map->dev, "Synced register %#x, value %#x\n",
648                         regtmp, val);
649         }
650
651         return 0;
652 }
653
654 static int regcache_sync_block_raw_flush(struct regmap *map, const void **data,
655                                          unsigned int base, unsigned int cur)
656 {
657         size_t val_bytes = map->format.val_bytes;
658         int ret, count;
659
660         if (*data == NULL)
661                 return 0;
662
663         count = cur - base;
664
665         dev_dbg(map->dev, "Writing %zu bytes for %d registers from 0x%x-0x%x\n",
666                 count * val_bytes, count, base, cur - 1);
667
668         map->cache_bypass = 1;
669
670         ret = _regmap_raw_write(map, base, *data, count * val_bytes,
671                                 false);
672
673         map->cache_bypass = 0;
674
675         *data = NULL;
676
677         return ret;
678 }
679
680 static int regcache_sync_block_raw(struct regmap *map, void *block,
681                             unsigned int block_base, unsigned int start,
682                             unsigned int end)
683 {
684         unsigned int i, val;
685         unsigned int regtmp = 0;
686         unsigned int base = 0;
687         const void *data = NULL;
688         int ret;
689
690         for (i = start; i < end; i++) {
691                 regtmp = block_base + (i * map->reg_stride);
692
693                 if (!regcache_reg_present(map, regtmp)) {
694                         ret = regcache_sync_block_raw_flush(map, &data,
695                                                             base, regtmp);
696                         if (ret != 0)
697                                 return ret;
698                         continue;
699                 }
700
701                 val = regcache_get_val(map, block, i);
702
703                 /* Is this the hardware default?  If so skip. */
704                 ret = regcache_lookup_reg(map, regtmp);
705                 if (ret >= 0 && val == map->reg_defaults[ret].def) {
706                         ret = regcache_sync_block_raw_flush(map, &data,
707                                                             base, regtmp);
708                         if (ret != 0)
709                                 return ret;
710                         continue;
711                 }
712
713                 if (!data) {
714                         data = regcache_get_val_addr(map, block, i);
715                         base = regtmp;
716                 }
717         }
718
719         return regcache_sync_block_raw_flush(map, &data, base, regtmp +
720                         map->reg_stride);
721 }
722
723 int regcache_sync_block(struct regmap *map, void *block,
724                         unsigned int block_base, unsigned int start,
725                         unsigned int end)
726 {
727         if (regmap_can_raw_write(map))
728                 return regcache_sync_block_raw(map, block, block_base,
729                                                start, end);
730         else
731                 return regcache_sync_block_single(map, block, block_base,
732                                                   start, end);
733 }