1 /* SPDX-License-Identifier: GPL-2.0+ */
3 * Copyright (c) 2015 Google, Inc
4 * Written by Simon Glass <sjg@chromium.org>
11 * enum regmap_size_t - Access sizes for regmap reads and writes
13 * @REGMAP_SIZE_8: 8-bit read/write access size
14 * @REGMAP_SIZE_16: 16-bit read/write access size
15 * @REGMAP_SIZE_32: 32-bit read/write access size
16 * @REGMAP_SIZE_64: 64-bit read/write access size
26 * enum regmap_endianness_t - Endianness for regmap reads and writes
28 * @REGMAP_NATIVE_ENDIAN: Native endian read/write accesses
29 * @REGMAP_LITTLE_ENDIAN: Little endian read/write accesses
30 * @REGMAP_BIG_ENDIAN: Big endian read/write accesses
32 enum regmap_endianness_t {
39 * struct regmap_range - a register map range
41 * @start: Start address
42 * @size: Size in bytes
50 * struct regmap - a way of accessing hardware/bus registers
52 * @range_count: Number of ranges available within the map
53 * @ranges: Array of ranges
56 enum regmap_endianness_t endianness;
58 struct regmap_range ranges[0];
62 * Interface to provide access to registers either through a direct memory
63 * bus or through a peripheral bus like I2C, SPI.
67 * regmap_write() - Write a 32-bit value to a regmap
69 * @map: Regmap to write to
70 * @offset: Offset in the regmap to write to
71 * @val: Data to write to the regmap at the specified offset
73 * Note that this function will only write values of 32 bit width to the
74 * regmap; if the size of data to be read is different, the regmap_raw_write
75 * function can be used.
77 * Return: 0 if OK, -ve on error
79 int regmap_write(struct regmap *map, uint offset, uint val);
82 * regmap_read() - Read a 32-bit value from a regmap
84 * @map: Regmap to read from
85 * @offset: Offset in the regmap to read from
86 * @valp: Pointer to the buffer to receive the data read from the regmap
87 * at the specified offset
89 * Note that this function will only read values of 32 bit width from the
90 * regmap; if the size of data to be read is different, the regmap_raw_read
91 * function can be used.
93 * Return: 0 if OK, -ve on error
95 int regmap_read(struct regmap *map, uint offset, uint *valp);
98 * regmap_raw_write() - Write a value of specified length to a regmap
100 * @map: Regmap to write to
101 * @offset: Offset in the regmap to write to
102 * @val: Value to write to the regmap at the specified offset
103 * @val_len: Length of the data to be written to the regmap
105 * Note that this function will, as opposed to regmap_write, write data of
106 * arbitrary length to the regmap, and not just 32-bit values, and is thus a
107 * generalized version of regmap_write.
109 * Return: 0 if OK, -ve on error
111 int regmap_raw_write(struct regmap *map, uint offset, const void *val,
115 * regmap_raw_read() - Read a value of specified length from a regmap
117 * @map: Regmap to read from
118 * @offset: Offset in the regmap to read from
119 * @valp: Pointer to the buffer to receive the data read from the regmap
120 * at the specified offset
121 * @val_len: Length of the data to be read from the regmap
123 * Note that this function will, as opposed to regmap_read, read data of
124 * arbitrary length from the regmap, and not just 32-bit values, and is thus a
125 * generalized version of regmap_read.
127 * Return: 0 if OK, -ve on error
129 int regmap_raw_read(struct regmap *map, uint offset, void *valp,
133 * regmap_raw_write_range() - Write a value of specified length to a range of a
136 * @map: Regmap to write to
137 * @range_num: Number of the range in the regmap to write to
138 * @offset: Offset in the regmap to write to
139 * @val: Value to write to the regmap at the specified offset
140 * @val_len: Length of the data to be written to the regmap
142 * Return: 0 if OK, -ve on error
144 int regmap_raw_write_range(struct regmap *map, uint range_num, uint offset,
145 const void *val, size_t val_len);
148 * regmap_raw_read_range() - Read a value of specified length from a range of a
151 * @map: Regmap to read from
152 * @range_num: Number of the range in the regmap to write to
153 * @offset: Offset in the regmap to read from
154 * @valp: Pointer to the buffer to receive the data read from the regmap
155 * at the specified offset
156 * @val_len: Length of the data to be read from the regmap
158 * Return: 0 if OK, -ve on error
160 int regmap_raw_read_range(struct regmap *map, uint range_num, uint offset,
161 void *valp, size_t val_len);
164 * regmap_range_set() - Set a value in a regmap range described by a struct
165 * @map: Regmap in which a value should be set
166 * @range: Range of the regmap in which a value should be set
167 * @type: Structure type that describes the memory layout of the regmap range
168 * @member: Member of the describing structure that should be set in the regmap
170 * @val: Value which should be written to the regmap range
172 #define regmap_range_set(map, range, type, member, val) \
174 typeof(((type *)0)->member) __tmp = val; \
175 regmap_raw_write_range(map, range, offsetof(type, member), \
176 &__tmp, sizeof(((type *)0)->member)); \
180 * regmap_set() - Set a value in a regmap described by a struct
181 * @map: Regmap in which a value should be set
182 * @type: Structure type that describes the memory layout of the regmap
183 * @member: Member of the describing structure that should be set in the regmap
184 * @val: Value which should be written to the regmap
186 #define regmap_set(map, type, member, val) \
187 regmap_range_set(map, 0, type, member, val)
190 * regmap_range_get() - Get a value from a regmap range described by a struct
191 * @map: Regmap from which a value should be read
192 * @range: Range of the regmap from which a value should be read
193 * @type: Structure type that describes the memory layout of the regmap
195 * @member: Member of the describing structure that should be read in the
197 * @valp: Variable that receives the value read from the regmap range
199 #define regmap_range_get(map, range, type, member, valp) \
200 regmap_raw_read_range(map, range, offsetof(type, member), \
201 (void *)valp, sizeof(((type *)0)->member))
204 * regmap_get() - Get a value from a regmap described by a struct
205 * @map: Regmap from which a value should be read
206 * @type: Structure type that describes the memory layout of the regmap
208 * @member: Member of the describing structure that should be read in the
210 * @valp: Variable that receives the value read from the regmap
212 #define regmap_get(map, type, member, valp) \
213 regmap_range_get(map, 0, type, member, valp)
216 * regmap_update_bits() - Perform a read/modify/write using a mask
218 * @map: The map returned by regmap_init_mem*()
219 * @offset: Offset of the memory
220 * @mask: Mask to apply to the read value
221 * @val: Value to apply to the value to write
222 * Return: 0 if OK, -ve on error
224 int regmap_update_bits(struct regmap *map, uint offset, uint mask, uint val);
227 * regmap_init_mem() - Set up a new register map that uses memory access
229 * @node: Device node that uses this map
230 * @mapp: Returns allocated map
231 * Return: 0 if OK, -ve on error
233 * Use regmap_uninit() to free it.
235 int regmap_init_mem(ofnode node, struct regmap **mapp);
238 * regmap_init_mem_platdata() - Set up a new memory register map for
241 * @dev: Device that uses this map
242 * @reg: List of address, size pairs
243 * @count: Number of pairs (e.g. 1 if the regmap has a single entry)
244 * @mapp: Returns allocated map
245 * Return: 0 if OK, -ve on error
247 * This creates a new regmap with a list of regions passed in, rather than
248 * using the device tree. It only supports 32-bit machines.
250 * Use regmap_uninit() to free it.
253 int regmap_init_mem_platdata(struct udevice *dev, fdt_val_t *reg, int count,
254 struct regmap **mapp);
257 * regmap_get_range() - Obtain the base memory address of a regmap range
259 * @map: Regmap to query
260 * @range_num: Range to look up
261 * Return: Pointer to the range in question if OK, NULL on error
263 void *regmap_get_range(struct regmap *map, unsigned int range_num);
266 * regmap_uninit() - free a previously inited regmap
268 * @map: Regmap to free
269 * Return: 0 if OK, -ve on error
271 int regmap_uninit(struct regmap *map);