xref: /linux-6.15/include/linux/nvmem-consumer.h (revision 33cf42e6)
1b1c1db98SBartosz Golaszewski /* SPDX-License-Identifier: GPL-2.0 */
2eace75cfSSrinivas Kandagatla /*
3eace75cfSSrinivas Kandagatla  * nvmem framework consumer.
4eace75cfSSrinivas Kandagatla  *
5eace75cfSSrinivas Kandagatla  * Copyright (C) 2015 Srinivas Kandagatla <[email protected]>
6eace75cfSSrinivas Kandagatla  * Copyright (C) 2013 Maxime Ripard <[email protected]>
7eace75cfSSrinivas Kandagatla  */
8eace75cfSSrinivas Kandagatla 
9eace75cfSSrinivas Kandagatla #ifndef _LINUX_NVMEM_CONSUMER_H
10eace75cfSSrinivas Kandagatla #define _LINUX_NVMEM_CONSUMER_H
11eace75cfSSrinivas Kandagatla 
124da69f49SSrinivas Kandagatla #include <linux/err.h>
134da69f49SSrinivas Kandagatla #include <linux/errno.h>
14bee1138bSBartosz Golaszewski #include <linux/notifier.h>
154da69f49SSrinivas Kandagatla 
1669aba794SSrinivas Kandagatla struct device;
1769aba794SSrinivas Kandagatla struct device_node;
1869aba794SSrinivas Kandagatla /* consumer cookie */
1969aba794SSrinivas Kandagatla struct nvmem_cell;
20e2a5402eSSrinivas Kandagatla struct nvmem_device;
21fbd03d27SMichael Walle struct nvmem_cell_info;
22eace75cfSSrinivas Kandagatla 
23506157beSBartosz Golaszewski /**
24506157beSBartosz Golaszewski  * struct nvmem_cell_lookup - cell lookup entry
25506157beSBartosz Golaszewski  *
26506157beSBartosz Golaszewski  * @nvmem_name:	Name of the provider.
27506157beSBartosz Golaszewski  * @cell_name:	Name of the nvmem cell as defined in the name field of
28506157beSBartosz Golaszewski  *		struct nvmem_cell_info.
29506157beSBartosz Golaszewski  * @dev_id:	Name of the consumer device that will be associated with
30506157beSBartosz Golaszewski  *		this cell.
31506157beSBartosz Golaszewski  * @con_id:	Connector id for this cell lookup.
32506157beSBartosz Golaszewski  */
33506157beSBartosz Golaszewski struct nvmem_cell_lookup {
34506157beSBartosz Golaszewski 	const char		*nvmem_name;
35506157beSBartosz Golaszewski 	const char		*cell_name;
36506157beSBartosz Golaszewski 	const char		*dev_id;
37506157beSBartosz Golaszewski 	const char		*con_id;
38506157beSBartosz Golaszewski 	struct list_head	node;
39506157beSBartosz Golaszewski };
40506157beSBartosz Golaszewski 
41bee1138bSBartosz Golaszewski enum {
42bee1138bSBartosz Golaszewski 	NVMEM_ADD = 1,
43bee1138bSBartosz Golaszewski 	NVMEM_REMOVE,
44bee1138bSBartosz Golaszewski 	NVMEM_CELL_ADD,
45bee1138bSBartosz Golaszewski 	NVMEM_CELL_REMOVE,
46eb176cb4SMiquel Raynal 	NVMEM_LAYOUT_ADD,
47eb176cb4SMiquel Raynal 	NVMEM_LAYOUT_REMOVE,
48bee1138bSBartosz Golaszewski };
49bee1138bSBartosz Golaszewski 
5069aba794SSrinivas Kandagatla #if IS_ENABLED(CONFIG_NVMEM)
5169aba794SSrinivas Kandagatla 
5269aba794SSrinivas Kandagatla /* Cell based interface */
53165589f0SBartosz Golaszewski struct nvmem_cell *nvmem_cell_get(struct device *dev, const char *id);
54165589f0SBartosz Golaszewski struct nvmem_cell *devm_nvmem_cell_get(struct device *dev, const char *id);
5569aba794SSrinivas Kandagatla void nvmem_cell_put(struct nvmem_cell *cell);
5669aba794SSrinivas Kandagatla void devm_nvmem_cell_put(struct device *dev, struct nvmem_cell *cell);
5769aba794SSrinivas Kandagatla void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len);
5869aba794SSrinivas Kandagatla int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len);
595037d368SAndreas Färber int nvmem_cell_read_u8(struct device *dev, const char *cell_id, u8 *val);
600a9b2d1cSFabrice Gasnier int nvmem_cell_read_u16(struct device *dev, const char *cell_id, u16 *val);
61d026d70aSLeonard Crestez int nvmem_cell_read_u32(struct device *dev, const char *cell_id, u32 *val);
628b977c54SYangtao Li int nvmem_cell_read_u64(struct device *dev, const char *cell_id, u64 *val);
63a28e824fSDouglas Anderson int nvmem_cell_read_variable_le_u32(struct device *dev, const char *cell_id,
64a28e824fSDouglas Anderson 				    u32 *val);
65a28e824fSDouglas Anderson int nvmem_cell_read_variable_le_u64(struct device *dev, const char *cell_id,
66a28e824fSDouglas Anderson 				    u64 *val);
6769aba794SSrinivas Kandagatla 
68e2a5402eSSrinivas Kandagatla /* direct nvmem device read/write interface */
69e2a5402eSSrinivas Kandagatla struct nvmem_device *nvmem_device_get(struct device *dev, const char *name);
70e2a5402eSSrinivas Kandagatla struct nvmem_device *devm_nvmem_device_get(struct device *dev,
71e2a5402eSSrinivas Kandagatla 					   const char *name);
72e2a5402eSSrinivas Kandagatla void nvmem_device_put(struct nvmem_device *nvmem);
73e2a5402eSSrinivas Kandagatla void devm_nvmem_device_put(struct device *dev, struct nvmem_device *nvmem);
74e2a5402eSSrinivas Kandagatla int nvmem_device_read(struct nvmem_device *nvmem, unsigned int offset,
75e2a5402eSSrinivas Kandagatla 		      size_t bytes, void *buf);
76e2a5402eSSrinivas Kandagatla int nvmem_device_write(struct nvmem_device *nvmem, unsigned int offset,
77e2a5402eSSrinivas Kandagatla 		       size_t bytes, void *buf);
78e2a5402eSSrinivas Kandagatla ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem,
79e2a5402eSSrinivas Kandagatla 			   struct nvmem_cell_info *info, void *buf);
80e2a5402eSSrinivas Kandagatla int nvmem_device_cell_write(struct nvmem_device *nvmem,
81e2a5402eSSrinivas Kandagatla 			    struct nvmem_cell_info *info, void *buf);
82e2a5402eSSrinivas Kandagatla 
83d7b9fd16SBartosz Golaszewski const char *nvmem_dev_name(struct nvmem_device *nvmem);
84*33cf42e6SRafał Miłecki size_t nvmem_dev_size(struct nvmem_device *nvmem);
85d7b9fd16SBartosz Golaszewski 
86506157beSBartosz Golaszewski void nvmem_add_cell_lookups(struct nvmem_cell_lookup *entries,
87506157beSBartosz Golaszewski 			    size_t nentries);
88506157beSBartosz Golaszewski void nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries,
89506157beSBartosz Golaszewski 			    size_t nentries);
90506157beSBartosz Golaszewski 
91bee1138bSBartosz Golaszewski int nvmem_register_notifier(struct notifier_block *nb);
92bee1138bSBartosz Golaszewski int nvmem_unregister_notifier(struct notifier_block *nb);
93bee1138bSBartosz Golaszewski 
948c2a2b8cSThomas Bogendoerfer struct nvmem_device *nvmem_device_find(void *data,
958c2a2b8cSThomas Bogendoerfer 			int (*match)(struct device *dev, const void *data));
968c2a2b8cSThomas Bogendoerfer 
9769aba794SSrinivas Kandagatla #else
9869aba794SSrinivas Kandagatla 
nvmem_cell_get(struct device * dev,const char * id)9969aba794SSrinivas Kandagatla static inline struct nvmem_cell *nvmem_cell_get(struct device *dev,
100165589f0SBartosz Golaszewski 						const char *id)
10169aba794SSrinivas Kandagatla {
10220167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
10369aba794SSrinivas Kandagatla }
10469aba794SSrinivas Kandagatla 
devm_nvmem_cell_get(struct device * dev,const char * id)10569aba794SSrinivas Kandagatla static inline struct nvmem_cell *devm_nvmem_cell_get(struct device *dev,
106165589f0SBartosz Golaszewski 						     const char *id)
10769aba794SSrinivas Kandagatla {
10820167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
10969aba794SSrinivas Kandagatla }
11069aba794SSrinivas Kandagatla 
devm_nvmem_cell_put(struct device * dev,struct nvmem_cell * cell)11169aba794SSrinivas Kandagatla static inline void devm_nvmem_cell_put(struct device *dev,
11269aba794SSrinivas Kandagatla 				       struct nvmem_cell *cell)
11369aba794SSrinivas Kandagatla {
11469aba794SSrinivas Kandagatla 
11569aba794SSrinivas Kandagatla }
nvmem_cell_put(struct nvmem_cell * cell)11669aba794SSrinivas Kandagatla static inline void nvmem_cell_put(struct nvmem_cell *cell)
11769aba794SSrinivas Kandagatla {
11869aba794SSrinivas Kandagatla }
11969aba794SSrinivas Kandagatla 
nvmem_cell_read(struct nvmem_cell * cell,size_t * len)120a6c50912SGuenter Roeck static inline void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len)
12169aba794SSrinivas Kandagatla {
12220167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
12369aba794SSrinivas Kandagatla }
12469aba794SSrinivas Kandagatla 
nvmem_cell_write(struct nvmem_cell * cell,void * buf,size_t len)12569aba794SSrinivas Kandagatla static inline int nvmem_cell_write(struct nvmem_cell *cell,
1269b8303fcSSebastian Reichel 				   void *buf, size_t len)
12769aba794SSrinivas Kandagatla {
12820167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
12969aba794SSrinivas Kandagatla }
130e2a5402eSSrinivas Kandagatla 
nvmem_cell_read_u8(struct device * dev,const char * cell_id,u8 * val)13154e1f99dSKomal Bajaj static inline int nvmem_cell_read_u8(struct device *dev,
13254e1f99dSKomal Bajaj 				     const char *cell_id, u8 *val)
13354e1f99dSKomal Bajaj {
13454e1f99dSKomal Bajaj 	return -EOPNOTSUPP;
13554e1f99dSKomal Bajaj }
13654e1f99dSKomal Bajaj 
nvmem_cell_read_u16(struct device * dev,const char * cell_id,u16 * val)1370a9b2d1cSFabrice Gasnier static inline int nvmem_cell_read_u16(struct device *dev,
1380a9b2d1cSFabrice Gasnier 				      const char *cell_id, u16 *val)
1390a9b2d1cSFabrice Gasnier {
1400a9b2d1cSFabrice Gasnier 	return -EOPNOTSUPP;
1410a9b2d1cSFabrice Gasnier }
1420a9b2d1cSFabrice Gasnier 
nvmem_cell_read_u32(struct device * dev,const char * cell_id,u32 * val)143d026d70aSLeonard Crestez static inline int nvmem_cell_read_u32(struct device *dev,
144d026d70aSLeonard Crestez 				      const char *cell_id, u32 *val)
145d026d70aSLeonard Crestez {
14620167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
147d026d70aSLeonard Crestez }
148d026d70aSLeonard Crestez 
nvmem_cell_read_u64(struct device * dev,const char * cell_id,u64 * val)1498b977c54SYangtao Li static inline int nvmem_cell_read_u64(struct device *dev,
1508b977c54SYangtao Li 				      const char *cell_id, u64 *val)
1518b977c54SYangtao Li {
1528b977c54SYangtao Li 	return -EOPNOTSUPP;
1538b977c54SYangtao Li }
1548b977c54SYangtao Li 
nvmem_cell_read_variable_le_u32(struct device * dev,const char * cell_id,u32 * val)1557a8aa39dSDouglas Anderson static inline int nvmem_cell_read_variable_le_u32(struct device *dev,
1567a8aa39dSDouglas Anderson 						 const char *cell_id,
1577a8aa39dSDouglas Anderson 						 u32 *val)
1587a8aa39dSDouglas Anderson {
1597a8aa39dSDouglas Anderson 	return -EOPNOTSUPP;
1607a8aa39dSDouglas Anderson }
1617a8aa39dSDouglas Anderson 
nvmem_cell_read_variable_le_u64(struct device * dev,const char * cell_id,u64 * val)1627a8aa39dSDouglas Anderson static inline int nvmem_cell_read_variable_le_u64(struct device *dev,
1637a8aa39dSDouglas Anderson 						  const char *cell_id,
1647a8aa39dSDouglas Anderson 						  u64 *val)
1657a8aa39dSDouglas Anderson {
1667a8aa39dSDouglas Anderson 	return -EOPNOTSUPP;
1677a8aa39dSDouglas Anderson }
1687a8aa39dSDouglas Anderson 
nvmem_device_get(struct device * dev,const char * name)169e2a5402eSSrinivas Kandagatla static inline struct nvmem_device *nvmem_device_get(struct device *dev,
170e2a5402eSSrinivas Kandagatla 						    const char *name)
171e2a5402eSSrinivas Kandagatla {
17220167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
173e2a5402eSSrinivas Kandagatla }
174e2a5402eSSrinivas Kandagatla 
devm_nvmem_device_get(struct device * dev,const char * name)175e2a5402eSSrinivas Kandagatla static inline struct nvmem_device *devm_nvmem_device_get(struct device *dev,
176e2a5402eSSrinivas Kandagatla 							 const char *name)
177e2a5402eSSrinivas Kandagatla {
17820167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
179e2a5402eSSrinivas Kandagatla }
180e2a5402eSSrinivas Kandagatla 
nvmem_device_put(struct nvmem_device * nvmem)181e2a5402eSSrinivas Kandagatla static inline void nvmem_device_put(struct nvmem_device *nvmem)
182e2a5402eSSrinivas Kandagatla {
183e2a5402eSSrinivas Kandagatla }
184e2a5402eSSrinivas Kandagatla 
devm_nvmem_device_put(struct device * dev,struct nvmem_device * nvmem)185e2a5402eSSrinivas Kandagatla static inline void devm_nvmem_device_put(struct device *dev,
186e2a5402eSSrinivas Kandagatla 					 struct nvmem_device *nvmem)
187e2a5402eSSrinivas Kandagatla {
188e2a5402eSSrinivas Kandagatla }
189e2a5402eSSrinivas Kandagatla 
nvmem_device_cell_read(struct nvmem_device * nvmem,struct nvmem_cell_info * info,void * buf)190e2a5402eSSrinivas Kandagatla static inline ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem,
191e2a5402eSSrinivas Kandagatla 					 struct nvmem_cell_info *info,
192e2a5402eSSrinivas Kandagatla 					 void *buf)
193e2a5402eSSrinivas Kandagatla {
19420167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
195e2a5402eSSrinivas Kandagatla }
196e2a5402eSSrinivas Kandagatla 
nvmem_device_cell_write(struct nvmem_device * nvmem,struct nvmem_cell_info * info,void * buf)197e2a5402eSSrinivas Kandagatla static inline int nvmem_device_cell_write(struct nvmem_device *nvmem,
198e2a5402eSSrinivas Kandagatla 					  struct nvmem_cell_info *info,
199e2a5402eSSrinivas Kandagatla 					  void *buf)
200e2a5402eSSrinivas Kandagatla {
20120167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
202e2a5402eSSrinivas Kandagatla }
203e2a5402eSSrinivas Kandagatla 
nvmem_device_read(struct nvmem_device * nvmem,unsigned int offset,size_t bytes,void * buf)204e2a5402eSSrinivas Kandagatla static inline int nvmem_device_read(struct nvmem_device *nvmem,
205e2a5402eSSrinivas Kandagatla 				    unsigned int offset, size_t bytes,
206e2a5402eSSrinivas Kandagatla 				    void *buf)
207e2a5402eSSrinivas Kandagatla {
20820167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
209e2a5402eSSrinivas Kandagatla }
210e2a5402eSSrinivas Kandagatla 
nvmem_device_write(struct nvmem_device * nvmem,unsigned int offset,size_t bytes,void * buf)211e2a5402eSSrinivas Kandagatla static inline int nvmem_device_write(struct nvmem_device *nvmem,
212e2a5402eSSrinivas Kandagatla 				     unsigned int offset, size_t bytes,
213e2a5402eSSrinivas Kandagatla 				     void *buf)
214e2a5402eSSrinivas Kandagatla {
21520167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
216e2a5402eSSrinivas Kandagatla }
217d7b9fd16SBartosz Golaszewski 
nvmem_dev_name(struct nvmem_device * nvmem)218d7b9fd16SBartosz Golaszewski static inline const char *nvmem_dev_name(struct nvmem_device *nvmem)
219d7b9fd16SBartosz Golaszewski {
220d7b9fd16SBartosz Golaszewski 	return NULL;
221d7b9fd16SBartosz Golaszewski }
222d7b9fd16SBartosz Golaszewski 
223506157beSBartosz Golaszewski static inline void
nvmem_add_cell_lookups(struct nvmem_cell_lookup * entries,size_t nentries)224506157beSBartosz Golaszewski nvmem_add_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries) {}
225506157beSBartosz Golaszewski static inline void
nvmem_del_cell_lookups(struct nvmem_cell_lookup * entries,size_t nentries)226506157beSBartosz Golaszewski nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries) {}
227506157beSBartosz Golaszewski 
nvmem_register_notifier(struct notifier_block * nb)228bee1138bSBartosz Golaszewski static inline int nvmem_register_notifier(struct notifier_block *nb)
229bee1138bSBartosz Golaszewski {
23020167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
231bee1138bSBartosz Golaszewski }
232bee1138bSBartosz Golaszewski 
nvmem_unregister_notifier(struct notifier_block * nb)233bee1138bSBartosz Golaszewski static inline int nvmem_unregister_notifier(struct notifier_block *nb)
234bee1138bSBartosz Golaszewski {
23520167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
236bee1138bSBartosz Golaszewski }
237bee1138bSBartosz Golaszewski 
nvmem_device_find(void * data,int (* match)(struct device * dev,const void * data))2388c2a2b8cSThomas Bogendoerfer static inline struct nvmem_device *nvmem_device_find(void *data,
2398c2a2b8cSThomas Bogendoerfer 			int (*match)(struct device *dev, const void *data))
2408c2a2b8cSThomas Bogendoerfer {
2418c2a2b8cSThomas Bogendoerfer 	return NULL;
2428c2a2b8cSThomas Bogendoerfer }
2438c2a2b8cSThomas Bogendoerfer 
24469aba794SSrinivas Kandagatla #endif /* CONFIG_NVMEM */
24569aba794SSrinivas Kandagatla 
24669aba794SSrinivas Kandagatla #if IS_ENABLED(CONFIG_NVMEM) && IS_ENABLED(CONFIG_OF)
24769aba794SSrinivas Kandagatla struct nvmem_cell *of_nvmem_cell_get(struct device_node *np,
248165589f0SBartosz Golaszewski 				     const char *id);
249e2a5402eSSrinivas Kandagatla struct nvmem_device *of_nvmem_device_get(struct device_node *np,
250e2a5402eSSrinivas Kandagatla 					 const char *name);
25169aba794SSrinivas Kandagatla #else
of_nvmem_cell_get(struct device_node * np,const char * id)25269aba794SSrinivas Kandagatla static inline struct nvmem_cell *of_nvmem_cell_get(struct device_node *np,
253165589f0SBartosz Golaszewski 						   const char *id)
25469aba794SSrinivas Kandagatla {
25520167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
25669aba794SSrinivas Kandagatla }
257e2a5402eSSrinivas Kandagatla 
of_nvmem_device_get(struct device_node * np,const char * name)258e2a5402eSSrinivas Kandagatla static inline struct nvmem_device *of_nvmem_device_get(struct device_node *np,
259e2a5402eSSrinivas Kandagatla 						       const char *name)
260e2a5402eSSrinivas Kandagatla {
26120167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
262e2a5402eSSrinivas Kandagatla }
26369aba794SSrinivas Kandagatla #endif /* CONFIG_NVMEM && CONFIG_OF */
26469aba794SSrinivas Kandagatla 
265eace75cfSSrinivas Kandagatla #endif  /* ifndef _LINUX_NVMEM_CONSUMER_H */
266