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