Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ebb57d94 authored by Nandha Kishore Easwaran's avatar Nandha Kishore Easwaran Committed by Madan Koyyalamudi
Browse files

qcacmn: Add extra parameters to gpio command

Add extra parameters to gpio wmi command since they
are required for smart antenna config.

Change-Id: I3b363c7b508862ded8aacffb9e0a39328e8b2b94
parent 57a0c15f
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -57,12 +57,16 @@ tgt_set_gpio_output_req(struct wlan_objmgr_psoc *psoc,
 * @input: enable/disable the gpio pin
 * @pull_type: gpio pull type
 * @intr_mode: gpio interrupt mode
 * @mux_config_val: gpio MUX value
 * @drive: gpio drive
 * @init_enable: gpio init_enable
 *
 * Return: status of operation
 */
QDF_STATUS tgt_gpio_config(struct wlan_objmgr_psoc *psoc, uint32_t gpio_num,
			   uint32_t input, uint32_t pull_type,
			   uint32_t intr_mode);
			   uint32_t intr_mode,  uint32_t mux_config_val,
			   uint32_t drive, uint32_t init_enable);
/**
 * tgt_if_gpio_output() - API to send gpio output request
 * @psoc: pointer to psoc object
+5 −1
Original line number Diff line number Diff line
@@ -59,7 +59,8 @@ QDF_STATUS tgt_set_gpio_output_req(struct wlan_objmgr_psoc *psoc,

QDF_STATUS tgt_gpio_config(struct wlan_objmgr_psoc *psoc, uint32_t gpio_num,
			   uint32_t input, uint32_t pull_type,
			   uint32_t intr_mode)
			   uint32_t intr_mode,  uint32_t mux_config_val,
			   uint32_t drive, uint32_t init_enable)
{
	struct gpio_config_params param;

@@ -73,6 +74,9 @@ QDF_STATUS tgt_gpio_config(struct wlan_objmgr_psoc *psoc, uint32_t gpio_num,
	param.pin_num = gpio_num;
	param.pin_dir = input;
	param.pin_intr_mode = intr_mode;
	param.mux_config_val = mux_config_val;
	param.drive = drive;
	param.init_enable = init_enable;

	return tgt_set_gpio_config_req(psoc, &param);
}
+102 −12
Original line number Diff line number Diff line
@@ -48,6 +48,15 @@ wlan_cfg80211_gpio_config_policy[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_MAX + 1] = {
	[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_DIR] = {
						.type = NLA_U32,
						.len = sizeof(uint32_t) },
	[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_MUX_CONFIG] = {
						.type = NLA_U32,
						.len = sizeof(uint32_t) },
	[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_DRIVE] = {
						.type = NLA_U32,
						.len = sizeof(uint32_t) },
	[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_INTERNAL_CONFIG] = {
						.type = NLA_U32,
						.len = sizeof(uint32_t) },
};

/**
@@ -146,6 +155,58 @@ convert_vendor_gpio_output_value(enum qca_gpio_value value)
	}
}

/**
 * convert_vendor_gpio_drive() - Function to convert vendor
 * gpio drive
 * @drive: value of enum gpio_drive
 *
 * Convert the vendor gpio drive to wmi unified gpio output drive
 *
 * Return: wmi unified gpio output drive config
 */
static enum gpio_drive
convert_vendor_gpio_drive(enum qca_gpio_drive drive)
{
	switch (drive) {
	case QCA_WLAN_GPIO_DRIVE_2MA:
		return WMI_HOST_GPIO_DRIVE_2MA;
	case QCA_WLAN_GPIO_DRIVE_4MA:
		return WMI_HOST_GPIO_DRIVE_4MA;
	case QCA_WLAN_GPIO_DRIVE_6MA:
		return WMI_HOST_GPIO_DRIVE_6MA;
	case QCA_WLAN_GPIO_DRIVE_8MA:
		return WMI_HOST_GPIO_DRIVE_8MA;
	case QCA_WLAN_GPIO_DRIVE_10MA:
		return WMI_HOST_GPIO_DRIVE_10MA;
	case QCA_WLAN_GPIO_DRIVE_12MA:
		return WMI_HOST_GPIO_DRIVE_12MA;
	case QCA_WLAN_GPIO_DRIVE_14MA:
		return WMI_HOST_GPIO_DRIVE_14MA;
	case QCA_WLAN_GPIO_DRIVE_16MA:
		return WMI_HOST_GPIO_DRIVE_16MA;
	default:
		return WMI_HOST_GPIO_DRIVE_2MA;
	}
}

/**
 * convert_vendor_gpio_init_enable() - Function to convert vendor
 * gpio init_enable
 * @internal_config: Param to decide whether to use internal config
 *
 * Convert the vendor internal_config to wmi unified gpio output init_enable
 *
 * Return: wmi unified gpio output init_enable config
 */
static enum gpio_init_enable
convert_vendor_gpio_init_enable(uint32_t internal_config)
{
	if(internal_config)
		return WMI_HOST_GPIO_INIT_DISABLE;
	else
		return WMI_HOST_GPIO_INIT_ENABLE;
}

/**
 * wlan_set_gpio_config() - set the gpio configuration info
 * @psoc: the pointer of wlan_objmgr_psoc
@@ -162,51 +223,80 @@ wlan_set_gpio_config(struct wlan_objmgr_psoc *psoc,
	enum qca_gpio_direction pin_dir;
	enum qca_gpio_pull_type pull_type;
	enum qca_gpio_interrupt_mode intr_mode;
	enum qca_gpio_drive drive;
	uint32_t internal_config;
	QDF_STATUS status;

	gpio_attr = attr[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_PINNUM];
	if (!gpio_attr) {
		osif_err("attr gpio number failed");
		osif_err_rl("attr gpio number failed");
		return -EINVAL;
	}
	cfg_param.pin_num = nla_get_u32(gpio_attr);

	gpio_attr = attr[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_DIR];
	if (!gpio_attr) {
		osif_err("attr gpio dir failed");
		osif_err_rl("attr gpio dir failed");
		return -EINVAL;
	}
	pin_dir = nla_get_u32(gpio_attr);
	if (pin_dir >= QCA_WLAN_GPIO_DIR_MAX) {
		osif_err("attr gpio direction invalid");
		osif_err_rl("attr gpio direction invalid");
		return -EINVAL;
	}
	cfg_param.pin_dir = convert_vendor_gpio_direction(pin_dir);

	gpio_attr = attr[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_PULL_TYPE];
	if (!gpio_attr) {
		osif_err("attr gpio pull failed");
		osif_err_rl("attr gpio pull failed");
		return -EINVAL;
	}
	pull_type = nla_get_u32(gpio_attr);
	if (pull_type >= QCA_WLAN_GPIO_PULL_MAX) {
		osif_err("attr gpio pull type invalid");
		osif_err_rl("attr gpio pull type invalid");
		return -EINVAL;
	}
	cfg_param.pin_pull_type = convert_vendor_gpio_pull_type(pull_type);

	gpio_attr = attr[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_INTR_MODE];
	if (!gpio_attr) {
		osif_err("attr gpio interrupt mode failed");
		osif_err_rl("attr gpio interrupt mode failed");
		return -EINVAL;
	}
	intr_mode = nla_get_u32(gpio_attr);
	if (intr_mode >= QCA_WLAN_GPIO_INTMODE_MAX) {
		osif_err("attr gpio interrupt mode invalid");
		osif_err_rl("attr gpio interrupt mode invalid");
		return -EINVAL;
	}
	cfg_param.pin_intr_mode = convert_vendor_gpio_interrupt_mode(intr_mode);

	/* Below are optional parameters. Initialize to zero */
	cfg_param.mux_config_val = WMI_HOST_GPIO_MUX_DEFAULT;
	cfg_param.drive = WMI_HOST_GPIO_DRIVE_2MA;
	cfg_param.init_enable = WMI_HOST_GPIO_INIT_DISABLE;

	gpio_attr = attr[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_MUX_CONFIG];
	if (gpio_attr) {
		cfg_param.mux_config_val = nla_get_u32(gpio_attr);
	}

	gpio_attr = attr[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_DRIVE];
	if (gpio_attr) {
		drive = nla_get_u32(gpio_attr);
		if (drive >= QCA_WLAN_GPIO_DRIVE_MAX) {
			osif_err_rl("attr gpio drive invalid");
			return -EINVAL;
		}
		cfg_param.drive = convert_vendor_gpio_drive(drive);
	}

	gpio_attr = attr[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_INTERNAL_CONFIG];
	if (gpio_attr) {
		internal_config = nla_get_u32(gpio_attr);
		cfg_param.init_enable =
			convert_vendor_gpio_init_enable(internal_config);
	}

	status = ucfg_set_gpio_config(psoc, &cfg_param);
	return status;
}
@@ -229,19 +319,19 @@ wlan_set_gpio_output(struct wlan_objmgr_psoc *psoc,

	gpio_attr = attr[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_PINNUM];
	if (!gpio_attr) {
		osif_err("attr gpio number failed");
		osif_err_rl("attr gpio number failed");
		return -EINVAL;
	}
	out_param.pin_num = nla_get_u32(gpio_attr);

	gpio_attr = attr[QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_VALUE];
	if (!gpio_attr) {
		osif_err("attr gpio value failed");
		osif_err_rl("attr gpio value failed");
		return -EINVAL;
	}
	pin_set = nla_get_u32(gpio_attr);
	if (pin_set >= QCA_WLAN_GPIO_LEVEL_MAX) {
		osif_err("attr gpio level invalid");
		osif_err_rl("attr gpio level invalid");
		return -EINVAL;
	}
	out_param.pin_set = convert_vendor_gpio_output_value(pin_set);
@@ -287,11 +377,11 @@ wlan_cfg80211_start_gpio_config(struct wiphy *wiphy,
		} else if (command == QCA_WLAN_VENDOR_GPIO_OUTPUT) {
			ret = wlan_set_gpio_output(psoc, attr);
		} else {
			osif_err("Invalid command");
			osif_err_rl("Invalid command");
			return -EINVAL;
		}
	} else {
		osif_err("Invalid command");
		osif_err_rl("Invalid command");
		return -EINVAL;
	}

+2 −0
Original line number Diff line number Diff line
@@ -46,6 +46,8 @@
	QDF_TRACE_DEBUG(QDF_MODULE_ID_OS_IF, params)
#define osif_rl_debug(params...) \
	QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_OS_IF, params)
#define osif_err_rl(params...) \
	QDF_TRACE_ERROR_RL(QDF_MODULE_ID_OS_IF, params)

#define osif_nofl_alert(params...) \
	QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_OS_IF, params)
+49 −0
Original line number Diff line number Diff line
@@ -3573,6 +3573,52 @@ enum gpio_value {
	WMI_HOST_GPIO_LEVEL_MAX,
};

/**
 * enum gpio_init_enable - GPIO init enable
 * @WMI_HOST_GPIO_INIT_DISABLE: Disable INIT
 * @WMI_HOST_GPIO_INIT_ENABLE: Enable INIT
 * @WMI_HOST_GPIO_INIT_MAX: invalid gpio init_enable
 */
enum gpio_init_enable {
	WMI_HOST_GPIO_INIT_DISABLE = 0,
	WMI_HOST_GPIO_INIT_ENABLE = 1,
	WMI_HOST_GPIO_INIT_MAX,
};

/**
 * enum gpio_drive - GPIO drive
 * @WMI_HOST_GPIO_DRIVE_2MA: drive 2MA
 * @WMI_HOST_GPIO_DRIVE_4MA: drive 4MA
 * @WMI_HOST_GPIO_DRIVE_6MA: drive 6MA
 * @WMI_HOST_GPIO_DRIVE_8MA: drive 8MA
 * @WMI_HOST_GPIO_DRIVE_10MA: drive 10MA
 * @WMI_HOST_GPIO_DRIVE_12MA: drive 12MA
 * @WMI_HOST_GPIO_DRIVE_14MA: drive 14MA
 * @WMI_HOST_GPIO_DRIVE_16MA: drive 16MA
 * @WMI_HOST_GPIO_DRIVE_MAX: invalid gpio drive
 */
enum gpio_drive {
	WMI_HOST_GPIO_DRIVE_2MA = 0,
	WMI_HOST_GPIO_DRIVE_4MA = 1,
	WMI_HOST_GPIO_DRIVE_6MA = 2,
	WMI_HOST_GPIO_DRIVE_8MA = 3,
	WMI_HOST_GPIO_DRIVE_10MA = 4,
	WMI_HOST_GPIO_DRIVE_12MA = 5,
	WMI_HOST_GPIO_DRIVE_14MA = 6,
	WMI_HOST_GPIO_DRIVE_16MA = 7,
	WMI_HOST_GPIO_DRIVE_MAX,
};

/**
 * enum gpio_mux_config - GPIO mux_config
 * @WMI_HOST_GPIO_MUX_DEFAULT: Default mux value
 * @WMI_HOST_GPIO_MUX_MAX: maximum allowed gpio mux_config
 */
enum gpio_mux_config {
	WMI_HOST_GPIO_MUX_DEFAULT = 0,
	WMI_HOST_GPIO_MUX_MAX = 15,
};

/**
 * struct wmi_host_gpio_input_event - GPIO input event structure
 * @gpio_num: GPIO number which changed state
@@ -3593,6 +3639,9 @@ struct gpio_config_params {
	enum gpio_direction pin_dir;
	enum gpio_pull_type pin_pull_type;
	enum gpio_interrupt_mode pin_intr_mode;
	enum gpio_mux_config mux_config_val;
	enum gpio_drive drive;
	enum gpio_init_enable init_enable;
};

/**
Loading