xref: /linux-6.15/include/linux/nvmem-provider.h (revision d4ea45e8)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * nvmem framework provider.
4  *
5  * Copyright (C) 2015 Srinivas Kandagatla <[email protected]>
6  * Copyright (C) 2013 Maxime Ripard <[email protected]>
7  */
8 
9 #ifndef _LINUX_NVMEM_PROVIDER_H
10 #define _LINUX_NVMEM_PROVIDER_H
11 
12 #include <linux/err.h>
13 #include <linux/errno.h>
14 
15 struct nvmem_device;
16 struct nvmem_cell_info;
17 typedef int (*nvmem_reg_read_t)(void *priv, unsigned int offset,
18 				void *val, size_t bytes);
19 typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset,
20 				 void *val, size_t bytes);
21 
22 /**
23  * struct nvmem_config - NVMEM device configuration
24  *
25  * @dev:	Parent device.
26  * @name:	Optional name.
27  * @id:		Optional device ID used in full name. Ignored if name is NULL.
28  * @owner:	Pointer to exporter module. Used for refcounting.
29  * @cells:	Optional array of pre-defined NVMEM cells.
30  * @ncells:	Number of elements in cells.
31  * @read_only:	Device is read-only.
32  * @root_only:	Device is accessibly to root only.
33  * @reg_read:	Callback to read data.
34  * @reg_write:	Callback to write data.
35  * @size:	Device size.
36  * @word_size:	Minimum read/write access granularity.
37  * @stride:	Minimum read/write access stride.
38  * @priv:	User context passed to read/write callbacks.
39  *
40  * Note: A default "nvmem<id>" name will be assigned to the device if
41  * no name is specified in its configuration. In such case "<id>" is
42  * generated with ida_simple_get() and provided id field is ignored.
43  *
44  * Note: Specifying name and setting id to -1 implies a unique device
45  * whose name is provided as-is (kept unaltered).
46  */
47 struct nvmem_config {
48 	struct device		*dev;
49 	const char		*name;
50 	int			id;
51 	struct module		*owner;
52 	const struct nvmem_cell_info	*cells;
53 	int			ncells;
54 	bool			read_only;
55 	bool			root_only;
56 	nvmem_reg_read_t	reg_read;
57 	nvmem_reg_write_t	reg_write;
58 	int	size;
59 	int	word_size;
60 	int	stride;
61 	void	*priv;
62 	/* To be only used by old driver/misc/eeprom drivers */
63 	bool			compat;
64 	struct device		*base_dev;
65 };
66 
67 /**
68  * struct nvmem_cell_table - NVMEM cell definitions for given provider
69  *
70  * @nvmem_name:		Provider name.
71  * @cells:		Array of cell definitions.
72  * @ncells:		Number of cell definitions in the array.
73  * @node:		List node.
74  *
75  * This structure together with related helper functions is provided for users
76  * that don't can't access the nvmem provided structure but wish to register
77  * cell definitions for it e.g. board files registering an EEPROM device.
78  */
79 struct nvmem_cell_table {
80 	const char		*nvmem_name;
81 	const struct nvmem_cell_info	*cells;
82 	size_t			ncells;
83 	struct list_head	node;
84 };
85 
86 #if IS_ENABLED(CONFIG_NVMEM)
87 
88 struct nvmem_device *nvmem_register(const struct nvmem_config *cfg);
89 void nvmem_unregister(struct nvmem_device *nvmem);
90 
91 struct nvmem_device *devm_nvmem_register(struct device *dev,
92 					 const struct nvmem_config *cfg);
93 
94 int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem);
95 
96 void nvmem_add_cell_table(struct nvmem_cell_table *table);
97 void nvmem_del_cell_table(struct nvmem_cell_table *table);
98 
99 #else
100 
101 static inline struct nvmem_device *nvmem_register(const struct nvmem_config *c)
102 {
103 	return ERR_PTR(-EOPNOTSUPP);
104 }
105 
106 static inline void nvmem_unregister(struct nvmem_device *nvmem) {}
107 
108 static inline struct nvmem_device *
109 devm_nvmem_register(struct device *dev, const struct nvmem_config *c)
110 {
111 	return nvmem_register(c);
112 }
113 
114 static inline int
115 devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem)
116 {
117 	return -EOPNOTSUPP;
118 }
119 
120 static inline void nvmem_add_cell_table(struct nvmem_cell_table *table) {}
121 static inline void nvmem_del_cell_table(struct nvmem_cell_table *table) {}
122 
123 #endif /* CONFIG_NVMEM */
124 #endif  /* ifndef _LINUX_NVMEM_PROVIDER_H */
125