Prechádzať zdrojové kódy

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: Laxminath Kasam <[email protected]>
Laxminath Kasam 5 rokov pred
rodič
commit
c39ed80b7c
1 zmenil súbory, kde vykonal 27 pridanie a 8 odobranie
  1. 27 8
      asoc/codecs/msm-cdc-pinctrl.c

+ 27 - 8
asoc/codecs/msm-cdc-pinctrl.c

@@ -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)) {