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

Commit c39ed80b authored by Laxminath Kasam's avatar Laxminath Kasam
Browse files

asoc: cdc-pinctrl: Update to disable MPM wakeup for multiple gpios



Under same pinctrl node, there are multiple gpios that
require MPM wakeup to be disabled. Update driver logic
to support disable of multiple gpios under same node.

Change-Id: I3a07e5d7621da4cd03b46d96ca5cec18958f1ebd
Signed-off-by: default avatarLaxminath Kasam <lkasam@codeaurora.org>
parent 018a0615
Loading
Loading
Loading
Loading
+27 −8
Original line number Diff line number Diff line
@@ -14,13 +14,16 @@
#include <linux/pinctrl/qcom-pinctrl.h>
#include <asoc/msm-cdc-pinctrl.h>

#define MAX_GPIOS 16

struct msm_cdc_pinctrl_info {
	struct pinctrl *pinctrl;
	struct pinctrl_state *pinctrl_active;
	struct pinctrl_state *pinctrl_sleep;
	int gpio;
	bool state;
	u32 tlmm_gpio;
	u32 tlmm_gpio[MAX_GPIOS];
	u32 count;
	bool wakeup_capable;
};

@@ -151,14 +154,21 @@ int msm_cdc_pinctrl_set_wakeup_capable(struct device_node *np, bool enable)
{
	struct msm_cdc_pinctrl_info *gpio_data;
	int ret = 0;
	u32 i = 0;

	gpio_data = msm_cdc_pinctrl_get_gpiodata(np);
	if (!gpio_data)
		return -EINVAL;

	if (gpio_data->wakeup_capable)
		ret = msm_gpio_mpm_wake_set(gpio_data->tlmm_gpio, enable);

	if (gpio_data->wakeup_capable) {
		for (i = 0; i < gpio_data->count; i++) {
			ret = msm_gpio_mpm_wake_set(gpio_data->tlmm_gpio[i],
						    enable);
			if (ret < 0)
				goto exit;
		}
	}
exit:
	return ret;
}
EXPORT_SYMBOL(msm_cdc_pinctrl_set_wakeup_capable);
@@ -167,7 +177,9 @@ static int msm_cdc_pinctrl_probe(struct platform_device *pdev)
{
	int ret = 0;
	struct msm_cdc_pinctrl_info *gpio_data;
	u32 tlmm_gpio = 0;
	u32 tlmm_gpio[MAX_GPIOS] = {0};
	u32 i = 0;
	int count = 0;

	gpio_data = devm_kzalloc(&pdev->dev,
				 sizeof(struct msm_cdc_pinctrl_info),
@@ -210,12 +222,19 @@ static int msm_cdc_pinctrl_probe(struct platform_device *pdev)
				__func__, ret);
	}

	if (!of_property_read_u32(pdev->dev.of_node, "qcom,tlmm-gpio",
				&tlmm_gpio)) {

	count = of_property_count_u32_elems(pdev->dev.of_node, "qcom,tlmm-gpio");
	if (count <= 0)
		goto cdc_rst;
	if (!of_property_read_u32_array(pdev->dev.of_node, "qcom,tlmm-gpio",
				tlmm_gpio, count)) {
		gpio_data->wakeup_capable = true;
		gpio_data->tlmm_gpio = tlmm_gpio;
		for (i = 0; i < count; i++)
			gpio_data->tlmm_gpio[i] = tlmm_gpio[i];
		gpio_data->count = count;
	}

cdc_rst:
	gpio_data->gpio = of_get_named_gpio(pdev->dev.of_node,
					    "qcom,cdc-rst-n-gpio", 0);
	if (gpio_is_valid(gpio_data->gpio)) {