.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
---|
1 | 2 | #ifndef __LINUX_REGMAP_H |
---|
2 | 3 | #define __LINUX_REGMAP_H |
---|
3 | 4 | |
---|
.. | .. |
---|
7 | 8 | * Copyright 2011 Wolfson Microelectronics plc |
---|
8 | 9 | * |
---|
9 | 10 | * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> |
---|
10 | | - * |
---|
11 | | - * This program is free software; you can redistribute it and/or modify |
---|
12 | | - * it under the terms of the GNU General Public License version 2 as |
---|
13 | | - * published by the Free Software Foundation. |
---|
14 | 11 | */ |
---|
15 | 12 | |
---|
16 | 13 | #include <linux/list.h> |
---|
.. | .. |
---|
20 | 17 | #include <linux/err.h> |
---|
21 | 18 | #include <linux/bug.h> |
---|
22 | 19 | #include <linux/lockdep.h> |
---|
| 20 | +#include <linux/iopoll.h> |
---|
| 21 | +#include <linux/fwnode.h> |
---|
| 22 | +#include <linux/android_kabi.h> |
---|
23 | 23 | |
---|
24 | 24 | struct module; |
---|
25 | 25 | struct clk; |
---|
26 | 26 | struct device; |
---|
| 27 | +struct device_node; |
---|
27 | 28 | struct i2c_client; |
---|
| 29 | +struct i3c_device; |
---|
28 | 30 | struct irq_domain; |
---|
29 | 31 | struct slim_device; |
---|
30 | 32 | struct spi_device; |
---|
.. | .. |
---|
73 | 75 | unsigned int delay_us; |
---|
74 | 76 | }; |
---|
75 | 77 | |
---|
76 | | -#define regmap_update_bits(map, reg, mask, val) \ |
---|
77 | | - regmap_update_bits_base(map, reg, mask, val, NULL, false, false) |
---|
78 | | -#define regmap_update_bits_async(map, reg, mask, val)\ |
---|
79 | | - regmap_update_bits_base(map, reg, mask, val, NULL, true, false) |
---|
80 | | -#define regmap_update_bits_check(map, reg, mask, val, change)\ |
---|
81 | | - regmap_update_bits_base(map, reg, mask, val, change, false, false) |
---|
82 | | -#define regmap_update_bits_check_async(map, reg, mask, val, change)\ |
---|
83 | | - regmap_update_bits_base(map, reg, mask, val, change, true, false) |
---|
84 | | - |
---|
85 | | -#define regmap_write_bits(map, reg, mask, val) \ |
---|
86 | | - regmap_update_bits_base(map, reg, mask, val, NULL, false, true) |
---|
87 | | - |
---|
88 | | -#define regmap_field_write(field, val) \ |
---|
89 | | - regmap_field_update_bits_base(field, ~0, val, NULL, false, false) |
---|
90 | | -#define regmap_field_force_write(field, val) \ |
---|
91 | | - regmap_field_update_bits_base(field, ~0, val, NULL, false, true) |
---|
92 | | -#define regmap_field_update_bits(field, mask, val)\ |
---|
93 | | - regmap_field_update_bits_base(field, mask, val, NULL, false, false) |
---|
94 | | -#define regmap_field_force_update_bits(field, mask, val) \ |
---|
95 | | - regmap_field_update_bits_base(field, mask, val, NULL, false, true) |
---|
96 | | - |
---|
97 | | -#define regmap_fields_write(field, id, val) \ |
---|
98 | | - regmap_fields_update_bits_base(field, id, ~0, val, NULL, false, false) |
---|
99 | | -#define regmap_fields_force_write(field, id, val) \ |
---|
100 | | - regmap_fields_update_bits_base(field, id, ~0, val, NULL, false, true) |
---|
101 | | -#define regmap_fields_update_bits(field, id, mask, val)\ |
---|
102 | | - regmap_fields_update_bits_base(field, id, mask, val, NULL, false, false) |
---|
103 | | -#define regmap_fields_force_update_bits(field, id, mask, val) \ |
---|
104 | | - regmap_fields_update_bits_base(field, id, mask, val, NULL, false, true) |
---|
| 78 | +#define REG_SEQ(_reg, _def, _delay_us) { \ |
---|
| 79 | + .reg = _reg, \ |
---|
| 80 | + .def = _def, \ |
---|
| 81 | + .delay_us = _delay_us, \ |
---|
| 82 | + } |
---|
| 83 | +#define REG_SEQ0(_reg, _def) REG_SEQ(_reg, _def, 0) |
---|
105 | 84 | |
---|
106 | 85 | /** |
---|
107 | 86 | * regmap_read_poll_timeout - Poll until a condition is met or a timeout occurs |
---|
.. | .. |
---|
112 | 91 | * @cond: Break condition (usually involving @val) |
---|
113 | 92 | * @sleep_us: Maximum time to sleep between reads in us (0 |
---|
114 | 93 | * tight-loops). Should be less than ~20ms since usleep_range |
---|
115 | | - * is used (see Documentation/timers/timers-howto.txt). |
---|
| 94 | + * is used (see Documentation/timers/timers-howto.rst). |
---|
116 | 95 | * @timeout_us: Timeout in us, 0 means never timeout |
---|
117 | 96 | * |
---|
118 | 97 | * Returns 0 on success and -ETIMEDOUT upon a timeout or the regmap_read |
---|
.. | .. |
---|
124 | 103 | */ |
---|
125 | 104 | #define regmap_read_poll_timeout(map, addr, val, cond, sleep_us, timeout_us) \ |
---|
126 | 105 | ({ \ |
---|
127 | | - u64 __timeout_us = (timeout_us); \ |
---|
128 | | - unsigned long __sleep_us = (sleep_us); \ |
---|
129 | | - ktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \ |
---|
130 | | - int __ret; \ |
---|
131 | | - might_sleep_if(__sleep_us); \ |
---|
132 | | - for (;;) { \ |
---|
133 | | - __ret = regmap_read((map), (addr), &(val)); \ |
---|
134 | | - if (__ret) \ |
---|
135 | | - break; \ |
---|
136 | | - if (cond) \ |
---|
137 | | - break; \ |
---|
138 | | - if ((__timeout_us) && \ |
---|
139 | | - ktime_compare(ktime_get(), __timeout) > 0) { \ |
---|
140 | | - __ret = regmap_read((map), (addr), &(val)); \ |
---|
141 | | - break; \ |
---|
142 | | - } \ |
---|
143 | | - if (__sleep_us) \ |
---|
144 | | - usleep_range((__sleep_us >> 2) + 1, __sleep_us); \ |
---|
145 | | - } \ |
---|
146 | | - __ret ?: ((cond) ? 0 : -ETIMEDOUT); \ |
---|
| 106 | + int __ret, __tmp; \ |
---|
| 107 | + __tmp = read_poll_timeout(regmap_read, __ret, __ret || (cond), \ |
---|
| 108 | + sleep_us, timeout_us, false, (map), (addr), &(val)); \ |
---|
| 109 | + __ret ?: __tmp; \ |
---|
147 | 110 | }) |
---|
148 | 111 | |
---|
149 | 112 | /** |
---|
.. | .. |
---|
199 | 162 | * @cond: Break condition (usually involving @val) |
---|
200 | 163 | * @sleep_us: Maximum time to sleep between reads in us (0 |
---|
201 | 164 | * tight-loops). Should be less than ~20ms since usleep_range |
---|
202 | | - * is used (see Documentation/timers/timers-howto.txt). |
---|
| 165 | + * is used (see Documentation/timers/timers-howto.rst). |
---|
203 | 166 | * @timeout_us: Timeout in us, 0 means never timeout |
---|
204 | 167 | * |
---|
205 | 168 | * Returns 0 on success and -ETIMEDOUT upon a timeout or the regmap_field_read |
---|
.. | .. |
---|
211 | 174 | */ |
---|
212 | 175 | #define regmap_field_read_poll_timeout(field, val, cond, sleep_us, timeout_us) \ |
---|
213 | 176 | ({ \ |
---|
214 | | - u64 __timeout_us = (timeout_us); \ |
---|
215 | | - unsigned long __sleep_us = (sleep_us); \ |
---|
216 | | - ktime_t timeout = ktime_add_us(ktime_get(), __timeout_us); \ |
---|
217 | | - int pollret; \ |
---|
218 | | - might_sleep_if(__sleep_us); \ |
---|
219 | | - for (;;) { \ |
---|
220 | | - pollret = regmap_field_read((field), &(val)); \ |
---|
221 | | - if (pollret) \ |
---|
222 | | - break; \ |
---|
223 | | - if (cond) \ |
---|
224 | | - break; \ |
---|
225 | | - if (__timeout_us && ktime_compare(ktime_get(), timeout) > 0) { \ |
---|
226 | | - pollret = regmap_field_read((field), &(val)); \ |
---|
227 | | - break; \ |
---|
228 | | - } \ |
---|
229 | | - if (__sleep_us) \ |
---|
230 | | - usleep_range((__sleep_us >> 2) + 1, __sleep_us); \ |
---|
231 | | - } \ |
---|
232 | | - pollret ?: ((cond) ? 0 : -ETIMEDOUT); \ |
---|
| 177 | + int __ret, __tmp; \ |
---|
| 178 | + __tmp = read_poll_timeout(regmap_field_read, __ret, __ret || (cond), \ |
---|
| 179 | + sleep_us, timeout_us, false, (field), &(val)); \ |
---|
| 180 | + __ret ?: __tmp; \ |
---|
233 | 181 | }) |
---|
234 | 182 | |
---|
235 | 183 | #ifdef CONFIG_REGMAP |
---|
.. | .. |
---|
313 | 261 | * field is NULL but precious_table (see below) is not, the |
---|
314 | 262 | * check is performed on such table (a register is precious if |
---|
315 | 263 | * it belongs to one of the ranges specified by precious_table). |
---|
| 264 | + * @writeable_noinc_reg: Optional callback returning true if the register |
---|
| 265 | + * supports multiple write operations without incrementing |
---|
| 266 | + * the register number. If this field is NULL but |
---|
| 267 | + * wr_noinc_table (see below) is not, the check is |
---|
| 268 | + * performed on such table (a register is no increment |
---|
| 269 | + * writeable if it belongs to one of the ranges specified |
---|
| 270 | + * by wr_noinc_table). |
---|
316 | 271 | * @readable_noinc_reg: Optional callback returning true if the register |
---|
317 | 272 | * supports multiple read operations without incrementing |
---|
318 | 273 | * the register number. If this field is NULL but |
---|
.. | .. |
---|
321 | 276 | * readable if it belongs to one of the ranges specified |
---|
322 | 277 | * by rd_noinc_table). |
---|
323 | 278 | * @disable_locking: This regmap is either protected by external means or |
---|
324 | | - * is guaranteed not be be accessed from multiple threads. |
---|
| 279 | + * is guaranteed not to be accessed from multiple threads. |
---|
325 | 280 | * Don't use any locking mechanisms. |
---|
326 | 281 | * @lock: Optional lock callback (overrides regmap's default lock |
---|
327 | 282 | * function, based on spinlock or mutex). |
---|
.. | .. |
---|
347 | 302 | * @rd_table: As above, for read access. |
---|
348 | 303 | * @volatile_table: As above, for volatile registers. |
---|
349 | 304 | * @precious_table: As above, for precious registers. |
---|
| 305 | + * @wr_noinc_table: As above, for no increment writeable registers. |
---|
350 | 306 | * @rd_noinc_table: As above, for no increment readable registers. |
---|
351 | 307 | * @reg_defaults: Power on reset values for registers (for use with |
---|
352 | 308 | * register cache support). |
---|
.. | .. |
---|
360 | 316 | * masks are used. |
---|
361 | 317 | * @zero_flag_mask: If set, read_flag_mask and write_flag_mask are used even |
---|
362 | 318 | * if they are both empty. |
---|
363 | | - * @use_single_rw: If set, converts the bulk read and write operations into |
---|
364 | | - * a series of single read and write operations. This is useful |
---|
365 | | - * for device that does not support bulk read and write. |
---|
| 319 | + * @use_single_read: If set, converts the bulk read operation into a series of |
---|
| 320 | + * single read operations. This is useful for a device that |
---|
| 321 | + * does not support bulk read. |
---|
| 322 | + * @use_single_write: If set, converts the bulk write operation into a series of |
---|
| 323 | + * single write operations. This is useful for a device that |
---|
| 324 | + * does not support bulk write. |
---|
366 | 325 | * @can_multi_write: If set, the device supports the multi write mode of bulk |
---|
367 | 326 | * write operations, if clear multi write requests will be |
---|
368 | 327 | * split into individual write operations |
---|
.. | .. |
---|
384 | 343 | * @hwlock_id: Specify the hardware spinlock id. |
---|
385 | 344 | * @hwlock_mode: The hardware spinlock mode, should be HWLOCK_IRQSTATE, |
---|
386 | 345 | * HWLOCK_IRQ or 0. |
---|
| 346 | + * @can_sleep: Optional, specifies whether regmap operations can sleep. |
---|
387 | 347 | */ |
---|
388 | 348 | struct regmap_config { |
---|
389 | 349 | const char *name; |
---|
.. | .. |
---|
397 | 357 | bool (*readable_reg)(struct device *dev, unsigned int reg); |
---|
398 | 358 | bool (*volatile_reg)(struct device *dev, unsigned int reg); |
---|
399 | 359 | bool (*precious_reg)(struct device *dev, unsigned int reg); |
---|
| 360 | + bool (*writeable_noinc_reg)(struct device *dev, unsigned int reg); |
---|
400 | 361 | bool (*readable_noinc_reg)(struct device *dev, unsigned int reg); |
---|
401 | 362 | |
---|
402 | 363 | bool disable_locking; |
---|
.. | .. |
---|
414 | 375 | const struct regmap_access_table *rd_table; |
---|
415 | 376 | const struct regmap_access_table *volatile_table; |
---|
416 | 377 | const struct regmap_access_table *precious_table; |
---|
| 378 | + const struct regmap_access_table *wr_noinc_table; |
---|
417 | 379 | const struct regmap_access_table *rd_noinc_table; |
---|
418 | 380 | const struct reg_default *reg_defaults; |
---|
419 | 381 | unsigned int num_reg_defaults; |
---|
.. | .. |
---|
425 | 387 | unsigned long write_flag_mask; |
---|
426 | 388 | bool zero_flag_mask; |
---|
427 | 389 | |
---|
428 | | - bool use_single_rw; |
---|
| 390 | + bool use_single_read; |
---|
| 391 | + bool use_single_write; |
---|
429 | 392 | bool can_multi_write; |
---|
430 | 393 | |
---|
431 | 394 | enum regmap_endian reg_format_endian; |
---|
.. | .. |
---|
437 | 400 | bool use_hwlock; |
---|
438 | 401 | unsigned int hwlock_id; |
---|
439 | 402 | unsigned int hwlock_mode; |
---|
| 403 | + |
---|
| 404 | + bool can_sleep; |
---|
| 405 | + |
---|
| 406 | + ANDROID_KABI_RESERVE(1); |
---|
440 | 407 | }; |
---|
441 | 408 | |
---|
442 | 409 | /** |
---|
.. | .. |
---|
449 | 416 | * @range_max: Address of the highest register in virtual range. |
---|
450 | 417 | * |
---|
451 | 418 | * @selector_reg: Register with selector field. |
---|
452 | | - * @selector_mask: Bit shift for selector value. |
---|
453 | | - * @selector_shift: Bit mask for selector value. |
---|
| 419 | + * @selector_mask: Bit mask for selector value. |
---|
| 420 | + * @selector_shift: Bit shift for selector value. |
---|
454 | 421 | * |
---|
455 | 422 | * @window_start: Address of first (lowest) register in data window. |
---|
456 | 423 | * @window_len: Number of registers in data window. |
---|
.. | .. |
---|
474 | 441 | /* Data window (per each page) */ |
---|
475 | 442 | unsigned int window_start; |
---|
476 | 443 | unsigned int window_len; |
---|
| 444 | + |
---|
| 445 | + ANDROID_KABI_RESERVE(1); |
---|
477 | 446 | }; |
---|
478 | 447 | |
---|
479 | 448 | struct regmap_async; |
---|
.. | .. |
---|
550 | 519 | enum regmap_endian val_format_endian_default; |
---|
551 | 520 | size_t max_raw_read; |
---|
552 | 521 | size_t max_raw_write; |
---|
| 522 | + |
---|
| 523 | + ANDROID_KABI_RESERVE(1); |
---|
553 | 524 | }; |
---|
554 | 525 | |
---|
555 | 526 | /* |
---|
.. | .. |
---|
606 | 577 | const struct regmap_config *config, |
---|
607 | 578 | struct lock_class_key *lock_key, |
---|
608 | 579 | const char *lock_name); |
---|
| 580 | +struct regmap *__regmap_init_spi_avmm(struct spi_device *spi, |
---|
| 581 | + const struct regmap_config *config, |
---|
| 582 | + struct lock_class_key *lock_key, |
---|
| 583 | + const char *lock_name); |
---|
609 | 584 | |
---|
610 | 585 | struct regmap *__devm_regmap_init(struct device *dev, |
---|
611 | 586 | const struct regmap_bus *bus, |
---|
.. | .. |
---|
655 | 630 | const struct regmap_config *config, |
---|
656 | 631 | struct lock_class_key *lock_key, |
---|
657 | 632 | const char *lock_name); |
---|
| 633 | +struct regmap *__devm_regmap_init_i3c(struct i3c_device *i3c, |
---|
| 634 | + const struct regmap_config *config, |
---|
| 635 | + struct lock_class_key *lock_key, |
---|
| 636 | + const char *lock_name); |
---|
| 637 | +struct regmap *__devm_regmap_init_spi_avmm(struct spi_device *spi, |
---|
| 638 | + const struct regmap_config *config, |
---|
| 639 | + struct lock_class_key *lock_key, |
---|
| 640 | + const char *lock_name); |
---|
658 | 641 | /* |
---|
659 | 642 | * Wrapper for regmap_init macros to include a unique lockdep key and name |
---|
660 | 643 | * for each call. No-op if CONFIG_LOCKDEP is not set. |
---|
.. | .. |
---|
841 | 824 | __regmap_lockdep_wrapper(__regmap_init_sdw, #config, \ |
---|
842 | 825 | sdw, config) |
---|
843 | 826 | |
---|
| 827 | +/** |
---|
| 828 | + * regmap_init_spi_avmm() - Initialize register map for Intel SPI Slave |
---|
| 829 | + * to AVMM Bus Bridge |
---|
| 830 | + * |
---|
| 831 | + * @spi: Device that will be interacted with |
---|
| 832 | + * @config: Configuration for register map |
---|
| 833 | + * |
---|
| 834 | + * The return value will be an ERR_PTR() on error or a valid pointer |
---|
| 835 | + * to a struct regmap. |
---|
| 836 | + */ |
---|
| 837 | +#define regmap_init_spi_avmm(spi, config) \ |
---|
| 838 | + __regmap_lockdep_wrapper(__regmap_init_spi_avmm, #config, \ |
---|
| 839 | + spi, config) |
---|
844 | 840 | |
---|
845 | 841 | /** |
---|
846 | 842 | * devm_regmap_init() - Initialise managed register map |
---|
.. | .. |
---|
1013 | 1009 | #define devm_regmap_init_slimbus(slimbus, config) \ |
---|
1014 | 1010 | __regmap_lockdep_wrapper(__devm_regmap_init_slimbus, #config, \ |
---|
1015 | 1011 | slimbus, config) |
---|
| 1012 | + |
---|
| 1013 | +/** |
---|
| 1014 | + * devm_regmap_init_i3c() - Initialise managed register map |
---|
| 1015 | + * |
---|
| 1016 | + * @i3c: Device that will be interacted with |
---|
| 1017 | + * @config: Configuration for register map |
---|
| 1018 | + * |
---|
| 1019 | + * The return value will be an ERR_PTR() on error or a valid pointer |
---|
| 1020 | + * to a struct regmap. The regmap will be automatically freed by the |
---|
| 1021 | + * device management code. |
---|
| 1022 | + */ |
---|
| 1023 | +#define devm_regmap_init_i3c(i3c, config) \ |
---|
| 1024 | + __regmap_lockdep_wrapper(__devm_regmap_init_i3c, #config, \ |
---|
| 1025 | + i3c, config) |
---|
| 1026 | + |
---|
| 1027 | +/** |
---|
| 1028 | + * devm_regmap_init_spi_avmm() - Initialize register map for Intel SPI Slave |
---|
| 1029 | + * to AVMM Bus Bridge |
---|
| 1030 | + * |
---|
| 1031 | + * @spi: Device that will be interacted with |
---|
| 1032 | + * @config: Configuration for register map |
---|
| 1033 | + * |
---|
| 1034 | + * The return value will be an ERR_PTR() on error or a valid pointer |
---|
| 1035 | + * to a struct regmap. The map will be automatically freed by the |
---|
| 1036 | + * device management code. |
---|
| 1037 | + */ |
---|
| 1038 | +#define devm_regmap_init_spi_avmm(spi, config) \ |
---|
| 1039 | + __regmap_lockdep_wrapper(__devm_regmap_init_spi_avmm, #config, \ |
---|
| 1040 | + spi, config) |
---|
| 1041 | + |
---|
1016 | 1042 | int regmap_mmio_attach_clk(struct regmap *map, struct clk *clk); |
---|
1017 | 1043 | void regmap_mmio_detach_clk(struct regmap *map); |
---|
1018 | 1044 | void regmap_exit(struct regmap *map); |
---|
.. | .. |
---|
1023 | 1049 | int regmap_write(struct regmap *map, unsigned int reg, unsigned int val); |
---|
1024 | 1050 | int regmap_write_async(struct regmap *map, unsigned int reg, unsigned int val); |
---|
1025 | 1051 | int regmap_raw_write(struct regmap *map, unsigned int reg, |
---|
| 1052 | + const void *val, size_t val_len); |
---|
| 1053 | +int regmap_noinc_write(struct regmap *map, unsigned int reg, |
---|
1026 | 1054 | const void *val, size_t val_len); |
---|
1027 | 1055 | int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val, |
---|
1028 | 1056 | size_t val_count); |
---|
.. | .. |
---|
1043 | 1071 | int regmap_update_bits_base(struct regmap *map, unsigned int reg, |
---|
1044 | 1072 | unsigned int mask, unsigned int val, |
---|
1045 | 1073 | bool *change, bool async, bool force); |
---|
| 1074 | + |
---|
| 1075 | +static inline int regmap_update_bits(struct regmap *map, unsigned int reg, |
---|
| 1076 | + unsigned int mask, unsigned int val) |
---|
| 1077 | +{ |
---|
| 1078 | + return regmap_update_bits_base(map, reg, mask, val, NULL, false, false); |
---|
| 1079 | +} |
---|
| 1080 | + |
---|
| 1081 | +static inline int regmap_update_bits_async(struct regmap *map, unsigned int reg, |
---|
| 1082 | + unsigned int mask, unsigned int val) |
---|
| 1083 | +{ |
---|
| 1084 | + return regmap_update_bits_base(map, reg, mask, val, NULL, true, false); |
---|
| 1085 | +} |
---|
| 1086 | + |
---|
| 1087 | +static inline int regmap_update_bits_check(struct regmap *map, unsigned int reg, |
---|
| 1088 | + unsigned int mask, unsigned int val, |
---|
| 1089 | + bool *change) |
---|
| 1090 | +{ |
---|
| 1091 | + return regmap_update_bits_base(map, reg, mask, val, |
---|
| 1092 | + change, false, false); |
---|
| 1093 | +} |
---|
| 1094 | + |
---|
| 1095 | +static inline int |
---|
| 1096 | +regmap_update_bits_check_async(struct regmap *map, unsigned int reg, |
---|
| 1097 | + unsigned int mask, unsigned int val, |
---|
| 1098 | + bool *change) |
---|
| 1099 | +{ |
---|
| 1100 | + return regmap_update_bits_base(map, reg, mask, val, |
---|
| 1101 | + change, true, false); |
---|
| 1102 | +} |
---|
| 1103 | + |
---|
| 1104 | +static inline int regmap_write_bits(struct regmap *map, unsigned int reg, |
---|
| 1105 | + unsigned int mask, unsigned int val) |
---|
| 1106 | +{ |
---|
| 1107 | + return regmap_update_bits_base(map, reg, mask, val, NULL, false, true); |
---|
| 1108 | +} |
---|
| 1109 | + |
---|
1046 | 1110 | int regmap_get_val_bytes(struct regmap *map); |
---|
1047 | 1111 | int regmap_get_max_register(struct regmap *map); |
---|
1048 | 1112 | int regmap_get_reg_stride(struct regmap *map); |
---|
.. | .. |
---|
1078 | 1142 | const struct regmap_range *ranges, |
---|
1079 | 1143 | unsigned int nranges); |
---|
1080 | 1144 | |
---|
| 1145 | +static inline int regmap_set_bits(struct regmap *map, |
---|
| 1146 | + unsigned int reg, unsigned int bits) |
---|
| 1147 | +{ |
---|
| 1148 | + return regmap_update_bits_base(map, reg, bits, bits, |
---|
| 1149 | + NULL, false, false); |
---|
| 1150 | +} |
---|
| 1151 | + |
---|
| 1152 | +static inline int regmap_clear_bits(struct regmap *map, |
---|
| 1153 | + unsigned int reg, unsigned int bits) |
---|
| 1154 | +{ |
---|
| 1155 | + return regmap_update_bits_base(map, reg, bits, 0, NULL, false, false); |
---|
| 1156 | +} |
---|
| 1157 | + |
---|
| 1158 | +int regmap_test_bits(struct regmap *map, unsigned int reg, unsigned int bits); |
---|
| 1159 | + |
---|
1081 | 1160 | /** |
---|
1082 | 1161 | * struct reg_field - Description of an register field |
---|
1083 | 1162 | * |
---|
.. | .. |
---|
1101 | 1180 | .msb = _msb, \ |
---|
1102 | 1181 | } |
---|
1103 | 1182 | |
---|
| 1183 | +#define REG_FIELD_ID(_reg, _lsb, _msb, _size, _offset) { \ |
---|
| 1184 | + .reg = _reg, \ |
---|
| 1185 | + .lsb = _lsb, \ |
---|
| 1186 | + .msb = _msb, \ |
---|
| 1187 | + .id_size = _size, \ |
---|
| 1188 | + .id_offset = _offset, \ |
---|
| 1189 | + } |
---|
| 1190 | + |
---|
1104 | 1191 | struct regmap_field *regmap_field_alloc(struct regmap *regmap, |
---|
1105 | 1192 | struct reg_field reg_field); |
---|
1106 | 1193 | void regmap_field_free(struct regmap_field *field); |
---|
.. | .. |
---|
1108 | 1195 | struct regmap_field *devm_regmap_field_alloc(struct device *dev, |
---|
1109 | 1196 | struct regmap *regmap, struct reg_field reg_field); |
---|
1110 | 1197 | void devm_regmap_field_free(struct device *dev, struct regmap_field *field); |
---|
| 1198 | + |
---|
| 1199 | +int regmap_field_bulk_alloc(struct regmap *regmap, |
---|
| 1200 | + struct regmap_field **rm_field, |
---|
| 1201 | + struct reg_field *reg_field, |
---|
| 1202 | + int num_fields); |
---|
| 1203 | +void regmap_field_bulk_free(struct regmap_field *field); |
---|
| 1204 | +int devm_regmap_field_bulk_alloc(struct device *dev, struct regmap *regmap, |
---|
| 1205 | + struct regmap_field **field, |
---|
| 1206 | + struct reg_field *reg_field, int num_fields); |
---|
| 1207 | +void devm_regmap_field_bulk_free(struct device *dev, |
---|
| 1208 | + struct regmap_field *field); |
---|
1111 | 1209 | |
---|
1112 | 1210 | int regmap_field_read(struct regmap_field *field, unsigned int *val); |
---|
1113 | 1211 | int regmap_field_update_bits_base(struct regmap_field *field, |
---|
.. | .. |
---|
1119 | 1217 | unsigned int mask, unsigned int val, |
---|
1120 | 1218 | bool *change, bool async, bool force); |
---|
1121 | 1219 | |
---|
| 1220 | +static inline int regmap_field_write(struct regmap_field *field, |
---|
| 1221 | + unsigned int val) |
---|
| 1222 | +{ |
---|
| 1223 | + return regmap_field_update_bits_base(field, ~0, val, |
---|
| 1224 | + NULL, false, false); |
---|
| 1225 | +} |
---|
| 1226 | + |
---|
| 1227 | +static inline int regmap_field_force_write(struct regmap_field *field, |
---|
| 1228 | + unsigned int val) |
---|
| 1229 | +{ |
---|
| 1230 | + return regmap_field_update_bits_base(field, ~0, val, NULL, false, true); |
---|
| 1231 | +} |
---|
| 1232 | + |
---|
| 1233 | +static inline int regmap_field_update_bits(struct regmap_field *field, |
---|
| 1234 | + unsigned int mask, unsigned int val) |
---|
| 1235 | +{ |
---|
| 1236 | + return regmap_field_update_bits_base(field, mask, val, |
---|
| 1237 | + NULL, false, false); |
---|
| 1238 | +} |
---|
| 1239 | + |
---|
| 1240 | +static inline int |
---|
| 1241 | +regmap_field_force_update_bits(struct regmap_field *field, |
---|
| 1242 | + unsigned int mask, unsigned int val) |
---|
| 1243 | +{ |
---|
| 1244 | + return regmap_field_update_bits_base(field, mask, val, |
---|
| 1245 | + NULL, false, true); |
---|
| 1246 | +} |
---|
| 1247 | + |
---|
| 1248 | +static inline int regmap_fields_write(struct regmap_field *field, |
---|
| 1249 | + unsigned int id, unsigned int val) |
---|
| 1250 | +{ |
---|
| 1251 | + return regmap_fields_update_bits_base(field, id, ~0, val, |
---|
| 1252 | + NULL, false, false); |
---|
| 1253 | +} |
---|
| 1254 | + |
---|
| 1255 | +static inline int regmap_fields_force_write(struct regmap_field *field, |
---|
| 1256 | + unsigned int id, unsigned int val) |
---|
| 1257 | +{ |
---|
| 1258 | + return regmap_fields_update_bits_base(field, id, ~0, val, |
---|
| 1259 | + NULL, false, true); |
---|
| 1260 | +} |
---|
| 1261 | + |
---|
| 1262 | +static inline int |
---|
| 1263 | +regmap_fields_update_bits(struct regmap_field *field, unsigned int id, |
---|
| 1264 | + unsigned int mask, unsigned int val) |
---|
| 1265 | +{ |
---|
| 1266 | + return regmap_fields_update_bits_base(field, id, mask, val, |
---|
| 1267 | + NULL, false, false); |
---|
| 1268 | +} |
---|
| 1269 | + |
---|
| 1270 | +static inline int |
---|
| 1271 | +regmap_fields_force_update_bits(struct regmap_field *field, unsigned int id, |
---|
| 1272 | + unsigned int mask, unsigned int val) |
---|
| 1273 | +{ |
---|
| 1274 | + return regmap_fields_update_bits_base(field, id, mask, val, |
---|
| 1275 | + NULL, false, true); |
---|
| 1276 | +} |
---|
| 1277 | + |
---|
| 1278 | +/** |
---|
| 1279 | + * struct regmap_irq_type - IRQ type definitions. |
---|
| 1280 | + * |
---|
| 1281 | + * @type_reg_offset: Offset register for the irq type setting. |
---|
| 1282 | + * @type_rising_val: Register value to configure RISING type irq. |
---|
| 1283 | + * @type_falling_val: Register value to configure FALLING type irq. |
---|
| 1284 | + * @type_level_low_val: Register value to configure LEVEL_LOW type irq. |
---|
| 1285 | + * @type_level_high_val: Register value to configure LEVEL_HIGH type irq. |
---|
| 1286 | + * @types_supported: logical OR of IRQ_TYPE_* flags indicating supported types. |
---|
| 1287 | + */ |
---|
| 1288 | +struct regmap_irq_type { |
---|
| 1289 | + unsigned int type_reg_offset; |
---|
| 1290 | + unsigned int type_reg_mask; |
---|
| 1291 | + unsigned int type_rising_val; |
---|
| 1292 | + unsigned int type_falling_val; |
---|
| 1293 | + unsigned int type_level_low_val; |
---|
| 1294 | + unsigned int type_level_high_val; |
---|
| 1295 | + unsigned int types_supported; |
---|
| 1296 | +}; |
---|
| 1297 | + |
---|
1122 | 1298 | /** |
---|
1123 | 1299 | * struct regmap_irq - Description of an IRQ for the generic regmap irq_chip. |
---|
1124 | 1300 | * |
---|
1125 | 1301 | * @reg_offset: Offset of the status/mask register within the bank |
---|
1126 | 1302 | * @mask: Mask used to flag/control the register. |
---|
1127 | | - * @type_reg_offset: Offset register for the irq type setting. |
---|
1128 | | - * @type_rising_mask: Mask bit to configure RISING type irq. |
---|
1129 | | - * @type_falling_mask: Mask bit to configure FALLING type irq. |
---|
| 1303 | + * @type: IRQ trigger type setting details if supported. |
---|
1130 | 1304 | */ |
---|
1131 | 1305 | struct regmap_irq { |
---|
1132 | 1306 | unsigned int reg_offset; |
---|
1133 | 1307 | unsigned int mask; |
---|
1134 | | - unsigned int type_reg_offset; |
---|
1135 | | - unsigned int type_rising_mask; |
---|
1136 | | - unsigned int type_falling_mask; |
---|
| 1308 | + struct regmap_irq_type type; |
---|
1137 | 1309 | }; |
---|
1138 | 1310 | |
---|
1139 | 1311 | #define REGMAP_IRQ_REG(_irq, _off, _mask) \ |
---|
.. | .. |
---|
1145 | 1317 | .reg_offset = (_id) / (_reg_bits), \ |
---|
1146 | 1318 | } |
---|
1147 | 1319 | |
---|
| 1320 | +#define REGMAP_IRQ_MAIN_REG_OFFSET(arr) \ |
---|
| 1321 | + { .num_regs = ARRAY_SIZE((arr)), .offset = &(arr)[0] } |
---|
| 1322 | + |
---|
| 1323 | +struct regmap_irq_sub_irq_map { |
---|
| 1324 | + unsigned int num_regs; |
---|
| 1325 | + unsigned int *offset; |
---|
| 1326 | +}; |
---|
| 1327 | + |
---|
1148 | 1328 | /** |
---|
1149 | 1329 | * struct regmap_irq_chip - Description of a generic regmap irq_chip. |
---|
1150 | 1330 | * |
---|
1151 | 1331 | * @name: Descriptive name for IRQ controller. |
---|
| 1332 | + * |
---|
| 1333 | + * @main_status: Base main status register address. For chips which have |
---|
| 1334 | + * interrupts arranged in separate sub-irq blocks with own IRQ |
---|
| 1335 | + * registers and which have a main IRQ registers indicating |
---|
| 1336 | + * sub-irq blocks with unhandled interrupts. For such chips fill |
---|
| 1337 | + * sub-irq register information in status_base, mask_base and |
---|
| 1338 | + * ack_base. |
---|
| 1339 | + * @num_main_status_bits: Should be given to chips where number of meaningfull |
---|
| 1340 | + * main status bits differs from num_regs. |
---|
| 1341 | + * @sub_reg_offsets: arrays of mappings from main register bits to sub irq |
---|
| 1342 | + * registers. First item in array describes the registers |
---|
| 1343 | + * for first main status bit. Second array for second bit etc. |
---|
| 1344 | + * Offset is given as sub register status offset to |
---|
| 1345 | + * status_base. Should contain num_regs arrays. |
---|
| 1346 | + * Can be provided for chips with more complex mapping than |
---|
| 1347 | + * 1.st bit to 1.st sub-reg, 2.nd bit to 2.nd sub-reg, ... |
---|
| 1348 | + * @num_main_regs: Number of 'main status' irq registers for chips which have |
---|
| 1349 | + * main_status set. |
---|
1152 | 1350 | * |
---|
1153 | 1351 | * @status_base: Base status register address. |
---|
1154 | 1352 | * @mask_base: Base mask register address. |
---|
.. | .. |
---|
1164 | 1362 | * @mask_invert: Inverted mask register: cleared bits are masked out. |
---|
1165 | 1363 | * @use_ack: Use @ack register even if it is zero. |
---|
1166 | 1364 | * @ack_invert: Inverted ack register: cleared bits for ack. |
---|
| 1365 | + * @clear_ack: Use this to set 1 and 0 or vice-versa to clear interrupts. |
---|
1167 | 1366 | * @wake_invert: Inverted wake register: cleared bits are wake enabled. |
---|
1168 | 1367 | * @type_invert: Invert the type flags. |
---|
| 1368 | + * @type_in_mask: Use the mask registers for controlling irq type. For |
---|
| 1369 | + * interrupts defining type_rising/falling_mask use mask_base |
---|
| 1370 | + * for edge configuration and never update bits in type_base. |
---|
| 1371 | + * @clear_on_unmask: For chips with interrupts cleared on read: read the status |
---|
| 1372 | + * registers before unmasking interrupts to clear any bits |
---|
| 1373 | + * set when they were masked. |
---|
1169 | 1374 | * @runtime_pm: Hold a runtime PM lock on the device when accessing it. |
---|
1170 | 1375 | * |
---|
1171 | 1376 | * @num_regs: Number of registers in each control bank. |
---|
.. | .. |
---|
1189 | 1394 | struct regmap_irq_chip { |
---|
1190 | 1395 | const char *name; |
---|
1191 | 1396 | |
---|
| 1397 | + unsigned int main_status; |
---|
| 1398 | + unsigned int num_main_status_bits; |
---|
| 1399 | + struct regmap_irq_sub_irq_map *sub_reg_offsets; |
---|
| 1400 | + int num_main_regs; |
---|
| 1401 | + |
---|
1192 | 1402 | unsigned int status_base; |
---|
1193 | 1403 | unsigned int mask_base; |
---|
1194 | 1404 | unsigned int unmask_base; |
---|
.. | .. |
---|
1196 | 1406 | unsigned int wake_base; |
---|
1197 | 1407 | unsigned int type_base; |
---|
1198 | 1408 | unsigned int irq_reg_stride; |
---|
1199 | | - unsigned int clear_ack; |
---|
1200 | 1409 | bool mask_writeonly:1; |
---|
1201 | 1410 | bool init_ack_masked:1; |
---|
1202 | 1411 | bool mask_invert:1; |
---|
1203 | 1412 | bool use_ack:1; |
---|
1204 | 1413 | bool ack_invert:1; |
---|
| 1414 | + bool clear_ack:1; |
---|
1205 | 1415 | bool wake_invert:1; |
---|
1206 | 1416 | bool runtime_pm:1; |
---|
1207 | 1417 | bool type_invert:1; |
---|
| 1418 | + bool type_in_mask:1; |
---|
| 1419 | + bool clear_on_unmask:1; |
---|
1208 | 1420 | |
---|
1209 | 1421 | int num_regs; |
---|
1210 | 1422 | |
---|
.. | .. |
---|
1224 | 1436 | int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags, |
---|
1225 | 1437 | int irq_base, const struct regmap_irq_chip *chip, |
---|
1226 | 1438 | struct regmap_irq_chip_data **data); |
---|
| 1439 | +int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode, |
---|
| 1440 | + struct regmap *map, int irq, |
---|
| 1441 | + int irq_flags, int irq_base, |
---|
| 1442 | + const struct regmap_irq_chip *chip, |
---|
| 1443 | + struct regmap_irq_chip_data **data); |
---|
1227 | 1444 | void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *data); |
---|
1228 | 1445 | |
---|
1229 | 1446 | int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq, |
---|
1230 | 1447 | int irq_flags, int irq_base, |
---|
1231 | 1448 | const struct regmap_irq_chip *chip, |
---|
1232 | 1449 | struct regmap_irq_chip_data **data); |
---|
| 1450 | +int devm_regmap_add_irq_chip_fwnode(struct device *dev, |
---|
| 1451 | + struct fwnode_handle *fwnode, |
---|
| 1452 | + struct regmap *map, int irq, |
---|
| 1453 | + int irq_flags, int irq_base, |
---|
| 1454 | + const struct regmap_irq_chip *chip, |
---|
| 1455 | + struct regmap_irq_chip_data **data); |
---|
1233 | 1456 | void devm_regmap_del_irq_chip(struct device *dev, int irq, |
---|
1234 | 1457 | struct regmap_irq_chip_data *data); |
---|
1235 | 1458 | |
---|
.. | .. |
---|
1269 | 1492 | |
---|
1270 | 1493 | static inline int regmap_raw_write_async(struct regmap *map, unsigned int reg, |
---|
1271 | 1494 | const void *val, size_t val_len) |
---|
| 1495 | +{ |
---|
| 1496 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1497 | + return -EINVAL; |
---|
| 1498 | +} |
---|
| 1499 | + |
---|
| 1500 | +static inline int regmap_noinc_write(struct regmap *map, unsigned int reg, |
---|
| 1501 | + const void *val, size_t val_len) |
---|
1272 | 1502 | { |
---|
1273 | 1503 | WARN_ONCE(1, "regmap API is disabled"); |
---|
1274 | 1504 | return -EINVAL; |
---|
.. | .. |
---|
1317 | 1547 | return -EINVAL; |
---|
1318 | 1548 | } |
---|
1319 | 1549 | |
---|
| 1550 | +static inline int regmap_set_bits(struct regmap *map, |
---|
| 1551 | + unsigned int reg, unsigned int bits) |
---|
| 1552 | +{ |
---|
| 1553 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1554 | + return -EINVAL; |
---|
| 1555 | +} |
---|
| 1556 | + |
---|
| 1557 | +static inline int regmap_clear_bits(struct regmap *map, |
---|
| 1558 | + unsigned int reg, unsigned int bits) |
---|
| 1559 | +{ |
---|
| 1560 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1561 | + return -EINVAL; |
---|
| 1562 | +} |
---|
| 1563 | + |
---|
| 1564 | +static inline int regmap_test_bits(struct regmap *map, |
---|
| 1565 | + unsigned int reg, unsigned int bits) |
---|
| 1566 | +{ |
---|
| 1567 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1568 | + return -EINVAL; |
---|
| 1569 | +} |
---|
| 1570 | + |
---|
1320 | 1571 | static inline int regmap_field_update_bits_base(struct regmap_field *field, |
---|
1321 | 1572 | unsigned int mask, unsigned int val, |
---|
1322 | 1573 | bool *change, bool async, bool force) |
---|
.. | .. |
---|
1334 | 1585 | return -EINVAL; |
---|
1335 | 1586 | } |
---|
1336 | 1587 | |
---|
| 1588 | +static inline int regmap_update_bits(struct regmap *map, unsigned int reg, |
---|
| 1589 | + unsigned int mask, unsigned int val) |
---|
| 1590 | +{ |
---|
| 1591 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1592 | + return -EINVAL; |
---|
| 1593 | +} |
---|
| 1594 | + |
---|
| 1595 | +static inline int regmap_update_bits_async(struct regmap *map, unsigned int reg, |
---|
| 1596 | + unsigned int mask, unsigned int val) |
---|
| 1597 | +{ |
---|
| 1598 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1599 | + return -EINVAL; |
---|
| 1600 | +} |
---|
| 1601 | + |
---|
| 1602 | +static inline int regmap_update_bits_check(struct regmap *map, unsigned int reg, |
---|
| 1603 | + unsigned int mask, unsigned int val, |
---|
| 1604 | + bool *change) |
---|
| 1605 | +{ |
---|
| 1606 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1607 | + return -EINVAL; |
---|
| 1608 | +} |
---|
| 1609 | + |
---|
| 1610 | +static inline int |
---|
| 1611 | +regmap_update_bits_check_async(struct regmap *map, unsigned int reg, |
---|
| 1612 | + unsigned int mask, unsigned int val, |
---|
| 1613 | + bool *change) |
---|
| 1614 | +{ |
---|
| 1615 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1616 | + return -EINVAL; |
---|
| 1617 | +} |
---|
| 1618 | + |
---|
| 1619 | +static inline int regmap_write_bits(struct regmap *map, unsigned int reg, |
---|
| 1620 | + unsigned int mask, unsigned int val) |
---|
| 1621 | +{ |
---|
| 1622 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1623 | + return -EINVAL; |
---|
| 1624 | +} |
---|
| 1625 | + |
---|
| 1626 | +static inline int regmap_field_write(struct regmap_field *field, |
---|
| 1627 | + unsigned int val) |
---|
| 1628 | +{ |
---|
| 1629 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1630 | + return -EINVAL; |
---|
| 1631 | +} |
---|
| 1632 | + |
---|
| 1633 | +static inline int regmap_field_force_write(struct regmap_field *field, |
---|
| 1634 | + unsigned int val) |
---|
| 1635 | +{ |
---|
| 1636 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1637 | + return -EINVAL; |
---|
| 1638 | +} |
---|
| 1639 | + |
---|
| 1640 | +static inline int regmap_field_update_bits(struct regmap_field *field, |
---|
| 1641 | + unsigned int mask, unsigned int val) |
---|
| 1642 | +{ |
---|
| 1643 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1644 | + return -EINVAL; |
---|
| 1645 | +} |
---|
| 1646 | + |
---|
| 1647 | +static inline int |
---|
| 1648 | +regmap_field_force_update_bits(struct regmap_field *field, |
---|
| 1649 | + unsigned int mask, unsigned int val) |
---|
| 1650 | +{ |
---|
| 1651 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1652 | + return -EINVAL; |
---|
| 1653 | +} |
---|
| 1654 | + |
---|
| 1655 | +static inline int regmap_fields_write(struct regmap_field *field, |
---|
| 1656 | + unsigned int id, unsigned int val) |
---|
| 1657 | +{ |
---|
| 1658 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1659 | + return -EINVAL; |
---|
| 1660 | +} |
---|
| 1661 | + |
---|
| 1662 | +static inline int regmap_fields_force_write(struct regmap_field *field, |
---|
| 1663 | + unsigned int id, unsigned int val) |
---|
| 1664 | +{ |
---|
| 1665 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1666 | + return -EINVAL; |
---|
| 1667 | +} |
---|
| 1668 | + |
---|
| 1669 | +static inline int |
---|
| 1670 | +regmap_fields_update_bits(struct regmap_field *field, unsigned int id, |
---|
| 1671 | + unsigned int mask, unsigned int val) |
---|
| 1672 | +{ |
---|
| 1673 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1674 | + return -EINVAL; |
---|
| 1675 | +} |
---|
| 1676 | + |
---|
| 1677 | +static inline int |
---|
| 1678 | +regmap_fields_force_update_bits(struct regmap_field *field, unsigned int id, |
---|
| 1679 | + unsigned int mask, unsigned int val) |
---|
| 1680 | +{ |
---|
| 1681 | + WARN_ONCE(1, "regmap API is disabled"); |
---|
| 1682 | + return -EINVAL; |
---|
| 1683 | +} |
---|
| 1684 | + |
---|
1337 | 1685 | static inline int regmap_get_val_bytes(struct regmap *map) |
---|
1338 | 1686 | { |
---|
1339 | 1687 | WARN_ONCE(1, "regmap API is disabled"); |
---|