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}; |