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

regmap: Merge up fixes

Needed for the regmap-irq rework.

+13 -10
+5 -3
drivers/base/regmap/regmap-irq.c
··· 252 252 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); 253 253 struct regmap *map = d->map; 254 254 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); 255 + unsigned int reg = irq_data->reg_offset / map->reg_stride; 255 256 unsigned int mask, type; 256 257 257 258 type = irq_data->type.type_falling_val | irq_data->type.type_rising_val; ··· 269 268 * at the corresponding offset in regmap_irq_set_type(). 270 269 */ 271 270 if (d->chip->type_in_mask && type) 272 - mask = d->type_buf[irq_data->reg_offset / map->reg_stride]; 271 + mask = d->type_buf[reg] & irq_data->mask; 273 272 else 274 273 mask = irq_data->mask; 275 274 276 275 if (d->chip->clear_on_unmask) 277 276 d->clear_status = true; 278 277 279 - d->mask_buf[irq_data->reg_offset / map->reg_stride] &= ~mask; 278 + d->mask_buf[reg] &= ~mask; 280 279 } 281 280 282 281 static void regmap_irq_disable(struct irq_data *data) ··· 387 386 subreg = &chip->sub_reg_offsets[b]; 388 387 for (i = 0; i < subreg->num_regs; i++) { 389 388 unsigned int offset = subreg->offset[i]; 389 + unsigned int index = offset / map->reg_stride; 390 390 391 391 if (chip->not_fixed_stride) 392 392 ret = regmap_read(map, ··· 396 394 else 397 395 ret = regmap_read(map, 398 396 chip->status_base + offset, 399 - &data->status_buf[offset]); 397 + &data->status_buf[index]); 400 398 401 399 if (ret) 402 400 break;
+8 -7
drivers/base/regmap/regmap.c
··· 1880 1880 */ 1881 1881 bool regmap_can_raw_write(struct regmap *map) 1882 1882 { 1883 - return map->bus && map->bus->write && map->format.format_val && 1884 - map->format.format_reg; 1883 + return map->write && map->format.format_val && map->format.format_reg; 1885 1884 } 1886 1885 EXPORT_SYMBOL_GPL(regmap_can_raw_write); 1887 1886 ··· 2154 2155 size_t write_len; 2155 2156 int ret; 2156 2157 2157 - if (!map->bus) 2158 - return -EINVAL; 2159 - if (!map->bus->write) 2158 + if (!map->write) 2160 2159 return -ENOTSUPP; 2160 + 2161 2161 if (val_len % map->format.val_bytes) 2162 2162 return -EINVAL; 2163 2163 if (!IS_ALIGNED(reg, map->reg_stride)) ··· 2298 2300 * Some devices don't support bulk write, for them we have a series of 2299 2301 * single write operations. 2300 2302 */ 2301 - if (!map->bus || !map->format.parse_inplace) { 2303 + if (!map->write || !map->format.parse_inplace) { 2302 2304 map->lock(map->lock_arg); 2303 2305 for (i = 0; i < val_count; i++) { 2304 2306 unsigned int ival; ··· 2924 2926 size_t read_len; 2925 2927 int ret; 2926 2928 2929 + if (!map->read) 2930 + return -ENOTSUPP; 2931 + 2927 2932 if (val_len % map->format.val_bytes) 2928 2933 return -EINVAL; 2929 2934 if (!IS_ALIGNED(reg, map->reg_stride)) ··· 3040 3039 if (val_count == 0) 3041 3040 return -EINVAL; 3042 3041 3043 - if (map->format.parse_inplace && (vol || map->cache_type == REGCACHE_NONE)) { 3042 + if (map->read && map->format.parse_inplace && (vol || map->cache_type == REGCACHE_NONE)) { 3044 3043 ret = regmap_raw_read(map, reg, val, val_bytes * val_count); 3045 3044 if (ret != 0) 3046 3045 return ret;