diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2017-04-07 11:57:08 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2017-04-11 08:33:48 +0200 |
commit | c5d95eb4c72a2639c10d01a801df00b4c34db315 (patch) | |
tree | 5b8c0afce59f832d2f102e4114feb3c16ffd98a0 /include | |
parent | c0511abbd1fa99ee8eff80d5bf207ff5f349cf8a (diff) | |
download | barebox-c5d95eb4c72a2639c10d01a801df00b4c34db315.tar.gz barebox-c5d95eb4c72a2639c10d01a801df00b4c34db315.tar.xz |
param: make parameter functions more consistent
This patch creates a consitent set of device parameter functions.
With this we have: dev_add_param_<type><access>
"type" is one of: int32, uint32, int64, uint64, string, mac, ipv4, enum, bitmask
The improvement here is that we now can exactly specify the width of the
int type parameters and also correctly distinguish between signed and
unsigned variables which means that a variable no longer ends up with
INT_MAX when it's assigned -1.
"access" can be empty for regular read/write parameter, "_ro" for readonly
parameters which get their value from a variable pointer in the
background or "_fixed" for parameters which are set to a fixed value
(without a pointer in the background).
Some more exotic types are not (yet) implemented, like
dev_add_param_ip_ro.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'include')
-rw-r--r-- | include/param.h | 169 |
1 files changed, 132 insertions, 37 deletions
diff --git a/include/param.h b/include/param.h index 2eb040fea4..be4cca7b68 100644 --- a/include/param.h +++ b/include/param.h @@ -52,15 +52,10 @@ struct param_d *dev_add_param_string(struct device_d *dev, const char *name, int (*get)(struct param_d *p, void *priv), char **value, void *priv); -struct param_d *dev_add_param_int(struct device_d *dev, const char *name, +struct param_d *__dev_add_param_int(struct device_d *dev, const char *name, int (*set)(struct param_d *p, void *priv), int (*get)(struct param_d *p, void *priv), - int *value, const char *format, void *priv); - -struct param_d *dev_add_param_bool(struct device_d *dev, const char *name, - int (*set)(struct param_d *p, void *priv), - int (*get)(struct param_d *p, void *priv), - int *value, void *priv); + void *value, enum param_type type, const char *format, void *priv); struct param_d *dev_add_param_enum(struct device_d *dev, const char *name, int (*set)(struct param_d *p, void *priv), @@ -72,12 +67,6 @@ struct param_d *dev_add_param_bitmask(struct device_d *dev, const char *name, int (*get)(struct param_d *p, void *priv), unsigned long *value, const char * const *names, int max, void *priv); -struct param_d *dev_add_param_int_ro(struct device_d *dev, const char *name, - int value, const char *format); - -struct param_d *dev_add_param_llint_ro(struct device_d *dev, const char *name, - long long value, const char *format); - struct param_d *dev_add_param_ip(struct device_d *dev, const char *name, int (*set)(struct param_d *p, void *priv), int (*get)(struct param_d *p, void *priv), @@ -88,7 +77,7 @@ struct param_d *dev_add_param_mac(struct device_d *dev, const char *name, int (*get)(struct param_d *p, void *priv), u8 *mac, void *priv); -int dev_add_param_fixed(struct device_d *dev, const char *name, const char *value); +struct param_d *dev_add_param_fixed(struct device_d *dev, const char *name, const char *value); void dev_remove_param(struct param_d *p); @@ -129,10 +118,10 @@ static inline struct param_d *dev_add_param_string(struct device_d *dev, const c return ERR_PTR(-ENOSYS); } -static inline struct param_d *dev_add_param_int(struct device_d *dev, const char *name, +static inline struct param_d *__dev_add_param_int(struct device_d *dev, const char *name, int (*set)(struct param_d *p, void *priv), int (*get)(struct param_d *p, void *priv), - int *value, const char *format, void *priv) + void *value, enum param_type type, const char *format, void *priv) { return ERR_PTR(-ENOSYS); } @@ -154,56 +143,162 @@ static inline struct param_d *dev_add_param_bitmask(struct device_d *dev, const return ERR_PTR(-ENOSYS); } -static inline struct param_d *dev_add_param_bool(struct device_d *dev, const char *name, +static inline struct param_d *dev_add_param_ip(struct device_d *dev, const char *name, int (*set)(struct param_d *p, void *priv), int (*get)(struct param_d *p, void *priv), - int *value, void *priv) + IPaddr_t *ip, void *priv) { return ERR_PTR(-ENOSYS); } -static inline struct param_d *dev_add_param_int_ro(struct device_d *dev, const char *name, - int value, const char *format) +static inline struct param_d *dev_add_param_mac(struct device_d *dev, const char *name, + int (*set)(struct param_d *p, void *priv), + int (*get)(struct param_d *p, void *priv), + u8 *mac, void *priv) { return ERR_PTR(-ENOSYS); } -static inline struct param_d *dev_add_param_llint_ro(struct device_d *dev, const char *name, - long long value, const char *format) +static inline struct param_d *dev_add_param_fixed(struct device_d *dev, const char *name, + const char *value) { return ERR_PTR(-ENOSYS); } -static inline struct param_d *dev_add_param_ip(struct device_d *dev, const char *name, +static inline void dev_remove_param(struct param_d *p) {} + +static inline void dev_remove_parameters(struct device_d *dev) {} + +static inline int dev_param_set_generic(struct device_d *dev, struct param_d *p, + const char *val) +{ + return 0; +} +#endif + +int param_set_readonly(struct param_d *p, void *priv); + +/* + * dev_add_param_int + * dev_add_param_int32 + * dev_add_param_uint32 + * dev_add_param_int64 + * dev_add_param_uint64 + */ +#define DECLARE_PARAM_INT(intname, inttype, paramtype) \ + static inline struct param_d *dev_add_param_##intname(struct device_d *dev, const char *name, \ + int (*set)(struct param_d *p, void *priv), \ + int (*get)(struct param_d *p, void *priv), \ + inttype *value, const char *format, void *priv) \ + { \ + return __dev_add_param_int(dev, name, set, get, value, paramtype, format, priv); \ + } + +DECLARE_PARAM_INT(int, int, PARAM_TYPE_INT32) +DECLARE_PARAM_INT(int32, int32_t, PARAM_TYPE_INT32) +DECLARE_PARAM_INT(uint32, uint32_t, PARAM_TYPE_UINT32) +DECLARE_PARAM_INT(int64, int64_t, PARAM_TYPE_INT64) +DECLARE_PARAM_INT(uint64, uint64_t, PARAM_TYPE_UINT64) + +/* + * dev_add_param_int_fixed + * dev_add_param_int32_fixed + * dev_add_param_uint32_fixed + * dev_add_param_int64_fixed + * dev_add_param_uint64_fixed + */ +#define DECLARE_PARAM_INT_FIXED(intname, inttype, paramtype) \ + static inline struct param_d *dev_add_param_##intname##_fixed(struct device_d *dev, const char *name, \ + inttype value, const char *format) \ + { \ + return __dev_add_param_int(dev, name, ERR_PTR(-EROFS), NULL, &value, paramtype, format, NULL); \ + } + +DECLARE_PARAM_INT_FIXED(int, int, PARAM_TYPE_INT32) +DECLARE_PARAM_INT_FIXED(int32, int32_t, PARAM_TYPE_INT32) +DECLARE_PARAM_INT_FIXED(uint32, uint32_t, PARAM_TYPE_UINT32) +DECLARE_PARAM_INT_FIXED(int64, int64_t, PARAM_TYPE_INT64) +DECLARE_PARAM_INT_FIXED(uint64, uint64_t, PARAM_TYPE_UINT64) + +/* + * dev_add_param_int_ro + * dev_add_param_int32_ro + * dev_add_param_uint32_ro + * dev_add_param_int64_ro + * dev_add_param_uint64_ro + */ +#define DECLARE_PARAM_INT_RO(intname, inttype, paramtype) \ + static inline struct param_d *dev_add_param_##intname##_ro(struct device_d *dev, const char *name, \ + inttype *value, const char *format) \ + { \ + return __dev_add_param_int(dev, name, param_set_readonly, NULL, value, paramtype, format, NULL); \ + } + +DECLARE_PARAM_INT_RO(int, int, PARAM_TYPE_INT32) +DECLARE_PARAM_INT_RO(int32, int32_t, PARAM_TYPE_INT32) +DECLARE_PARAM_INT_RO(uint32, uint32_t, PARAM_TYPE_UINT32) +DECLARE_PARAM_INT_RO(int64, int64_t, PARAM_TYPE_INT64) +DECLARE_PARAM_INT_RO(uint64, uint64_t, PARAM_TYPE_UINT64) + +static inline struct param_d *dev_add_param_bool(struct device_d *dev, const char *name, int (*set)(struct param_d *p, void *priv), int (*get)(struct param_d *p, void *priv), - IPaddr_t *ip, void *priv) + uint32_t *value, void *priv) { - return ERR_PTR(-ENOSYS); + return __dev_add_param_int(dev, name, set, get, value, PARAM_TYPE_BOOL, "%u", priv); } -static inline struct param_d *dev_add_param_mac(struct device_d *dev, const char *name, +static inline struct param_d *dev_add_param_bool_fixed(struct device_d *dev, const char *name, + uint32_t value) +{ + return __dev_add_param_int(dev, name, ERR_PTR(-EROFS), NULL, &value, PARAM_TYPE_BOOL, + "%u", NULL); +} + +static inline struct param_d *dev_add_param_bool_ro(struct device_d *dev, const char *name, + uint32_t *value) +{ + return __dev_add_param_int(dev, name, param_set_readonly, NULL, value, PARAM_TYPE_BOOL, + "%u", NULL); +} + +static inline struct param_d *dev_add_param_string_ro(struct device_d *dev, const char *name, int (*set)(struct param_d *p, void *priv), int (*get)(struct param_d *p, void *priv), - u8 *mac, void *priv) + char **value, void *priv) { - return ERR_PTR(-ENOSYS); + return dev_add_param_string(dev, name, param_set_readonly, NULL, value, NULL); } -static inline int dev_add_param_fixed(struct device_d *dev, const char *name, const char *value) +static inline struct param_d *dev_add_param_string_fixed(struct device_d *dev, const char *name, + char *value) { - return 0; + return dev_add_param_fixed(dev, name, value); } -static inline void dev_remove_param(struct param_d *p) {} - -static inline void dev_remove_parameters(struct device_d *dev) {} +static inline struct param_d *dev_add_param_enum_ro(struct device_d *dev, const char *name, + int *value, const char * const *names, int max) +{ + return dev_add_param_enum(dev, name, param_set_readonly, NULL, + value, names, max, NULL); +} -static inline int dev_param_set_generic(struct device_d *dev, struct param_d *p, - const char *val) +static inline struct param_d *dev_add_param_bitmask_ro(struct device_d *dev, const char *name, + int (*set)(struct param_d *p, void *priv), + int (*get)(struct param_d *p, void *priv), + unsigned long *value, const char * const *names, int max, void *priv) { - return 0; + return dev_add_param_bitmask(dev, name, param_set_readonly, NULL, + value, names, max, NULL); } -#endif +/* + * unimplemented: + * dev_add_param_enum_fixed + * dev_add_param_bitmask_fixed + * dev_add_param_ip_ro + * dev_add_param_ip_fixed + * dev_add_param_mac_ro + * dev_add_param_mac_fixed + */ #endif /* PARAM_H */ |