regcache-indexed.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /*
  2. * Register cache access API - indexed caching support
  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. #include <linux/slab.h>
  13. #include "internal.h"
  14. static int regcache_indexed_read(struct regmap *map, unsigned int reg,
  15. unsigned int *value)
  16. {
  17. int ret;
  18. ret = regcache_lookup_reg(map, reg);
  19. if (ret >= 0)
  20. *value = map->reg_defaults[ret].def;
  21. return ret;
  22. }
  23. static int regcache_indexed_write(struct regmap *map, unsigned int reg,
  24. unsigned int value)
  25. {
  26. int ret;
  27. ret = regcache_lookup_reg(map, reg);
  28. if (ret < 0)
  29. return regcache_insert_reg(map, reg, value);
  30. map->reg_defaults[ret].def = value;
  31. return 0;
  32. }
  33. static int regcache_indexed_sync(struct regmap *map)
  34. {
  35. unsigned int i;
  36. int ret;
  37. for (i = 0; i < map->num_reg_defaults; i++) {
  38. ret = _regmap_write(map, map->reg_defaults[i].reg,
  39. map->reg_defaults[i].def);
  40. if (ret < 0)
  41. return ret;
  42. dev_dbg(map->dev, "Synced register %#x, value %#x\n",
  43. map->reg_defaults[i].reg,
  44. map->reg_defaults[i].def);
  45. }
  46. return 0;
  47. }
  48. struct regcache_ops regcache_indexed_ops = {
  49. .type = REGCACHE_INDEXED,
  50. .name = "indexed",
  51. .read = regcache_indexed_read,
  52. .write = regcache_indexed_write,
  53. .sync = regcache_indexed_sync
  54. };