Lines Matching refs:map
36 static int _regmap_update_bits(struct regmap *map, unsigned int reg,
65 bool regmap_check_range_table(struct regmap *map, unsigned int reg, in regmap_check_range_table() argument
81 bool regmap_writeable(struct regmap *map, unsigned int reg) in regmap_writeable() argument
83 if (map->max_register && reg > map->max_register) in regmap_writeable()
86 if (map->writeable_reg) in regmap_writeable()
87 return map->writeable_reg(map->dev, reg); in regmap_writeable()
89 if (map->wr_table) in regmap_writeable()
90 return regmap_check_range_table(map, reg, map->wr_table); in regmap_writeable()
95 bool regmap_readable(struct regmap *map, unsigned int reg) in regmap_readable() argument
97 if (!map->reg_read) in regmap_readable()
100 if (map->max_register && reg > map->max_register) in regmap_readable()
103 if (map->format.format_write) in regmap_readable()
106 if (map->readable_reg) in regmap_readable()
107 return map->readable_reg(map->dev, reg); in regmap_readable()
109 if (map->rd_table) in regmap_readable()
110 return regmap_check_range_table(map, reg, map->rd_table); in regmap_readable()
115 bool regmap_volatile(struct regmap *map, unsigned int reg) in regmap_volatile() argument
117 if (!map->format.format_write && !regmap_readable(map, reg)) in regmap_volatile()
120 if (map->volatile_reg) in regmap_volatile()
121 return map->volatile_reg(map->dev, reg); in regmap_volatile()
123 if (map->volatile_table) in regmap_volatile()
124 return regmap_check_range_table(map, reg, map->volatile_table); in regmap_volatile()
126 if (map->cache_ops) in regmap_volatile()
132 bool regmap_precious(struct regmap *map, unsigned int reg) in regmap_precious() argument
134 if (!regmap_readable(map, reg)) in regmap_precious()
137 if (map->precious_reg) in regmap_precious()
138 return map->precious_reg(map->dev, reg); in regmap_precious()
140 if (map->precious_table) in regmap_precious()
141 return regmap_check_range_table(map, reg, map->precious_table); in regmap_precious()
146 static bool regmap_volatile_range(struct regmap *map, unsigned int reg, in regmap_volatile_range() argument
152 if (!regmap_volatile(map, reg + i)) in regmap_volatile_range()
158 static void regmap_format_2_6_write(struct regmap *map, in regmap_format_2_6_write() argument
161 u8 *out = map->work_buf; in regmap_format_2_6_write()
166 static void regmap_format_4_12_write(struct regmap *map, in regmap_format_4_12_write() argument
169 __be16 *out = map->work_buf; in regmap_format_4_12_write()
173 static void regmap_format_7_9_write(struct regmap *map, in regmap_format_7_9_write() argument
176 __be16 *out = map->work_buf; in regmap_format_7_9_write()
180 static void regmap_format_10_14_write(struct regmap *map, in regmap_format_10_14_write() argument
183 u8 *out = map->work_buf; in regmap_format_10_14_write()
337 struct regmap *map = __map; in regmap_lock_mutex() local
338 mutex_lock(&map->mutex); in regmap_lock_mutex()
343 struct regmap *map = __map; in regmap_unlock_mutex() local
344 mutex_unlock(&map->mutex); in regmap_unlock_mutex()
348 __acquires(&map->spinlock) in regmap_lock_spinlock()
350 struct regmap *map = __map; in regmap_lock_spinlock() local
353 spin_lock_irqsave(&map->spinlock, flags); in regmap_lock_spinlock()
354 map->spinlock_flags = flags; in regmap_lock_spinlock()
358 __releases(&map->spinlock) in regmap_unlock_spinlock()
360 struct regmap *map = __map; in regmap_unlock_spinlock() local
361 spin_unlock_irqrestore(&map->spinlock, map->spinlock_flags); in regmap_unlock_spinlock()
373 static bool _regmap_range_add(struct regmap *map, in _regmap_range_add() argument
376 struct rb_root *root = &map->range_tree; in _regmap_range_add()
398 static struct regmap_range_node *_regmap_range_lookup(struct regmap *map, in _regmap_range_lookup() argument
401 struct rb_node *node = map->range_tree.rb_node; in _regmap_range_lookup()
418 static void regmap_range_exit(struct regmap *map) in regmap_range_exit() argument
423 next = rb_first(&map->range_tree); in regmap_range_exit()
427 rb_erase(&range_node->node, &map->range_tree); in regmap_range_exit()
431 kfree(map->selector_work_buf); in regmap_range_exit()
434 int regmap_attach_dev(struct device *dev, struct regmap *map, in regmap_attach_dev() argument
439 map->dev = dev; in regmap_attach_dev()
441 regmap_debugfs_init(map, config->name); in regmap_attach_dev()
446 regmap_debugfs_exit(map); in regmap_attach_dev()
449 *m = map; in regmap_attach_dev()
529 struct regmap *map; in __regmap_init() local
537 map = kzalloc(sizeof(*map), GFP_KERNEL); in __regmap_init()
538 if (map == NULL) { in __regmap_init()
544 map->lock = config->lock; in __regmap_init()
545 map->unlock = config->unlock; in __regmap_init()
546 map->lock_arg = config->lock_arg; in __regmap_init()
550 spin_lock_init(&map->spinlock); in __regmap_init()
551 map->lock = regmap_lock_spinlock; in __regmap_init()
552 map->unlock = regmap_unlock_spinlock; in __regmap_init()
553 lockdep_set_class_and_name(&map->spinlock, in __regmap_init()
556 mutex_init(&map->mutex); in __regmap_init()
557 map->lock = regmap_lock_mutex; in __regmap_init()
558 map->unlock = regmap_unlock_mutex; in __regmap_init()
559 lockdep_set_class_and_name(&map->mutex, in __regmap_init()
562 map->lock_arg = map; in __regmap_init()
570 map->alloc_flags = GFP_ATOMIC; in __regmap_init()
572 map->alloc_flags = GFP_KERNEL; in __regmap_init()
574 map->format.reg_bytes = DIV_ROUND_UP(config->reg_bits, 8); in __regmap_init()
575 map->format.pad_bytes = config->pad_bits / 8; in __regmap_init()
576 map->format.val_bytes = DIV_ROUND_UP(config->val_bits, 8); in __regmap_init()
577 map->format.buf_size = DIV_ROUND_UP(config->reg_bits + in __regmap_init()
579 map->reg_shift = config->pad_bits % 8; in __regmap_init()
581 map->reg_stride = config->reg_stride; in __regmap_init()
583 map->reg_stride = 1; in __regmap_init()
584 map->use_single_read = config->use_single_rw || !bus || !bus->read; in __regmap_init()
585 map->use_single_write = config->use_single_rw || !bus || !bus->write; in __regmap_init()
586 map->can_multi_write = config->can_multi_write && bus && bus->write; in __regmap_init()
588 map->max_raw_read = bus->max_raw_read; in __regmap_init()
589 map->max_raw_write = bus->max_raw_write; in __regmap_init()
591 map->dev = dev; in __regmap_init()
592 map->bus = bus; in __regmap_init()
593 map->bus_context = bus_context; in __regmap_init()
594 map->max_register = config->max_register; in __regmap_init()
595 map->wr_table = config->wr_table; in __regmap_init()
596 map->rd_table = config->rd_table; in __regmap_init()
597 map->volatile_table = config->volatile_table; in __regmap_init()
598 map->precious_table = config->precious_table; in __regmap_init()
599 map->writeable_reg = config->writeable_reg; in __regmap_init()
600 map->readable_reg = config->readable_reg; in __regmap_init()
601 map->volatile_reg = config->volatile_reg; in __regmap_init()
602 map->precious_reg = config->precious_reg; in __regmap_init()
603 map->cache_type = config->cache_type; in __regmap_init()
604 map->name = config->name; in __regmap_init()
606 spin_lock_init(&map->async_lock); in __regmap_init()
607 INIT_LIST_HEAD(&map->async_list); in __regmap_init()
608 INIT_LIST_HEAD(&map->async_free); in __regmap_init()
609 init_waitqueue_head(&map->async_waitq); in __regmap_init()
612 map->read_flag_mask = config->read_flag_mask; in __regmap_init()
613 map->write_flag_mask = config->write_flag_mask; in __regmap_init()
615 map->read_flag_mask = bus->read_flag_mask; in __regmap_init()
619 map->reg_read = config->reg_read; in __regmap_init()
620 map->reg_write = config->reg_write; in __regmap_init()
622 map->defer_caching = false; in __regmap_init()
625 map->reg_read = _regmap_bus_reg_read; in __regmap_init()
626 map->reg_write = _regmap_bus_reg_write; in __regmap_init()
628 map->defer_caching = false; in __regmap_init()
631 map->reg_read = _regmap_bus_read; in __regmap_init()
632 map->reg_update_bits = bus->reg_update_bits; in __regmap_init()
638 switch (config->reg_bits + map->reg_shift) { in __regmap_init()
642 map->format.format_write = regmap_format_2_6_write; in __regmap_init()
652 map->format.format_write = regmap_format_4_12_write; in __regmap_init()
662 map->format.format_write = regmap_format_7_9_write; in __regmap_init()
672 map->format.format_write = regmap_format_10_14_write; in __regmap_init()
680 map->format.format_reg = regmap_format_8; in __regmap_init()
686 map->format.format_reg = regmap_format_16_be; in __regmap_init()
689 map->format.format_reg = regmap_format_16_native; in __regmap_init()
699 map->format.format_reg = regmap_format_24; in __regmap_init()
705 map->format.format_reg = regmap_format_32_be; in __regmap_init()
708 map->format.format_reg = regmap_format_32_native; in __regmap_init()
720 map->format.parse_inplace = regmap_parse_inplace_noop; in __regmap_init()
724 map->format.format_val = regmap_format_8; in __regmap_init()
725 map->format.parse_val = regmap_parse_8; in __regmap_init()
726 map->format.parse_inplace = regmap_parse_inplace_noop; in __regmap_init()
731 map->format.format_val = regmap_format_16_be; in __regmap_init()
732 map->format.parse_val = regmap_parse_16_be; in __regmap_init()
733 map->format.parse_inplace = regmap_parse_16_be_inplace; in __regmap_init()
736 map->format.format_val = regmap_format_16_le; in __regmap_init()
737 map->format.parse_val = regmap_parse_16_le; in __regmap_init()
738 map->format.parse_inplace = regmap_parse_16_le_inplace; in __regmap_init()
741 map->format.format_val = regmap_format_16_native; in __regmap_init()
742 map->format.parse_val = regmap_parse_16_native; in __regmap_init()
751 map->format.format_val = regmap_format_24; in __regmap_init()
752 map->format.parse_val = regmap_parse_24; in __regmap_init()
757 map->format.format_val = regmap_format_32_be; in __regmap_init()
758 map->format.parse_val = regmap_parse_32_be; in __regmap_init()
759 map->format.parse_inplace = regmap_parse_32_be_inplace; in __regmap_init()
762 map->format.format_val = regmap_format_32_le; in __regmap_init()
763 map->format.parse_val = regmap_parse_32_le; in __regmap_init()
764 map->format.parse_inplace = regmap_parse_32_le_inplace; in __regmap_init()
767 map->format.format_val = regmap_format_32_native; in __regmap_init()
768 map->format.parse_val = regmap_parse_32_native; in __regmap_init()
776 if (map->format.format_write) { in __regmap_init()
780 map->use_single_write = true; in __regmap_init()
783 if (!map->format.format_write && in __regmap_init()
784 !(map->format.format_reg && map->format.format_val)) in __regmap_init()
787 map->work_buf = kzalloc(map->format.buf_size, GFP_KERNEL); in __regmap_init()
788 if (map->work_buf == NULL) { in __regmap_init()
793 if (map->format.format_write) { in __regmap_init()
794 map->defer_caching = false; in __regmap_init()
795 map->reg_write = _regmap_bus_formatted_write; in __regmap_init()
796 } else if (map->format.format_val) { in __regmap_init()
797 map->defer_caching = true; in __regmap_init()
798 map->reg_write = _regmap_bus_raw_write; in __regmap_init()
803 map->range_tree = RB_ROOT; in __regmap_init()
810 dev_err(map->dev, "Invalid range %d: %d < %d\n", i, in __regmap_init()
815 if (range_cfg->range_max > map->max_register) { in __regmap_init()
816 dev_err(map->dev, "Invalid range %d: %d > %d\n", i, in __regmap_init()
817 range_cfg->range_max, map->max_register); in __regmap_init()
821 if (range_cfg->selector_reg > map->max_register) { in __regmap_init()
822 dev_err(map->dev, in __regmap_init()
828 dev_err(map->dev, "Invalid range %d: window_len 0\n", in __regmap_init()
847 dev_err(map->dev, in __regmap_init()
855 dev_err(map->dev, in __regmap_init()
868 new->map = map; in __regmap_init()
878 if (!_regmap_range_add(map, new)) { in __regmap_init()
879 dev_err(map->dev, "Failed to add range %d\n", i); in __regmap_init()
884 if (map->selector_work_buf == NULL) { in __regmap_init()
885 map->selector_work_buf = in __regmap_init()
886 kzalloc(map->format.buf_size, GFP_KERNEL); in __regmap_init()
887 if (map->selector_work_buf == NULL) { in __regmap_init()
894 ret = regcache_init(map, config); in __regmap_init()
899 ret = regmap_attach_dev(dev, map, config); in __regmap_init()
904 return map; in __regmap_init()
907 regcache_exit(map); in __regmap_init()
909 regmap_range_exit(map); in __regmap_init()
910 kfree(map->work_buf); in __regmap_init()
912 kfree(map); in __regmap_init()
1053 int regmap_reinit_cache(struct regmap *map, const struct regmap_config *config) in regmap_reinit_cache() argument
1055 regcache_exit(map); in regmap_reinit_cache()
1056 regmap_debugfs_exit(map); in regmap_reinit_cache()
1058 map->max_register = config->max_register; in regmap_reinit_cache()
1059 map->writeable_reg = config->writeable_reg; in regmap_reinit_cache()
1060 map->readable_reg = config->readable_reg; in regmap_reinit_cache()
1061 map->volatile_reg = config->volatile_reg; in regmap_reinit_cache()
1062 map->precious_reg = config->precious_reg; in regmap_reinit_cache()
1063 map->cache_type = config->cache_type; in regmap_reinit_cache()
1065 regmap_debugfs_init(map, config->name); in regmap_reinit_cache()
1067 map->cache_bypass = false; in regmap_reinit_cache()
1068 map->cache_only = false; in regmap_reinit_cache()
1070 return regcache_init(map, config); in regmap_reinit_cache()
1077 void regmap_exit(struct regmap *map) in regmap_exit() argument
1081 regcache_exit(map); in regmap_exit()
1082 regmap_debugfs_exit(map); in regmap_exit()
1083 regmap_range_exit(map); in regmap_exit()
1084 if (map->bus && map->bus->free_context) in regmap_exit()
1085 map->bus->free_context(map->bus_context); in regmap_exit()
1086 kfree(map->work_buf); in regmap_exit()
1087 while (!list_empty(&map->async_free)) { in regmap_exit()
1088 async = list_first_entry_or_null(&map->async_free, in regmap_exit()
1095 kfree(map); in regmap_exit()
1144 struct device *regmap_get_device(struct regmap *map) in regmap_get_device() argument
1146 return map->dev; in regmap_get_device()
1150 static int _regmap_select_page(struct regmap *map, unsigned int *reg, in _regmap_select_page() argument
1179 orig_work_buf = map->work_buf; in _regmap_select_page()
1180 map->work_buf = map->selector_work_buf; in _regmap_select_page()
1182 ret = _regmap_update_bits(map, range->selector_reg, in _regmap_select_page()
1187 map->work_buf = orig_work_buf; in _regmap_select_page()
1198 int _regmap_raw_write(struct regmap *map, unsigned int reg, in _regmap_raw_write() argument
1203 u8 *u8 = map->work_buf; in _regmap_raw_write()
1204 void *work_val = map->work_buf + map->format.reg_bytes + in _regmap_raw_write()
1205 map->format.pad_bytes; in _regmap_raw_write()
1211 WARN_ON(!map->bus); in _regmap_raw_write()
1214 if (map->writeable_reg) in _regmap_raw_write()
1215 for (i = 0; i < val_len / map->format.val_bytes; i++) in _regmap_raw_write()
1216 if (!map->writeable_reg(map->dev, in _regmap_raw_write()
1217 reg + (i * map->reg_stride))) in _regmap_raw_write()
1220 if (!map->cache_bypass && map->format.parse_val) { in _regmap_raw_write()
1222 int val_bytes = map->format.val_bytes; in _regmap_raw_write()
1224 ival = map->format.parse_val(val + (i * val_bytes)); in _regmap_raw_write()
1225 ret = regcache_write(map, reg + (i * map->reg_stride), in _regmap_raw_write()
1228 dev_err(map->dev, in _regmap_raw_write()
1234 if (map->cache_only) { in _regmap_raw_write()
1235 map->cache_dirty = true; in _regmap_raw_write()
1240 range = _regmap_range_lookup(map, reg); in _regmap_raw_write()
1242 int val_num = val_len / map->format.val_bytes; in _regmap_raw_write()
1248 dev_dbg(map->dev, "Writing window %d/%zu\n", in _regmap_raw_write()
1249 win_residue, val_len / map->format.val_bytes); in _regmap_raw_write()
1250 ret = _regmap_raw_write(map, reg, val, win_residue * in _regmap_raw_write()
1251 map->format.val_bytes); in _regmap_raw_write()
1257 val += win_residue * map->format.val_bytes; in _regmap_raw_write()
1258 val_len -= win_residue * map->format.val_bytes; in _regmap_raw_write()
1265 ret = _regmap_select_page(map, ®, range, val_num); in _regmap_raw_write()
1270 map->format.format_reg(map->work_buf, reg, map->reg_shift); in _regmap_raw_write()
1272 u8[0] |= map->write_flag_mask; in _regmap_raw_write()
1279 if (val != work_val && val_len == map->format.val_bytes) { in _regmap_raw_write()
1280 memcpy(work_val, val, map->format.val_bytes); in _regmap_raw_write()
1284 if (map->async && map->bus->async_write) { in _regmap_raw_write()
1287 trace_regmap_async_write_start(map, reg, val_len); in _regmap_raw_write()
1289 spin_lock_irqsave(&map->async_lock, flags); in _regmap_raw_write()
1290 async = list_first_entry_or_null(&map->async_free, in _regmap_raw_write()
1295 spin_unlock_irqrestore(&map->async_lock, flags); in _regmap_raw_write()
1298 async = map->bus->async_alloc(); in _regmap_raw_write()
1302 async->work_buf = kzalloc(map->format.buf_size, in _regmap_raw_write()
1310 async->map = map; in _regmap_raw_write()
1313 memcpy(async->work_buf, map->work_buf, map->format.pad_bytes + in _regmap_raw_write()
1314 map->format.reg_bytes + map->format.val_bytes); in _regmap_raw_write()
1316 spin_lock_irqsave(&map->async_lock, flags); in _regmap_raw_write()
1317 list_add_tail(&async->list, &map->async_list); in _regmap_raw_write()
1318 spin_unlock_irqrestore(&map->async_lock, flags); in _regmap_raw_write()
1321 ret = map->bus->async_write(map->bus_context, in _regmap_raw_write()
1323 map->format.reg_bytes + in _regmap_raw_write()
1324 map->format.pad_bytes, in _regmap_raw_write()
1327 ret = map->bus->async_write(map->bus_context, in _regmap_raw_write()
1329 map->format.reg_bytes + in _regmap_raw_write()
1330 map->format.pad_bytes + in _regmap_raw_write()
1334 dev_err(map->dev, "Failed to schedule write: %d\n", in _regmap_raw_write()
1337 spin_lock_irqsave(&map->async_lock, flags); in _regmap_raw_write()
1338 list_move(&async->list, &map->async_free); in _regmap_raw_write()
1339 spin_unlock_irqrestore(&map->async_lock, flags); in _regmap_raw_write()
1345 trace_regmap_hw_write_start(map, reg, val_len / map->format.val_bytes); in _regmap_raw_write()
1352 ret = map->bus->write(map->bus_context, map->work_buf, in _regmap_raw_write()
1353 map->format.reg_bytes + in _regmap_raw_write()
1354 map->format.pad_bytes + in _regmap_raw_write()
1356 else if (map->bus->gather_write) in _regmap_raw_write()
1357 ret = map->bus->gather_write(map->bus_context, map->work_buf, in _regmap_raw_write()
1358 map->format.reg_bytes + in _regmap_raw_write()
1359 map->format.pad_bytes, in _regmap_raw_write()
1364 len = map->format.reg_bytes + map->format.pad_bytes + val_len; in _regmap_raw_write()
1369 memcpy(buf, map->work_buf, map->format.reg_bytes); in _regmap_raw_write()
1370 memcpy(buf + map->format.reg_bytes + map->format.pad_bytes, in _regmap_raw_write()
1372 ret = map->bus->write(map->bus_context, buf, len); in _regmap_raw_write()
1377 trace_regmap_hw_write_done(map, reg, val_len / map->format.val_bytes); in _regmap_raw_write()
1387 bool regmap_can_raw_write(struct regmap *map) in regmap_can_raw_write() argument
1389 return map->bus && map->bus->write && map->format.format_val && in regmap_can_raw_write()
1390 map->format.format_reg; in regmap_can_raw_write()
1399 size_t regmap_get_raw_read_max(struct regmap *map) in regmap_get_raw_read_max() argument
1401 return map->max_raw_read; in regmap_get_raw_read_max()
1410 size_t regmap_get_raw_write_max(struct regmap *map) in regmap_get_raw_write_max() argument
1412 return map->max_raw_write; in regmap_get_raw_write_max()
1421 struct regmap *map = context; in _regmap_bus_formatted_write() local
1423 WARN_ON(!map->bus || !map->format.format_write); in _regmap_bus_formatted_write()
1425 range = _regmap_range_lookup(map, reg); in _regmap_bus_formatted_write()
1427 ret = _regmap_select_page(map, ®, range, 1); in _regmap_bus_formatted_write()
1432 map->format.format_write(map, reg, val); in _regmap_bus_formatted_write()
1434 trace_regmap_hw_write_start(map, reg, 1); in _regmap_bus_formatted_write()
1436 ret = map->bus->write(map->bus_context, map->work_buf, in _regmap_bus_formatted_write()
1437 map->format.buf_size); in _regmap_bus_formatted_write()
1439 trace_regmap_hw_write_done(map, reg, 1); in _regmap_bus_formatted_write()
1447 struct regmap *map = context; in _regmap_bus_reg_write() local
1449 return map->bus->reg_write(map->bus_context, reg, val); in _regmap_bus_reg_write()
1455 struct regmap *map = context; in _regmap_bus_raw_write() local
1457 WARN_ON(!map->bus || !map->format.format_val); in _regmap_bus_raw_write()
1459 map->format.format_val(map->work_buf + map->format.reg_bytes in _regmap_bus_raw_write()
1460 + map->format.pad_bytes, val, 0); in _regmap_bus_raw_write()
1461 return _regmap_raw_write(map, reg, in _regmap_bus_raw_write()
1462 map->work_buf + in _regmap_bus_raw_write()
1463 map->format.reg_bytes + in _regmap_bus_raw_write()
1464 map->format.pad_bytes, in _regmap_bus_raw_write()
1465 map->format.val_bytes); in _regmap_bus_raw_write()
1468 static inline void *_regmap_map_get_context(struct regmap *map) in _regmap_map_get_context() argument
1470 return (map->bus) ? map : map->bus_context; in _regmap_map_get_context()
1473 int _regmap_write(struct regmap *map, unsigned int reg, in _regmap_write() argument
1477 void *context = _regmap_map_get_context(map); in _regmap_write()
1479 if (!regmap_writeable(map, reg)) in _regmap_write()
1482 if (!map->cache_bypass && !map->defer_caching) { in _regmap_write()
1483 ret = regcache_write(map, reg, val); in _regmap_write()
1486 if (map->cache_only) { in _regmap_write()
1487 map->cache_dirty = true; in _regmap_write()
1493 if (map->dev && strcmp(dev_name(map->dev), LOG_DEVICE) == 0) in _regmap_write()
1494 dev_info(map->dev, "%x <= %x\n", reg, val); in _regmap_write()
1497 trace_regmap_reg_write(map, reg, val); in _regmap_write()
1499 return map->reg_write(context, reg, val); in _regmap_write()
1512 int regmap_write(struct regmap *map, unsigned int reg, unsigned int val) in regmap_write() argument
1516 if (reg % map->reg_stride) in regmap_write()
1519 map->lock(map->lock_arg); in regmap_write()
1521 ret = _regmap_write(map, reg, val); in regmap_write()
1523 map->unlock(map->lock_arg); in regmap_write()
1539 int regmap_write_async(struct regmap *map, unsigned int reg, unsigned int val) in regmap_write_async() argument
1543 if (reg % map->reg_stride) in regmap_write_async()
1546 map->lock(map->lock_arg); in regmap_write_async()
1548 map->async = true; in regmap_write_async()
1550 ret = _regmap_write(map, reg, val); in regmap_write_async()
1552 map->async = false; in regmap_write_async()
1554 map->unlock(map->lock_arg); in regmap_write_async()
1576 int regmap_raw_write(struct regmap *map, unsigned int reg, in regmap_raw_write() argument
1581 if (!regmap_can_raw_write(map)) in regmap_raw_write()
1583 if (val_len % map->format.val_bytes) in regmap_raw_write()
1585 if (map->max_raw_write && map->max_raw_write > val_len) in regmap_raw_write()
1588 map->lock(map->lock_arg); in regmap_raw_write()
1590 ret = _regmap_raw_write(map, reg, val, val_len); in regmap_raw_write()
1592 map->unlock(map->lock_arg); in regmap_raw_write()
1708 int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val, in regmap_bulk_write() argument
1712 size_t val_bytes = map->format.val_bytes; in regmap_bulk_write()
1715 if (map->bus && !map->format.parse_inplace) in regmap_bulk_write()
1717 if (reg % map->reg_stride) in regmap_bulk_write()
1730 if (!map->bus) { in regmap_bulk_write()
1731 map->lock(map->lock_arg); in regmap_bulk_write()
1755 ret = _regmap_write(map, reg + (i * map->reg_stride), in regmap_bulk_write()
1761 map->unlock(map->lock_arg); in regmap_bulk_write()
1762 } else if (map->use_single_write || in regmap_bulk_write()
1763 (map->max_raw_write && map->max_raw_write < total_size)) { in regmap_bulk_write()
1764 int chunk_stride = map->reg_stride; in regmap_bulk_write()
1768 if (!map->use_single_write) { in regmap_bulk_write()
1769 chunk_size = map->max_raw_write; in regmap_bulk_write()
1776 map->lock(map->lock_arg); in regmap_bulk_write()
1779 ret = _regmap_raw_write(map, in regmap_bulk_write()
1789 ret = _regmap_raw_write(map, reg + (i * chunk_stride), in regmap_bulk_write()
1793 map->unlock(map->lock_arg); in regmap_bulk_write()
1800 wval = kmemdup(val, val_count * val_bytes, map->alloc_flags); in regmap_bulk_write()
1802 dev_err(map->dev, "Error in memory allocation\n"); in regmap_bulk_write()
1806 map->format.parse_inplace(wval + i); in regmap_bulk_write()
1808 map->lock(map->lock_arg); in regmap_bulk_write()
1809 ret = _regmap_raw_write(map, reg, wval, val_bytes * val_count); in regmap_bulk_write()
1810 map->unlock(map->lock_arg); in regmap_bulk_write()
1825 static int _regmap_raw_multi_reg_write(struct regmap *map, in _regmap_raw_multi_reg_write() argument
1833 size_t val_bytes = map->format.val_bytes; in _regmap_raw_multi_reg_write()
1834 size_t reg_bytes = map->format.reg_bytes; in _regmap_raw_multi_reg_write()
1835 size_t pad_bytes = map->format.pad_bytes; in _regmap_raw_multi_reg_write()
1853 trace_regmap_hw_write_start(map, reg, 1); in _regmap_raw_multi_reg_write()
1854 map->format.format_reg(u8, reg, map->reg_shift); in _regmap_raw_multi_reg_write()
1856 map->format.format_val(u8, val, 0); in _regmap_raw_multi_reg_write()
1860 *u8 |= map->write_flag_mask; in _regmap_raw_multi_reg_write()
1862 ret = map->bus->write(map->bus_context, buf, len); in _regmap_raw_multi_reg_write()
1868 trace_regmap_hw_write_done(map, reg, 1); in _regmap_raw_multi_reg_write()
1873 static unsigned int _regmap_register_page(struct regmap *map, in _regmap_register_page() argument
1882 static int _regmap_range_multi_paged_reg_write(struct regmap *map, in _regmap_range_multi_paged_reg_write() argument
1902 range = _regmap_range_lookup(map, reg); in _regmap_range_multi_paged_reg_write()
1904 unsigned int win_page = _regmap_register_page(map, reg, in _regmap_range_multi_paged_reg_write()
1931 ret = _regmap_raw_multi_reg_write(map, base, n); in _regmap_range_multi_paged_reg_write()
1942 ret = _regmap_select_page(map, in _regmap_range_multi_paged_reg_write()
1955 return _regmap_raw_multi_reg_write(map, base, n); in _regmap_range_multi_paged_reg_write()
1959 static int _regmap_multi_reg_write(struct regmap *map, in _regmap_multi_reg_write() argument
1966 if (!map->can_multi_write) { in _regmap_multi_reg_write()
1968 ret = _regmap_write(map, regs[i].reg, regs[i].def); in _regmap_multi_reg_write()
1978 if (!map->format.parse_inplace) in _regmap_multi_reg_write()
1981 if (map->writeable_reg) in _regmap_multi_reg_write()
1984 if (!map->writeable_reg(map->dev, reg)) in _regmap_multi_reg_write()
1986 if (reg % map->reg_stride) in _regmap_multi_reg_write()
1990 if (!map->cache_bypass) { in _regmap_multi_reg_write()
1994 ret = regcache_write(map, reg, val); in _regmap_multi_reg_write()
1996 dev_err(map->dev, in _regmap_multi_reg_write()
2002 if (map->cache_only) { in _regmap_multi_reg_write()
2003 map->cache_dirty = true; in _regmap_multi_reg_write()
2008 WARN_ON(!map->bus); in _regmap_multi_reg_write()
2017 range = _regmap_range_lookup(map, reg); in _regmap_multi_reg_write()
2024 ret = _regmap_range_multi_paged_reg_write(map, base, in _regmap_multi_reg_write()
2031 return _regmap_raw_multi_reg_write(map, regs, num_regs); in _regmap_multi_reg_write()
2053 int regmap_multi_reg_write(struct regmap *map, const struct reg_sequence *regs, in regmap_multi_reg_write() argument
2058 map->lock(map->lock_arg); in regmap_multi_reg_write()
2060 ret = _regmap_multi_reg_write(map, regs, num_regs); in regmap_multi_reg_write()
2062 map->unlock(map->lock_arg); in regmap_multi_reg_write()
2085 int regmap_multi_reg_write_bypassed(struct regmap *map, in regmap_multi_reg_write_bypassed() argument
2092 map->lock(map->lock_arg); in regmap_multi_reg_write_bypassed()
2094 bypass = map->cache_bypass; in regmap_multi_reg_write_bypassed()
2095 map->cache_bypass = true; in regmap_multi_reg_write_bypassed()
2097 ret = _regmap_multi_reg_write(map, regs, num_regs); in regmap_multi_reg_write_bypassed()
2099 map->cache_bypass = bypass; in regmap_multi_reg_write_bypassed()
2101 map->unlock(map->lock_arg); in regmap_multi_reg_write_bypassed()
2129 int regmap_raw_write_async(struct regmap *map, unsigned int reg, in regmap_raw_write_async() argument
2134 if (val_len % map->format.val_bytes) in regmap_raw_write_async()
2136 if (reg % map->reg_stride) in regmap_raw_write_async()
2139 map->lock(map->lock_arg); in regmap_raw_write_async()
2141 map->async = true; in regmap_raw_write_async()
2143 ret = _regmap_raw_write(map, reg, val, val_len); in regmap_raw_write_async()
2145 map->async = false; in regmap_raw_write_async()
2147 map->unlock(map->lock_arg); in regmap_raw_write_async()
2153 static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val, in _regmap_raw_read() argument
2157 u8 *u8 = map->work_buf; in _regmap_raw_read()
2160 WARN_ON(!map->bus); in _regmap_raw_read()
2162 range = _regmap_range_lookup(map, reg); in _regmap_raw_read()
2164 ret = _regmap_select_page(map, ®, range, in _regmap_raw_read()
2165 val_len / map->format.val_bytes); in _regmap_raw_read()
2170 map->format.format_reg(map->work_buf, reg, map->reg_shift); in _regmap_raw_read()
2178 u8[0] |= map->read_flag_mask; in _regmap_raw_read()
2180 trace_regmap_hw_read_start(map, reg, val_len / map->format.val_bytes); in _regmap_raw_read()
2182 ret = map->bus->read(map->bus_context, map->work_buf, in _regmap_raw_read()
2183 map->format.reg_bytes + map->format.pad_bytes, in _regmap_raw_read()
2186 trace_regmap_hw_read_done(map, reg, val_len / map->format.val_bytes); in _regmap_raw_read()
2194 struct regmap *map = context; in _regmap_bus_reg_read() local
2196 return map->bus->reg_read(map->bus_context, reg, val); in _regmap_bus_reg_read()
2203 struct regmap *map = context; in _regmap_bus_read() local
2205 if (!map->format.parse_val) in _regmap_bus_read()
2208 ret = _regmap_raw_read(map, reg, map->work_buf, map->format.val_bytes); in _regmap_bus_read()
2210 *val = map->format.parse_val(map->work_buf); in _regmap_bus_read()
2215 static int _regmap_read(struct regmap *map, unsigned int reg, in _regmap_read() argument
2219 void *context = _regmap_map_get_context(map); in _regmap_read()
2221 if (!map->cache_bypass) { in _regmap_read()
2222 ret = regcache_read(map, reg, val); in _regmap_read()
2227 if (map->cache_only) in _regmap_read()
2230 if (!regmap_readable(map, reg)) in _regmap_read()
2233 ret = map->reg_read(context, reg, val); in _regmap_read()
2236 if (map->dev && strcmp(dev_name(map->dev), LOG_DEVICE) == 0) in _regmap_read()
2237 dev_info(map->dev, "%x => %x\n", reg, *val); in _regmap_read()
2240 trace_regmap_reg_read(map, reg, *val); in _regmap_read()
2242 if (!map->cache_bypass) in _regmap_read()
2243 regcache_write(map, reg, *val); in _regmap_read()
2259 int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val) in regmap_read() argument
2263 if (reg % map->reg_stride) in regmap_read()
2266 map->lock(map->lock_arg); in regmap_read()
2268 ret = _regmap_read(map, reg, val); in regmap_read()
2270 map->unlock(map->lock_arg); in regmap_read()
2287 int regmap_raw_read(struct regmap *map, unsigned int reg, void *val, in regmap_raw_read() argument
2290 size_t val_bytes = map->format.val_bytes; in regmap_raw_read()
2295 if (!map->bus) in regmap_raw_read()
2297 if (val_len % map->format.val_bytes) in regmap_raw_read()
2299 if (reg % map->reg_stride) in regmap_raw_read()
2304 map->lock(map->lock_arg); in regmap_raw_read()
2306 if (regmap_volatile_range(map, reg, val_count) || map->cache_bypass || in regmap_raw_read()
2307 map->cache_type == REGCACHE_NONE) { in regmap_raw_read()
2308 if (!map->bus->read) { in regmap_raw_read()
2312 if (map->max_raw_read && map->max_raw_read < val_len) { in regmap_raw_read()
2318 ret = _regmap_raw_read(map, reg, val, val_len); in regmap_raw_read()
2325 ret = _regmap_read(map, reg + (i * map->reg_stride), in regmap_raw_read()
2330 map->format.format_val(val + (i * val_bytes), v, 0); in regmap_raw_read()
2335 map->unlock(map->lock_arg); in regmap_raw_read()
2410 int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val, in regmap_bulk_read() argument
2414 size_t val_bytes = map->format.val_bytes; in regmap_bulk_read()
2415 bool vol = regmap_volatile_range(map, reg, val_count); in regmap_bulk_read()
2417 if (reg % map->reg_stride) in regmap_bulk_read()
2420 if (map->bus && map->format.parse_inplace && (vol || map->cache_type == REGCACHE_NONE)) { in regmap_bulk_read()
2427 if (!map->use_single_read && in regmap_bulk_read()
2428 (!map->max_raw_read || map->max_raw_read > total_size)) { in regmap_bulk_read()
2429 ret = regmap_raw_read(map, reg, val, in regmap_bulk_read()
2439 int chunk_stride = map->reg_stride; in regmap_bulk_read()
2443 if (!map->use_single_read) { in regmap_bulk_read()
2444 chunk_size = map->max_raw_read; in regmap_bulk_read()
2453 ret = regmap_raw_read(map, in regmap_bulk_read()
2463 ret = regmap_raw_read(map, in regmap_bulk_read()
2473 map->format.parse_inplace(val + i); in regmap_bulk_read()
2477 ret = regmap_read(map, reg + (i * map->reg_stride), in regmap_bulk_read()
2482 if (map->format.format_val) { in regmap_bulk_read()
2483 map->format.format_val(val + (i * val_bytes), ival, 0); in regmap_bulk_read()
2495 switch (map->format.val_bytes) { in regmap_bulk_read()
2516 static int _regmap_update_bits(struct regmap *map, unsigned int reg, in _regmap_update_bits() argument
2526 if (regmap_volatile(map, reg) && map->reg_update_bits) { in _regmap_update_bits()
2527 ret = map->reg_update_bits(map->bus_context, reg, mask, val); in _regmap_update_bits()
2531 ret = _regmap_read(map, reg, &orig); in _regmap_update_bits()
2539 ret = _regmap_write(map, reg, tmp); in _regmap_update_bits()
2558 int regmap_update_bits(struct regmap *map, unsigned int reg, in regmap_update_bits() argument
2563 map->lock(map->lock_arg); in regmap_update_bits()
2564 ret = _regmap_update_bits(map, reg, mask, val, NULL, false); in regmap_update_bits()
2565 map->unlock(map->lock_arg); in regmap_update_bits()
2581 int regmap_write_bits(struct regmap *map, unsigned int reg, in regmap_write_bits() argument
2586 map->lock(map->lock_arg); in regmap_write_bits()
2587 ret = _regmap_update_bits(map, reg, mask, val, NULL, true); in regmap_write_bits()
2588 map->unlock(map->lock_arg); in regmap_write_bits()
2609 int regmap_update_bits_async(struct regmap *map, unsigned int reg, in regmap_update_bits_async() argument
2614 map->lock(map->lock_arg); in regmap_update_bits_async()
2616 map->async = true; in regmap_update_bits_async()
2618 ret = _regmap_update_bits(map, reg, mask, val, NULL, false); in regmap_update_bits_async()
2620 map->async = false; in regmap_update_bits_async()
2622 map->unlock(map->lock_arg); in regmap_update_bits_async()
2640 int regmap_update_bits_check(struct regmap *map, unsigned int reg, in regmap_update_bits_check() argument
2646 map->lock(map->lock_arg); in regmap_update_bits_check()
2647 ret = _regmap_update_bits(map, reg, mask, val, change, false); in regmap_update_bits_check()
2648 map->unlock(map->lock_arg); in regmap_update_bits_check()
2670 int regmap_update_bits_check_async(struct regmap *map, unsigned int reg, in regmap_update_bits_check_async() argument
2676 map->lock(map->lock_arg); in regmap_update_bits_check_async()
2678 map->async = true; in regmap_update_bits_check_async()
2680 ret = _regmap_update_bits(map, reg, mask, val, change, false); in regmap_update_bits_check_async()
2682 map->async = false; in regmap_update_bits_check_async()
2684 map->unlock(map->lock_arg); in regmap_update_bits_check_async()
2692 struct regmap *map = async->map; in regmap_async_complete_cb() local
2695 trace_regmap_async_io_complete(map); in regmap_async_complete_cb()
2697 spin_lock(&map->async_lock); in regmap_async_complete_cb()
2698 list_move(&async->list, &map->async_free); in regmap_async_complete_cb()
2699 wake = list_empty(&map->async_list); in regmap_async_complete_cb()
2702 map->async_ret = ret; in regmap_async_complete_cb()
2704 spin_unlock(&map->async_lock); in regmap_async_complete_cb()
2707 wake_up(&map->async_waitq); in regmap_async_complete_cb()
2711 static int regmap_async_is_done(struct regmap *map) in regmap_async_is_done() argument
2716 spin_lock_irqsave(&map->async_lock, flags); in regmap_async_is_done()
2717 ret = list_empty(&map->async_list); in regmap_async_is_done()
2718 spin_unlock_irqrestore(&map->async_lock, flags); in regmap_async_is_done()
2731 int regmap_async_complete(struct regmap *map) in regmap_async_complete() argument
2737 if (!map->bus || !map->bus->async_write) in regmap_async_complete()
2740 trace_regmap_async_complete_start(map); in regmap_async_complete()
2742 wait_event(map->async_waitq, regmap_async_is_done(map)); in regmap_async_complete()
2744 spin_lock_irqsave(&map->async_lock, flags); in regmap_async_complete()
2745 ret = map->async_ret; in regmap_async_complete()
2746 map->async_ret = 0; in regmap_async_complete()
2747 spin_unlock_irqrestore(&map->async_lock, flags); in regmap_async_complete()
2749 trace_regmap_async_complete_done(map); in regmap_async_complete()
2772 int regmap_register_patch(struct regmap *map, const struct reg_sequence *regs, in regmap_register_patch() argument
2783 p = krealloc(map->patch, in regmap_register_patch()
2784 sizeof(struct reg_sequence) * (map->patch_regs + num_regs), in regmap_register_patch()
2787 memcpy(p + map->patch_regs, regs, num_regs * sizeof(*regs)); in regmap_register_patch()
2788 map->patch = p; in regmap_register_patch()
2789 map->patch_regs += num_regs; in regmap_register_patch()
2794 map->lock(map->lock_arg); in regmap_register_patch()
2796 bypass = map->cache_bypass; in regmap_register_patch()
2798 map->cache_bypass = true; in regmap_register_patch()
2799 map->async = true; in regmap_register_patch()
2801 ret = _regmap_multi_reg_write(map, regs, num_regs); in regmap_register_patch()
2803 map->async = false; in regmap_register_patch()
2804 map->cache_bypass = bypass; in regmap_register_patch()
2806 map->unlock(map->lock_arg); in regmap_register_patch()
2808 regmap_async_complete(map); in regmap_register_patch()
2820 int regmap_get_val_bytes(struct regmap *map) in regmap_get_val_bytes() argument
2822 if (map->format.format_write) in regmap_get_val_bytes()
2825 return map->format.val_bytes; in regmap_get_val_bytes()
2835 int regmap_get_max_register(struct regmap *map) in regmap_get_max_register() argument
2837 return map->max_register ? map->max_register : -EINVAL; in regmap_get_max_register()
2847 int regmap_get_reg_stride(struct regmap *map) in regmap_get_reg_stride() argument
2849 return map->reg_stride; in regmap_get_reg_stride()
2853 int regmap_parse_val(struct regmap *map, const void *buf, in regmap_parse_val() argument
2856 if (!map->format.parse_val) in regmap_parse_val()
2859 *val = map->format.parse_val(buf); in regmap_parse_val()