Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge remote-tracking branches 'regmap/topic/1wire', 'regmap/topic/irq' and 'regmap/topic/lzo' into regmap-next

+321 -19
+9 -2
drivers/base/regmap/Kconfig
··· 3 3 # subsystems should select the appropriate symbols. 4 4 5 5 config REGMAP 6 - default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ) 6 + default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ) 7 + select IRQ_DOMAIN if REGMAP_IRQ 8 + bool 9 + 10 + config REGCACHE_COMPRESSED 7 11 select LZO_COMPRESS 8 12 select LZO_DECOMPRESS 9 - select IRQ_DOMAIN if REGMAP_IRQ 10 13 bool 11 14 12 15 config REGMAP_AC97 ··· 26 23 config REGMAP_SPMI 27 24 tristate 28 25 depends on SPMI 26 + 27 + config REGMAP_W1 28 + tristate 29 + depends on W1 29 30 30 31 config REGMAP_MMIO 31 32 tristate
+3 -1
drivers/base/regmap/Makefile
··· 2 2 CFLAGS_regmap.o := -I$(src) 3 3 4 4 obj-$(CONFIG_REGMAP) += regmap.o regcache.o 5 - obj-$(CONFIG_REGMAP) += regcache-rbtree.o regcache-lzo.o regcache-flat.o 5 + obj-$(CONFIG_REGMAP) += regcache-rbtree.o regcache-flat.o 6 + obj-$(CONFIG_REGCACHE_COMPRESSED) += regcache-lzo.o 6 7 obj-$(CONFIG_DEBUG_FS) += regmap-debugfs.o 7 8 obj-$(CONFIG_REGMAP_AC97) += regmap-ac97.o 8 9 obj-$(CONFIG_REGMAP_I2C) += regmap-i2c.o ··· 11 10 obj-$(CONFIG_REGMAP_SPMI) += regmap-spmi.o 12 11 obj-$(CONFIG_REGMAP_MMIO) += regmap-mmio.o 13 12 obj-$(CONFIG_REGMAP_IRQ) += regmap-irq.o 13 + obj-$(CONFIG_REGMAP_W1) += regmap-w1.o
+2
drivers/base/regmap/regcache.c
··· 21 21 22 22 static const struct regcache_ops *cache_types[] = { 23 23 &regcache_rbtree_ops, 24 + #if IS_ENABLED(CONFIG_REGCACHE_COMPRESSED) 24 25 &regcache_lzo_ops, 26 + #endif 25 27 &regcache_flat_ops, 26 28 }; 27 29
+26 -16
drivers/base/regmap/regmap-irq.c
··· 60 60 mutex_lock(&d->lock); 61 61 } 62 62 63 + static int regmap_irq_update_bits(struct regmap_irq_chip_data *d, 64 + unsigned int reg, unsigned int mask, 65 + unsigned int val) 66 + { 67 + if (d->chip->mask_writeonly) 68 + return regmap_write_bits(d->map, reg, mask, val); 69 + else 70 + return regmap_update_bits(d->map, reg, mask, val); 71 + } 72 + 63 73 static void regmap_irq_sync_unlock(struct irq_data *data) 64 74 { 65 75 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); ··· 94 84 reg = d->chip->mask_base + 95 85 (i * map->reg_stride * d->irq_reg_stride); 96 86 if (d->chip->mask_invert) { 97 - ret = regmap_update_bits(d->map, reg, 87 + ret = regmap_irq_update_bits(d, reg, 98 88 d->mask_buf_def[i], ~d->mask_buf[i]); 99 89 } else if (d->chip->unmask_base) { 100 90 /* set mask with mask_base register */ 101 - ret = regmap_update_bits(d->map, reg, 91 + ret = regmap_irq_update_bits(d, reg, 102 92 d->mask_buf_def[i], ~d->mask_buf[i]); 103 93 if (ret < 0) 104 94 dev_err(d->map->dev, ··· 107 97 unmask_offset = d->chip->unmask_base - 108 98 d->chip->mask_base; 109 99 /* clear mask with unmask_base register */ 110 - ret = regmap_update_bits(d->map, 100 + ret = regmap_irq_update_bits(d, 111 101 reg + unmask_offset, 112 102 d->mask_buf_def[i], 113 103 d->mask_buf[i]); 114 104 } else { 115 - ret = regmap_update_bits(d->map, reg, 105 + ret = regmap_irq_update_bits(d, reg, 116 106 d->mask_buf_def[i], d->mask_buf[i]); 117 107 } 118 108 if (ret != 0) ··· 123 113 (i * map->reg_stride * d->irq_reg_stride); 124 114 if (d->wake_buf) { 125 115 if (d->chip->wake_invert) 126 - ret = regmap_update_bits(d->map, reg, 116 + ret = regmap_irq_update_bits(d, reg, 127 117 d->mask_buf_def[i], 128 118 ~d->wake_buf[i]); 129 119 else 130 - ret = regmap_update_bits(d->map, reg, 120 + ret = regmap_irq_update_bits(d, reg, 131 121 d->mask_buf_def[i], 132 122 d->wake_buf[i]); 133 123 if (ret != 0) ··· 163 153 reg = d->chip->type_base + 164 154 (i * map->reg_stride * d->type_reg_stride); 165 155 if (d->chip->type_invert) 166 - ret = regmap_update_bits(d->map, reg, 156 + ret = regmap_irq_update_bits(d, reg, 167 157 d->type_buf_def[i], ~d->type_buf[i]); 168 158 else 169 - ret = regmap_update_bits(d->map, reg, 159 + ret = regmap_irq_update_bits(d, reg, 170 160 d->type_buf_def[i], d->type_buf[i]); 171 161 if (ret != 0) 172 162 dev_err(d->map->dev, "Failed to sync type in %x\n", ··· 404 394 405 395 static const struct irq_domain_ops regmap_domain_ops = { 406 396 .map = regmap_irq_map, 407 - .xlate = irq_domain_xlate_twocell, 397 + .xlate = irq_domain_xlate_onetwocell, 408 398 }; 409 399 410 400 /** ··· 529 519 reg = chip->mask_base + 530 520 (i * map->reg_stride * d->irq_reg_stride); 531 521 if (chip->mask_invert) 532 - ret = regmap_update_bits(map, reg, 522 + ret = regmap_irq_update_bits(d, reg, 533 523 d->mask_buf[i], ~d->mask_buf[i]); 534 524 else if (d->chip->unmask_base) { 535 525 unmask_offset = d->chip->unmask_base - 536 526 d->chip->mask_base; 537 - ret = regmap_update_bits(d->map, 527 + ret = regmap_irq_update_bits(d, 538 528 reg + unmask_offset, 539 529 d->mask_buf[i], 540 530 d->mask_buf[i]); 541 531 } else 542 - ret = regmap_update_bits(map, reg, 532 + ret = regmap_irq_update_bits(d, reg, 543 533 d->mask_buf[i], d->mask_buf[i]); 544 534 if (ret != 0) { 545 535 dev_err(map->dev, "Failed to set masks in 0x%x: %d\n", ··· 585 575 (i * map->reg_stride * d->irq_reg_stride); 586 576 587 577 if (chip->wake_invert) 588 - ret = regmap_update_bits(map, reg, 578 + ret = regmap_irq_update_bits(d, reg, 589 579 d->mask_buf_def[i], 590 580 0); 591 581 else 592 - ret = regmap_update_bits(map, reg, 582 + ret = regmap_irq_update_bits(d, reg, 593 583 d->mask_buf_def[i], 594 584 d->wake_buf[i]); 595 585 if (ret != 0) { ··· 613 603 reg = chip->type_base + 614 604 (i * map->reg_stride * d->type_reg_stride); 615 605 if (chip->type_invert) 616 - ret = regmap_update_bits(map, reg, 606 + ret = regmap_irq_update_bits(d, reg, 617 607 d->type_buf_def[i], 0xFF); 618 608 else 619 - ret = regmap_update_bits(map, reg, 609 + ret = regmap_irq_update_bits(d, reg, 620 610 d->type_buf_def[i], 0x0); 621 611 if (ret != 0) { 622 612 dev_err(map->dev,
+245
drivers/base/regmap/regmap-w1.c
··· 1 + /* 2 + * Register map access API - W1 (1-Wire) support 3 + * 4 + * Copyright (C) 2017 OAO Radioavionica 5 + * Author: Alex A. Mihaylov <minimumlaw@rambler.ru> 6 + * 7 + * This program is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License version 2 as 9 + * published by the Free Software Foundation 10 + */ 11 + 12 + #include <linux/regmap.h> 13 + #include <linux/module.h> 14 + #include "../../w1/w1.h" 15 + 16 + #include "internal.h" 17 + 18 + #define W1_CMD_READ_DATA 0x69 19 + #define W1_CMD_WRITE_DATA 0x6C 20 + 21 + /* 22 + * 1-Wire slaves registers with addess 8 bit and data 8 bit 23 + */ 24 + 25 + static int w1_reg_a8_v8_read(void *context, unsigned int reg, unsigned int *val) 26 + { 27 + struct device *dev = context; 28 + struct w1_slave *sl = container_of(dev, struct w1_slave, dev); 29 + int ret = 0; 30 + 31 + if (reg > 255) 32 + return -EINVAL; 33 + 34 + mutex_lock(&sl->master->bus_mutex); 35 + if (!w1_reset_select_slave(sl)) { 36 + w1_write_8(sl->master, W1_CMD_READ_DATA); 37 + w1_write_8(sl->master, reg); 38 + *val = w1_read_8(sl->master); 39 + } else { 40 + ret = -ENODEV; 41 + } 42 + mutex_unlock(&sl->master->bus_mutex); 43 + 44 + return ret; 45 + } 46 + 47 + static int w1_reg_a8_v8_write(void *context, unsigned int reg, unsigned int val) 48 + { 49 + struct device *dev = context; 50 + struct w1_slave *sl = container_of(dev, struct w1_slave, dev); 51 + int ret = 0; 52 + 53 + if (reg > 255) 54 + return -EINVAL; 55 + 56 + mutex_lock(&sl->master->bus_mutex); 57 + if (!w1_reset_select_slave(sl)) { 58 + w1_write_8(sl->master, W1_CMD_WRITE_DATA); 59 + w1_write_8(sl->master, reg); 60 + w1_write_8(sl->master, val); 61 + } else { 62 + ret = -ENODEV; 63 + } 64 + mutex_unlock(&sl->master->bus_mutex); 65 + 66 + return ret; 67 + } 68 + 69 + /* 70 + * 1-Wire slaves registers with addess 8 bit and data 16 bit 71 + */ 72 + 73 + static int w1_reg_a8_v16_read(void *context, unsigned int reg, 74 + unsigned int *val) 75 + { 76 + struct device *dev = context; 77 + struct w1_slave *sl = container_of(dev, struct w1_slave, dev); 78 + int ret = 0; 79 + 80 + if (reg > 255) 81 + return -EINVAL; 82 + 83 + mutex_lock(&sl->master->bus_mutex); 84 + if (!w1_reset_select_slave(sl)) { 85 + w1_write_8(sl->master, W1_CMD_READ_DATA); 86 + w1_write_8(sl->master, reg); 87 + *val = w1_read_8(sl->master); 88 + *val |= w1_read_8(sl->master)<<8; 89 + } else { 90 + ret = -ENODEV; 91 + } 92 + mutex_unlock(&sl->master->bus_mutex); 93 + 94 + return ret; 95 + } 96 + 97 + static int w1_reg_a8_v16_write(void *context, unsigned int reg, 98 + unsigned int val) 99 + { 100 + struct device *dev = context; 101 + struct w1_slave *sl = container_of(dev, struct w1_slave, dev); 102 + int ret = 0; 103 + 104 + if (reg > 255) 105 + return -EINVAL; 106 + 107 + mutex_lock(&sl->master->bus_mutex); 108 + if (!w1_reset_select_slave(sl)) { 109 + w1_write_8(sl->master, W1_CMD_WRITE_DATA); 110 + w1_write_8(sl->master, reg); 111 + w1_write_8(sl->master, val & 0x00FF); 112 + w1_write_8(sl->master, val>>8 & 0x00FF); 113 + } else { 114 + ret = -ENODEV; 115 + } 116 + mutex_unlock(&sl->master->bus_mutex); 117 + 118 + return ret; 119 + } 120 + 121 + /* 122 + * 1-Wire slaves registers with addess 16 bit and data 16 bit 123 + */ 124 + 125 + static int w1_reg_a16_v16_read(void *context, unsigned int reg, 126 + unsigned int *val) 127 + { 128 + struct device *dev = context; 129 + struct w1_slave *sl = container_of(dev, struct w1_slave, dev); 130 + int ret = 0; 131 + 132 + if (reg > 65535) 133 + return -EINVAL; 134 + 135 + mutex_lock(&sl->master->bus_mutex); 136 + if (!w1_reset_select_slave(sl)) { 137 + w1_write_8(sl->master, W1_CMD_READ_DATA); 138 + w1_write_8(sl->master, reg & 0x00FF); 139 + w1_write_8(sl->master, reg>>8 & 0x00FF); 140 + *val = w1_read_8(sl->master); 141 + *val |= w1_read_8(sl->master)<<8; 142 + } else { 143 + ret = -ENODEV; 144 + } 145 + mutex_unlock(&sl->master->bus_mutex); 146 + 147 + return ret; 148 + } 149 + 150 + static int w1_reg_a16_v16_write(void *context, unsigned int reg, 151 + unsigned int val) 152 + { 153 + struct device *dev = context; 154 + struct w1_slave *sl = container_of(dev, struct w1_slave, dev); 155 + int ret = 0; 156 + 157 + if (reg > 65535) 158 + return -EINVAL; 159 + 160 + mutex_lock(&sl->master->bus_mutex); 161 + if (!w1_reset_select_slave(sl)) { 162 + w1_write_8(sl->master, W1_CMD_WRITE_DATA); 163 + w1_write_8(sl->master, reg & 0x00FF); 164 + w1_write_8(sl->master, reg>>8 & 0x00FF); 165 + w1_write_8(sl->master, val & 0x00FF); 166 + w1_write_8(sl->master, val>>8 & 0x00FF); 167 + } else { 168 + ret = -ENODEV; 169 + } 170 + mutex_unlock(&sl->master->bus_mutex); 171 + 172 + return ret; 173 + } 174 + 175 + /* 176 + * Various types of supported bus addressing 177 + */ 178 + 179 + static struct regmap_bus regmap_w1_bus_a8_v8 = { 180 + .reg_read = w1_reg_a8_v8_read, 181 + .reg_write = w1_reg_a8_v8_write, 182 + }; 183 + 184 + static struct regmap_bus regmap_w1_bus_a8_v16 = { 185 + .reg_read = w1_reg_a8_v16_read, 186 + .reg_write = w1_reg_a8_v16_write, 187 + }; 188 + 189 + static struct regmap_bus regmap_w1_bus_a16_v16 = { 190 + .reg_read = w1_reg_a16_v16_read, 191 + .reg_write = w1_reg_a16_v16_write, 192 + }; 193 + 194 + static const struct regmap_bus *regmap_get_w1_bus(struct device *w1_dev, 195 + const struct regmap_config *config) 196 + { 197 + if (config->reg_bits == 8 && config->val_bits == 8) 198 + return &regmap_w1_bus_a8_v8; 199 + 200 + if (config->reg_bits == 8 && config->val_bits == 16) 201 + return &regmap_w1_bus_a8_v16; 202 + 203 + if (config->reg_bits == 16 && config->val_bits == 16) 204 + return &regmap_w1_bus_a16_v16; 205 + 206 + return ERR_PTR(-ENOTSUPP); 207 + } 208 + 209 + struct regmap *__regmap_init_w1(struct device *w1_dev, 210 + const struct regmap_config *config, 211 + struct lock_class_key *lock_key, 212 + const char *lock_name) 213 + { 214 + 215 + const struct regmap_bus *bus = regmap_get_w1_bus(w1_dev, config); 216 + 217 + if (IS_ERR(bus)) 218 + return ERR_CAST(bus); 219 + 220 + return __regmap_init(w1_dev, bus, w1_dev, config, 221 + lock_key, lock_name); 222 + 223 + return NULL; 224 + } 225 + EXPORT_SYMBOL_GPL(__regmap_init_w1); 226 + 227 + struct regmap *__devm_regmap_init_w1(struct device *w1_dev, 228 + const struct regmap_config *config, 229 + struct lock_class_key *lock_key, 230 + const char *lock_name) 231 + { 232 + 233 + const struct regmap_bus *bus = regmap_get_w1_bus(w1_dev, config); 234 + 235 + if (IS_ERR(bus)) 236 + return ERR_CAST(bus); 237 + 238 + return __devm_regmap_init(w1_dev, bus, w1_dev, config, 239 + lock_key, lock_name); 240 + 241 + return NULL; 242 + } 243 + EXPORT_SYMBOL_GPL(__devm_regmap_init_w1); 244 + 245 + MODULE_LICENSE("GPL");
+36
include/linux/regmap.h
··· 461 461 const struct regmap_config *config, 462 462 struct lock_class_key *lock_key, 463 463 const char *lock_name); 464 + struct regmap *__regmap_init_w1(struct device *w1_dev, 465 + const struct regmap_config *config, 466 + struct lock_class_key *lock_key, 467 + const char *lock_name); 464 468 struct regmap *__regmap_init_mmio_clk(struct device *dev, const char *clk_id, 465 469 void __iomem *regs, 466 470 const struct regmap_config *config, ··· 497 493 const struct regmap_config *config, 498 494 struct lock_class_key *lock_key, 499 495 const char *lock_name); 496 + struct regmap *__devm_regmap_init_w1(struct device *w1_dev, 497 + const struct regmap_config *config, 498 + struct lock_class_key *lock_key, 499 + const char *lock_name); 500 500 struct regmap *__devm_regmap_init_mmio_clk(struct device *dev, 501 501 const char *clk_id, 502 502 void __iomem *regs, ··· 603 595 #define regmap_init_spmi_ext(dev, config) \ 604 596 __regmap_lockdep_wrapper(__regmap_init_spmi_ext, #config, \ 605 597 dev, config) 598 + 599 + /** 600 + * regmap_init_w1() - Initialise register map 601 + * 602 + * @w1_dev: Device that will be interacted with 603 + * @config: Configuration for register map 604 + * 605 + * The return value will be an ERR_PTR() on error or a valid pointer to 606 + * a struct regmap. 607 + */ 608 + #define regmap_init_w1(w1_dev, config) \ 609 + __regmap_lockdep_wrapper(__regmap_init_w1, #config, \ 610 + w1_dev, config) 606 611 607 612 /** 608 613 * regmap_init_mmio_clk() - Initialise register map with register clock ··· 732 711 __regmap_lockdep_wrapper(__devm_regmap_init_spmi_ext, #config, \ 733 712 dev, config) 734 713 714 + /** 715 + * devm_regmap_init_w1() - Initialise managed register map 716 + * 717 + * @w1_dev: Device that will be interacted with 718 + * @config: Configuration for register map 719 + * 720 + * The return value will be an ERR_PTR() on error or a valid pointer 721 + * to a struct regmap. The regmap will be automatically freed by the 722 + * device management code. 723 + */ 724 + #define devm_regmap_init_w1(w1_dev, config) \ 725 + __regmap_lockdep_wrapper(__devm_regmap_init_w1, #config, \ 726 + w1_dev, config) 735 727 /** 736 728 * devm_regmap_init_mmio_clk() - Initialise managed register map with clock 737 729 * ··· 918 884 * 919 885 * @status_base: Base status register address. 920 886 * @mask_base: Base mask register address. 887 + * @mask_writeonly: Base mask register is write only. 921 888 * @unmask_base: Base unmask register address. for chips who have 922 889 * separate mask and unmask registers 923 890 * @ack_base: Base ack address. If zero then the chip is clear on read. ··· 962 927 unsigned int wake_base; 963 928 unsigned int type_base; 964 929 unsigned int irq_reg_stride; 930 + bool mask_writeonly:1; 965 931 bool init_ack_masked:1; 966 932 bool mask_invert:1; 967 933 bool use_ack:1;