1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2b83a313bSMark Brown #ifndef __LINUX_REGMAP_H
3b83a313bSMark Brown #define __LINUX_REGMAP_H
4b83a313bSMark Brown
5b83a313bSMark Brown /*
6b83a313bSMark Brown * Register map access API
7b83a313bSMark Brown *
8b83a313bSMark Brown * Copyright 2011 Wolfson Microelectronics plc
9b83a313bSMark Brown *
10b83a313bSMark Brown * Author: Mark Brown <[email protected]>
11b83a313bSMark Brown */
12b83a313bSMark Brown
13b83a313bSMark Brown #include <linux/list.h>
146863ca62SKrystian Garbaciak #include <linux/rbtree.h>
15f15cd6d9SSean Wang #include <linux/ktime.h>
16adf08d48SMasahiro Yamada #include <linux/delay.h>
1749ccc142SMateusz Krawczuk #include <linux/err.h>
183f0fa9a8SKevin Hilman #include <linux/bug.h>
193cfe7a74SNicolas Boichat #include <linux/lockdep.h>
20e44ab4e1SDejin Zheng #include <linux/iopoll.h>
215cc2013bSMichael Walle #include <linux/fwnode.h>
22b83a313bSMark Brown
23de477254SPaul Gortmaker struct module;
2431895662SMaxime Ripard struct clk;
25313162d0SPaul Gortmaker struct device;
2612479382SMichael Walle struct device_node;
27bf0d29fbSEddie James struct fsi_device;
289943fa30SMark Brown struct i2c_client;
296445500bSVitor Soares struct i3c_device;
3090f790d2SMark Brown struct irq_domain;
311f89d2feSSander Vanheule struct mdio_device;
327d6f7fb0SSrinivas Kandagatla struct slim_device;
33a676f083SMark Brown struct spi_device;
34a01779f8SJosh Cartwright struct spmi_device;
35b83d2ff0SMark Brown struct regmap;
366863ca62SKrystian Garbaciak struct regmap_range_cfg;
3767252287SSrinivas Kandagatla struct regmap_field;
3822853223SMark Brown struct snd_ac97;
397c22ce6eSVinod Koul struct sdw_slave;
409943fa30SMark Brown
417b3c4c37SAndrew Lunn /*
427b3c4c37SAndrew Lunn * regmap_mdio address encoding. IEEE 802.3ae clause 45 addresses consist of a
437b3c4c37SAndrew Lunn * device address and a register address.
447b3c4c37SAndrew Lunn */
457b3c4c37SAndrew Lunn #define REGMAP_MDIO_C45_DEVAD_SHIFT 16
467b3c4c37SAndrew Lunn #define REGMAP_MDIO_C45_DEVAD_MASK GENMASK(20, 16)
477b3c4c37SAndrew Lunn #define REGMAP_MDIO_C45_REGNUM_MASK GENMASK(15, 0)
487b3c4c37SAndrew Lunn
494a670ac3SMaxime Chevallier /*
504a670ac3SMaxime Chevallier * regmap.reg_shift indicates by how much we must shift registers prior to
514a670ac3SMaxime Chevallier * performing any operation. It's a signed value, positive numbers means
524a670ac3SMaxime Chevallier * downshifting the register's address, while negative numbers means upshifting.
534a670ac3SMaxime Chevallier */
544a670ac3SMaxime Chevallier #define REGMAP_UPSHIFT(s) (-(s))
554a670ac3SMaxime Chevallier #define REGMAP_DOWNSHIFT(s) (s)
564a670ac3SMaxime Chevallier
57caf78b04SMark Brown /*
58caf78b04SMark Brown * The supported cache types, the default is no cache. Any new caches
59caf78b04SMark Brown * should usually use the maple tree cache unless they specifically
60caf78b04SMark Brown * require that there are never any allocations at runtime and can't
61caf78b04SMark Brown * provide defaults in which case they should use the flat cache. The
62caf78b04SMark Brown * rbtree cache *may* have some performance advantage for very low end
63caf78b04SMark Brown * systems that make heavy use of cache syncs but is mainly legacy.
64caf78b04SMark Brown */
659fabe24eSDimitris Papastamos enum regcache_type {
669fabe24eSDimitris Papastamos REGCACHE_NONE,
6728644c80SDimitris Papastamos REGCACHE_RBTREE,
682ac902ceSMark Brown REGCACHE_FLAT,
69f033c26dSMark Brown REGCACHE_MAPLE,
709fabe24eSDimitris Papastamos };
719fabe24eSDimitris Papastamos
72dd898b20SMark Brown /**
732cf8e2dfSCharles Keepax * struct reg_default - Default value for a register.
74bd20eb54SMark Brown *
75bd20eb54SMark Brown * @reg: Register address.
76bd20eb54SMark Brown * @def: Register default value.
772cf8e2dfSCharles Keepax *
782cf8e2dfSCharles Keepax * We use an array of structs rather than a simple array as many modern devices
792cf8e2dfSCharles Keepax * have very sparse register maps.
80bd20eb54SMark Brown */
81bd20eb54SMark Brown struct reg_default {
82bd20eb54SMark Brown unsigned int reg;
83bd20eb54SMark Brown unsigned int def;
84bd20eb54SMark Brown };
85bd20eb54SMark Brown
868019ff6cSNariman Poushin /**
872cf8e2dfSCharles Keepax * struct reg_sequence - An individual write from a sequence of writes.
888019ff6cSNariman Poushin *
898019ff6cSNariman Poushin * @reg: Register address.
908019ff6cSNariman Poushin * @def: Register value.
912de9d600SNariman Poushin * @delay_us: Delay to be applied after the register write in microseconds
922cf8e2dfSCharles Keepax *
932cf8e2dfSCharles Keepax * Register/value pairs for sequences of writes with an optional delay in
942cf8e2dfSCharles Keepax * microseconds to be applied after each write.
958019ff6cSNariman Poushin */
968019ff6cSNariman Poushin struct reg_sequence {
978019ff6cSNariman Poushin unsigned int reg;
988019ff6cSNariman Poushin unsigned int def;
992de9d600SNariman Poushin unsigned int delay_us;
1008019ff6cSNariman Poushin };
1018019ff6cSNariman Poushin
102bd3ddb49SMarco Felsch #define REG_SEQ(_reg, _def, _delay_us) { \
103bd3ddb49SMarco Felsch .reg = _reg, \
104bd3ddb49SMarco Felsch .def = _def, \
105bd3ddb49SMarco Felsch .delay_us = _delay_us, \
106bd3ddb49SMarco Felsch }
107bd3ddb49SMarco Felsch #define REG_SEQ0(_reg, _def) REG_SEQ(_reg, _def, 0)
108bd3ddb49SMarco Felsch
10908188ba8SPhilipp Zabel /**
11008188ba8SPhilipp Zabel * regmap_read_poll_timeout - Poll until a condition is met or a timeout occurs
1112cf8e2dfSCharles Keepax *
11208188ba8SPhilipp Zabel * @map: Regmap to read from
11308188ba8SPhilipp Zabel * @addr: Address to poll
11408188ba8SPhilipp Zabel * @val: Unsigned integer variable to read the value into
11508188ba8SPhilipp Zabel * @cond: Break condition (usually involving @val)
11689124747SAnna-Maria Behnsen * @sleep_us: Maximum time to sleep between reads in us (0 tight-loops). Please
11789124747SAnna-Maria Behnsen * read usleep_range() function description for details and
11889124747SAnna-Maria Behnsen * limitations.
11908188ba8SPhilipp Zabel * @timeout_us: Timeout in us, 0 means never timeout
12008188ba8SPhilipp Zabel *
12189124747SAnna-Maria Behnsen * This is modelled after the readx_poll_timeout macros in linux/iopoll.h.
12289124747SAnna-Maria Behnsen *
12389124747SAnna-Maria Behnsen * Returns: 0 on success and -ETIMEDOUT upon a timeout or the regmap_read
12408188ba8SPhilipp Zabel * error return value in case of a error read. In the two former cases,
12508188ba8SPhilipp Zabel * the last read value at @addr is stored in @val. Must not be called
12608188ba8SPhilipp Zabel * from atomic context if sleep_us or timeout_us are used.
12708188ba8SPhilipp Zabel */
12808188ba8SPhilipp Zabel #define regmap_read_poll_timeout(map, addr, val, cond, sleep_us, timeout_us) \
12908188ba8SPhilipp Zabel ({ \
130e44ab4e1SDejin Zheng int __ret, __tmp; \
131e44ab4e1SDejin Zheng __tmp = read_poll_timeout(regmap_read, __ret, __ret || (cond), \
132e44ab4e1SDejin Zheng sleep_us, timeout_us, false, (map), (addr), &(val)); \
133e44ab4e1SDejin Zheng __ret ?: __tmp; \
13408188ba8SPhilipp Zabel })
13508188ba8SPhilipp Zabel
136667063acSChen-Yu Tsai /**
13750816a4cSSameer Pujar * regmap_read_poll_timeout_atomic - Poll until a condition is met or a timeout occurs
13850816a4cSSameer Pujar *
13950816a4cSSameer Pujar * @map: Regmap to read from
14050816a4cSSameer Pujar * @addr: Address to poll
14150816a4cSSameer Pujar * @val: Unsigned integer variable to read the value into
14250816a4cSSameer Pujar * @cond: Break condition (usually involving @val)
14389124747SAnna-Maria Behnsen * @delay_us: Time to udelay between reads in us (0 tight-loops). Please
14489124747SAnna-Maria Behnsen * read udelay() function description for details and
14589124747SAnna-Maria Behnsen * limitations.
14650816a4cSSameer Pujar * @timeout_us: Timeout in us, 0 means never timeout
14750816a4cSSameer Pujar *
14850816a4cSSameer Pujar * This is modelled after the readx_poll_timeout_atomic macros in linux/iopoll.h.
14950816a4cSSameer Pujar *
15050816a4cSSameer Pujar * Note: In general regmap cannot be used in atomic context. If you want to use
15150816a4cSSameer Pujar * this macro then first setup your regmap for atomic use (flat or no cache
15250816a4cSSameer Pujar * and MMIO regmap).
15389124747SAnna-Maria Behnsen *
15489124747SAnna-Maria Behnsen * Returns: 0 on success and -ETIMEDOUT upon a timeout or the regmap_read
15589124747SAnna-Maria Behnsen * error return value in case of a error read. In the two former cases,
15689124747SAnna-Maria Behnsen * the last read value at @addr is stored in @val.
15750816a4cSSameer Pujar */
15850816a4cSSameer Pujar #define regmap_read_poll_timeout_atomic(map, addr, val, cond, delay_us, timeout_us) \
15950816a4cSSameer Pujar ({ \
16050816a4cSSameer Pujar u64 __timeout_us = (timeout_us); \
16150816a4cSSameer Pujar unsigned long __delay_us = (delay_us); \
16250816a4cSSameer Pujar ktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \
16350816a4cSSameer Pujar int __ret; \
16450816a4cSSameer Pujar for (;;) { \
16550816a4cSSameer Pujar __ret = regmap_read((map), (addr), &(val)); \
16650816a4cSSameer Pujar if (__ret) \
16750816a4cSSameer Pujar break; \
16850816a4cSSameer Pujar if (cond) \
16950816a4cSSameer Pujar break; \
17050816a4cSSameer Pujar if ((__timeout_us) && \
17150816a4cSSameer Pujar ktime_compare(ktime_get(), __timeout) > 0) { \
17250816a4cSSameer Pujar __ret = regmap_read((map), (addr), &(val)); \
17350816a4cSSameer Pujar break; \
17450816a4cSSameer Pujar } \
17550816a4cSSameer Pujar if (__delay_us) \
17650816a4cSSameer Pujar udelay(__delay_us); \
17750816a4cSSameer Pujar } \
17850816a4cSSameer Pujar __ret ?: ((cond) ? 0 : -ETIMEDOUT); \
17950816a4cSSameer Pujar })
18050816a4cSSameer Pujar
18150816a4cSSameer Pujar /**
182667063acSChen-Yu Tsai * regmap_field_read_poll_timeout - Poll until a condition is met or timeout
183667063acSChen-Yu Tsai *
184667063acSChen-Yu Tsai * @field: Regmap field to read from
185667063acSChen-Yu Tsai * @val: Unsigned integer variable to read the value into
186667063acSChen-Yu Tsai * @cond: Break condition (usually involving @val)
18789124747SAnna-Maria Behnsen * @sleep_us: Maximum time to sleep between reads in us (0 tight-loops). Please
18889124747SAnna-Maria Behnsen * read usleep_range() function description for details and
18989124747SAnna-Maria Behnsen * limitations.
190667063acSChen-Yu Tsai * @timeout_us: Timeout in us, 0 means never timeout
191667063acSChen-Yu Tsai *
19289124747SAnna-Maria Behnsen * This is modelled after the readx_poll_timeout macros in linux/iopoll.h.
19389124747SAnna-Maria Behnsen *
19489124747SAnna-Maria Behnsen * Returns: 0 on success and -ETIMEDOUT upon a timeout or the regmap_field_read
195667063acSChen-Yu Tsai * error return value in case of a error read. In the two former cases,
196667063acSChen-Yu Tsai * the last read value at @addr is stored in @val. Must not be called
197667063acSChen-Yu Tsai * from atomic context if sleep_us or timeout_us are used.
198667063acSChen-Yu Tsai */
199667063acSChen-Yu Tsai #define regmap_field_read_poll_timeout(field, val, cond, sleep_us, timeout_us) \
200667063acSChen-Yu Tsai ({ \
201148c01d1SDejin Zheng int __ret, __tmp; \
202148c01d1SDejin Zheng __tmp = read_poll_timeout(regmap_field_read, __ret, __ret || (cond), \
203148c01d1SDejin Zheng sleep_us, timeout_us, false, (field), &(val)); \
204148c01d1SDejin Zheng __ret ?: __tmp; \
205667063acSChen-Yu Tsai })
206667063acSChen-Yu Tsai
207b83d2ff0SMark Brown #ifdef CONFIG_REGMAP
208b83d2ff0SMark Brown
209141eba2eSStephen Warren enum regmap_endian {
210141eba2eSStephen Warren /* Unspecified -> 0 -> Backwards compatible default */
211141eba2eSStephen Warren REGMAP_ENDIAN_DEFAULT = 0,
212141eba2eSStephen Warren REGMAP_ENDIAN_BIG,
213141eba2eSStephen Warren REGMAP_ENDIAN_LITTLE,
214141eba2eSStephen Warren REGMAP_ENDIAN_NATIVE,
215141eba2eSStephen Warren };
216141eba2eSStephen Warren
21776aad392SDavide Ciminaghi /**
2182cf8e2dfSCharles Keepax * struct regmap_range - A register range, used for access related checks
21976aad392SDavide Ciminaghi * (readable/writeable/volatile/precious checks)
22076aad392SDavide Ciminaghi *
22176aad392SDavide Ciminaghi * @range_min: address of first register
22276aad392SDavide Ciminaghi * @range_max: address of last register
22376aad392SDavide Ciminaghi */
22476aad392SDavide Ciminaghi struct regmap_range {
22576aad392SDavide Ciminaghi unsigned int range_min;
22676aad392SDavide Ciminaghi unsigned int range_max;
22776aad392SDavide Ciminaghi };
22876aad392SDavide Ciminaghi
2296112fe60SLaxman Dewangan #define regmap_reg_range(low, high) { .range_min = low, .range_max = high, }
2306112fe60SLaxman Dewangan
2312cf8e2dfSCharles Keepax /**
2322cf8e2dfSCharles Keepax * struct regmap_access_table - A table of register ranges for access checks
23376aad392SDavide Ciminaghi *
23476aad392SDavide Ciminaghi * @yes_ranges : pointer to an array of regmap ranges used as "yes ranges"
23576aad392SDavide Ciminaghi * @n_yes_ranges: size of the above array
23676aad392SDavide Ciminaghi * @no_ranges: pointer to an array of regmap ranges used as "no ranges"
23776aad392SDavide Ciminaghi * @n_no_ranges: size of the above array
2382cf8e2dfSCharles Keepax *
2392cf8e2dfSCharles Keepax * A table of ranges including some yes ranges and some no ranges.
2402cf8e2dfSCharles Keepax * If a register belongs to a no_range, the corresponding check function
2412cf8e2dfSCharles Keepax * will return false. If a register belongs to a yes range, the corresponding
2422cf8e2dfSCharles Keepax * check function will return true. "no_ranges" are searched first.
24376aad392SDavide Ciminaghi */
24476aad392SDavide Ciminaghi struct regmap_access_table {
24576aad392SDavide Ciminaghi const struct regmap_range *yes_ranges;
24676aad392SDavide Ciminaghi unsigned int n_yes_ranges;
24776aad392SDavide Ciminaghi const struct regmap_range *no_ranges;
24876aad392SDavide Ciminaghi unsigned int n_no_ranges;
24976aad392SDavide Ciminaghi };
25076aad392SDavide Ciminaghi
2510d4529c5SDavide Ciminaghi typedef void (*regmap_lock)(void *);
2520d4529c5SDavide Ciminaghi typedef void (*regmap_unlock)(void *);
2530d4529c5SDavide Ciminaghi
254bd20eb54SMark Brown /**
2552cf8e2dfSCharles Keepax * struct regmap_config - Configuration for the register map of a device.
256dd898b20SMark Brown *
257d3c242e1SStephen Warren * @name: Optional name of the regmap. Useful when a device has multiple
258d3c242e1SStephen Warren * register regions.
259d3c242e1SStephen Warren *
260dd898b20SMark Brown * @reg_bits: Number of bits in a register address, mandatory.
261f01ee60fSStephen Warren * @reg_stride: The register address stride. Valid register addresses are a
262f01ee60fSStephen Warren * multiple of this value. If set to 0, a value of 1 will be
263f01ee60fSStephen Warren * used.
2644a670ac3SMaxime Chevallier * @reg_shift: The number of bits to shift the register before performing any
2654a670ac3SMaxime Chevallier * operations. Any positive number will be downshifted, and negative
2664a670ac3SMaxime Chevallier * values will be upshifted
2670074f3f2SColin Foster * @reg_base: Value to be added to every register address before performing any
2680074f3f2SColin Foster * operation.
26982159ba8SMark Brown * @pad_bits: Number of bits of padding between register and value.
270dd898b20SMark Brown * @val_bits: Number of bits in a register value, mandatory.
2712e2ae66dSMark Brown *
2723566cc9dSMark Brown * @writeable_reg: Optional callback returning true if the register
27376aad392SDavide Ciminaghi * can be written to. If this field is NULL but wr_table
27476aad392SDavide Ciminaghi * (see below) is not, the check is performed on such table
27576aad392SDavide Ciminaghi * (a register is writeable if it belongs to one of the ranges
27676aad392SDavide Ciminaghi * specified by wr_table).
2773566cc9dSMark Brown * @readable_reg: Optional callback returning true if the register
27876aad392SDavide Ciminaghi * can be read from. If this field is NULL but rd_table
27976aad392SDavide Ciminaghi * (see below) is not, the check is performed on such table
28076aad392SDavide Ciminaghi * (a register is readable if it belongs to one of the ranges
28176aad392SDavide Ciminaghi * specified by rd_table).
2823566cc9dSMark Brown * @volatile_reg: Optional callback returning true if the register
28376aad392SDavide Ciminaghi * value can't be cached. If this field is NULL but
28476aad392SDavide Ciminaghi * volatile_table (see below) is not, the check is performed on
28576aad392SDavide Ciminaghi * such table (a register is volatile if it belongs to one of
28676aad392SDavide Ciminaghi * the ranges specified by volatile_table).
287bdc39644SLaszlo Papp * @precious_reg: Optional callback returning true if the register
28818694886SMark Brown * should not be read outside of a call from the driver
289bdc39644SLaszlo Papp * (e.g., a clear on read interrupt status register). If this
29076aad392SDavide Ciminaghi * field is NULL but precious_table (see below) is not, the
29176aad392SDavide Ciminaghi * check is performed on such table (a register is precious if
29276aad392SDavide Ciminaghi * it belongs to one of the ranges specified by precious_table).
293cdf6b11dSBen Whitten * @writeable_noinc_reg: Optional callback returning true if the register
294cdf6b11dSBen Whitten * supports multiple write operations without incrementing
295cdf6b11dSBen Whitten * the register number. If this field is NULL but
296cdf6b11dSBen Whitten * wr_noinc_table (see below) is not, the check is
297cdf6b11dSBen Whitten * performed on such table (a register is no increment
298cdf6b11dSBen Whitten * writeable if it belongs to one of the ranges specified
299cdf6b11dSBen Whitten * by wr_noinc_table).
30074fe7b55SCrestez Dan Leonard * @readable_noinc_reg: Optional callback returning true if the register
30174fe7b55SCrestez Dan Leonard * supports multiple read operations without incrementing
30274fe7b55SCrestez Dan Leonard * the register number. If this field is NULL but
30374fe7b55SCrestez Dan Leonard * rd_noinc_table (see below) is not, the check is
30474fe7b55SCrestez Dan Leonard * performed on such table (a register is no increment
30574fe7b55SCrestez Dan Leonard * readable if it belongs to one of the ranges specified
30674fe7b55SCrestez Dan Leonard * by rd_noinc_table).
307d2a5884aSAndrey Smirnov * @reg_read: Optional callback that if filled will be used to perform
308d2a5884aSAndrey Smirnov * all the reads from the registers. Should only be provided for
309bdc39644SLaszlo Papp * devices whose read operation cannot be represented as a simple
310bdc39644SLaszlo Papp * read operation on a bus such as SPI, I2C, etc. Most of the
311bdc39644SLaszlo Papp * devices do not need this.
312d2a5884aSAndrey Smirnov * @reg_write: Same as above for writing.
31302d6fdecSAnsuel Smith * @reg_update_bits: Optional callback that if filled will be used to perform
31402d6fdecSAnsuel Smith * all the update_bits(rmw) operation. Should only be provided
31502d6fdecSAnsuel Smith * if the function require special handling with lock and reg
31602d6fdecSAnsuel Smith * handling and the operation cannot be represented as a simple
31702d6fdecSAnsuel Smith * update_bits operation on a bus such as SPI, I2C, etc.
318d77e7456SMarek Vasut * @read: Optional callback that if filled will be used to perform all the
319d77e7456SMarek Vasut * bulk reads from the registers. Data is returned in the buffer used
320d77e7456SMarek Vasut * to transmit data.
321d77e7456SMarek Vasut * @write: Same as above for writing.
322d77e7456SMarek Vasut * @max_raw_read: Max raw read size that can be used on the device.
323d77e7456SMarek Vasut * @max_raw_write: Max raw write size that can be used on the device.
3249b1fe051SChristophe JAILLET * @can_sleep: Optional, specifies whether regmap operations can sleep.
325d2a5884aSAndrey Smirnov * @fast_io: Register IO is fast. Use a spinlock instead of a mutex
326d2a5884aSAndrey Smirnov * to perform locking. This field is ignored if custom lock/unlock
327d2a5884aSAndrey Smirnov * functions are used (see fields lock/unlock of struct regmap_config).
328d2a5884aSAndrey Smirnov * This field is a duplicate of a similar file in
329d2a5884aSAndrey Smirnov * 'struct regmap_bus' and serves exact same purpose.
330d2a5884aSAndrey Smirnov * Use it only for "no-bus" cases.
33193ce5576SAndy Shevchenko * @io_port: Support IO port accessors. Makes sense only when MMIO vs. IO port
33293ce5576SAndy Shevchenko * access can be distinguished.
3339b1fe051SChristophe JAILLET * @disable_locking: This regmap is either protected by external means or
3349b1fe051SChristophe JAILLET * is guaranteed not to be accessed from multiple threads.
3359b1fe051SChristophe JAILLET * Don't use any locking mechanisms.
3369b1fe051SChristophe JAILLET * @lock: Optional lock callback (overrides regmap's default lock
3379b1fe051SChristophe JAILLET * function, based on spinlock or mutex).
3389b1fe051SChristophe JAILLET * @unlock: As above for unlocking.
3399b1fe051SChristophe JAILLET * @lock_arg: This field is passed as the only argument of lock/unlock
3409b1fe051SChristophe JAILLET * functions (ignored in case regular lock/unlock functions
3419b1fe051SChristophe JAILLET * are not overridden).
342b429fab4SStefan Agner * @max_register: Optional, specifies the maximum valid register address.
3430ec74ad3SJan Dakinevich * @max_register_is_0: Optional, specifies that zero value in @max_register
3440ec74ad3SJan Dakinevich * should be taken into account. This is a workaround to
3450ec74ad3SJan Dakinevich * apply handling of @max_register for regmap that contains
3460ec74ad3SJan Dakinevich * only one register.
34776aad392SDavide Ciminaghi * @wr_table: Optional, points to a struct regmap_access_table specifying
34876aad392SDavide Ciminaghi * valid ranges for write access.
34976aad392SDavide Ciminaghi * @rd_table: As above, for read access.
35076aad392SDavide Ciminaghi * @volatile_table: As above, for volatile registers.
35176aad392SDavide Ciminaghi * @precious_table: As above, for precious registers.
352cdf6b11dSBen Whitten * @wr_noinc_table: As above, for no increment writeable registers.
35374fe7b55SCrestez Dan Leonard * @rd_noinc_table: As above, for no increment readable registers.
354bd20eb54SMark Brown * @reg_defaults: Power on reset values for registers (for use with
355bd20eb54SMark Brown * register cache support).
356bd20eb54SMark Brown * @num_reg_defaults: Number of elements in reg_defaults.
3576f306441SLars-Peter Clausen *
358f50e38c9STony Lindgren * @read_flag_mask: Mask to be set in the top bytes of the register when doing
3596f306441SLars-Peter Clausen * a read.
360f50e38c9STony Lindgren * @write_flag_mask: Mask to be set in the top bytes of the register when doing
3616f306441SLars-Peter Clausen * a write. If both read_flag_mask and write_flag_mask are
3629bf485c9SAndrew F. Davis * empty and zero_flag_mask is not set the regmap_bus default
3639bf485c9SAndrew F. Davis * masks are used.
3649bf485c9SAndrew F. Davis * @zero_flag_mask: If set, read_flag_mask and write_flag_mask are used even
3659bf485c9SAndrew F. Davis * if they are both empty.
3666e1e90ecSAdrian Ratiu * @use_relaxed_mmio: If set, MMIO R/W operations will not use memory barriers.
3676e1e90ecSAdrian Ratiu * This can avoid load on devices which don't require strict
3686e1e90ecSAdrian Ratiu * orderings, but drivers should carefully add any explicit
3696e1e90ecSAdrian Ratiu * memory barriers when they may require them.
3701c96a2f6SDavid Frey * @use_single_read: If set, converts the bulk read operation into a series of
3711c96a2f6SDavid Frey * single read operations. This is useful for a device that
3721c96a2f6SDavid Frey * does not support bulk read.
3731c96a2f6SDavid Frey * @use_single_write: If set, converts the bulk write operation into a series of
3741c96a2f6SDavid Frey * single write operations. This is useful for a device that
3751c96a2f6SDavid Frey * does not support bulk write.
376e894c3f4SOpensource [Anthony Olech] * @can_multi_write: If set, the device supports the multi write mode of bulk
377e894c3f4SOpensource [Anthony Olech] * write operations, if clear multi write requests will be
378e894c3f4SOpensource [Anthony Olech] * split into individual write operations
3799fabe24eSDimitris Papastamos *
3809fabe24eSDimitris Papastamos * @cache_type: The actual cache type.
3819fabe24eSDimitris Papastamos * @reg_defaults_raw: Power on reset values for registers (for use with
3829fabe24eSDimitris Papastamos * register cache support).
3839fabe24eSDimitris Papastamos * @num_reg_defaults_raw: Number of elements in reg_defaults_raw.
3849b1fe051SChristophe JAILLET * @use_hwlock: Indicate if a hardware spinlock should be used.
3859b1fe051SChristophe JAILLET * @use_raw_spinlock: Indicate if a raw spinlock should be used.
3869b1fe051SChristophe JAILLET * @hwlock_id: Specify the hardware spinlock id.
3879b1fe051SChristophe JAILLET * @hwlock_mode: The hardware spinlock mode, should be HWLOCK_IRQSTATE,
3889b1fe051SChristophe JAILLET * HWLOCK_IRQ or 0.
389141eba2eSStephen Warren * @reg_format_endian: Endianness for formatted register addresses. If this is
390141eba2eSStephen Warren * DEFAULT, the @reg_format_endian_default value from the
391141eba2eSStephen Warren * regmap bus is used.
392141eba2eSStephen Warren * @val_format_endian: Endianness for formatted register values. If this is
393141eba2eSStephen Warren * DEFAULT, the @reg_format_endian_default value from the
394141eba2eSStephen Warren * regmap bus is used.
3956863ca62SKrystian Garbaciak *
3966863ca62SKrystian Garbaciak * @ranges: Array of configuration entries for virtual address ranges.
3976863ca62SKrystian Garbaciak * @num_ranges: Number of range configuration entries.
398dd898b20SMark Brown */
399b83a313bSMark Brown struct regmap_config {
400d3c242e1SStephen Warren const char *name;
401d3c242e1SStephen Warren
402b83a313bSMark Brown int reg_bits;
403f01ee60fSStephen Warren int reg_stride;
4044a670ac3SMaxime Chevallier int reg_shift;
4050074f3f2SColin Foster unsigned int reg_base;
40682159ba8SMark Brown int pad_bits;
407b83a313bSMark Brown int val_bits;
4082e2ae66dSMark Brown
4092e2ae66dSMark Brown bool (*writeable_reg)(struct device *dev, unsigned int reg);
4102e2ae66dSMark Brown bool (*readable_reg)(struct device *dev, unsigned int reg);
4112e2ae66dSMark Brown bool (*volatile_reg)(struct device *dev, unsigned int reg);
41218694886SMark Brown bool (*precious_reg)(struct device *dev, unsigned int reg);
413cdf6b11dSBen Whitten bool (*writeable_noinc_reg)(struct device *dev, unsigned int reg);
41474fe7b55SCrestez Dan Leonard bool (*readable_noinc_reg)(struct device *dev, unsigned int reg);
415c9b41fcfSBartosz Golaszewski
416d2a5884aSAndrey Smirnov int (*reg_read)(void *context, unsigned int reg, unsigned int *val);
417d2a5884aSAndrey Smirnov int (*reg_write)(void *context, unsigned int reg, unsigned int val);
41802d6fdecSAnsuel Smith int (*reg_update_bits)(void *context, unsigned int reg,
41902d6fdecSAnsuel Smith unsigned int mask, unsigned int val);
420d77e7456SMarek Vasut /* Bulk read/write */
421d77e7456SMarek Vasut int (*read)(void *context, const void *reg_buf, size_t reg_size,
422d77e7456SMarek Vasut void *val_buf, size_t val_size);
423d77e7456SMarek Vasut int (*write)(void *context, const void *data, size_t count);
424d77e7456SMarek Vasut size_t max_raw_read;
425d77e7456SMarek Vasut size_t max_raw_write;
426d2a5884aSAndrey Smirnov
4279b1fe051SChristophe JAILLET bool can_sleep;
4289b1fe051SChristophe JAILLET
429d2a5884aSAndrey Smirnov bool fast_io;
43093ce5576SAndy Shevchenko bool io_port;
431d2a5884aSAndrey Smirnov
4329b1fe051SChristophe JAILLET bool disable_locking;
4339b1fe051SChristophe JAILLET regmap_lock lock;
4349b1fe051SChristophe JAILLET regmap_unlock unlock;
4359b1fe051SChristophe JAILLET void *lock_arg;
4369b1fe051SChristophe JAILLET
437bd20eb54SMark Brown unsigned int max_register;
4380ec74ad3SJan Dakinevich bool max_register_is_0;
43976aad392SDavide Ciminaghi const struct regmap_access_table *wr_table;
44076aad392SDavide Ciminaghi const struct regmap_access_table *rd_table;
44176aad392SDavide Ciminaghi const struct regmap_access_table *volatile_table;
44276aad392SDavide Ciminaghi const struct regmap_access_table *precious_table;
443cdf6b11dSBen Whitten const struct regmap_access_table *wr_noinc_table;
44474fe7b55SCrestez Dan Leonard const struct regmap_access_table *rd_noinc_table;
445720e4616SLars-Peter Clausen const struct reg_default *reg_defaults;
4469fabe24eSDimitris Papastamos unsigned int num_reg_defaults;
4479fabe24eSDimitris Papastamos enum regcache_type cache_type;
4489fabe24eSDimitris Papastamos const void *reg_defaults_raw;
4499fabe24eSDimitris Papastamos unsigned int num_reg_defaults_raw;
4506f306441SLars-Peter Clausen
451f50e38c9STony Lindgren unsigned long read_flag_mask;
452f50e38c9STony Lindgren unsigned long write_flag_mask;
4539bf485c9SAndrew F. Davis bool zero_flag_mask;
4542e33caf1SAshish Jangam
4551c96a2f6SDavid Frey bool use_single_read;
4561c96a2f6SDavid Frey bool use_single_write;
4576e1e90ecSAdrian Ratiu bool use_relaxed_mmio;
458e894c3f4SOpensource [Anthony Olech] bool can_multi_write;
459141eba2eSStephen Warren
460a4887813SBaolin Wang bool use_hwlock;
46167021f25SVladimir Oltean bool use_raw_spinlock;
4628698b936SBaolin Wang unsigned int hwlock_id;
4638698b936SBaolin Wang unsigned int hwlock_mode;
46421f8e482SDmitry Osipenko
4659b1fe051SChristophe JAILLET enum regmap_endian reg_format_endian;
4669b1fe051SChristophe JAILLET enum regmap_endian val_format_endian;
4679b1fe051SChristophe JAILLET
4689b1fe051SChristophe JAILLET const struct regmap_range_cfg *ranges;
4699b1fe051SChristophe JAILLET unsigned int num_ranges;
4706863ca62SKrystian Garbaciak };
4716863ca62SKrystian Garbaciak
4726863ca62SKrystian Garbaciak /**
4732cf8e2dfSCharles Keepax * struct regmap_range_cfg - Configuration for indirectly accessed or paged
4742cf8e2dfSCharles Keepax * registers.
4756863ca62SKrystian Garbaciak *
476d058bb49SMark Brown * @name: Descriptive name for diagnostics
477d058bb49SMark Brown *
4786863ca62SKrystian Garbaciak * @range_min: Address of the lowest register address in virtual range.
4796863ca62SKrystian Garbaciak * @range_max: Address of the highest register in virtual range.
4806863ca62SKrystian Garbaciak *
4812cf8e2dfSCharles Keepax * @selector_reg: Register with selector field.
482ad5906bdSPhong LE * @selector_mask: Bit mask for selector value.
483ad5906bdSPhong LE * @selector_shift: Bit shift for selector value.
4846863ca62SKrystian Garbaciak *
4856863ca62SKrystian Garbaciak * @window_start: Address of first (lowest) register in data window.
4866863ca62SKrystian Garbaciak * @window_len: Number of registers in data window.
4872cf8e2dfSCharles Keepax *
4882cf8e2dfSCharles Keepax * Registers, mapped to this virtual range, are accessed in two steps:
4892cf8e2dfSCharles Keepax * 1. page selector register update;
4902cf8e2dfSCharles Keepax * 2. access through data window registers.
4916863ca62SKrystian Garbaciak */
4926863ca62SKrystian Garbaciak struct regmap_range_cfg {
493d058bb49SMark Brown const char *name;
494d058bb49SMark Brown
4956863ca62SKrystian Garbaciak /* Registers of virtual address range */
4966863ca62SKrystian Garbaciak unsigned int range_min;
4976863ca62SKrystian Garbaciak unsigned int range_max;
4986863ca62SKrystian Garbaciak
4996863ca62SKrystian Garbaciak /* Page selector for indirect addressing */
5006863ca62SKrystian Garbaciak unsigned int selector_reg;
5016863ca62SKrystian Garbaciak unsigned int selector_mask;
5026863ca62SKrystian Garbaciak int selector_shift;
5036863ca62SKrystian Garbaciak
5046863ca62SKrystian Garbaciak /* Data window (per each page) */
5056863ca62SKrystian Garbaciak unsigned int window_start;
5066863ca62SKrystian Garbaciak unsigned int window_len;
507b83a313bSMark Brown };
508b83a313bSMark Brown
509fdd9ef3dSCharles Keepax /**
510fdd9ef3dSCharles Keepax * struct regmap_sdw_mbq_cfg - Configuration for Multi-Byte Quantities
511fdd9ef3dSCharles Keepax *
512fdd9ef3dSCharles Keepax * @mbq_size: Callback returning the actual size of the given register.
5135bc493bfSCharles Keepax * @deferrable: Callback returning true if the hardware can defer
5145bc493bfSCharles Keepax * transactions to the given register. Deferral should
5155bc493bfSCharles Keepax * only be used by SDCA parts and typically which controls
5165bc493bfSCharles Keepax * are deferrable will be specified in either as a hard
5175bc493bfSCharles Keepax * coded list or from the DisCo tables in the platform
5185bc493bfSCharles Keepax * firmware.
5195bc493bfSCharles Keepax *
5205bc493bfSCharles Keepax * @timeout_us: The time in microseconds after which waiting for a deferred
5215bc493bfSCharles Keepax * transaction should time out.
5225bc493bfSCharles Keepax * @retry_us: The time in microseconds between polls of the function busy
5235bc493bfSCharles Keepax * status whilst waiting for an opportunity to retry a deferred
5245bc493bfSCharles Keepax * transaction.
525fdd9ef3dSCharles Keepax *
526fdd9ef3dSCharles Keepax * Provides additional configuration required for SoundWire MBQ register maps.
527fdd9ef3dSCharles Keepax */
528fdd9ef3dSCharles Keepax struct regmap_sdw_mbq_cfg {
529fdd9ef3dSCharles Keepax int (*mbq_size)(struct device *dev, unsigned int reg);
5305bc493bfSCharles Keepax bool (*deferrable)(struct device *dev, unsigned int reg);
5315bc493bfSCharles Keepax unsigned long timeout_us;
5325bc493bfSCharles Keepax unsigned long retry_us;
533fdd9ef3dSCharles Keepax };
534fdd9ef3dSCharles Keepax
5350d509f2bSMark Brown struct regmap_async;
5360d509f2bSMark Brown
5370135bbccSStephen Warren typedef int (*regmap_hw_write)(void *context, const void *data,
538b83a313bSMark Brown size_t count);
5390135bbccSStephen Warren typedef int (*regmap_hw_gather_write)(void *context,
540b83a313bSMark Brown const void *reg, size_t reg_len,
541b83a313bSMark Brown const void *val, size_t val_len);
5420d509f2bSMark Brown typedef int (*regmap_hw_async_write)(void *context,
5430d509f2bSMark Brown const void *reg, size_t reg_len,
5440d509f2bSMark Brown const void *val, size_t val_len,
5450d509f2bSMark Brown struct regmap_async *async);
5460135bbccSStephen Warren typedef int (*regmap_hw_read)(void *context,
547b83a313bSMark Brown const void *reg_buf, size_t reg_size,
548b83a313bSMark Brown void *val_buf, size_t val_size);
5493ac17037SBoris BREZILLON typedef int (*regmap_hw_reg_read)(void *context, unsigned int reg,
5503ac17037SBoris BREZILLON unsigned int *val);
551c20cc099SLinus Walleij typedef int (*regmap_hw_reg_noinc_read)(void *context, unsigned int reg,
552c20cc099SLinus Walleij void *val, size_t val_count);
5533ac17037SBoris BREZILLON typedef int (*regmap_hw_reg_write)(void *context, unsigned int reg,
5543ac17037SBoris BREZILLON unsigned int val);
555c20cc099SLinus Walleij typedef int (*regmap_hw_reg_noinc_write)(void *context, unsigned int reg,
556c20cc099SLinus Walleij const void *val, size_t val_count);
55777792b11SJon Ringle typedef int (*regmap_hw_reg_update_bits)(void *context, unsigned int reg,
55877792b11SJon Ringle unsigned int mask, unsigned int val);
5590d509f2bSMark Brown typedef struct regmap_async *(*regmap_hw_async_alloc)(void);
5600135bbccSStephen Warren typedef void (*regmap_hw_free_context)(void *context);
561b83a313bSMark Brown
562b83a313bSMark Brown /**
5632cf8e2dfSCharles Keepax * struct regmap_bus - Description of a hardware bus for the register map
5642cf8e2dfSCharles Keepax * infrastructure.
565b83a313bSMark Brown *
566bacdbe07SStephen Warren * @fast_io: Register IO is fast. Use a spinlock instead of a mutex
5670d4529c5SDavide Ciminaghi * to perform locking. This field is ignored if custom lock/unlock
5680d4529c5SDavide Ciminaghi * functions are used (see fields lock/unlock of
5690d4529c5SDavide Ciminaghi * struct regmap_config).
57074641458SChristophe JAILLET * @free_on_exit: kfree this on exit of regmap
571b83a313bSMark Brown * @write: Write operation.
572b83a313bSMark Brown * @gather_write: Write operation with split register/value, return -ENOTSUPP
573b83a313bSMark Brown * if not implemented on a given device.
5740d509f2bSMark Brown * @async_write: Write operation which completes asynchronously, optional and
5750d509f2bSMark Brown * must serialise with respect to non-async I/O.
576c5f58f2dSMarkus Pargmann * @reg_write: Write a single register value to the given register address. This
577c5f58f2dSMarkus Pargmann * write operation has to complete when returning from the function.
578c20cc099SLinus Walleij * @reg_write_noinc: Write multiple register value to the same register. This
579c20cc099SLinus Walleij * write operation has to complete when returning from the function.
5802cf8e2dfSCharles Keepax * @reg_update_bits: Update bits operation to be used against volatile
5812cf8e2dfSCharles Keepax * registers, intended for devices supporting some mechanism
5822cf8e2dfSCharles Keepax * for setting clearing bits without having to
5832cf8e2dfSCharles Keepax * read/modify/write.
584b83a313bSMark Brown * @read: Read operation. Data is returned in the buffer used to transmit
585b83a313bSMark Brown * data.
586c5f58f2dSMarkus Pargmann * @reg_read: Read a single register value from a given register address.
587c5f58f2dSMarkus Pargmann * @free_context: Free context.
5880d509f2bSMark Brown * @async_alloc: Allocate a regmap_async() structure.
589b83a313bSMark Brown * @read_flag_mask: Mask to be set in the top byte of the register when doing
590b83a313bSMark Brown * a read.
591141eba2eSStephen Warren * @reg_format_endian_default: Default endianness for formatted register
592141eba2eSStephen Warren * addresses. Used when the regmap_config specifies DEFAULT. If this is
593141eba2eSStephen Warren * DEFAULT, BIG is assumed.
594141eba2eSStephen Warren * @val_format_endian_default: Default endianness for formatted register
595141eba2eSStephen Warren * values. Used when the regmap_config specifies DEFAULT. If this is
596141eba2eSStephen Warren * DEFAULT, BIG is assumed.
597adaac459SMarkus Pargmann * @max_raw_read: Max raw read size that can be used on the bus.
598adaac459SMarkus Pargmann * @max_raw_write: Max raw write size that can be used on the bus.
599b83a313bSMark Brown */
600b83a313bSMark Brown struct regmap_bus {
601bacdbe07SStephen Warren bool fast_io;
60274641458SChristophe JAILLET bool free_on_exit;
603b83a313bSMark Brown regmap_hw_write write;
604b83a313bSMark Brown regmap_hw_gather_write gather_write;
6050d509f2bSMark Brown regmap_hw_async_write async_write;
6063ac17037SBoris BREZILLON regmap_hw_reg_write reg_write;
607c20cc099SLinus Walleij regmap_hw_reg_noinc_write reg_noinc_write;
60877792b11SJon Ringle regmap_hw_reg_update_bits reg_update_bits;
609b83a313bSMark Brown regmap_hw_read read;
6103ac17037SBoris BREZILLON regmap_hw_reg_read reg_read;
611c20cc099SLinus Walleij regmap_hw_reg_noinc_read reg_noinc_read;
6120135bbccSStephen Warren regmap_hw_free_context free_context;
6130d509f2bSMark Brown regmap_hw_async_alloc async_alloc;
614b83a313bSMark Brown u8 read_flag_mask;
615141eba2eSStephen Warren enum regmap_endian reg_format_endian_default;
616141eba2eSStephen Warren enum regmap_endian val_format_endian_default;
617adaac459SMarkus Pargmann size_t max_raw_read;
618adaac459SMarkus Pargmann size_t max_raw_write;
619b83a313bSMark Brown };
620b83a313bSMark Brown
6213cfe7a74SNicolas Boichat /*
6223cfe7a74SNicolas Boichat * __regmap_init functions.
6233cfe7a74SNicolas Boichat *
6243cfe7a74SNicolas Boichat * These functions take a lock key and name parameter, and should not be called
6253cfe7a74SNicolas Boichat * directly. Instead, use the regmap_init macros that generate a key and name
6263cfe7a74SNicolas Boichat * for each call.
6273cfe7a74SNicolas Boichat */
6283cfe7a74SNicolas Boichat struct regmap *__regmap_init(struct device *dev,
629b83a313bSMark Brown const struct regmap_bus *bus,
6300135bbccSStephen Warren void *bus_context,
6313cfe7a74SNicolas Boichat const struct regmap_config *config,
6323cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
6333cfe7a74SNicolas Boichat const char *lock_name);
6343cfe7a74SNicolas Boichat struct regmap *__regmap_init_i2c(struct i2c_client *i2c,
6353cfe7a74SNicolas Boichat const struct regmap_config *config,
6363cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
6373cfe7a74SNicolas Boichat const char *lock_name);
6381f89d2feSSander Vanheule struct regmap *__regmap_init_mdio(struct mdio_device *mdio_dev,
6391f89d2feSSander Vanheule const struct regmap_config *config,
6401f89d2feSSander Vanheule struct lock_class_key *lock_key,
6411f89d2feSSander Vanheule const char *lock_name);
642bcf7eac3SAkinobu Mita struct regmap *__regmap_init_sccb(struct i2c_client *i2c,
643bcf7eac3SAkinobu Mita const struct regmap_config *config,
644bcf7eac3SAkinobu Mita struct lock_class_key *lock_key,
645bcf7eac3SAkinobu Mita const char *lock_name);
6467d6f7fb0SSrinivas Kandagatla struct regmap *__regmap_init_slimbus(struct slim_device *slimbus,
6477d6f7fb0SSrinivas Kandagatla const struct regmap_config *config,
6487d6f7fb0SSrinivas Kandagatla struct lock_class_key *lock_key,
6497d6f7fb0SSrinivas Kandagatla const char *lock_name);
6503cfe7a74SNicolas Boichat struct regmap *__regmap_init_spi(struct spi_device *dev,
6513cfe7a74SNicolas Boichat const struct regmap_config *config,
6523cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
6533cfe7a74SNicolas Boichat const char *lock_name);
6543cfe7a74SNicolas Boichat struct regmap *__regmap_init_spmi_base(struct spmi_device *dev,
6553cfe7a74SNicolas Boichat const struct regmap_config *config,
6563cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
6573cfe7a74SNicolas Boichat const char *lock_name);
6583cfe7a74SNicolas Boichat struct regmap *__regmap_init_spmi_ext(struct spmi_device *dev,
6593cfe7a74SNicolas Boichat const struct regmap_config *config,
6603cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
6613cfe7a74SNicolas Boichat const char *lock_name);
662cc5d0db3SAlex A. Mihaylov struct regmap *__regmap_init_w1(struct device *w1_dev,
663cc5d0db3SAlex A. Mihaylov const struct regmap_config *config,
664cc5d0db3SAlex A. Mihaylov struct lock_class_key *lock_key,
665cc5d0db3SAlex A. Mihaylov const char *lock_name);
6663cfe7a74SNicolas Boichat struct regmap *__regmap_init_mmio_clk(struct device *dev, const char *clk_id,
6673cfe7a74SNicolas Boichat void __iomem *regs,
6683cfe7a74SNicolas Boichat const struct regmap_config *config,
6693cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
6703cfe7a74SNicolas Boichat const char *lock_name);
6713cfe7a74SNicolas Boichat struct regmap *__regmap_init_ac97(struct snd_ac97 *ac97,
6723cfe7a74SNicolas Boichat const struct regmap_config *config,
6733cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
6743cfe7a74SNicolas Boichat const char *lock_name);
6757c22ce6eSVinod Koul struct regmap *__regmap_init_sdw(struct sdw_slave *sdw,
6767c22ce6eSVinod Koul const struct regmap_config *config,
6777c22ce6eSVinod Koul struct lock_class_key *lock_key,
6787c22ce6eSVinod Koul const char *lock_name);
679fb5103f9SPierre-Louis Bossart struct regmap *__regmap_init_sdw_mbq(struct sdw_slave *sdw,
680fb5103f9SPierre-Louis Bossart const struct regmap_config *config,
681fdd9ef3dSCharles Keepax const struct regmap_sdw_mbq_cfg *mbq_config,
682fb5103f9SPierre-Louis Bossart struct lock_class_key *lock_key,
683fb5103f9SPierre-Louis Bossart const char *lock_name);
6847f9fb673SXu Yilun struct regmap *__regmap_init_spi_avmm(struct spi_device *spi,
6857f9fb673SXu Yilun const struct regmap_config *config,
6867f9fb673SXu Yilun struct lock_class_key *lock_key,
6877f9fb673SXu Yilun const char *lock_name);
688bf0d29fbSEddie James struct regmap *__regmap_init_fsi(struct fsi_device *fsi_dev,
689bf0d29fbSEddie James const struct regmap_config *config,
690bf0d29fbSEddie James struct lock_class_key *lock_key,
691bf0d29fbSEddie James const char *lock_name);
6923cfe7a74SNicolas Boichat
6933cfe7a74SNicolas Boichat struct regmap *__devm_regmap_init(struct device *dev,
6943cfe7a74SNicolas Boichat const struct regmap_bus *bus,
6953cfe7a74SNicolas Boichat void *bus_context,
6963cfe7a74SNicolas Boichat const struct regmap_config *config,
6973cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
6983cfe7a74SNicolas Boichat const char *lock_name);
6993cfe7a74SNicolas Boichat struct regmap *__devm_regmap_init_i2c(struct i2c_client *i2c,
7003cfe7a74SNicolas Boichat const struct regmap_config *config,
7013cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
7023cfe7a74SNicolas Boichat const char *lock_name);
7031f89d2feSSander Vanheule struct regmap *__devm_regmap_init_mdio(struct mdio_device *mdio_dev,
7041f89d2feSSander Vanheule const struct regmap_config *config,
7051f89d2feSSander Vanheule struct lock_class_key *lock_key,
7061f89d2feSSander Vanheule const char *lock_name);
707bcf7eac3SAkinobu Mita struct regmap *__devm_regmap_init_sccb(struct i2c_client *i2c,
708bcf7eac3SAkinobu Mita const struct regmap_config *config,
709bcf7eac3SAkinobu Mita struct lock_class_key *lock_key,
710bcf7eac3SAkinobu Mita const char *lock_name);
7113cfe7a74SNicolas Boichat struct regmap *__devm_regmap_init_spi(struct spi_device *dev,
7123cfe7a74SNicolas Boichat const struct regmap_config *config,
7133cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
7143cfe7a74SNicolas Boichat const char *lock_name);
7153cfe7a74SNicolas Boichat struct regmap *__devm_regmap_init_spmi_base(struct spmi_device *dev,
7163cfe7a74SNicolas Boichat const struct regmap_config *config,
7173cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
7183cfe7a74SNicolas Boichat const char *lock_name);
7193cfe7a74SNicolas Boichat struct regmap *__devm_regmap_init_spmi_ext(struct spmi_device *dev,
7203cfe7a74SNicolas Boichat const struct regmap_config *config,
7213cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
7223cfe7a74SNicolas Boichat const char *lock_name);
723cc5d0db3SAlex A. Mihaylov struct regmap *__devm_regmap_init_w1(struct device *w1_dev,
724cc5d0db3SAlex A. Mihaylov const struct regmap_config *config,
725cc5d0db3SAlex A. Mihaylov struct lock_class_key *lock_key,
726cc5d0db3SAlex A. Mihaylov const char *lock_name);
7273cfe7a74SNicolas Boichat struct regmap *__devm_regmap_init_mmio_clk(struct device *dev,
7283cfe7a74SNicolas Boichat const char *clk_id,
7293cfe7a74SNicolas Boichat void __iomem *regs,
7303cfe7a74SNicolas Boichat const struct regmap_config *config,
7313cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
7323cfe7a74SNicolas Boichat const char *lock_name);
7333cfe7a74SNicolas Boichat struct regmap *__devm_regmap_init_ac97(struct snd_ac97 *ac97,
7343cfe7a74SNicolas Boichat const struct regmap_config *config,
7353cfe7a74SNicolas Boichat struct lock_class_key *lock_key,
7363cfe7a74SNicolas Boichat const char *lock_name);
7377c22ce6eSVinod Koul struct regmap *__devm_regmap_init_sdw(struct sdw_slave *sdw,
7387c22ce6eSVinod Koul const struct regmap_config *config,
7397c22ce6eSVinod Koul struct lock_class_key *lock_key,
7407c22ce6eSVinod Koul const char *lock_name);
741fb5103f9SPierre-Louis Bossart struct regmap *__devm_regmap_init_sdw_mbq(struct sdw_slave *sdw,
742fb5103f9SPierre-Louis Bossart const struct regmap_config *config,
743fdd9ef3dSCharles Keepax const struct regmap_sdw_mbq_cfg *mbq_config,
744fb5103f9SPierre-Louis Bossart struct lock_class_key *lock_key,
745fb5103f9SPierre-Louis Bossart const char *lock_name);
746ed24d568SSrinivas Kandagatla struct regmap *__devm_regmap_init_slimbus(struct slim_device *slimbus,
747ed24d568SSrinivas Kandagatla const struct regmap_config *config,
748ed24d568SSrinivas Kandagatla struct lock_class_key *lock_key,
749ed24d568SSrinivas Kandagatla const char *lock_name);
7506445500bSVitor Soares struct regmap *__devm_regmap_init_i3c(struct i3c_device *i3c,
7516445500bSVitor Soares const struct regmap_config *config,
7526445500bSVitor Soares struct lock_class_key *lock_key,
7536445500bSVitor Soares const char *lock_name);
7547f9fb673SXu Yilun struct regmap *__devm_regmap_init_spi_avmm(struct spi_device *spi,
7557f9fb673SXu Yilun const struct regmap_config *config,
7567f9fb673SXu Yilun struct lock_class_key *lock_key,
7577f9fb673SXu Yilun const char *lock_name);
758bf0d29fbSEddie James struct regmap *__devm_regmap_init_fsi(struct fsi_device *fsi_dev,
759bf0d29fbSEddie James const struct regmap_config *config,
760bf0d29fbSEddie James struct lock_class_key *lock_key,
761bf0d29fbSEddie James const char *lock_name);
762bf0d29fbSEddie James
7633cfe7a74SNicolas Boichat /*
7643cfe7a74SNicolas Boichat * Wrapper for regmap_init macros to include a unique lockdep key and name
7653cfe7a74SNicolas Boichat * for each call. No-op if CONFIG_LOCKDEP is not set.
7663cfe7a74SNicolas Boichat *
7673cfe7a74SNicolas Boichat * @fn: Real function to call (in the form __[*_]regmap_init[_*])
7683cfe7a74SNicolas Boichat * @name: Config variable name (#config in the calling macro)
7693cfe7a74SNicolas Boichat **/
7703cfe7a74SNicolas Boichat #ifdef CONFIG_LOCKDEP
7713cfe7a74SNicolas Boichat #define __regmap_lockdep_wrapper(fn, name, ...) \
7723cfe7a74SNicolas Boichat ( \
7733cfe7a74SNicolas Boichat ({ \
7743cfe7a74SNicolas Boichat static struct lock_class_key _key; \
7753cfe7a74SNicolas Boichat fn(__VA_ARGS__, &_key, \
7763cfe7a74SNicolas Boichat KBUILD_BASENAME ":" \
7773cfe7a74SNicolas Boichat __stringify(__LINE__) ":" \
7783cfe7a74SNicolas Boichat "(" name ")->lock"); \
7793cfe7a74SNicolas Boichat }) \
7803cfe7a74SNicolas Boichat )
7813cfe7a74SNicolas Boichat #else
7823cfe7a74SNicolas Boichat #define __regmap_lockdep_wrapper(fn, name, ...) fn(__VA_ARGS__, NULL, NULL)
7833cfe7a74SNicolas Boichat #endif
7843cfe7a74SNicolas Boichat
7851ed81114SNicolas Boichat /**
7862cf8e2dfSCharles Keepax * regmap_init() - Initialise register map
7871ed81114SNicolas Boichat *
7881ed81114SNicolas Boichat * @dev: Device that will be interacted with
7891ed81114SNicolas Boichat * @bus: Bus-specific callbacks to use with device
7901ed81114SNicolas Boichat * @bus_context: Data passed to bus-specific callbacks
7911ed81114SNicolas Boichat * @config: Configuration for register map
7921ed81114SNicolas Boichat *
7931ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer to
7941ed81114SNicolas Boichat * a struct regmap. This function should generally not be called
7951ed81114SNicolas Boichat * directly, it should be called by bus-specific init functions.
7961ed81114SNicolas Boichat */
7973cfe7a74SNicolas Boichat #define regmap_init(dev, bus, bus_context, config) \
7983cfe7a74SNicolas Boichat __regmap_lockdep_wrapper(__regmap_init, #config, \
7993cfe7a74SNicolas Boichat dev, bus, bus_context, config)
8006cfec04bSMichal Simek int regmap_attach_dev(struct device *dev, struct regmap *map,
8016cfec04bSMichal Simek const struct regmap_config *config);
802a676f083SMark Brown
8031ed81114SNicolas Boichat /**
8042cf8e2dfSCharles Keepax * regmap_init_i2c() - Initialise register map
8051ed81114SNicolas Boichat *
8061ed81114SNicolas Boichat * @i2c: Device that will be interacted with
8071ed81114SNicolas Boichat * @config: Configuration for register map
8081ed81114SNicolas Boichat *
8091ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer to
8101ed81114SNicolas Boichat * a struct regmap.
8111ed81114SNicolas Boichat */
8123cfe7a74SNicolas Boichat #define regmap_init_i2c(i2c, config) \
8133cfe7a74SNicolas Boichat __regmap_lockdep_wrapper(__regmap_init_i2c, #config, \
8143cfe7a74SNicolas Boichat i2c, config)
81522853223SMark Brown
8161ed81114SNicolas Boichat /**
8171f89d2feSSander Vanheule * regmap_init_mdio() - Initialise register map
8181f89d2feSSander Vanheule *
8191f89d2feSSander Vanheule * @mdio_dev: Device that will be interacted with
8201f89d2feSSander Vanheule * @config: Configuration for register map
8211f89d2feSSander Vanheule *
8221f89d2feSSander Vanheule * The return value will be an ERR_PTR() on error or a valid pointer to
8231f89d2feSSander Vanheule * a struct regmap.
8241f89d2feSSander Vanheule */
8251f89d2feSSander Vanheule #define regmap_init_mdio(mdio_dev, config) \
8261f89d2feSSander Vanheule __regmap_lockdep_wrapper(__regmap_init_mdio, #config, \
8271f89d2feSSander Vanheule mdio_dev, config)
8281f89d2feSSander Vanheule
8291f89d2feSSander Vanheule /**
830bcf7eac3SAkinobu Mita * regmap_init_sccb() - Initialise register map
831bcf7eac3SAkinobu Mita *
832bcf7eac3SAkinobu Mita * @i2c: Device that will be interacted with
833bcf7eac3SAkinobu Mita * @config: Configuration for register map
834bcf7eac3SAkinobu Mita *
835bcf7eac3SAkinobu Mita * The return value will be an ERR_PTR() on error or a valid pointer to
836bcf7eac3SAkinobu Mita * a struct regmap.
837bcf7eac3SAkinobu Mita */
838bcf7eac3SAkinobu Mita #define regmap_init_sccb(i2c, config) \
839bcf7eac3SAkinobu Mita __regmap_lockdep_wrapper(__regmap_init_sccb, #config, \
840bcf7eac3SAkinobu Mita i2c, config)
841bcf7eac3SAkinobu Mita
842bcf7eac3SAkinobu Mita /**
8437d6f7fb0SSrinivas Kandagatla * regmap_init_slimbus() - Initialise register map
8447d6f7fb0SSrinivas Kandagatla *
8457d6f7fb0SSrinivas Kandagatla * @slimbus: Device that will be interacted with
8467d6f7fb0SSrinivas Kandagatla * @config: Configuration for register map
8477d6f7fb0SSrinivas Kandagatla *
8487d6f7fb0SSrinivas Kandagatla * The return value will be an ERR_PTR() on error or a valid pointer to
8497d6f7fb0SSrinivas Kandagatla * a struct regmap.
8507d6f7fb0SSrinivas Kandagatla */
8517d6f7fb0SSrinivas Kandagatla #define regmap_init_slimbus(slimbus, config) \
8527d6f7fb0SSrinivas Kandagatla __regmap_lockdep_wrapper(__regmap_init_slimbus, #config, \
8537d6f7fb0SSrinivas Kandagatla slimbus, config)
8547d6f7fb0SSrinivas Kandagatla
8557d6f7fb0SSrinivas Kandagatla /**
8562cf8e2dfSCharles Keepax * regmap_init_spi() - Initialise register map
8571ed81114SNicolas Boichat *
8582cf8e2dfSCharles Keepax * @dev: Device that will be interacted with
8591ed81114SNicolas Boichat * @config: Configuration for register map
8601ed81114SNicolas Boichat *
8611ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer to
8621ed81114SNicolas Boichat * a struct regmap.
8631ed81114SNicolas Boichat */
8643cfe7a74SNicolas Boichat #define regmap_init_spi(dev, config) \
8653cfe7a74SNicolas Boichat __regmap_lockdep_wrapper(__regmap_init_spi, #config, \
8663cfe7a74SNicolas Boichat dev, config)
8671ed81114SNicolas Boichat
8681ed81114SNicolas Boichat /**
8692cf8e2dfSCharles Keepax * regmap_init_spmi_base() - Create regmap for the Base register space
8702cf8e2dfSCharles Keepax *
8712cf8e2dfSCharles Keepax * @dev: SPMI device that will be interacted with
8721ed81114SNicolas Boichat * @config: Configuration for register map
8731ed81114SNicolas Boichat *
8741ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer to
8751ed81114SNicolas Boichat * a struct regmap.
8761ed81114SNicolas Boichat */
8773cfe7a74SNicolas Boichat #define regmap_init_spmi_base(dev, config) \
8783cfe7a74SNicolas Boichat __regmap_lockdep_wrapper(__regmap_init_spmi_base, #config, \
8793cfe7a74SNicolas Boichat dev, config)
8801ed81114SNicolas Boichat
8811ed81114SNicolas Boichat /**
8822cf8e2dfSCharles Keepax * regmap_init_spmi_ext() - Create regmap for Ext register space
8832cf8e2dfSCharles Keepax *
8842cf8e2dfSCharles Keepax * @dev: Device that will be interacted with
8851ed81114SNicolas Boichat * @config: Configuration for register map
8861ed81114SNicolas Boichat *
8871ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer to
8881ed81114SNicolas Boichat * a struct regmap.
8891ed81114SNicolas Boichat */
8903cfe7a74SNicolas Boichat #define regmap_init_spmi_ext(dev, config) \
8913cfe7a74SNicolas Boichat __regmap_lockdep_wrapper(__regmap_init_spmi_ext, #config, \
8923cfe7a74SNicolas Boichat dev, config)
8931ed81114SNicolas Boichat
8941ed81114SNicolas Boichat /**
895cc5d0db3SAlex A. Mihaylov * regmap_init_w1() - Initialise register map
896cc5d0db3SAlex A. Mihaylov *
897cc5d0db3SAlex A. Mihaylov * @w1_dev: Device that will be interacted with
898cc5d0db3SAlex A. Mihaylov * @config: Configuration for register map
899cc5d0db3SAlex A. Mihaylov *
900cc5d0db3SAlex A. Mihaylov * The return value will be an ERR_PTR() on error or a valid pointer to
901cc5d0db3SAlex A. Mihaylov * a struct regmap.
902cc5d0db3SAlex A. Mihaylov */
903cc5d0db3SAlex A. Mihaylov #define regmap_init_w1(w1_dev, config) \
904cc5d0db3SAlex A. Mihaylov __regmap_lockdep_wrapper(__regmap_init_w1, #config, \
905cc5d0db3SAlex A. Mihaylov w1_dev, config)
906cc5d0db3SAlex A. Mihaylov
907cc5d0db3SAlex A. Mihaylov /**
9082cf8e2dfSCharles Keepax * regmap_init_mmio_clk() - Initialise register map with register clock
9091ed81114SNicolas Boichat *
9101ed81114SNicolas Boichat * @dev: Device that will be interacted with
9111ed81114SNicolas Boichat * @clk_id: register clock consumer ID
9121ed81114SNicolas Boichat * @regs: Pointer to memory-mapped IO region
9131ed81114SNicolas Boichat * @config: Configuration for register map
9141ed81114SNicolas Boichat *
9151ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer to
9161ed81114SNicolas Boichat * a struct regmap.
9171ed81114SNicolas Boichat */
9183cfe7a74SNicolas Boichat #define regmap_init_mmio_clk(dev, clk_id, regs, config) \
9193cfe7a74SNicolas Boichat __regmap_lockdep_wrapper(__regmap_init_mmio_clk, #config, \
9203cfe7a74SNicolas Boichat dev, clk_id, regs, config)
921c0eb4676SMark Brown
922878ec67bSPhilipp Zabel /**
9232cf8e2dfSCharles Keepax * regmap_init_mmio() - Initialise register map
924878ec67bSPhilipp Zabel *
925878ec67bSPhilipp Zabel * @dev: Device that will be interacted with
926878ec67bSPhilipp Zabel * @regs: Pointer to memory-mapped IO region
927878ec67bSPhilipp Zabel * @config: Configuration for register map
928878ec67bSPhilipp Zabel *
929878ec67bSPhilipp Zabel * The return value will be an ERR_PTR() on error or a valid pointer to
930878ec67bSPhilipp Zabel * a struct regmap.
931878ec67bSPhilipp Zabel */
9323cfe7a74SNicolas Boichat #define regmap_init_mmio(dev, regs, config) \
9333cfe7a74SNicolas Boichat regmap_init_mmio_clk(dev, NULL, regs, config)
934878ec67bSPhilipp Zabel
935878ec67bSPhilipp Zabel /**
9362cf8e2dfSCharles Keepax * regmap_init_ac97() - Initialise AC'97 register map
9371ed81114SNicolas Boichat *
9381ed81114SNicolas Boichat * @ac97: Device that will be interacted with
9391ed81114SNicolas Boichat * @config: Configuration for register map
9401ed81114SNicolas Boichat *
9411ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer to
9421ed81114SNicolas Boichat * a struct regmap.
9431ed81114SNicolas Boichat */
9441ed81114SNicolas Boichat #define regmap_init_ac97(ac97, config) \
9451ed81114SNicolas Boichat __regmap_lockdep_wrapper(__regmap_init_ac97, #config, \
9461ed81114SNicolas Boichat ac97, config)
9471ed81114SNicolas Boichat bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
9481ed81114SNicolas Boichat
9491ed81114SNicolas Boichat /**
9507c22ce6eSVinod Koul * regmap_init_sdw() - Initialise register map
9517c22ce6eSVinod Koul *
9527c22ce6eSVinod Koul * @sdw: Device that will be interacted with
9537c22ce6eSVinod Koul * @config: Configuration for register map
9547c22ce6eSVinod Koul *
9557c22ce6eSVinod Koul * The return value will be an ERR_PTR() on error or a valid pointer to
9567c22ce6eSVinod Koul * a struct regmap.
9577c22ce6eSVinod Koul */
9587c22ce6eSVinod Koul #define regmap_init_sdw(sdw, config) \
9597c22ce6eSVinod Koul __regmap_lockdep_wrapper(__regmap_init_sdw, #config, \
9607c22ce6eSVinod Koul sdw, config)
9617c22ce6eSVinod Koul
9627f9fb673SXu Yilun /**
963fb5103f9SPierre-Louis Bossart * regmap_init_sdw_mbq() - Initialise register map
964fb5103f9SPierre-Louis Bossart *
965fb5103f9SPierre-Louis Bossart * @sdw: Device that will be interacted with
966fb5103f9SPierre-Louis Bossart * @config: Configuration for register map
967fb5103f9SPierre-Louis Bossart *
968fb5103f9SPierre-Louis Bossart * The return value will be an ERR_PTR() on error or a valid pointer to
969fb5103f9SPierre-Louis Bossart * a struct regmap.
970fb5103f9SPierre-Louis Bossart */
971fb5103f9SPierre-Louis Bossart #define regmap_init_sdw_mbq(sdw, config) \
972fb5103f9SPierre-Louis Bossart __regmap_lockdep_wrapper(__regmap_init_sdw_mbq, #config, \
973fdd9ef3dSCharles Keepax sdw, config, NULL)
974fdd9ef3dSCharles Keepax
975fdd9ef3dSCharles Keepax /**
976fdd9ef3dSCharles Keepax * regmap_init_sdw_mbq_cfg() - Initialise MBQ SDW register map with config
977fdd9ef3dSCharles Keepax *
978fdd9ef3dSCharles Keepax * @sdw: Device that will be interacted with
979fdd9ef3dSCharles Keepax * @config: Configuration for register map
980fdd9ef3dSCharles Keepax * @mbq_config: Properties for the MBQ registers
981fdd9ef3dSCharles Keepax *
982fdd9ef3dSCharles Keepax * The return value will be an ERR_PTR() on error or a valid pointer
983fdd9ef3dSCharles Keepax * to a struct regmap. The regmap will be automatically freed by the
984fdd9ef3dSCharles Keepax * device management code.
985fdd9ef3dSCharles Keepax */
986fdd9ef3dSCharles Keepax #define regmap_init_sdw_mbq_cfg(sdw, config, mbq_config) \
987fdd9ef3dSCharles Keepax __regmap_lockdep_wrapper(__regmap_init_sdw_mbq, #config, \
988fdd9ef3dSCharles Keepax sdw, config, mbq_config)
989fb5103f9SPierre-Louis Bossart
990fb5103f9SPierre-Louis Bossart /**
9917f9fb673SXu Yilun * regmap_init_spi_avmm() - Initialize register map for Intel SPI Slave
9927f9fb673SXu Yilun * to AVMM Bus Bridge
9937f9fb673SXu Yilun *
9947f9fb673SXu Yilun * @spi: Device that will be interacted with
9957f9fb673SXu Yilun * @config: Configuration for register map
9967f9fb673SXu Yilun *
9977f9fb673SXu Yilun * The return value will be an ERR_PTR() on error or a valid pointer
9987f9fb673SXu Yilun * to a struct regmap.
9997f9fb673SXu Yilun */
10007f9fb673SXu Yilun #define regmap_init_spi_avmm(spi, config) \
10017f9fb673SXu Yilun __regmap_lockdep_wrapper(__regmap_init_spi_avmm, #config, \
10027f9fb673SXu Yilun spi, config)
10037c22ce6eSVinod Koul
10047c22ce6eSVinod Koul /**
1005bf0d29fbSEddie James * regmap_init_fsi() - Initialise register map
1006bf0d29fbSEddie James *
1007bf0d29fbSEddie James * @fsi_dev: Device that will be interacted with
1008bf0d29fbSEddie James * @config: Configuration for register map
1009bf0d29fbSEddie James *
1010bf0d29fbSEddie James * The return value will be an ERR_PTR() on error or a valid pointer to
1011bf0d29fbSEddie James * a struct regmap.
1012bf0d29fbSEddie James */
1013bf0d29fbSEddie James #define regmap_init_fsi(fsi_dev, config) \
1014bf0d29fbSEddie James __regmap_lockdep_wrapper(__regmap_init_fsi, #config, fsi_dev, \
1015bf0d29fbSEddie James config)
1016bf0d29fbSEddie James
1017bf0d29fbSEddie James /**
10182cf8e2dfSCharles Keepax * devm_regmap_init() - Initialise managed register map
10191ed81114SNicolas Boichat *
10201ed81114SNicolas Boichat * @dev: Device that will be interacted with
10211ed81114SNicolas Boichat * @bus: Bus-specific callbacks to use with device
10221ed81114SNicolas Boichat * @bus_context: Data passed to bus-specific callbacks
10231ed81114SNicolas Boichat * @config: Configuration for register map
10241ed81114SNicolas Boichat *
10251ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer
10261ed81114SNicolas Boichat * to a struct regmap. This function should generally not be called
10271ed81114SNicolas Boichat * directly, it should be called by bus-specific init functions. The
10281ed81114SNicolas Boichat * map will be automatically freed by the device management code.
10291ed81114SNicolas Boichat */
10301ed81114SNicolas Boichat #define devm_regmap_init(dev, bus, bus_context, config) \
10311ed81114SNicolas Boichat __regmap_lockdep_wrapper(__devm_regmap_init, #config, \
10321ed81114SNicolas Boichat dev, bus, bus_context, config)
10331ed81114SNicolas Boichat
10341ed81114SNicolas Boichat /**
10352cf8e2dfSCharles Keepax * devm_regmap_init_i2c() - Initialise managed register map
10361ed81114SNicolas Boichat *
10371ed81114SNicolas Boichat * @i2c: Device that will be interacted with
10381ed81114SNicolas Boichat * @config: Configuration for register map
10391ed81114SNicolas Boichat *
10401ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer
10411ed81114SNicolas Boichat * to a struct regmap. The regmap will be automatically freed by the
10421ed81114SNicolas Boichat * device management code.
10431ed81114SNicolas Boichat */
10441ed81114SNicolas Boichat #define devm_regmap_init_i2c(i2c, config) \
10451ed81114SNicolas Boichat __regmap_lockdep_wrapper(__devm_regmap_init_i2c, #config, \
10461ed81114SNicolas Boichat i2c, config)
10471ed81114SNicolas Boichat
10481ed81114SNicolas Boichat /**
10491f89d2feSSander Vanheule * devm_regmap_init_mdio() - Initialise managed register map
10501f89d2feSSander Vanheule *
10511f89d2feSSander Vanheule * @mdio_dev: Device that will be interacted with
10521f89d2feSSander Vanheule * @config: Configuration for register map
10531f89d2feSSander Vanheule *
10541f89d2feSSander Vanheule * The return value will be an ERR_PTR() on error or a valid pointer
10551f89d2feSSander Vanheule * to a struct regmap. The regmap will be automatically freed by the
10561f89d2feSSander Vanheule * device management code.
10571f89d2feSSander Vanheule */
10581f89d2feSSander Vanheule #define devm_regmap_init_mdio(mdio_dev, config) \
10591f89d2feSSander Vanheule __regmap_lockdep_wrapper(__devm_regmap_init_mdio, #config, \
10601f89d2feSSander Vanheule mdio_dev, config)
10611f89d2feSSander Vanheule
10621f89d2feSSander Vanheule /**
1063bcf7eac3SAkinobu Mita * devm_regmap_init_sccb() - Initialise managed register map
1064bcf7eac3SAkinobu Mita *
1065bcf7eac3SAkinobu Mita * @i2c: Device that will be interacted with
1066bcf7eac3SAkinobu Mita * @config: Configuration for register map
1067bcf7eac3SAkinobu Mita *
1068bcf7eac3SAkinobu Mita * The return value will be an ERR_PTR() on error or a valid pointer
1069bcf7eac3SAkinobu Mita * to a struct regmap. The regmap will be automatically freed by the
1070bcf7eac3SAkinobu Mita * device management code.
1071bcf7eac3SAkinobu Mita */
1072bcf7eac3SAkinobu Mita #define devm_regmap_init_sccb(i2c, config) \
1073bcf7eac3SAkinobu Mita __regmap_lockdep_wrapper(__devm_regmap_init_sccb, #config, \
1074bcf7eac3SAkinobu Mita i2c, config)
1075bcf7eac3SAkinobu Mita
1076bcf7eac3SAkinobu Mita /**
10772cf8e2dfSCharles Keepax * devm_regmap_init_spi() - Initialise register map
10781ed81114SNicolas Boichat *
10792cf8e2dfSCharles Keepax * @dev: Device that will be interacted with
10801ed81114SNicolas Boichat * @config: Configuration for register map
10811ed81114SNicolas Boichat *
10821ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer
10831ed81114SNicolas Boichat * to a struct regmap. The map will be automatically freed by the
10841ed81114SNicolas Boichat * device management code.
10851ed81114SNicolas Boichat */
10861ed81114SNicolas Boichat #define devm_regmap_init_spi(dev, config) \
10871ed81114SNicolas Boichat __regmap_lockdep_wrapper(__devm_regmap_init_spi, #config, \
10881ed81114SNicolas Boichat dev, config)
10891ed81114SNicolas Boichat
10901ed81114SNicolas Boichat /**
10912cf8e2dfSCharles Keepax * devm_regmap_init_spmi_base() - Create managed regmap for Base register space
10922cf8e2dfSCharles Keepax *
10932cf8e2dfSCharles Keepax * @dev: SPMI device that will be interacted with
10941ed81114SNicolas Boichat * @config: Configuration for register map
10951ed81114SNicolas Boichat *
10961ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer
10971ed81114SNicolas Boichat * to a struct regmap. The regmap will be automatically freed by the
10981ed81114SNicolas Boichat * device management code.
10991ed81114SNicolas Boichat */
11001ed81114SNicolas Boichat #define devm_regmap_init_spmi_base(dev, config) \
11011ed81114SNicolas Boichat __regmap_lockdep_wrapper(__devm_regmap_init_spmi_base, #config, \
11021ed81114SNicolas Boichat dev, config)
11031ed81114SNicolas Boichat
11041ed81114SNicolas Boichat /**
11052cf8e2dfSCharles Keepax * devm_regmap_init_spmi_ext() - Create managed regmap for Ext register space
11062cf8e2dfSCharles Keepax *
11072cf8e2dfSCharles Keepax * @dev: SPMI device that will be interacted with
11081ed81114SNicolas Boichat * @config: Configuration for register map
11091ed81114SNicolas Boichat *
11101ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer
11111ed81114SNicolas Boichat * to a struct regmap. The regmap will be automatically freed by the
11121ed81114SNicolas Boichat * device management code.
11131ed81114SNicolas Boichat */
11141ed81114SNicolas Boichat #define devm_regmap_init_spmi_ext(dev, config) \
11151ed81114SNicolas Boichat __regmap_lockdep_wrapper(__devm_regmap_init_spmi_ext, #config, \
11161ed81114SNicolas Boichat dev, config)
11171ed81114SNicolas Boichat
11181ed81114SNicolas Boichat /**
1119cc5d0db3SAlex A. Mihaylov * devm_regmap_init_w1() - Initialise managed register map
1120cc5d0db3SAlex A. Mihaylov *
1121cc5d0db3SAlex A. Mihaylov * @w1_dev: Device that will be interacted with
1122cc5d0db3SAlex A. Mihaylov * @config: Configuration for register map
1123cc5d0db3SAlex A. Mihaylov *
1124cc5d0db3SAlex A. Mihaylov * The return value will be an ERR_PTR() on error or a valid pointer
1125cc5d0db3SAlex A. Mihaylov * to a struct regmap. The regmap will be automatically freed by the
1126cc5d0db3SAlex A. Mihaylov * device management code.
1127cc5d0db3SAlex A. Mihaylov */
1128cc5d0db3SAlex A. Mihaylov #define devm_regmap_init_w1(w1_dev, config) \
1129cc5d0db3SAlex A. Mihaylov __regmap_lockdep_wrapper(__devm_regmap_init_w1, #config, \
1130cc5d0db3SAlex A. Mihaylov w1_dev, config)
1131cc5d0db3SAlex A. Mihaylov /**
11322cf8e2dfSCharles Keepax * devm_regmap_init_mmio_clk() - Initialise managed register map with clock
11331ed81114SNicolas Boichat *
11341ed81114SNicolas Boichat * @dev: Device that will be interacted with
11351ed81114SNicolas Boichat * @clk_id: register clock consumer ID
11361ed81114SNicolas Boichat * @regs: Pointer to memory-mapped IO region
11371ed81114SNicolas Boichat * @config: Configuration for register map
11381ed81114SNicolas Boichat *
11391ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer
11401ed81114SNicolas Boichat * to a struct regmap. The regmap will be automatically freed by the
11411ed81114SNicolas Boichat * device management code.
11421ed81114SNicolas Boichat */
11431ed81114SNicolas Boichat #define devm_regmap_init_mmio_clk(dev, clk_id, regs, config) \
11441ed81114SNicolas Boichat __regmap_lockdep_wrapper(__devm_regmap_init_mmio_clk, #config, \
11451ed81114SNicolas Boichat dev, clk_id, regs, config)
1146878ec67bSPhilipp Zabel
1147878ec67bSPhilipp Zabel /**
11482cf8e2dfSCharles Keepax * devm_regmap_init_mmio() - Initialise managed register map
1149878ec67bSPhilipp Zabel *
1150878ec67bSPhilipp Zabel * @dev: Device that will be interacted with
1151878ec67bSPhilipp Zabel * @regs: Pointer to memory-mapped IO region
1152878ec67bSPhilipp Zabel * @config: Configuration for register map
1153878ec67bSPhilipp Zabel *
1154878ec67bSPhilipp Zabel * The return value will be an ERR_PTR() on error or a valid pointer
1155878ec67bSPhilipp Zabel * to a struct regmap. The regmap will be automatically freed by the
1156878ec67bSPhilipp Zabel * device management code.
1157878ec67bSPhilipp Zabel */
11583cfe7a74SNicolas Boichat #define devm_regmap_init_mmio(dev, regs, config) \
11593cfe7a74SNicolas Boichat devm_regmap_init_mmio_clk(dev, NULL, regs, config)
1160878ec67bSPhilipp Zabel
11611ed81114SNicolas Boichat /**
11622cf8e2dfSCharles Keepax * devm_regmap_init_ac97() - Initialise AC'97 register map
11631ed81114SNicolas Boichat *
11641ed81114SNicolas Boichat * @ac97: Device that will be interacted with
11651ed81114SNicolas Boichat * @config: Configuration for register map
11661ed81114SNicolas Boichat *
11671ed81114SNicolas Boichat * The return value will be an ERR_PTR() on error or a valid pointer
11681ed81114SNicolas Boichat * to a struct regmap. The regmap will be automatically freed by the
11691ed81114SNicolas Boichat * device management code.
11701ed81114SNicolas Boichat */
11711ed81114SNicolas Boichat #define devm_regmap_init_ac97(ac97, config) \
11721ed81114SNicolas Boichat __regmap_lockdep_wrapper(__devm_regmap_init_ac97, #config, \
11731ed81114SNicolas Boichat ac97, config)
117476aad392SDavide Ciminaghi
11757c22ce6eSVinod Koul /**
11767c22ce6eSVinod Koul * devm_regmap_init_sdw() - Initialise managed register map
11777c22ce6eSVinod Koul *
11787c22ce6eSVinod Koul * @sdw: Device that will be interacted with
11797c22ce6eSVinod Koul * @config: Configuration for register map
11807c22ce6eSVinod Koul *
11817c22ce6eSVinod Koul * The return value will be an ERR_PTR() on error or a valid pointer
11827c22ce6eSVinod Koul * to a struct regmap. The regmap will be automatically freed by the
11837c22ce6eSVinod Koul * device management code.
11847c22ce6eSVinod Koul */
11857c22ce6eSVinod Koul #define devm_regmap_init_sdw(sdw, config) \
11867c22ce6eSVinod Koul __regmap_lockdep_wrapper(__devm_regmap_init_sdw, #config, \
11877c22ce6eSVinod Koul sdw, config)
11887c22ce6eSVinod Koul
1189ed24d568SSrinivas Kandagatla /**
1190fb5103f9SPierre-Louis Bossart * devm_regmap_init_sdw_mbq() - Initialise managed register map
1191fb5103f9SPierre-Louis Bossart *
1192fb5103f9SPierre-Louis Bossart * @sdw: Device that will be interacted with
1193fb5103f9SPierre-Louis Bossart * @config: Configuration for register map
1194fb5103f9SPierre-Louis Bossart *
1195fb5103f9SPierre-Louis Bossart * The return value will be an ERR_PTR() on error or a valid pointer
1196fb5103f9SPierre-Louis Bossart * to a struct regmap. The regmap will be automatically freed by the
1197fb5103f9SPierre-Louis Bossart * device management code.
1198fb5103f9SPierre-Louis Bossart */
1199fb5103f9SPierre-Louis Bossart #define devm_regmap_init_sdw_mbq(sdw, config) \
1200fb5103f9SPierre-Louis Bossart __regmap_lockdep_wrapper(__devm_regmap_init_sdw_mbq, #config, \
1201fdd9ef3dSCharles Keepax sdw, config, NULL)
1202fdd9ef3dSCharles Keepax
1203fdd9ef3dSCharles Keepax /**
1204fdd9ef3dSCharles Keepax * devm_regmap_init_sdw_mbq_cfg() - Initialise managed MBQ SDW register map with config
1205fdd9ef3dSCharles Keepax *
1206fdd9ef3dSCharles Keepax * @sdw: Device that will be interacted with
1207fdd9ef3dSCharles Keepax * @config: Configuration for register map
1208fdd9ef3dSCharles Keepax * @mbq_config: Properties for the MBQ registers
1209fdd9ef3dSCharles Keepax *
1210fdd9ef3dSCharles Keepax * The return value will be an ERR_PTR() on error or a valid pointer
1211fdd9ef3dSCharles Keepax * to a struct regmap. The regmap will be automatically freed by the
1212fdd9ef3dSCharles Keepax * device management code.
1213fdd9ef3dSCharles Keepax */
1214fdd9ef3dSCharles Keepax #define devm_regmap_init_sdw_mbq_cfg(sdw, config, mbq_config) \
1215fdd9ef3dSCharles Keepax __regmap_lockdep_wrapper(__devm_regmap_init_sdw_mbq, \
1216fdd9ef3dSCharles Keepax #config, sdw, config, mbq_config)
1217fb5103f9SPierre-Louis Bossart
1218fb5103f9SPierre-Louis Bossart /**
1219ed24d568SSrinivas Kandagatla * devm_regmap_init_slimbus() - Initialise managed register map
1220ed24d568SSrinivas Kandagatla *
1221ed24d568SSrinivas Kandagatla * @slimbus: Device that will be interacted with
1222ed24d568SSrinivas Kandagatla * @config: Configuration for register map
1223ed24d568SSrinivas Kandagatla *
1224ed24d568SSrinivas Kandagatla * The return value will be an ERR_PTR() on error or a valid pointer
1225ed24d568SSrinivas Kandagatla * to a struct regmap. The regmap will be automatically freed by the
1226ed24d568SSrinivas Kandagatla * device management code.
1227ed24d568SSrinivas Kandagatla */
1228ed24d568SSrinivas Kandagatla #define devm_regmap_init_slimbus(slimbus, config) \
1229ed24d568SSrinivas Kandagatla __regmap_lockdep_wrapper(__devm_regmap_init_slimbus, #config, \
1230ed24d568SSrinivas Kandagatla slimbus, config)
12316445500bSVitor Soares
12326445500bSVitor Soares /**
12336445500bSVitor Soares * devm_regmap_init_i3c() - Initialise managed register map
12346445500bSVitor Soares *
12356445500bSVitor Soares * @i3c: Device that will be interacted with
12366445500bSVitor Soares * @config: Configuration for register map
12376445500bSVitor Soares *
12386445500bSVitor Soares * The return value will be an ERR_PTR() on error or a valid pointer
12396445500bSVitor Soares * to a struct regmap. The regmap will be automatically freed by the
12406445500bSVitor Soares * device management code.
12416445500bSVitor Soares */
12426445500bSVitor Soares #define devm_regmap_init_i3c(i3c, config) \
12436445500bSVitor Soares __regmap_lockdep_wrapper(__devm_regmap_init_i3c, #config, \
12446445500bSVitor Soares i3c, config)
12456445500bSVitor Soares
12467f9fb673SXu Yilun /**
12477f9fb673SXu Yilun * devm_regmap_init_spi_avmm() - Initialize register map for Intel SPI Slave
12487f9fb673SXu Yilun * to AVMM Bus Bridge
12497f9fb673SXu Yilun *
12507f9fb673SXu Yilun * @spi: Device that will be interacted with
12517f9fb673SXu Yilun * @config: Configuration for register map
12527f9fb673SXu Yilun *
12537f9fb673SXu Yilun * The return value will be an ERR_PTR() on error or a valid pointer
12547f9fb673SXu Yilun * to a struct regmap. The map will be automatically freed by the
12557f9fb673SXu Yilun * device management code.
12567f9fb673SXu Yilun */
12577f9fb673SXu Yilun #define devm_regmap_init_spi_avmm(spi, config) \
12587f9fb673SXu Yilun __regmap_lockdep_wrapper(__devm_regmap_init_spi_avmm, #config, \
12597f9fb673SXu Yilun spi, config)
12607f9fb673SXu Yilun
1261bf0d29fbSEddie James /**
1262bf0d29fbSEddie James * devm_regmap_init_fsi() - Initialise managed register map
1263bf0d29fbSEddie James *
1264bf0d29fbSEddie James * @fsi_dev: Device that will be interacted with
1265bf0d29fbSEddie James * @config: Configuration for register map
1266bf0d29fbSEddie James *
1267bf0d29fbSEddie James * The return value will be an ERR_PTR() on error or a valid pointer
1268bf0d29fbSEddie James * to a struct regmap. The regmap will be automatically freed by the
1269bf0d29fbSEddie James * device management code.
1270bf0d29fbSEddie James */
1271bf0d29fbSEddie James #define devm_regmap_init_fsi(fsi_dev, config) \
1272bf0d29fbSEddie James __regmap_lockdep_wrapper(__devm_regmap_init_fsi, #config, \
1273bf0d29fbSEddie James fsi_dev, config)
1274bf0d29fbSEddie James
127531895662SMaxime Ripard int regmap_mmio_attach_clk(struct regmap *map, struct clk *clk);
127631895662SMaxime Ripard void regmap_mmio_detach_clk(struct regmap *map);
1277b83a313bSMark Brown void regmap_exit(struct regmap *map);
1278b83a313bSMark Brown int regmap_reinit_cache(struct regmap *map,
1279b83a313bSMark Brown const struct regmap_config *config);
1280b83a313bSMark Brown struct regmap *dev_get_regmap(struct device *dev, const char *name);
12818d7d3972STuomas Tynkkynen struct device *regmap_get_device(struct regmap *map);
1282b83a313bSMark Brown int regmap_write(struct regmap *map, unsigned int reg, unsigned int val);
1283915f441bSMark Brown int regmap_write_async(struct regmap *map, unsigned int reg, unsigned int val);
1284b83a313bSMark Brown int regmap_raw_write(struct regmap *map, unsigned int reg,
128572b39f6fSMark Brown const void *val, size_t val_len);
1286cdf6b11dSBen Whitten int regmap_noinc_write(struct regmap *map, unsigned int reg,
1287cdf6b11dSBen Whitten const void *val, size_t val_len);
1288b83a313bSMark Brown int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
1289b83a313bSMark Brown size_t val_count);
12908019ff6cSNariman Poushin int regmap_multi_reg_write(struct regmap *map, const struct reg_sequence *regs,
1291e33fabd3SAnthony Olech int num_regs);
12921d5b40bcSCharles Keepax int regmap_multi_reg_write_bypassed(struct regmap *map,
12938019ff6cSNariman Poushin const struct reg_sequence *regs,
12948eaeb219SLaxman Dewangan int num_regs);
12958eaeb219SLaxman Dewangan int regmap_raw_write_async(struct regmap *map, unsigned int reg,
1296b83a313bSMark Brown const void *val, size_t val_len);
1297b83a313bSMark Brown int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val);
129870ee853eSRichard Fitzgerald int regmap_read_bypassed(struct regmap *map, unsigned int reg, unsigned int *val);
1299b83a313bSMark Brown int regmap_raw_read(struct regmap *map, unsigned int reg,
1300b83a313bSMark Brown void *val, size_t val_len);
130174fe7b55SCrestez Dan Leonard int regmap_noinc_read(struct regmap *map, unsigned int reg,
130274fe7b55SCrestez Dan Leonard void *val, size_t val_len);
1303b83a313bSMark Brown int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
1304b83a313bSMark Brown size_t val_count);
1305eb708cd6SRichard Fitzgerald int regmap_multi_reg_read(struct regmap *map, const unsigned int *reg, void *val,
13063c1ff93bSGuenter Roeck size_t val_count);
130791d31b9fSKuninori Morimoto int regmap_update_bits_base(struct regmap *map, unsigned int reg,
1308018690d3SMark Brown unsigned int mask, unsigned int val,
130991d31b9fSKuninori Morimoto bool *change, bool async, bool force);
13104b9e7edbSBartosz Golaszewski
regmap_update_bits(struct regmap * map,unsigned int reg,unsigned int mask,unsigned int val)13114b9e7edbSBartosz Golaszewski static inline int regmap_update_bits(struct regmap *map, unsigned int reg,
13124b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
13134b9e7edbSBartosz Golaszewski {
13144b9e7edbSBartosz Golaszewski return regmap_update_bits_base(map, reg, mask, val, NULL, false, false);
13154b9e7edbSBartosz Golaszewski }
13164b9e7edbSBartosz Golaszewski
regmap_update_bits_async(struct regmap * map,unsigned int reg,unsigned int mask,unsigned int val)13174b9e7edbSBartosz Golaszewski static inline int regmap_update_bits_async(struct regmap *map, unsigned int reg,
13184b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
13194b9e7edbSBartosz Golaszewski {
13204b9e7edbSBartosz Golaszewski return regmap_update_bits_base(map, reg, mask, val, NULL, true, false);
13214b9e7edbSBartosz Golaszewski }
13224b9e7edbSBartosz Golaszewski
regmap_update_bits_check(struct regmap * map,unsigned int reg,unsigned int mask,unsigned int val,bool * change)13234b9e7edbSBartosz Golaszewski static inline int regmap_update_bits_check(struct regmap *map, unsigned int reg,
13244b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val,
13254b9e7edbSBartosz Golaszewski bool *change)
13264b9e7edbSBartosz Golaszewski {
13274b9e7edbSBartosz Golaszewski return regmap_update_bits_base(map, reg, mask, val,
13284b9e7edbSBartosz Golaszewski change, false, false);
13294b9e7edbSBartosz Golaszewski }
13304b9e7edbSBartosz Golaszewski
13314b9e7edbSBartosz Golaszewski static inline int
regmap_update_bits_check_async(struct regmap * map,unsigned int reg,unsigned int mask,unsigned int val,bool * change)13324b9e7edbSBartosz Golaszewski regmap_update_bits_check_async(struct regmap *map, unsigned int reg,
13334b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val,
13344b9e7edbSBartosz Golaszewski bool *change)
13354b9e7edbSBartosz Golaszewski {
13364b9e7edbSBartosz Golaszewski return regmap_update_bits_base(map, reg, mask, val,
13374b9e7edbSBartosz Golaszewski change, true, false);
13384b9e7edbSBartosz Golaszewski }
13394b9e7edbSBartosz Golaszewski
regmap_write_bits(struct regmap * map,unsigned int reg,unsigned int mask,unsigned int val)13404b9e7edbSBartosz Golaszewski static inline int regmap_write_bits(struct regmap *map, unsigned int reg,
13414b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
13424b9e7edbSBartosz Golaszewski {
13434b9e7edbSBartosz Golaszewski return regmap_update_bits_base(map, reg, mask, val, NULL, false, true);
13444b9e7edbSBartosz Golaszewski }
13454b9e7edbSBartosz Golaszewski
1346018690d3SMark Brown int regmap_get_val_bytes(struct regmap *map);
1347668abc72SSrinivas Kandagatla int regmap_get_max_register(struct regmap *map);
1348a2f776cbSSrinivas Kandagatla int regmap_get_reg_stride(struct regmap *map);
1349a6d99022SMichael Walle bool regmap_might_sleep(struct regmap *map);
1350a6539c32SMark Brown int regmap_async_complete(struct regmap *map);
1351221ad7f2SMark Brown bool regmap_can_raw_write(struct regmap *map);
1352f50c9eb4SMarkus Pargmann size_t regmap_get_raw_read_max(struct regmap *map);
1353f50c9eb4SMarkus Pargmann size_t regmap_get_raw_write_max(struct regmap *map);
1354b83a313bSMark Brown
1355*fd80df35SCharles Keepax void regcache_sort_defaults(struct reg_default *defaults, unsigned int ndefaults);
135639a58439SMark Brown int regcache_sync(struct regmap *map);
13574d4cfd16SMark Brown int regcache_sync_region(struct regmap *map, unsigned int min,
13584d4cfd16SMark Brown unsigned int max);
1359697e85bcSMark Brown int regcache_drop_region(struct regmap *map, unsigned int min,
1360697e85bcSMark Brown unsigned int max);
136192afb286SMark Brown void regcache_cache_only(struct regmap *map, bool enable);
13626eb0f5e0SDimitris Papastamos void regcache_cache_bypass(struct regmap *map, bool enable);
13638ae0d7e8SMark Brown void regcache_mark_dirty(struct regmap *map);
136478908f45SMark Brown bool regcache_reg_cached(struct regmap *map, unsigned int reg);
136592afb286SMark Brown
1366154881e5SMark Brown bool regmap_check_range_table(struct regmap *map, unsigned int reg,
1367154881e5SMark Brown const struct regmap_access_table *table);
1368154881e5SMark Brown
13698019ff6cSNariman Poushin int regmap_register_patch(struct regmap *map, const struct reg_sequence *regs,
137022f0d90aSMark Brown int num_regs);
137113ff50c8SNenghua Cao int regmap_parse_val(struct regmap *map, const void *buf,
137213ff50c8SNenghua Cao unsigned int *val);
137322f0d90aSMark Brown
regmap_reg_in_range(unsigned int reg,const struct regmap_range * range)137476aad392SDavide Ciminaghi static inline bool regmap_reg_in_range(unsigned int reg,
137576aad392SDavide Ciminaghi const struct regmap_range *range)
137676aad392SDavide Ciminaghi {
137776aad392SDavide Ciminaghi return reg >= range->range_min && reg <= range->range_max;
137876aad392SDavide Ciminaghi }
137976aad392SDavide Ciminaghi
138076aad392SDavide Ciminaghi bool regmap_reg_in_ranges(unsigned int reg,
138176aad392SDavide Ciminaghi const struct regmap_range *ranges,
138276aad392SDavide Ciminaghi unsigned int nranges);
138376aad392SDavide Ciminaghi
regmap_set_bits(struct regmap * map,unsigned int reg,unsigned int bits)1384aa2ff9dbSBartosz Golaszewski static inline int regmap_set_bits(struct regmap *map,
1385aa2ff9dbSBartosz Golaszewski unsigned int reg, unsigned int bits)
1386aa2ff9dbSBartosz Golaszewski {
1387aa2ff9dbSBartosz Golaszewski return regmap_update_bits_base(map, reg, bits, bits,
1388aa2ff9dbSBartosz Golaszewski NULL, false, false);
1389aa2ff9dbSBartosz Golaszewski }
1390aa2ff9dbSBartosz Golaszewski
regmap_clear_bits(struct regmap * map,unsigned int reg,unsigned int bits)1391aa2ff9dbSBartosz Golaszewski static inline int regmap_clear_bits(struct regmap *map,
1392aa2ff9dbSBartosz Golaszewski unsigned int reg, unsigned int bits)
1393aa2ff9dbSBartosz Golaszewski {
1394aa2ff9dbSBartosz Golaszewski return regmap_update_bits_base(map, reg, bits, 0, NULL, false, false);
1395aa2ff9dbSBartosz Golaszewski }
1396aa2ff9dbSBartosz Golaszewski
regmap_assign_bits(struct regmap * map,unsigned int reg,unsigned int bits,bool value)1397d1f4390dSBartosz Golaszewski static inline int regmap_assign_bits(struct regmap *map, unsigned int reg,
1398d1f4390dSBartosz Golaszewski unsigned int bits, bool value)
1399d1f4390dSBartosz Golaszewski {
1400d1f4390dSBartosz Golaszewski if (value)
1401d1f4390dSBartosz Golaszewski return regmap_set_bits(map, reg, bits);
1402d1f4390dSBartosz Golaszewski else
1403d1f4390dSBartosz Golaszewski return regmap_clear_bits(map, reg, bits);
1404d1f4390dSBartosz Golaszewski }
1405d1f4390dSBartosz Golaszewski
1406aa2ff9dbSBartosz Golaszewski int regmap_test_bits(struct regmap *map, unsigned int reg, unsigned int bits);
1407aa2ff9dbSBartosz Golaszewski
1408f8beab2bSMark Brown /**
14092cf8e2dfSCharles Keepax * struct reg_field - Description of an register field
141067252287SSrinivas Kandagatla *
141167252287SSrinivas Kandagatla * @reg: Offset of the register within the regmap bank
141267252287SSrinivas Kandagatla * @lsb: lsb of the register field.
1413f27b37f5SBintian Wang * @msb: msb of the register field.
1414a0102375SKuninori Morimoto * @id_size: port size if it has some ports
1415a0102375SKuninori Morimoto * @id_offset: address offset for each ports
141667252287SSrinivas Kandagatla */
141767252287SSrinivas Kandagatla struct reg_field {
141867252287SSrinivas Kandagatla unsigned int reg;
141967252287SSrinivas Kandagatla unsigned int lsb;
142067252287SSrinivas Kandagatla unsigned int msb;
1421a0102375SKuninori Morimoto unsigned int id_size;
1422a0102375SKuninori Morimoto unsigned int id_offset;
142367252287SSrinivas Kandagatla };
142467252287SSrinivas Kandagatla
142567252287SSrinivas Kandagatla #define REG_FIELD(_reg, _lsb, _msb) { \
142667252287SSrinivas Kandagatla .reg = _reg, \
142767252287SSrinivas Kandagatla .lsb = _lsb, \
142867252287SSrinivas Kandagatla .msb = _msb, \
142967252287SSrinivas Kandagatla }
143067252287SSrinivas Kandagatla
14318baebfc2SVladimir Oltean #define REG_FIELD_ID(_reg, _lsb, _msb, _size, _offset) { \
14328baebfc2SVladimir Oltean .reg = _reg, \
14338baebfc2SVladimir Oltean .lsb = _lsb, \
14348baebfc2SVladimir Oltean .msb = _msb, \
14358baebfc2SVladimir Oltean .id_size = _size, \
14368baebfc2SVladimir Oltean .id_offset = _offset, \
14378baebfc2SVladimir Oltean }
14388baebfc2SVladimir Oltean
143967252287SSrinivas Kandagatla struct regmap_field *regmap_field_alloc(struct regmap *regmap,
144067252287SSrinivas Kandagatla struct reg_field reg_field);
144167252287SSrinivas Kandagatla void regmap_field_free(struct regmap_field *field);
144267252287SSrinivas Kandagatla
144367252287SSrinivas Kandagatla struct regmap_field *devm_regmap_field_alloc(struct device *dev,
144467252287SSrinivas Kandagatla struct regmap *regmap, struct reg_field reg_field);
144567252287SSrinivas Kandagatla void devm_regmap_field_free(struct device *dev, struct regmap_field *field);
144667252287SSrinivas Kandagatla
1447ea470b82SSrinivas Kandagatla int regmap_field_bulk_alloc(struct regmap *regmap,
1448ea470b82SSrinivas Kandagatla struct regmap_field **rm_field,
144929c34975SIcenowy Zheng const struct reg_field *reg_field,
1450ea470b82SSrinivas Kandagatla int num_fields);
1451ea470b82SSrinivas Kandagatla void regmap_field_bulk_free(struct regmap_field *field);
1452ea470b82SSrinivas Kandagatla int devm_regmap_field_bulk_alloc(struct device *dev, struct regmap *regmap,
1453ea470b82SSrinivas Kandagatla struct regmap_field **field,
145429c34975SIcenowy Zheng const struct reg_field *reg_field,
145529c34975SIcenowy Zheng int num_fields);
1456ea470b82SSrinivas Kandagatla void devm_regmap_field_bulk_free(struct device *dev,
1457ea470b82SSrinivas Kandagatla struct regmap_field *field);
1458ea470b82SSrinivas Kandagatla
145967252287SSrinivas Kandagatla int regmap_field_read(struct regmap_field *field, unsigned int *val);
146028972eaaSKuninori Morimoto int regmap_field_update_bits_base(struct regmap_field *field,
146128972eaaSKuninori Morimoto unsigned int mask, unsigned int val,
146228972eaaSKuninori Morimoto bool *change, bool async, bool force);
1463a0102375SKuninori Morimoto int regmap_fields_read(struct regmap_field *field, unsigned int id,
1464a0102375SKuninori Morimoto unsigned int *val);
1465e126edecSKuninori Morimoto int regmap_fields_update_bits_base(struct regmap_field *field, unsigned int id,
1466e126edecSKuninori Morimoto unsigned int mask, unsigned int val,
1467e126edecSKuninori Morimoto bool *change, bool async, bool force);
14684b9e7edbSBartosz Golaszewski
regmap_field_write(struct regmap_field * field,unsigned int val)14694b9e7edbSBartosz Golaszewski static inline int regmap_field_write(struct regmap_field *field,
14704b9e7edbSBartosz Golaszewski unsigned int val)
14714b9e7edbSBartosz Golaszewski {
14724b9e7edbSBartosz Golaszewski return regmap_field_update_bits_base(field, ~0, val,
14734b9e7edbSBartosz Golaszewski NULL, false, false);
14744b9e7edbSBartosz Golaszewski }
14754b9e7edbSBartosz Golaszewski
regmap_field_force_write(struct regmap_field * field,unsigned int val)14764b9e7edbSBartosz Golaszewski static inline int regmap_field_force_write(struct regmap_field *field,
14774b9e7edbSBartosz Golaszewski unsigned int val)
14784b9e7edbSBartosz Golaszewski {
14794b9e7edbSBartosz Golaszewski return regmap_field_update_bits_base(field, ~0, val, NULL, false, true);
14804b9e7edbSBartosz Golaszewski }
14814b9e7edbSBartosz Golaszewski
regmap_field_update_bits(struct regmap_field * field,unsigned int mask,unsigned int val)14824b9e7edbSBartosz Golaszewski static inline int regmap_field_update_bits(struct regmap_field *field,
14834b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
14844b9e7edbSBartosz Golaszewski {
14854b9e7edbSBartosz Golaszewski return regmap_field_update_bits_base(field, mask, val,
14864b9e7edbSBartosz Golaszewski NULL, false, false);
14874b9e7edbSBartosz Golaszewski }
14884b9e7edbSBartosz Golaszewski
regmap_field_set_bits(struct regmap_field * field,unsigned int bits)1489f67be8b7SLi Chen static inline int regmap_field_set_bits(struct regmap_field *field,
1490f67be8b7SLi Chen unsigned int bits)
1491f67be8b7SLi Chen {
1492f67be8b7SLi Chen return regmap_field_update_bits_base(field, bits, bits, NULL, false,
1493f67be8b7SLi Chen false);
1494f67be8b7SLi Chen }
1495f67be8b7SLi Chen
regmap_field_clear_bits(struct regmap_field * field,unsigned int bits)1496f67be8b7SLi Chen static inline int regmap_field_clear_bits(struct regmap_field *field,
1497f67be8b7SLi Chen unsigned int bits)
1498f67be8b7SLi Chen {
1499f67be8b7SLi Chen return regmap_field_update_bits_base(field, bits, 0, NULL, false,
1500f67be8b7SLi Chen false);
1501f67be8b7SLi Chen }
1502f67be8b7SLi Chen
1503f67be8b7SLi Chen int regmap_field_test_bits(struct regmap_field *field, unsigned int bits);
1504f67be8b7SLi Chen
15054b9e7edbSBartosz Golaszewski static inline int
regmap_field_force_update_bits(struct regmap_field * field,unsigned int mask,unsigned int val)15064b9e7edbSBartosz Golaszewski regmap_field_force_update_bits(struct regmap_field *field,
15074b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
15084b9e7edbSBartosz Golaszewski {
15094b9e7edbSBartosz Golaszewski return regmap_field_update_bits_base(field, mask, val,
15104b9e7edbSBartosz Golaszewski NULL, false, true);
15114b9e7edbSBartosz Golaszewski }
15124b9e7edbSBartosz Golaszewski
regmap_fields_write(struct regmap_field * field,unsigned int id,unsigned int val)15134b9e7edbSBartosz Golaszewski static inline int regmap_fields_write(struct regmap_field *field,
15144b9e7edbSBartosz Golaszewski unsigned int id, unsigned int val)
15154b9e7edbSBartosz Golaszewski {
15164b9e7edbSBartosz Golaszewski return regmap_fields_update_bits_base(field, id, ~0, val,
15174b9e7edbSBartosz Golaszewski NULL, false, false);
15184b9e7edbSBartosz Golaszewski }
15194b9e7edbSBartosz Golaszewski
regmap_fields_force_write(struct regmap_field * field,unsigned int id,unsigned int val)15204b9e7edbSBartosz Golaszewski static inline int regmap_fields_force_write(struct regmap_field *field,
15214b9e7edbSBartosz Golaszewski unsigned int id, unsigned int val)
15224b9e7edbSBartosz Golaszewski {
15234b9e7edbSBartosz Golaszewski return regmap_fields_update_bits_base(field, id, ~0, val,
15244b9e7edbSBartosz Golaszewski NULL, false, true);
15254b9e7edbSBartosz Golaszewski }
15264b9e7edbSBartosz Golaszewski
15274b9e7edbSBartosz Golaszewski static inline int
regmap_fields_update_bits(struct regmap_field * field,unsigned int id,unsigned int mask,unsigned int val)15284b9e7edbSBartosz Golaszewski regmap_fields_update_bits(struct regmap_field *field, unsigned int id,
15294b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
15304b9e7edbSBartosz Golaszewski {
15314b9e7edbSBartosz Golaszewski return regmap_fields_update_bits_base(field, id, mask, val,
15324b9e7edbSBartosz Golaszewski NULL, false, false);
15334b9e7edbSBartosz Golaszewski }
15344b9e7edbSBartosz Golaszewski
15354b9e7edbSBartosz Golaszewski static inline int
regmap_fields_force_update_bits(struct regmap_field * field,unsigned int id,unsigned int mask,unsigned int val)15364b9e7edbSBartosz Golaszewski regmap_fields_force_update_bits(struct regmap_field *field, unsigned int id,
15374b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
15384b9e7edbSBartosz Golaszewski {
15394b9e7edbSBartosz Golaszewski return regmap_fields_update_bits_base(field, id, mask, val,
15404b9e7edbSBartosz Golaszewski NULL, false, true);
15414b9e7edbSBartosz Golaszewski }
15424b9e7edbSBartosz Golaszewski
15431c2928e3SMatti Vaittinen /**
15441c2928e3SMatti Vaittinen * struct regmap_irq_type - IRQ type definitions.
15451c2928e3SMatti Vaittinen *
15461c2928e3SMatti Vaittinen * @type_reg_offset: Offset register for the irq type setting.
15471c2928e3SMatti Vaittinen * @type_rising_val: Register value to configure RISING type irq.
15481c2928e3SMatti Vaittinen * @type_falling_val: Register value to configure FALLING type irq.
15491c2928e3SMatti Vaittinen * @type_level_low_val: Register value to configure LEVEL_LOW type irq.
15501c2928e3SMatti Vaittinen * @type_level_high_val: Register value to configure LEVEL_HIGH type irq.
15511c2928e3SMatti Vaittinen * @types_supported: logical OR of IRQ_TYPE_* flags indicating supported types.
15521c2928e3SMatti Vaittinen */
15531c2928e3SMatti Vaittinen struct regmap_irq_type {
15541c2928e3SMatti Vaittinen unsigned int type_reg_offset;
15551c2928e3SMatti Vaittinen unsigned int type_reg_mask;
15561c2928e3SMatti Vaittinen unsigned int type_rising_val;
15571c2928e3SMatti Vaittinen unsigned int type_falling_val;
15581c2928e3SMatti Vaittinen unsigned int type_level_low_val;
15591c2928e3SMatti Vaittinen unsigned int type_level_high_val;
15601c2928e3SMatti Vaittinen unsigned int types_supported;
15611c2928e3SMatti Vaittinen };
156267252287SSrinivas Kandagatla
156367252287SSrinivas Kandagatla /**
15642cf8e2dfSCharles Keepax * struct regmap_irq - Description of an IRQ for the generic regmap irq_chip.
1565f8beab2bSMark Brown *
1566f8beab2bSMark Brown * @reg_offset: Offset of the status/mask register within the bank
1567f8beab2bSMark Brown * @mask: Mask used to flag/control the register.
15681c2928e3SMatti Vaittinen * @type: IRQ trigger type setting details if supported.
1569f8beab2bSMark Brown */
1570f8beab2bSMark Brown struct regmap_irq {
1571f8beab2bSMark Brown unsigned int reg_offset;
1572f8beab2bSMark Brown unsigned int mask;
15731c2928e3SMatti Vaittinen struct regmap_irq_type type;
1574f8beab2bSMark Brown };
1575f8beab2bSMark Brown
1576b4fe8ba7SQipeng Zha #define REGMAP_IRQ_REG(_irq, _off, _mask) \
1577b4fe8ba7SQipeng Zha [_irq] = { .reg_offset = (_off), .mask = (_mask) }
1578b4fe8ba7SQipeng Zha
157943fac323STony Xie #define REGMAP_IRQ_REG_LINE(_id, _reg_bits) \
158043fac323STony Xie [_id] = { \
158143fac323STony Xie .mask = BIT((_id) % (_reg_bits)), \
158243fac323STony Xie .reg_offset = (_id) / (_reg_bits), \
158343fac323STony Xie }
158443fac323STony Xie
1585a2d21848SMatti Vaittinen #define REGMAP_IRQ_MAIN_REG_OFFSET(arr) \
1586a2d21848SMatti Vaittinen { .num_regs = ARRAY_SIZE((arr)), .offset = &(arr)[0] }
1587a2d21848SMatti Vaittinen
1588a2d21848SMatti Vaittinen struct regmap_irq_sub_irq_map {
1589a2d21848SMatti Vaittinen unsigned int num_regs;
1590a2d21848SMatti Vaittinen unsigned int *offset;
1591a2d21848SMatti Vaittinen };
1592a2d21848SMatti Vaittinen
1593bdf9b86cSAidan MacDonald struct regmap_irq_chip_data;
1594bdf9b86cSAidan MacDonald
1595f8beab2bSMark Brown /**
15962cf8e2dfSCharles Keepax * struct regmap_irq_chip - Description of a generic regmap irq_chip.
1597f8beab2bSMark Brown *
1598f8beab2bSMark Brown * @name: Descriptive name for IRQ controller.
1599dde286eeSMatti Vaittinen * @domain_suffix: Name suffix to be appended to end of IRQ domain name. Needed
1600dde286eeSMatti Vaittinen * when multiple regmap-IRQ controllers are created from same
1601dde286eeSMatti Vaittinen * device.
1602f8beab2bSMark Brown *
1603a2d21848SMatti Vaittinen * @main_status: Base main status register address. For chips which have
1604a2d21848SMatti Vaittinen * interrupts arranged in separate sub-irq blocks with own IRQ
1605a2d21848SMatti Vaittinen * registers and which have a main IRQ registers indicating
1606a2d21848SMatti Vaittinen * sub-irq blocks with unhandled interrupts. For such chips fill
1607a2d21848SMatti Vaittinen * sub-irq register information in status_base, mask_base and
1608a2d21848SMatti Vaittinen * ack_base.
1609a2d21848SMatti Vaittinen * @num_main_status_bits: Should be given to chips where number of meaningfull
1610a2d21848SMatti Vaittinen * main status bits differs from num_regs.
1611a2d21848SMatti Vaittinen * @sub_reg_offsets: arrays of mappings from main register bits to sub irq
1612a2d21848SMatti Vaittinen * registers. First item in array describes the registers
1613a2d21848SMatti Vaittinen * for first main status bit. Second array for second bit etc.
1614a2d21848SMatti Vaittinen * Offset is given as sub register status offset to
1615a2d21848SMatti Vaittinen * status_base. Should contain num_regs arrays.
1616a2d21848SMatti Vaittinen * Can be provided for chips with more complex mapping than
1617a2d21848SMatti Vaittinen * 1.st bit to 1.st sub-reg, 2.nd bit to 2.nd sub-reg, ...
1618a2d21848SMatti Vaittinen * @num_main_regs: Number of 'main status' irq registers for chips which have
1619a2d21848SMatti Vaittinen * main_status set.
1620a2d21848SMatti Vaittinen *
1621f8beab2bSMark Brown * @status_base: Base status register address.
1622e8ffb12eSAidan MacDonald * @mask_base: Base mask register address. Mask bits are set to 1 when an
1623e8ffb12eSAidan MacDonald * interrupt is masked, 0 when unmasked.
1624e8ffb12eSAidan MacDonald * @unmask_base: Base unmask register address. Unmask bits are set to 1 when
1625e8ffb12eSAidan MacDonald * an interrupt is unmasked and 0 when masked.
1626f8beab2bSMark Brown * @ack_base: Base ack address. If zero then the chip is clear on read.
1627d3233433SAlexander Shiyan * Using zero value is possible with @use_ack bit.
1628a43fd50dSMark Brown * @wake_base: Base address for wake enables. If zero unsupported.
1629faa87ce9SAidan MacDonald * @config_base: Base address for IRQ type config regs. If null unsupported.
1630022f926aSGraeme Gregory * @irq_reg_stride: Stride to use for chips where registers are not contiguous.
16312753e6f8SPhilipp Zabel * @init_ack_masked: Ack all masked interrupts once during initalization.
1632e8ffb12eSAidan MacDonald * @mask_unmask_non_inverted: Controls mask bit inversion for chips that set
1633e8ffb12eSAidan MacDonald * both @mask_base and @unmask_base. If false, mask and unmask bits are
1634e8ffb12eSAidan MacDonald * inverted (which is deprecated behavior); if true, bits will not be
1635e8ffb12eSAidan MacDonald * inverted and the registers keep their normal behavior. Note that if
1636e8ffb12eSAidan MacDonald * you use only one of @mask_base or @unmask_base, this flag has no
1637e8ffb12eSAidan MacDonald * effect and is unnecessary. Any new drivers that set both @mask_base
1638e8ffb12eSAidan MacDonald * and @unmask_base should set this to true to avoid relying on the
1639e8ffb12eSAidan MacDonald * deprecated behavior.
1640d3233433SAlexander Shiyan * @use_ack: Use @ack register even if it is zero.
1641a650fdd9SGuo Zeng * @ack_invert: Inverted ack register: cleared bits for ack.
16423a6f0fb7SLaxminath Kasam * @clear_ack: Use this to set 1 and 0 or vice-versa to clear interrupts.
16439b400171SAndy Shevchenko * @status_invert: Inverted status register: cleared bits are active interrupts.
164468622bdfSPhilipp Zabel * @wake_invert: Inverted wake register: cleared bits are wake enabled.
1645610fdd66SAidan MacDonald * @type_in_mask: Use the mask registers for controlling irq type. Use this if
1646610fdd66SAidan MacDonald * the hardware provides separate bits for rising/falling edge
1647610fdd66SAidan MacDonald * or low/high level interrupts and they should be combined into
1648610fdd66SAidan MacDonald * a single logical interrupt. Use &struct regmap_irq_type data
1649610fdd66SAidan MacDonald * to define the mask bit for each irq type.
1650c82ea33eSBartosz Golaszewski * @clear_on_unmask: For chips with interrupts cleared on read: read the status
1651c82ea33eSBartosz Golaszewski * registers before unmasking interrupts to clear any bits
1652c82ea33eSBartosz Golaszewski * set when they were masked.
16539b400171SAndy Shevchenko * @runtime_pm: Hold a runtime PM lock on the device when accessing it.
16544d60cac9SWilliam Breathitt Gray * @no_status: No status register: all interrupts assumed generated by device.
1655f8beab2bSMark Brown *
1656f8beab2bSMark Brown * @num_regs: Number of registers in each control bank.
16579b400171SAndy Shevchenko *
1658f8beab2bSMark Brown * @irqs: Descriptors for individual IRQs. Interrupt numbers are
1659f8beab2bSMark Brown * assigned based on the index in the array of the interrupt.
1660f8beab2bSMark Brown * @num_irqs: Number of descriptors.
1661faa87ce9SAidan MacDonald * @num_config_bases: Number of config base registers.
1662faa87ce9SAidan MacDonald * @num_config_regs: Number of config registers for each config base register.
16639b400171SAndy Shevchenko *
1664ccc12561SLaxman Dewangan * @handle_pre_irq: Driver specific callback to handle interrupt from device
1665ccc12561SLaxman Dewangan * before regmap_irq_handler process the interrupts.
1666ccc12561SLaxman Dewangan * @handle_post_irq: Driver specific callback to handle interrupt from device
1667ccc12561SLaxman Dewangan * after handling the interrupts in regmap_irq_handler().
166869af4bcaSWilliam Breathitt Gray * @handle_mask_sync: Callback used to handle IRQ mask syncs. The index will be
166969af4bcaSWilliam Breathitt Gray * in the range [0, num_regs)
1670faa87ce9SAidan MacDonald * @set_type_config: Callback used for configuring irq types.
1671bdf9b86cSAidan MacDonald * @get_irq_reg: Callback for mapping (base register, index) pairs to register
1672bdf9b86cSAidan MacDonald * addresses. The base register will be one of @status_base,
1673bdf9b86cSAidan MacDonald * @mask_base, etc., @main_status, or any of @config_base.
1674bdf9b86cSAidan MacDonald * The index will be in the range [0, num_main_regs[ for the
1675212bc1ceSAidan MacDonald * main status base, [0, num_config_regs[ for any config
1676bdf9b86cSAidan MacDonald * register base, and [0, num_regs[ for any other base.
1677bdf9b86cSAidan MacDonald * If unspecified then regmap_irq_get_irq_reg_linear() is used.
1678ccc12561SLaxman Dewangan * @irq_drv_data: Driver specific IRQ data which is passed as parameter when
1679ccc12561SLaxman Dewangan * driver specific pre/post interrupt handler is called.
16802cf8e2dfSCharles Keepax *
16812cf8e2dfSCharles Keepax * This is not intended to handle every possible interrupt controller, but
16822cf8e2dfSCharles Keepax * it should handle a substantial proportion of those that are found in the
16832cf8e2dfSCharles Keepax * wild.
1684f8beab2bSMark Brown */
1685f8beab2bSMark Brown struct regmap_irq_chip {
1686f8beab2bSMark Brown const char *name;
1687dde286eeSMatti Vaittinen const char *domain_suffix;
1688f8beab2bSMark Brown
1689a2d21848SMatti Vaittinen unsigned int main_status;
1690a2d21848SMatti Vaittinen unsigned int num_main_status_bits;
1691f21711bbSThomas Weißschuh const struct regmap_irq_sub_irq_map *sub_reg_offsets;
1692a2d21848SMatti Vaittinen int num_main_regs;
1693a2d21848SMatti Vaittinen
1694f8beab2bSMark Brown unsigned int status_base;
1695f8beab2bSMark Brown unsigned int mask_base;
16967b7d1968SGuo Zeng unsigned int unmask_base;
1697f8beab2bSMark Brown unsigned int ack_base;
1698a43fd50dSMark Brown unsigned int wake_base;
1699faa87ce9SAidan MacDonald const unsigned int *config_base;
1700022f926aSGraeme Gregory unsigned int irq_reg_stride;
1701445cbd21SAidan MacDonald unsigned int init_ack_masked:1;
1702e8ffb12eSAidan MacDonald unsigned int mask_unmask_non_inverted:1;
1703445cbd21SAidan MacDonald unsigned int use_ack:1;
1704445cbd21SAidan MacDonald unsigned int ack_invert:1;
1705445cbd21SAidan MacDonald unsigned int clear_ack:1;
17069b400171SAndy Shevchenko unsigned int status_invert:1;
1707445cbd21SAidan MacDonald unsigned int wake_invert:1;
1708445cbd21SAidan MacDonald unsigned int type_in_mask:1;
1709445cbd21SAidan MacDonald unsigned int clear_on_unmask:1;
17109b400171SAndy Shevchenko unsigned int runtime_pm:1;
17114d60cac9SWilliam Breathitt Gray unsigned int no_status:1;
1712f8beab2bSMark Brown
1713f8beab2bSMark Brown int num_regs;
1714f8beab2bSMark Brown
1715f8beab2bSMark Brown const struct regmap_irq *irqs;
1716f8beab2bSMark Brown int num_irqs;
17177a78479fSLaxman Dewangan
1718faa87ce9SAidan MacDonald int num_config_bases;
1719faa87ce9SAidan MacDonald int num_config_regs;
1720ccc12561SLaxman Dewangan
1721ccc12561SLaxman Dewangan int (*handle_pre_irq)(void *irq_drv_data);
1722ccc12561SLaxman Dewangan int (*handle_post_irq)(void *irq_drv_data);
172369da5aa9SWilliam Breathitt Gray int (*handle_mask_sync)(int index, unsigned int mask_buf_def,
172469af4bcaSWilliam Breathitt Gray unsigned int mask_buf, void *irq_drv_data);
1725faa87ce9SAidan MacDonald int (*set_type_config)(unsigned int **buf, unsigned int type,
17267697c64bSWilliam Breathitt Gray const struct regmap_irq *irq_data, int idx,
17277697c64bSWilliam Breathitt Gray void *irq_drv_data);
1728bdf9b86cSAidan MacDonald unsigned int (*get_irq_reg)(struct regmap_irq_chip_data *data,
1729bdf9b86cSAidan MacDonald unsigned int base, int index);
1730ccc12561SLaxman Dewangan void *irq_drv_data;
1731f8beab2bSMark Brown };
1732f8beab2bSMark Brown
1733bdf9b86cSAidan MacDonald unsigned int regmap_irq_get_irq_reg_linear(struct regmap_irq_chip_data *data,
1734bdf9b86cSAidan MacDonald unsigned int base, int index);
1735faa87ce9SAidan MacDonald int regmap_irq_set_type_config_simple(unsigned int **buf, unsigned int type,
17367697c64bSWilliam Breathitt Gray const struct regmap_irq *irq_data,
17377697c64bSWilliam Breathitt Gray int idx, void *irq_drv_data);
1738faa87ce9SAidan MacDonald
1739f8beab2bSMark Brown int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
1740b026ddbbSMark Brown int irq_base, const struct regmap_irq_chip *chip,
1741f8beab2bSMark Brown struct regmap_irq_chip_data **data);
17425cc2013bSMichael Walle int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
17435cc2013bSMichael Walle struct regmap *map, int irq,
174412479382SMichael Walle int irq_flags, int irq_base,
174512479382SMichael Walle const struct regmap_irq_chip *chip,
174612479382SMichael Walle struct regmap_irq_chip_data **data);
1747f8beab2bSMark Brown void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *data);
1748045b9848SLaxman Dewangan
1749045b9848SLaxman Dewangan int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq,
1750045b9848SLaxman Dewangan int irq_flags, int irq_base,
1751045b9848SLaxman Dewangan const struct regmap_irq_chip *chip,
1752045b9848SLaxman Dewangan struct regmap_irq_chip_data **data);
17535cc2013bSMichael Walle int devm_regmap_add_irq_chip_fwnode(struct device *dev,
17545cc2013bSMichael Walle struct fwnode_handle *fwnode,
17555cc2013bSMichael Walle struct regmap *map, int irq,
17565cc2013bSMichael Walle int irq_flags, int irq_base,
175712479382SMichael Walle const struct regmap_irq_chip *chip,
175812479382SMichael Walle struct regmap_irq_chip_data **data);
1759045b9848SLaxman Dewangan void devm_regmap_del_irq_chip(struct device *dev, int irq,
1760045b9848SLaxman Dewangan struct regmap_irq_chip_data *data);
1761045b9848SLaxman Dewangan
1762209a6006SMark Brown int regmap_irq_chip_get_base(struct regmap_irq_chip_data *data);
17634af8be67SMark Brown int regmap_irq_get_virq(struct regmap_irq_chip_data *data, int irq);
176490f790d2SMark Brown struct irq_domain *regmap_irq_get_domain(struct regmap_irq_chip_data *data);
1765b83a313bSMark Brown
17669cde5fcdSMark Brown #else
17679cde5fcdSMark Brown
17689cde5fcdSMark Brown /*
17699cde5fcdSMark Brown * These stubs should only ever be called by generic code which has
17709cde5fcdSMark Brown * regmap based facilities, if they ever get called at runtime
17719cde5fcdSMark Brown * something is going wrong and something probably needs to select
17729cde5fcdSMark Brown * REGMAP.
17739cde5fcdSMark Brown */
17749cde5fcdSMark Brown
regmap_write(struct regmap * map,unsigned int reg,unsigned int val)17759cde5fcdSMark Brown static inline int regmap_write(struct regmap *map, unsigned int reg,
17769cde5fcdSMark Brown unsigned int val)
17779cde5fcdSMark Brown {
17789cde5fcdSMark Brown WARN_ONCE(1, "regmap API is disabled");
17799cde5fcdSMark Brown return -EINVAL;
17809cde5fcdSMark Brown }
17819cde5fcdSMark Brown
regmap_write_async(struct regmap * map,unsigned int reg,unsigned int val)1782915f441bSMark Brown static inline int regmap_write_async(struct regmap *map, unsigned int reg,
1783915f441bSMark Brown unsigned int val)
1784915f441bSMark Brown {
1785915f441bSMark Brown WARN_ONCE(1, "regmap API is disabled");
1786915f441bSMark Brown return -EINVAL;
1787915f441bSMark Brown }
1788915f441bSMark Brown
regmap_raw_write(struct regmap * map,unsigned int reg,const void * val,size_t val_len)17899cde5fcdSMark Brown static inline int regmap_raw_write(struct regmap *map, unsigned int reg,
17909cde5fcdSMark Brown const void *val, size_t val_len)
17919cde5fcdSMark Brown {
17929cde5fcdSMark Brown WARN_ONCE(1, "regmap API is disabled");
17939cde5fcdSMark Brown return -EINVAL;
17949cde5fcdSMark Brown }
17959cde5fcdSMark Brown
regmap_raw_write_async(struct regmap * map,unsigned int reg,const void * val,size_t val_len)17960d509f2bSMark Brown static inline int regmap_raw_write_async(struct regmap *map, unsigned int reg,
17970d509f2bSMark Brown const void *val, size_t val_len)
17980d509f2bSMark Brown {
17990d509f2bSMark Brown WARN_ONCE(1, "regmap API is disabled");
18000d509f2bSMark Brown return -EINVAL;
18010d509f2bSMark Brown }
18020d509f2bSMark Brown
regmap_noinc_write(struct regmap * map,unsigned int reg,const void * val,size_t val_len)1803cdf6b11dSBen Whitten static inline int regmap_noinc_write(struct regmap *map, unsigned int reg,
1804cdf6b11dSBen Whitten const void *val, size_t val_len)
1805cdf6b11dSBen Whitten {
1806cdf6b11dSBen Whitten WARN_ONCE(1, "regmap API is disabled");
1807cdf6b11dSBen Whitten return -EINVAL;
1808cdf6b11dSBen Whitten }
1809cdf6b11dSBen Whitten
regmap_bulk_write(struct regmap * map,unsigned int reg,const void * val,size_t val_count)18109cde5fcdSMark Brown static inline int regmap_bulk_write(struct regmap *map, unsigned int reg,
18119cde5fcdSMark Brown const void *val, size_t val_count)
18129cde5fcdSMark Brown {
18139cde5fcdSMark Brown WARN_ONCE(1, "regmap API is disabled");
18149cde5fcdSMark Brown return -EINVAL;
18159cde5fcdSMark Brown }
18169cde5fcdSMark Brown
regmap_read(struct regmap * map,unsigned int reg,unsigned int * val)18179cde5fcdSMark Brown static inline int regmap_read(struct regmap *map, unsigned int reg,
18189cde5fcdSMark Brown unsigned int *val)
18199cde5fcdSMark Brown {
18209cde5fcdSMark Brown WARN_ONCE(1, "regmap API is disabled");
18219cde5fcdSMark Brown return -EINVAL;
18229cde5fcdSMark Brown }
18239cde5fcdSMark Brown
regmap_read_bypassed(struct regmap * map,unsigned int reg,unsigned int * val)182470ee853eSRichard Fitzgerald static inline int regmap_read_bypassed(struct regmap *map, unsigned int reg,
182570ee853eSRichard Fitzgerald unsigned int *val)
182670ee853eSRichard Fitzgerald {
182770ee853eSRichard Fitzgerald WARN_ONCE(1, "regmap API is disabled");
182870ee853eSRichard Fitzgerald return -EINVAL;
182970ee853eSRichard Fitzgerald }
183070ee853eSRichard Fitzgerald
regmap_raw_read(struct regmap * map,unsigned int reg,void * val,size_t val_len)18319cde5fcdSMark Brown static inline int regmap_raw_read(struct regmap *map, unsigned int reg,
18329cde5fcdSMark Brown void *val, size_t val_len)
18339cde5fcdSMark Brown {
18349cde5fcdSMark Brown WARN_ONCE(1, "regmap API is disabled");
18359cde5fcdSMark Brown return -EINVAL;
18369cde5fcdSMark Brown }
18379cde5fcdSMark Brown
regmap_noinc_read(struct regmap * map,unsigned int reg,void * val,size_t val_len)183874fe7b55SCrestez Dan Leonard static inline int regmap_noinc_read(struct regmap *map, unsigned int reg,
183974fe7b55SCrestez Dan Leonard void *val, size_t val_len)
184074fe7b55SCrestez Dan Leonard {
184174fe7b55SCrestez Dan Leonard WARN_ONCE(1, "regmap API is disabled");
184274fe7b55SCrestez Dan Leonard return -EINVAL;
184374fe7b55SCrestez Dan Leonard }
184474fe7b55SCrestez Dan Leonard
regmap_bulk_read(struct regmap * map,unsigned int reg,void * val,size_t val_count)18459cde5fcdSMark Brown static inline int regmap_bulk_read(struct regmap *map, unsigned int reg,
18469cde5fcdSMark Brown void *val, size_t val_count)
18479cde5fcdSMark Brown {
18489cde5fcdSMark Brown WARN_ONCE(1, "regmap API is disabled");
18499cde5fcdSMark Brown return -EINVAL;
18509cde5fcdSMark Brown }
18519cde5fcdSMark Brown
regmap_update_bits_base(struct regmap * map,unsigned int reg,unsigned int mask,unsigned int val,bool * change,bool async,bool force)185291d31b9fSKuninori Morimoto static inline int regmap_update_bits_base(struct regmap *map, unsigned int reg,
18539cde5fcdSMark Brown unsigned int mask, unsigned int val,
185491d31b9fSKuninori Morimoto bool *change, bool async, bool force)
18559cde5fcdSMark Brown {
18569cde5fcdSMark Brown WARN_ONCE(1, "regmap API is disabled");
18579cde5fcdSMark Brown return -EINVAL;
18589cde5fcdSMark Brown }
18599cde5fcdSMark Brown
regmap_set_bits(struct regmap * map,unsigned int reg,unsigned int bits)1860aa2ff9dbSBartosz Golaszewski static inline int regmap_set_bits(struct regmap *map,
1861aa2ff9dbSBartosz Golaszewski unsigned int reg, unsigned int bits)
1862aa2ff9dbSBartosz Golaszewski {
1863aa2ff9dbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
1864aa2ff9dbSBartosz Golaszewski return -EINVAL;
1865aa2ff9dbSBartosz Golaszewski }
1866aa2ff9dbSBartosz Golaszewski
regmap_clear_bits(struct regmap * map,unsigned int reg,unsigned int bits)1867aa2ff9dbSBartosz Golaszewski static inline int regmap_clear_bits(struct regmap *map,
1868aa2ff9dbSBartosz Golaszewski unsigned int reg, unsigned int bits)
1869aa2ff9dbSBartosz Golaszewski {
1870aa2ff9dbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
1871aa2ff9dbSBartosz Golaszewski return -EINVAL;
1872aa2ff9dbSBartosz Golaszewski }
1873aa2ff9dbSBartosz Golaszewski
regmap_assign_bits(struct regmap * map,unsigned int reg,unsigned int bits,bool value)1874d1f4390dSBartosz Golaszewski static inline int regmap_assign_bits(struct regmap *map, unsigned int reg,
1875d1f4390dSBartosz Golaszewski unsigned int bits, bool value)
1876d1f4390dSBartosz Golaszewski {
1877d1f4390dSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
1878d1f4390dSBartosz Golaszewski return -EINVAL;
1879d1f4390dSBartosz Golaszewski }
1880d1f4390dSBartosz Golaszewski
regmap_test_bits(struct regmap * map,unsigned int reg,unsigned int bits)1881aa2ff9dbSBartosz Golaszewski static inline int regmap_test_bits(struct regmap *map,
1882aa2ff9dbSBartosz Golaszewski unsigned int reg, unsigned int bits)
1883aa2ff9dbSBartosz Golaszewski {
1884aa2ff9dbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
1885aa2ff9dbSBartosz Golaszewski return -EINVAL;
1886aa2ff9dbSBartosz Golaszewski }
1887aa2ff9dbSBartosz Golaszewski
regmap_field_update_bits_base(struct regmap_field * field,unsigned int mask,unsigned int val,bool * change,bool async,bool force)188828972eaaSKuninori Morimoto static inline int regmap_field_update_bits_base(struct regmap_field *field,
188928972eaaSKuninori Morimoto unsigned int mask, unsigned int val,
189028972eaaSKuninori Morimoto bool *change, bool async, bool force)
189128972eaaSKuninori Morimoto {
189228972eaaSKuninori Morimoto WARN_ONCE(1, "regmap API is disabled");
189328972eaaSKuninori Morimoto return -EINVAL;
189428972eaaSKuninori Morimoto }
189528972eaaSKuninori Morimoto
regmap_fields_update_bits_base(struct regmap_field * field,unsigned int id,unsigned int mask,unsigned int val,bool * change,bool async,bool force)1896e126edecSKuninori Morimoto static inline int regmap_fields_update_bits_base(struct regmap_field *field,
1897e126edecSKuninori Morimoto unsigned int id,
1898e126edecSKuninori Morimoto unsigned int mask, unsigned int val,
1899e126edecSKuninori Morimoto bool *change, bool async, bool force)
1900915f441bSMark Brown {
1901915f441bSMark Brown WARN_ONCE(1, "regmap API is disabled");
1902915f441bSMark Brown return -EINVAL;
1903915f441bSMark Brown }
1904915f441bSMark Brown
regmap_update_bits(struct regmap * map,unsigned int reg,unsigned int mask,unsigned int val)19054b9e7edbSBartosz Golaszewski static inline int regmap_update_bits(struct regmap *map, unsigned int reg,
19064b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
19074b9e7edbSBartosz Golaszewski {
19084b9e7edbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
19094b9e7edbSBartosz Golaszewski return -EINVAL;
19104b9e7edbSBartosz Golaszewski }
19114b9e7edbSBartosz Golaszewski
regmap_update_bits_async(struct regmap * map,unsigned int reg,unsigned int mask,unsigned int val)19124b9e7edbSBartosz Golaszewski static inline int regmap_update_bits_async(struct regmap *map, unsigned int reg,
19134b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
19144b9e7edbSBartosz Golaszewski {
19154b9e7edbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
19164b9e7edbSBartosz Golaszewski return -EINVAL;
19174b9e7edbSBartosz Golaszewski }
19184b9e7edbSBartosz Golaszewski
regmap_update_bits_check(struct regmap * map,unsigned int reg,unsigned int mask,unsigned int val,bool * change)19194b9e7edbSBartosz Golaszewski static inline int regmap_update_bits_check(struct regmap *map, unsigned int reg,
19204b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val,
19214b9e7edbSBartosz Golaszewski bool *change)
19224b9e7edbSBartosz Golaszewski {
19234b9e7edbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
19244b9e7edbSBartosz Golaszewski return -EINVAL;
19254b9e7edbSBartosz Golaszewski }
19264b9e7edbSBartosz Golaszewski
19274b9e7edbSBartosz Golaszewski static inline int
regmap_update_bits_check_async(struct regmap * map,unsigned int reg,unsigned int mask,unsigned int val,bool * change)19284b9e7edbSBartosz Golaszewski regmap_update_bits_check_async(struct regmap *map, unsigned int reg,
19294b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val,
19304b9e7edbSBartosz Golaszewski bool *change)
19314b9e7edbSBartosz Golaszewski {
19324b9e7edbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
19334b9e7edbSBartosz Golaszewski return -EINVAL;
19344b9e7edbSBartosz Golaszewski }
19354b9e7edbSBartosz Golaszewski
regmap_write_bits(struct regmap * map,unsigned int reg,unsigned int mask,unsigned int val)19364b9e7edbSBartosz Golaszewski static inline int regmap_write_bits(struct regmap *map, unsigned int reg,
19374b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
19384b9e7edbSBartosz Golaszewski {
19394b9e7edbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
19404b9e7edbSBartosz Golaszewski return -EINVAL;
19414b9e7edbSBartosz Golaszewski }
19424b9e7edbSBartosz Golaszewski
regmap_field_write(struct regmap_field * field,unsigned int val)19434b9e7edbSBartosz Golaszewski static inline int regmap_field_write(struct regmap_field *field,
19444b9e7edbSBartosz Golaszewski unsigned int val)
19454b9e7edbSBartosz Golaszewski {
19464b9e7edbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
19474b9e7edbSBartosz Golaszewski return -EINVAL;
19484b9e7edbSBartosz Golaszewski }
19494b9e7edbSBartosz Golaszewski
regmap_field_force_write(struct regmap_field * field,unsigned int val)19504b9e7edbSBartosz Golaszewski static inline int regmap_field_force_write(struct regmap_field *field,
19514b9e7edbSBartosz Golaszewski unsigned int val)
19524b9e7edbSBartosz Golaszewski {
19534b9e7edbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
19544b9e7edbSBartosz Golaszewski return -EINVAL;
19554b9e7edbSBartosz Golaszewski }
19564b9e7edbSBartosz Golaszewski
regmap_field_update_bits(struct regmap_field * field,unsigned int mask,unsigned int val)19574b9e7edbSBartosz Golaszewski static inline int regmap_field_update_bits(struct regmap_field *field,
19584b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
19594b9e7edbSBartosz Golaszewski {
19604b9e7edbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
19614b9e7edbSBartosz Golaszewski return -EINVAL;
19624b9e7edbSBartosz Golaszewski }
19634b9e7edbSBartosz Golaszewski
19644b9e7edbSBartosz Golaszewski static inline int
regmap_field_force_update_bits(struct regmap_field * field,unsigned int mask,unsigned int val)19654b9e7edbSBartosz Golaszewski regmap_field_force_update_bits(struct regmap_field *field,
19664b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
19674b9e7edbSBartosz Golaszewski {
19684b9e7edbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
19694b9e7edbSBartosz Golaszewski return -EINVAL;
19704b9e7edbSBartosz Golaszewski }
19714b9e7edbSBartosz Golaszewski
regmap_field_set_bits(struct regmap_field * field,unsigned int bits)1972f67be8b7SLi Chen static inline int regmap_field_set_bits(struct regmap_field *field,
1973f67be8b7SLi Chen unsigned int bits)
1974f67be8b7SLi Chen {
1975f67be8b7SLi Chen WARN_ONCE(1, "regmap API is disabled");
1976f67be8b7SLi Chen return -EINVAL;
1977f67be8b7SLi Chen }
1978f67be8b7SLi Chen
regmap_field_clear_bits(struct regmap_field * field,unsigned int bits)1979f67be8b7SLi Chen static inline int regmap_field_clear_bits(struct regmap_field *field,
1980f67be8b7SLi Chen unsigned int bits)
1981f67be8b7SLi Chen {
1982f67be8b7SLi Chen WARN_ONCE(1, "regmap API is disabled");
1983f67be8b7SLi Chen return -EINVAL;
1984f67be8b7SLi Chen }
1985f67be8b7SLi Chen
regmap_field_test_bits(struct regmap_field * field,unsigned int bits)1986f67be8b7SLi Chen static inline int regmap_field_test_bits(struct regmap_field *field,
1987f67be8b7SLi Chen unsigned int bits)
1988f67be8b7SLi Chen {
1989f67be8b7SLi Chen WARN_ONCE(1, "regmap API is disabled");
1990f67be8b7SLi Chen return -EINVAL;
1991f67be8b7SLi Chen }
1992f67be8b7SLi Chen
regmap_fields_write(struct regmap_field * field,unsigned int id,unsigned int val)19934b9e7edbSBartosz Golaszewski static inline int regmap_fields_write(struct regmap_field *field,
19944b9e7edbSBartosz Golaszewski unsigned int id, unsigned int val)
19954b9e7edbSBartosz Golaszewski {
19964b9e7edbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
19974b9e7edbSBartosz Golaszewski return -EINVAL;
19984b9e7edbSBartosz Golaszewski }
19994b9e7edbSBartosz Golaszewski
regmap_fields_force_write(struct regmap_field * field,unsigned int id,unsigned int val)20004b9e7edbSBartosz Golaszewski static inline int regmap_fields_force_write(struct regmap_field *field,
20014b9e7edbSBartosz Golaszewski unsigned int id, unsigned int val)
20024b9e7edbSBartosz Golaszewski {
20034b9e7edbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
20044b9e7edbSBartosz Golaszewski return -EINVAL;
20054b9e7edbSBartosz Golaszewski }
20064b9e7edbSBartosz Golaszewski
20074b9e7edbSBartosz Golaszewski static inline int
regmap_fields_update_bits(struct regmap_field * field,unsigned int id,unsigned int mask,unsigned int val)20084b9e7edbSBartosz Golaszewski regmap_fields_update_bits(struct regmap_field *field, unsigned int id,
20094b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
20104b9e7edbSBartosz Golaszewski {
20114b9e7edbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
20124b9e7edbSBartosz Golaszewski return -EINVAL;
20134b9e7edbSBartosz Golaszewski }
20144b9e7edbSBartosz Golaszewski
20154b9e7edbSBartosz Golaszewski static inline int
regmap_fields_force_update_bits(struct regmap_field * field,unsigned int id,unsigned int mask,unsigned int val)20164b9e7edbSBartosz Golaszewski regmap_fields_force_update_bits(struct regmap_field *field, unsigned int id,
20174b9e7edbSBartosz Golaszewski unsigned int mask, unsigned int val)
20184b9e7edbSBartosz Golaszewski {
20194b9e7edbSBartosz Golaszewski WARN_ONCE(1, "regmap API is disabled");
20204b9e7edbSBartosz Golaszewski return -EINVAL;
20214b9e7edbSBartosz Golaszewski }
20224b9e7edbSBartosz Golaszewski
regmap_get_val_bytes(struct regmap * map)20239cde5fcdSMark Brown static inline int regmap_get_val_bytes(struct regmap *map)
20249cde5fcdSMark Brown {
20259cde5fcdSMark Brown WARN_ONCE(1, "regmap API is disabled");
20269cde5fcdSMark Brown return -EINVAL;
20279cde5fcdSMark Brown }
20289cde5fcdSMark Brown
regmap_get_max_register(struct regmap * map)2029668abc72SSrinivas Kandagatla static inline int regmap_get_max_register(struct regmap *map)
2030668abc72SSrinivas Kandagatla {
2031668abc72SSrinivas Kandagatla WARN_ONCE(1, "regmap API is disabled");
2032668abc72SSrinivas Kandagatla return -EINVAL;
2033668abc72SSrinivas Kandagatla }
2034668abc72SSrinivas Kandagatla
regmap_get_reg_stride(struct regmap * map)2035a2f776cbSSrinivas Kandagatla static inline int regmap_get_reg_stride(struct regmap *map)
2036a2f776cbSSrinivas Kandagatla {
2037a2f776cbSSrinivas Kandagatla WARN_ONCE(1, "regmap API is disabled");
2038a2f776cbSSrinivas Kandagatla return -EINVAL;
2039a2f776cbSSrinivas Kandagatla }
2040a2f776cbSSrinivas Kandagatla
regmap_might_sleep(struct regmap * map)2041a6d99022SMichael Walle static inline bool regmap_might_sleep(struct regmap *map)
2042a6d99022SMichael Walle {
2043a6d99022SMichael Walle WARN_ONCE(1, "regmap API is disabled");
2044a6d99022SMichael Walle return true;
2045a6d99022SMichael Walle }
2046a6d99022SMichael Walle
regcache_sort_defaults(struct reg_default * defaults,unsigned int ndefaults)2047*fd80df35SCharles Keepax static inline void regcache_sort_defaults(struct reg_default *defaults,
2048*fd80df35SCharles Keepax unsigned int ndefaults)
2049*fd80df35SCharles Keepax {
2050*fd80df35SCharles Keepax WARN_ONCE(1, "regmap API is disabled");
2051*fd80df35SCharles Keepax }
2052*fd80df35SCharles Keepax
regcache_sync(struct regmap * map)20539cde5fcdSMark Brown static inline int regcache_sync(struct regmap *map)
20549cde5fcdSMark Brown {
20559cde5fcdSMark Brown WARN_ONCE(1, "regmap API is disabled");
20569cde5fcdSMark Brown return -EINVAL;
20579cde5fcdSMark Brown }
20589cde5fcdSMark Brown
regcache_sync_region(struct regmap * map,unsigned int min,unsigned int max)2059a313f9f5SMark Brown static inline int regcache_sync_region(struct regmap *map, unsigned int min,
2060a313f9f5SMark Brown unsigned int max)
2061a313f9f5SMark Brown {
2062a313f9f5SMark Brown WARN_ONCE(1, "regmap API is disabled");
2063a313f9f5SMark Brown return -EINVAL;
2064a313f9f5SMark Brown }
2065a313f9f5SMark Brown
regcache_drop_region(struct regmap * map,unsigned int min,unsigned int max)2066697e85bcSMark Brown static inline int regcache_drop_region(struct regmap *map, unsigned int min,
2067697e85bcSMark Brown unsigned int max)
2068697e85bcSMark Brown {
2069697e85bcSMark Brown WARN_ONCE(1, "regmap API is disabled");
2070697e85bcSMark Brown return -EINVAL;
2071697e85bcSMark Brown }
2072697e85bcSMark Brown
regcache_cache_only(struct regmap * map,bool enable)20739cde5fcdSMark Brown static inline void regcache_cache_only(struct regmap *map, bool enable)
20749cde5fcdSMark Brown {
20759cde5fcdSMark Brown WARN_ONCE(1, "regmap API is disabled");
20769cde5fcdSMark Brown }
20779cde5fcdSMark Brown
regcache_cache_bypass(struct regmap * map,bool enable)20789cde5fcdSMark Brown static inline void regcache_cache_bypass(struct regmap *map, bool enable)
20799cde5fcdSMark Brown {
20809cde5fcdSMark Brown WARN_ONCE(1, "regmap API is disabled");
20819cde5fcdSMark Brown }
20829cde5fcdSMark Brown
regcache_mark_dirty(struct regmap * map)20839cde5fcdSMark Brown static inline void regcache_mark_dirty(struct regmap *map)
20849cde5fcdSMark Brown {
20859cde5fcdSMark Brown WARN_ONCE(1, "regmap API is disabled");
20869cde5fcdSMark Brown }
20879cde5fcdSMark Brown
regmap_async_complete(struct regmap * map)20880d509f2bSMark Brown static inline void regmap_async_complete(struct regmap *map)
20890d509f2bSMark Brown {
20900d509f2bSMark Brown WARN_ONCE(1, "regmap API is disabled");
20910d509f2bSMark Brown }
20920d509f2bSMark Brown
regmap_register_patch(struct regmap * map,const struct reg_sequence * regs,int num_regs)20939cde5fcdSMark Brown static inline int regmap_register_patch(struct regmap *map,
2094a6baa3deSDaniel Wagner const struct reg_sequence *regs,
20959cde5fcdSMark Brown int num_regs)
20969cde5fcdSMark Brown {
20979cde5fcdSMark Brown WARN_ONCE(1, "regmap API is disabled");
20989cde5fcdSMark Brown return -EINVAL;
20999cde5fcdSMark Brown }
21009cde5fcdSMark Brown
regmap_parse_val(struct regmap * map,const void * buf,unsigned int * val)210113ff50c8SNenghua Cao static inline int regmap_parse_val(struct regmap *map, const void *buf,
210213ff50c8SNenghua Cao unsigned int *val)
210313ff50c8SNenghua Cao {
210413ff50c8SNenghua Cao WARN_ONCE(1, "regmap API is disabled");
210513ff50c8SNenghua Cao return -EINVAL;
210613ff50c8SNenghua Cao }
210713ff50c8SNenghua Cao
dev_get_regmap(struct device * dev,const char * name)210872b39f6fSMark Brown static inline struct regmap *dev_get_regmap(struct device *dev,
210972b39f6fSMark Brown const char *name)
211072b39f6fSMark Brown {
211172b39f6fSMark Brown return NULL;
211272b39f6fSMark Brown }
211372b39f6fSMark Brown
regmap_get_device(struct regmap * map)21148d7d3972STuomas Tynkkynen static inline struct device *regmap_get_device(struct regmap *map)
21158d7d3972STuomas Tynkkynen {
21168d7d3972STuomas Tynkkynen WARN_ONCE(1, "regmap API is disabled");
21171d33dc6bSMark Brown return NULL;
21188d7d3972STuomas Tynkkynen }
21198d7d3972STuomas Tynkkynen
21209cde5fcdSMark Brown #endif
21219cde5fcdSMark Brown
2122b83a313bSMark Brown #endif
2123