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