1b1c1db98SBartosz Golaszewski /* SPDX-License-Identifier: GPL-2.0 */
2eace75cfSSrinivas Kandagatla /*
3eace75cfSSrinivas Kandagatla  * nvmem framework consumer.
4eace75cfSSrinivas Kandagatla  *
5eace75cfSSrinivas Kandagatla  * Copyright (C) 2015 Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
6eace75cfSSrinivas Kandagatla  * Copyright (C) 2013 Maxime Ripard <maxime.ripard@free-electrons.com>
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,
46*eb176cb4SMiquel Raynal 	NVMEM_LAYOUT_ADD,
47*eb176cb4SMiquel 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);
84d7b9fd16SBartosz Golaszewski 
85506157beSBartosz Golaszewski void nvmem_add_cell_lookups(struct nvmem_cell_lookup *entries,
86506157beSBartosz Golaszewski 			    size_t nentries);
87506157beSBartosz Golaszewski void nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries,
88506157beSBartosz Golaszewski 			    size_t nentries);
89506157beSBartosz Golaszewski 
90bee1138bSBartosz Golaszewski int nvmem_register_notifier(struct notifier_block *nb);
91bee1138bSBartosz Golaszewski int nvmem_unregister_notifier(struct notifier_block *nb);
92bee1138bSBartosz Golaszewski 
938c2a2b8cSThomas Bogendoerfer struct nvmem_device *nvmem_device_find(void *data,
948c2a2b8cSThomas Bogendoerfer 			int (*match)(struct device *dev, const void *data));
958c2a2b8cSThomas Bogendoerfer 
9669aba794SSrinivas Kandagatla #else
9769aba794SSrinivas Kandagatla 
nvmem_cell_get(struct device * dev,const char * id)9869aba794SSrinivas Kandagatla static inline struct nvmem_cell *nvmem_cell_get(struct device *dev,
99165589f0SBartosz Golaszewski 						const char *id)
10069aba794SSrinivas Kandagatla {
10120167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
10269aba794SSrinivas Kandagatla }
10369aba794SSrinivas Kandagatla 
devm_nvmem_cell_get(struct device * dev,const char * id)10469aba794SSrinivas Kandagatla static inline struct nvmem_cell *devm_nvmem_cell_get(struct device *dev,
105165589f0SBartosz Golaszewski 						     const char *id)
10669aba794SSrinivas Kandagatla {
10720167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
10869aba794SSrinivas Kandagatla }
10969aba794SSrinivas Kandagatla 
devm_nvmem_cell_put(struct device * dev,struct nvmem_cell * cell)11069aba794SSrinivas Kandagatla static inline void devm_nvmem_cell_put(struct device *dev,
11169aba794SSrinivas Kandagatla 				       struct nvmem_cell *cell)
11269aba794SSrinivas Kandagatla {
11369aba794SSrinivas Kandagatla 
11469aba794SSrinivas Kandagatla }
nvmem_cell_put(struct nvmem_cell * cell)11569aba794SSrinivas Kandagatla static inline void nvmem_cell_put(struct nvmem_cell *cell)
11669aba794SSrinivas Kandagatla {
11769aba794SSrinivas Kandagatla }
11869aba794SSrinivas Kandagatla 
nvmem_cell_read(struct nvmem_cell * cell,size_t * len)119a6c50912SGuenter Roeck static inline void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len)
12069aba794SSrinivas Kandagatla {
12120167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
12269aba794SSrinivas Kandagatla }
12369aba794SSrinivas Kandagatla 
nvmem_cell_write(struct nvmem_cell * cell,void * buf,size_t len)12469aba794SSrinivas Kandagatla static inline int nvmem_cell_write(struct nvmem_cell *cell,
1259b8303fcSSebastian Reichel 				   void *buf, size_t len)
12669aba794SSrinivas Kandagatla {
12720167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
12869aba794SSrinivas Kandagatla }
129e2a5402eSSrinivas Kandagatla 
nvmem_cell_read_u16(struct device * dev,const char * cell_id,u16 * val)1300a9b2d1cSFabrice Gasnier static inline int nvmem_cell_read_u16(struct device *dev,
1310a9b2d1cSFabrice Gasnier 				      const char *cell_id, u16 *val)
1320a9b2d1cSFabrice Gasnier {
1330a9b2d1cSFabrice Gasnier 	return -EOPNOTSUPP;
1340a9b2d1cSFabrice Gasnier }
1350a9b2d1cSFabrice Gasnier 
nvmem_cell_read_u32(struct device * dev,const char * cell_id,u32 * val)136d026d70aSLeonard Crestez static inline int nvmem_cell_read_u32(struct device *dev,
137d026d70aSLeonard Crestez 				      const char *cell_id, u32 *val)
138d026d70aSLeonard Crestez {
13920167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
140d026d70aSLeonard Crestez }
141d026d70aSLeonard Crestez 
nvmem_cell_read_u64(struct device * dev,const char * cell_id,u64 * val)1428b977c54SYangtao Li static inline int nvmem_cell_read_u64(struct device *dev,
1438b977c54SYangtao Li 				      const char *cell_id, u64 *val)
1448b977c54SYangtao Li {
1458b977c54SYangtao Li 	return -EOPNOTSUPP;
1468b977c54SYangtao Li }
1478b977c54SYangtao Li 
nvmem_cell_read_variable_le_u32(struct device * dev,const char * cell_id,u32 * val)1487a8aa39dSDouglas Anderson static inline int nvmem_cell_read_variable_le_u32(struct device *dev,
1497a8aa39dSDouglas Anderson 						 const char *cell_id,
1507a8aa39dSDouglas Anderson 						 u32 *val)
1517a8aa39dSDouglas Anderson {
1527a8aa39dSDouglas Anderson 	return -EOPNOTSUPP;
1537a8aa39dSDouglas Anderson }
1547a8aa39dSDouglas Anderson 
nvmem_cell_read_variable_le_u64(struct device * dev,const char * cell_id,u64 * val)1557a8aa39dSDouglas Anderson static inline int nvmem_cell_read_variable_le_u64(struct device *dev,
1567a8aa39dSDouglas Anderson 						  const char *cell_id,
1577a8aa39dSDouglas Anderson 						  u64 *val)
1587a8aa39dSDouglas Anderson {
1597a8aa39dSDouglas Anderson 	return -EOPNOTSUPP;
1607a8aa39dSDouglas Anderson }
1617a8aa39dSDouglas Anderson 
nvmem_device_get(struct device * dev,const char * name)162e2a5402eSSrinivas Kandagatla static inline struct nvmem_device *nvmem_device_get(struct device *dev,
163e2a5402eSSrinivas Kandagatla 						    const char *name)
164e2a5402eSSrinivas Kandagatla {
16520167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
166e2a5402eSSrinivas Kandagatla }
167e2a5402eSSrinivas Kandagatla 
devm_nvmem_device_get(struct device * dev,const char * name)168e2a5402eSSrinivas Kandagatla static inline struct nvmem_device *devm_nvmem_device_get(struct device *dev,
169e2a5402eSSrinivas Kandagatla 							 const char *name)
170e2a5402eSSrinivas Kandagatla {
17120167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
172e2a5402eSSrinivas Kandagatla }
173e2a5402eSSrinivas Kandagatla 
nvmem_device_put(struct nvmem_device * nvmem)174e2a5402eSSrinivas Kandagatla static inline void nvmem_device_put(struct nvmem_device *nvmem)
175e2a5402eSSrinivas Kandagatla {
176e2a5402eSSrinivas Kandagatla }
177e2a5402eSSrinivas Kandagatla 
devm_nvmem_device_put(struct device * dev,struct nvmem_device * nvmem)178e2a5402eSSrinivas Kandagatla static inline void devm_nvmem_device_put(struct device *dev,
179e2a5402eSSrinivas Kandagatla 					 struct nvmem_device *nvmem)
180e2a5402eSSrinivas Kandagatla {
181e2a5402eSSrinivas Kandagatla }
182e2a5402eSSrinivas Kandagatla 
nvmem_device_cell_read(struct nvmem_device * nvmem,struct nvmem_cell_info * info,void * buf)183e2a5402eSSrinivas Kandagatla static inline ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem,
184e2a5402eSSrinivas Kandagatla 					 struct nvmem_cell_info *info,
185e2a5402eSSrinivas Kandagatla 					 void *buf)
186e2a5402eSSrinivas Kandagatla {
18720167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
188e2a5402eSSrinivas Kandagatla }
189e2a5402eSSrinivas Kandagatla 
nvmem_device_cell_write(struct nvmem_device * nvmem,struct nvmem_cell_info * info,void * buf)190e2a5402eSSrinivas Kandagatla static inline int nvmem_device_cell_write(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_read(struct nvmem_device * nvmem,unsigned int offset,size_t bytes,void * buf)197e2a5402eSSrinivas Kandagatla static inline int nvmem_device_read(struct nvmem_device *nvmem,
198e2a5402eSSrinivas Kandagatla 				    unsigned int offset, size_t bytes,
199e2a5402eSSrinivas Kandagatla 				    void *buf)
200e2a5402eSSrinivas Kandagatla {
20120167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
202e2a5402eSSrinivas Kandagatla }
203e2a5402eSSrinivas Kandagatla 
nvmem_device_write(struct nvmem_device * nvmem,unsigned int offset,size_t bytes,void * buf)204e2a5402eSSrinivas Kandagatla static inline int nvmem_device_write(struct nvmem_device *nvmem,
205e2a5402eSSrinivas Kandagatla 				     unsigned int offset, size_t bytes,
206e2a5402eSSrinivas Kandagatla 				     void *buf)
207e2a5402eSSrinivas Kandagatla {
20820167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
209e2a5402eSSrinivas Kandagatla }
210d7b9fd16SBartosz Golaszewski 
nvmem_dev_name(struct nvmem_device * nvmem)211d7b9fd16SBartosz Golaszewski static inline const char *nvmem_dev_name(struct nvmem_device *nvmem)
212d7b9fd16SBartosz Golaszewski {
213d7b9fd16SBartosz Golaszewski 	return NULL;
214d7b9fd16SBartosz Golaszewski }
215d7b9fd16SBartosz Golaszewski 
216506157beSBartosz Golaszewski static inline void
nvmem_add_cell_lookups(struct nvmem_cell_lookup * entries,size_t nentries)217506157beSBartosz Golaszewski nvmem_add_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries) {}
218506157beSBartosz Golaszewski static inline void
nvmem_del_cell_lookups(struct nvmem_cell_lookup * entries,size_t nentries)219506157beSBartosz Golaszewski nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries) {}
220506157beSBartosz Golaszewski 
nvmem_register_notifier(struct notifier_block * nb)221bee1138bSBartosz Golaszewski static inline int nvmem_register_notifier(struct notifier_block *nb)
222bee1138bSBartosz Golaszewski {
22320167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
224bee1138bSBartosz Golaszewski }
225bee1138bSBartosz Golaszewski 
nvmem_unregister_notifier(struct notifier_block * nb)226bee1138bSBartosz Golaszewski static inline int nvmem_unregister_notifier(struct notifier_block *nb)
227bee1138bSBartosz Golaszewski {
22820167b70SBartosz Golaszewski 	return -EOPNOTSUPP;
229bee1138bSBartosz Golaszewski }
230bee1138bSBartosz Golaszewski 
nvmem_device_find(void * data,int (* match)(struct device * dev,const void * data))2318c2a2b8cSThomas Bogendoerfer static inline struct nvmem_device *nvmem_device_find(void *data,
2328c2a2b8cSThomas Bogendoerfer 			int (*match)(struct device *dev, const void *data))
2338c2a2b8cSThomas Bogendoerfer {
2348c2a2b8cSThomas Bogendoerfer 	return NULL;
2358c2a2b8cSThomas Bogendoerfer }
2368c2a2b8cSThomas Bogendoerfer 
23769aba794SSrinivas Kandagatla #endif /* CONFIG_NVMEM */
23869aba794SSrinivas Kandagatla 
23969aba794SSrinivas Kandagatla #if IS_ENABLED(CONFIG_NVMEM) && IS_ENABLED(CONFIG_OF)
24069aba794SSrinivas Kandagatla struct nvmem_cell *of_nvmem_cell_get(struct device_node *np,
241165589f0SBartosz Golaszewski 				     const char *id);
242e2a5402eSSrinivas Kandagatla struct nvmem_device *of_nvmem_device_get(struct device_node *np,
243e2a5402eSSrinivas Kandagatla 					 const char *name);
244266570f4SMichael Walle struct device_node *of_nvmem_layout_get_container(struct nvmem_device *nvmem);
24569aba794SSrinivas Kandagatla #else
of_nvmem_cell_get(struct device_node * np,const char * id)24669aba794SSrinivas Kandagatla static inline struct nvmem_cell *of_nvmem_cell_get(struct device_node *np,
247165589f0SBartosz Golaszewski 						   const char *id)
24869aba794SSrinivas Kandagatla {
24920167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
25069aba794SSrinivas Kandagatla }
251e2a5402eSSrinivas Kandagatla 
of_nvmem_device_get(struct device_node * np,const char * name)252e2a5402eSSrinivas Kandagatla static inline struct nvmem_device *of_nvmem_device_get(struct device_node *np,
253e2a5402eSSrinivas Kandagatla 						       const char *name)
254e2a5402eSSrinivas Kandagatla {
25520167b70SBartosz Golaszewski 	return ERR_PTR(-EOPNOTSUPP);
256e2a5402eSSrinivas Kandagatla }
257266570f4SMichael Walle 
258266570f4SMichael Walle static inline struct device_node *
of_nvmem_layout_get_container(struct nvmem_device * nvmem)259266570f4SMichael Walle of_nvmem_layout_get_container(struct nvmem_device *nvmem)
260266570f4SMichael Walle {
26181e1d9a3SMiquel Raynal 	return NULL;
262266570f4SMichael Walle }
26369aba794SSrinivas Kandagatla #endif /* CONFIG_NVMEM && CONFIG_OF */
26469aba794SSrinivas Kandagatla 
265eace75cfSSrinivas Kandagatla #endif  /* ifndef _LINUX_NVMEM_CONSUMER_H */
266