regcache-rbtree.c (78493f2d7b51d6f6d03982cee559c62dfab4c292) regcache-rbtree.c (f8bd822cbf953299b2957b45f6a43c08e7931ddc)
1/*
2 * Register cache access API - rbtree 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

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

48}
49
50static unsigned int regcache_rbtree_get_register(struct regmap *map,
51 struct regcache_rbtree_node *rbnode, unsigned int idx)
52{
53 return regcache_get_val(map, rbnode->block, idx);
54}
55
1/*
2 * Register cache access API - rbtree 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

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

48}
49
50static unsigned int regcache_rbtree_get_register(struct regmap *map,
51 struct regcache_rbtree_node *rbnode, unsigned int idx)
52{
53 return regcache_get_val(map, rbnode->block, idx);
54}
55
56static const void *regcache_rbtree_get_reg_addr(struct regmap *map,
57 struct regcache_rbtree_node *rbnode, unsigned int idx)
58{
59 return regcache_get_val_addr(map, rbnode->block, idx);
60}
61
62static void regcache_rbtree_set_register(struct regmap *map,
63 struct regcache_rbtree_node *rbnode,
64 unsigned int idx, unsigned int val)
65{
66 regcache_set_val(map, rbnode->block, idx, val);
67}
68
69static struct regcache_rbtree_node *regcache_rbtree_lookup(struct regmap *map,

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

385}
386
387static int regcache_rbtree_sync(struct regmap *map, unsigned int min,
388 unsigned int max)
389{
390 struct regcache_rbtree_ctx *rbtree_ctx;
391 struct rb_node *node;
392 struct regcache_rbtree_node *rbnode;
56static void regcache_rbtree_set_register(struct regmap *map,
57 struct regcache_rbtree_node *rbnode,
58 unsigned int idx, unsigned int val)
59{
60 regcache_set_val(map, rbnode->block, idx, val);
61}
62
63static struct regcache_rbtree_node *regcache_rbtree_lookup(struct regmap *map,

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

379}
380
381static int regcache_rbtree_sync(struct regmap *map, unsigned int min,
382 unsigned int max)
383{
384 struct regcache_rbtree_ctx *rbtree_ctx;
385 struct rb_node *node;
386 struct regcache_rbtree_node *rbnode;
393 unsigned int regtmp;
394 unsigned int val;
395 const void *addr;
396 int ret;
387 int ret;
397 int i, base, end;
388 int base, end;
398
399 rbtree_ctx = map->cache;
400 for (node = rb_first(&rbtree_ctx->root); node; node = rb_next(node)) {
401 rbnode = rb_entry(node, struct regcache_rbtree_node, node);
402
403 if (rbnode->base_reg < min)
404 continue;
405 if (rbnode->base_reg > max)

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

412 else
413 base = 0;
414
415 if (max < rbnode->base_reg + rbnode->blklen)
416 end = rbnode->base_reg + rbnode->blklen - max;
417 else
418 end = rbnode->blklen;
419
389
390 rbtree_ctx = map->cache;
391 for (node = rb_first(&rbtree_ctx->root); node; node = rb_next(node)) {
392 rbnode = rb_entry(node, struct regcache_rbtree_node, node);
393
394 if (rbnode->base_reg < min)
395 continue;
396 if (rbnode->base_reg > max)

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

403 else
404 base = 0;
405
406 if (max < rbnode->base_reg + rbnode->blklen)
407 end = rbnode->base_reg + rbnode->blklen - max;
408 else
409 end = rbnode->blklen;
410
420 for (i = base; i < end; i++) {
421 regtmp = rbnode->base_reg + (i * map->reg_stride);
422
423 if (!regcache_reg_present(map, regtmp))
424 continue;
425
426 val = regcache_rbtree_get_register(map, rbnode, i);
427
428 /* Is this the hardware default? If so skip. */
429 ret = regcache_lookup_reg(map, regtmp);
430 if (ret >= 0 && val == map->reg_defaults[ret].def)
431 continue;
432
433 map->cache_bypass = 1;
434
435 if (regmap_can_raw_write(map)) {
436 addr = regcache_rbtree_get_reg_addr(map,
437 rbnode, i);
438 ret = _regmap_raw_write(map, regtmp, addr,
439 map->format.val_bytes,
440 false);
441 } else {
442 ret = _regmap_write(map, regtmp, val);
443 }
444
445 map->cache_bypass = 0;
446 if (ret)
447 return ret;
448 dev_dbg(map->dev, "Synced register %#x, value %#x\n",
449 regtmp, val);
450 }
411 ret = regcache_sync_block(map, rbnode->block, rbnode->base_reg,
412 base, end);
413 if (ret != 0)
414 return ret;
451 }
452
415 }
416
453 return 0;
417 return regmap_async_complete(map);
454}
455
456struct regcache_ops regcache_rbtree_ops = {
457 .type = REGCACHE_RBTREE,
458 .name = "rbtree",
459 .init = regcache_rbtree_init,
460 .exit = regcache_rbtree_exit,
461 .read = regcache_rbtree_read,
462 .write = regcache_rbtree_write,
463 .sync = regcache_rbtree_sync
464};
418}
419
420struct regcache_ops regcache_rbtree_ops = {
421 .type = REGCACHE_RBTREE,
422 .name = "rbtree",
423 .init = regcache_rbtree_init,
424 .exit = regcache_rbtree_exit,
425 .read = regcache_rbtree_read,
426 .write = regcache_rbtree_write,
427 .sync = regcache_rbtree_sync
428};