regmap.c (c0cc6fe1d09e3f1baecbdf8922473c8e7d3a5317) regmap.c (f01ee60fffa4dc6c77122121233a793f7f696e67)
1/*
2 * Register map access API
3 *
4 * Copyright 2011 Wolfson Microelectronics plc
5 *
6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

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

238 map->unlock = regmap_unlock_mutex;
239 }
240 map->format.buf_size = (config->reg_bits + config->val_bits) / 8;
241 map->format.reg_bytes = DIV_ROUND_UP(config->reg_bits, 8);
242 map->format.pad_bytes = config->pad_bits / 8;
243 map->format.val_bytes = DIV_ROUND_UP(config->val_bits, 8);
244 map->format.buf_size += map->format.pad_bytes;
245 map->reg_shift = config->pad_bits % 8;
1/*
2 * Register map access API
3 *
4 * Copyright 2011 Wolfson Microelectronics plc
5 *
6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

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

238 map->unlock = regmap_unlock_mutex;
239 }
240 map->format.buf_size = (config->reg_bits + config->val_bits) / 8;
241 map->format.reg_bytes = DIV_ROUND_UP(config->reg_bits, 8);
242 map->format.pad_bytes = config->pad_bits / 8;
243 map->format.val_bytes = DIV_ROUND_UP(config->val_bits, 8);
244 map->format.buf_size += map->format.pad_bytes;
245 map->reg_shift = config->pad_bits % 8;
246 if (config->reg_stride)
247 map->reg_stride = config->reg_stride;
248 else
249 map->reg_stride = 1;
246 map->dev = dev;
247 map->bus = bus;
248 map->bus_context = bus_context;
249 map->max_register = config->max_register;
250 map->writeable_reg = config->writeable_reg;
251 map->readable_reg = config->readable_reg;
252 map->volatile_reg = config->volatile_reg;
253 map->precious_reg = config->precious_reg;

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

464 void *buf;
465 int ret = -ENOTSUPP;
466 size_t len;
467 int i;
468
469 /* Check for unwritable registers before we start */
470 if (map->writeable_reg)
471 for (i = 0; i < val_len / map->format.val_bytes; i++)
250 map->dev = dev;
251 map->bus = bus;
252 map->bus_context = bus_context;
253 map->max_register = config->max_register;
254 map->writeable_reg = config->writeable_reg;
255 map->readable_reg = config->readable_reg;
256 map->volatile_reg = config->volatile_reg;
257 map->precious_reg = config->precious_reg;

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

468 void *buf;
469 int ret = -ENOTSUPP;
470 size_t len;
471 int i;
472
473 /* Check for unwritable registers before we start */
474 if (map->writeable_reg)
475 for (i = 0; i < val_len / map->format.val_bytes; i++)
472 if (!map->writeable_reg(map->dev, reg + i))
476 if (!map->writeable_reg(map->dev,
477 reg + (i * map->reg_stride)))
473 return -EINVAL;
474
475 if (!map->cache_bypass && map->format.parse_val) {
476 unsigned int ival;
477 int val_bytes = map->format.val_bytes;
478 for (i = 0; i < val_len / val_bytes; i++) {
479 memcpy(map->work_buf, val + (i * val_bytes), val_bytes);
480 ival = map->format.parse_val(map->work_buf);
478 return -EINVAL;
479
480 if (!map->cache_bypass && map->format.parse_val) {
481 unsigned int ival;
482 int val_bytes = map->format.val_bytes;
483 for (i = 0; i < val_len / val_bytes; i++) {
484 memcpy(map->work_buf, val + (i * val_bytes), val_bytes);
485 ival = map->format.parse_val(map->work_buf);
481 ret = regcache_write(map, reg + i, ival);
486 ret = regcache_write(map, reg + (i * map->reg_stride),
487 ival);
482 if (ret) {
483 dev_err(map->dev,
484 "Error in caching of register: %u ret: %d\n",
485 reg + i, ret);
486 return ret;
487 }
488 }
489 if (map->cache_only) {

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

585 *
586 * A value of zero will be returned on success, a negative errno will
587 * be returned in error cases.
588 */
589int regmap_write(struct regmap *map, unsigned int reg, unsigned int val)
590{
591 int ret;
592
488 if (ret) {
489 dev_err(map->dev,
490 "Error in caching of register: %u ret: %d\n",
491 reg + i, ret);
492 return ret;
493 }
494 }
495 if (map->cache_only) {

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

591 *
592 * A value of zero will be returned on success, a negative errno will
593 * be returned in error cases.
594 */
595int regmap_write(struct regmap *map, unsigned int reg, unsigned int val)
596{
597 int ret;
598
599 if (reg % map->reg_stride)
600 return -EINVAL;
601
593 map->lock(map);
594
595 ret = _regmap_write(map, reg, val);
596
597 map->unlock(map);
598
599 return ret;
600}

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

618 */
619int regmap_raw_write(struct regmap *map, unsigned int reg,
620 const void *val, size_t val_len)
621{
622 int ret;
623
624 if (val_len % map->format.val_bytes)
625 return -EINVAL;
602 map->lock(map);
603
604 ret = _regmap_write(map, reg, val);
605
606 map->unlock(map);
607
608 return ret;
609}

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

627 */
628int regmap_raw_write(struct regmap *map, unsigned int reg,
629 const void *val, size_t val_len)
630{
631 int ret;
632
633 if (val_len % map->format.val_bytes)
634 return -EINVAL;
635 if (reg % map->reg_stride)
636 return -EINVAL;
626
627 map->lock(map);
628
629 ret = _regmap_raw_write(map, reg, val, val_len);
630
631 map->unlock(map);
632
633 return ret;

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

652 size_t val_count)
653{
654 int ret = 0, i;
655 size_t val_bytes = map->format.val_bytes;
656 void *wval;
657
658 if (!map->format.parse_val)
659 return -EINVAL;
637
638 map->lock(map);
639
640 ret = _regmap_raw_write(map, reg, val, val_len);
641
642 map->unlock(map);
643
644 return ret;

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

663 size_t val_count)
664{
665 int ret = 0, i;
666 size_t val_bytes = map->format.val_bytes;
667 void *wval;
668
669 if (!map->format.parse_val)
670 return -EINVAL;
671 if (reg % map->reg_stride)
672 return -EINVAL;
660
661 map->lock(map);
662
663 /* No formatting is require if val_byte is 1 */
664 if (val_bytes == 1) {
665 wval = (void *)val;
666 } else {
667 wval = kmemdup(val, val_count * val_bytes, GFP_KERNEL);

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

748 *
749 * A value of zero will be returned on success, a negative errno will
750 * be returned in error cases.
751 */
752int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val)
753{
754 int ret;
755
673
674 map->lock(map);
675
676 /* No formatting is require if val_byte is 1 */
677 if (val_bytes == 1) {
678 wval = (void *)val;
679 } else {
680 wval = kmemdup(val, val_count * val_bytes, GFP_KERNEL);

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

761 *
762 * A value of zero will be returned on success, a negative errno will
763 * be returned in error cases.
764 */
765int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val)
766{
767 int ret;
768
769 if (reg % map->reg_stride)
770 return -EINVAL;
771
756 map->lock(map);
757
758 ret = _regmap_read(map, reg, val);
759
760 map->unlock(map);
761
762 return ret;
763}

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

779{
780 size_t val_bytes = map->format.val_bytes;
781 size_t val_count = val_len / val_bytes;
782 unsigned int v;
783 int ret, i;
784
785 if (val_len % map->format.val_bytes)
786 return -EINVAL;
772 map->lock(map);
773
774 ret = _regmap_read(map, reg, val);
775
776 map->unlock(map);
777
778 return ret;
779}

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

795{
796 size_t val_bytes = map->format.val_bytes;
797 size_t val_count = val_len / val_bytes;
798 unsigned int v;
799 int ret, i;
800
801 if (val_len % map->format.val_bytes)
802 return -EINVAL;
803 if (reg % map->reg_stride)
804 return -EINVAL;
787
788 map->lock(map);
789
790 if (regmap_volatile_range(map, reg, val_count) || map->cache_bypass ||
791 map->cache_type == REGCACHE_NONE) {
792 /* Physical block read if there's no cache involved */
793 ret = _regmap_raw_read(map, reg, val, val_len);
794
795 } else {
796 /* Otherwise go word by word for the cache; should be low
797 * cost as we expect to hit the cache.
798 */
799 for (i = 0; i < val_count; i++) {
805
806 map->lock(map);
807
808 if (regmap_volatile_range(map, reg, val_count) || map->cache_bypass ||
809 map->cache_type == REGCACHE_NONE) {
810 /* Physical block read if there's no cache involved */
811 ret = _regmap_raw_read(map, reg, val, val_len);
812
813 } else {
814 /* Otherwise go word by word for the cache; should be low
815 * cost as we expect to hit the cache.
816 */
817 for (i = 0; i < val_count; i++) {
800 ret = _regmap_read(map, reg + i, &v);
818 ret = _regmap_read(map, reg + (i * map->reg_stride),
819 &v);
801 if (ret != 0)
802 goto out;
803
804 map->format.format_val(val + (i * val_bytes), v, 0);
805 }
806 }
807
808 out:

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

827 size_t val_count)
828{
829 int ret, i;
830 size_t val_bytes = map->format.val_bytes;
831 bool vol = regmap_volatile_range(map, reg, val_count);
832
833 if (!map->format.parse_val)
834 return -EINVAL;
820 if (ret != 0)
821 goto out;
822
823 map->format.format_val(val + (i * val_bytes), v, 0);
824 }
825 }
826
827 out:

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

846 size_t val_count)
847{
848 int ret, i;
849 size_t val_bytes = map->format.val_bytes;
850 bool vol = regmap_volatile_range(map, reg, val_count);
851
852 if (!map->format.parse_val)
853 return -EINVAL;
854 if (reg % map->reg_stride)
855 return -EINVAL;
835
836 if (vol || map->cache_type == REGCACHE_NONE) {
837 ret = regmap_raw_read(map, reg, val, val_bytes * val_count);
838 if (ret != 0)
839 return ret;
840
841 for (i = 0; i < val_count * val_bytes; i += val_bytes)
842 map->format.parse_val(val + i);
843 } else {
844 for (i = 0; i < val_count; i++) {
856
857 if (vol || map->cache_type == REGCACHE_NONE) {
858 ret = regmap_raw_read(map, reg, val, val_bytes * val_count);
859 if (ret != 0)
860 return ret;
861
862 for (i = 0; i < val_count * val_bytes; i += val_bytes)
863 map->format.parse_val(val + i);
864 } else {
865 for (i = 0; i < val_count; i++) {
845 ret = regmap_read(map, reg + i, val + (i * val_bytes));
866 ret = regmap_read(map, reg + (i * map->reg_stride),
867 val + (i * val_bytes));
846 if (ret != 0)
847 return ret;
848 }
849 }
850
851 return 0;
852}
853EXPORT_SYMBOL_GPL(regmap_bulk_read);

--- 148 unchanged lines hidden ---
868 if (ret != 0)
869 return ret;
870 }
871 }
872
873 return 0;
874}
875EXPORT_SYMBOL_GPL(regmap_bulk_read);

--- 148 unchanged lines hidden ---