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