#ifndef _AVM_HW_CONFIG_H_ #define _AVM_HW_CONFIG_H_ #define AVM_HW_CONFIG_VERSION 1 #include #include enum _avm_hw_param { avm_hw_param_no_param = AVM_DEF_HW_PARAM_NO_PARAM, avm_hw_param_gpio_out_active_low = AVM_DEF_HW_PARAM_GPIO_OUT_ACTIVE_LOW, avm_hw_param_gpio_out_active_high = AVM_DEF_HW_PARAM_GPIO_OUT_ACTIVE_HIGH, avm_hw_param_gpio_in_active_low = AVM_DEF_HW_PARAM_GPIO_IN_ACTIVE_LOW, avm_hw_param_gpio_in_active_high = AVM_DEF_HW_PARAM_GPIO_IN_ACTIVE_HIGH, avm_hw_param_in_pinmux1 = AVM_DEF_HW_FUNCTION_PINMUX1_IN, avm_hw_param_in_pinmux2 = AVM_DEF_HW_FUNCTION_PINMUX2_IN, avm_hw_param_in_pinmux3 = AVM_DEF_HW_FUNCTION_PINMUX3_IN, avm_hw_param_out_pinmux1 = AVM_DEF_HW_FUNCTION_PINMUX1_OUT, avm_hw_param_out_pinmux2 = AVM_DEF_HW_FUNCTION_PINMUX2_OUT, avm_hw_param_out_pinmux3 = AVM_DEF_HW_FUNCTION_PINMUX3_OUT, avm_hw_param_gpio_out_rgb = AVM_DEF_HW_PARAM_GPIO_OUT_RGB, avm_hw_param_gpio_out_rgb_active_low = AVM_DEF_HW_PARAM_GPIO_OUT_RGB_ACTIVE_LOW, avm_hw_param_last_param }; enum _avm_gpio_preset_raw { AVM_HWCFG_GPIO_DONT_TOUCH, AVM_HWCFG_GPIO_RAW_HI, AVM_HWCFG_GPIO_RAW_LO }; struct _avm_hw_config { char *name; int value; enum _avm_hw_param param; enum _avm_gpio_preset_raw preset; #define SET_PINCTRL(ctrl, value) (BIT(31) | ((ctrl) << 8) | ((value) & 0xFF)) #define VALID_PINCTRL(ctrl) (!!((ctrl) & BIT(31))) #define GET_PINCTRL(ctrl) (((ctrl) >> 8) & 0xFF) #define GET_PINCTRLVAL(ctrl) ( (ctrl) & 0xFF) uint32_t pinctrl[5]; bool gpio_force_logical; }; struct _avm_hw_config_table { unsigned int hwrev; unsigned int hwsubrev; struct _avm_hw_config *table; }; struct avm_hwrev_info { unsigned int hwrev; unsigned int subrev; }; #if IS_ENABLED(CONFIG_AVM_HW_CONFIG) extern struct _avm_hw_config_table avm_hw_config_tables[]; extern struct _avm_hw_config *avm_current_hw_config; struct _avm_hw_config *avm_get_hw_config_table(void); /* Returns -ENOENT, if @name has not been found; * -EFAULT, if version != AVM_HW_CONFIG_VERSION; * 0, on success * * On error, p_value and p_param are invalid. */ extern int avm_get_hw_config(unsigned int version, const char *name, int *p_value, enum _avm_hw_param *p_param); /* * Returns (struct avm_hwrev_info) with values obtained by prom_getenv(), or a * zeroed structure. */ extern struct avm_hwrev_info avm_get_hwrev(void); /* * Find a gpio by name, and optionally the gpio flags */ extern int avm_gpio_find_by_name(const char *name, unsigned long *flags); #else static inline int avm_get_hw_config(unsigned int version, const char *name, int *p_value, enum _avm_hw_param *p_param) { return -ENOENT; } static inline struct avm_hwrev_info avm_get_hwrev(void) { return (struct avm_hwrev_info) {}; } static inline int avm_gpio_find_by_name(const char *name, unsigned long *flags) { return -ENOENT; } #endif #endif