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

Commit a2b7762a authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "leds: qpnp-flash-v2: Fix pinctrl configuration" into msm-4.9

parents 242acaf3 58377f0d
Loading
Loading
Loading
Loading
+1 −7
Original line number Diff line number Diff line
@@ -119,13 +119,7 @@
	status = "ok";
};

&pmi8998_flash2 {
	pinctrl-names = "led_enable", "led_disable";
	pinctrl-0 = <&flash_led3_front_en>;
	pinctrl-1 = <&flash_led3_front_dis>;
};

&pmi8998_torch2 {
&pmi8998_switch1 {
	pinctrl-names = "led_enable", "led_disable";
	pinctrl-0 = <&flash_led3_front_en>;
	pinctrl-1 = <&flash_led3_front_dis>;
+1 −7
Original line number Diff line number Diff line
@@ -104,13 +104,7 @@
	status = "ok";
};

&pmi8998_flash2 {
	pinctrl-names = "led_enable", "led_disable";
	pinctrl-0 = <&flash_led3_front_en>;
	pinctrl-1 = <&flash_led3_front_dis>;
};

&pmi8998_torch2 {
&pmi8998_switch1 {
	pinctrl-names = "led_enable", "led_disable";
	pinctrl-0 = <&flash_led3_front_en>;
	pinctrl-1 = <&flash_led3_front_dis>;
+12 −0
Original line number Diff line number Diff line
@@ -69,17 +69,29 @@
		flash_led3_front {
			flash_led3_front_en: flash_led3_front_en {
				mux {
					pins = "gpio21";
					function = "gpio";
				};

				config {
					pins = "gpio21";
					drive_strength = <2>;
					output-high;
					bias-disable;
				};
			};

			flash_led3_front_dis: flash_led3_front_dis {
				mux {
					pins = "gpio21";
					function = "gpio";
				};

				config {
					pins = "gpio21";
					drive_strength = <2>;
					output-low;
					bias-disable;
				};
			};
		};
+77 −60
Original line number Diff line number Diff line
@@ -175,9 +175,7 @@ enum {
struct flash_node_data {
	struct platform_device		*pdev;
	struct led_classdev		cdev;
	struct pinctrl			*pinctrl;
	struct pinctrl_state		*gpio_state_active;
	struct pinctrl_state		*gpio_state_suspend;
	struct pinctrl			*strobe_pinctrl;
	struct pinctrl_state		*hw_strobe_state_active;
	struct pinctrl_state		*hw_strobe_state_suspend;
	int				hw_strobe_gpio;
@@ -198,6 +196,9 @@ struct flash_node_data {
struct flash_switch_data {
	struct platform_device		*pdev;
	struct regulator		*vreg;
	struct pinctrl			*led_en_pinctrl;
	struct pinctrl_state		*gpio_state_active;
	struct pinctrl_state		*gpio_state_suspend;
	struct led_classdev		cdev;
	int				led_mask;
	bool				regulator_on;
@@ -570,9 +571,9 @@ static int qpnp_flash_led_hw_strobe_enable(struct flash_node_data *fnode,

	if (gpio_is_valid(fnode->hw_strobe_gpio)) {
		gpio_set_value(fnode->hw_strobe_gpio, on ? 1 : 0);
	} else if (fnode->hw_strobe_state_active &&
	} else if (fnode->strobe_pinctrl && fnode->hw_strobe_state_active &&
					fnode->hw_strobe_state_suspend) {
		rc = pinctrl_select_state(fnode->pinctrl,
		rc = pinctrl_select_state(fnode->strobe_pinctrl,
			on ? fnode->hw_strobe_state_active :
			fnode->hw_strobe_state_suspend);
		if (rc < 0) {
@@ -949,15 +950,6 @@ static int qpnp_flash_led_switch_disable(struct flash_switch_data *snode)

		led->fnode[i].led_on = false;

		if (led->fnode[i].pinctrl) {
			rc = pinctrl_select_state(led->fnode[i].pinctrl,
					led->fnode[i].gpio_state_suspend);
			if (rc < 0) {
				pr_err("failed to disable GPIO, rc=%d\n", rc);
				return rc;
			}
		}

		if (led->fnode[i].trigger & FLASH_LED_HW_SW_STROBE_SEL_BIT) {
			rc = qpnp_flash_led_hw_strobe_enable(&led->fnode[i],
					led->pdata->hw_strobe_option, false);
@@ -969,6 +961,17 @@ static int qpnp_flash_led_switch_disable(struct flash_switch_data *snode)
		}
	}

	if (snode->led_en_pinctrl) {
		pr_debug("Selecting suspend state for %s\n", snode->cdev.name);
		rc = pinctrl_select_state(snode->led_en_pinctrl,
				snode->gpio_state_suspend);
		if (rc < 0) {
			pr_err("failed to select pinctrl suspend state rc=%d\n",
				rc);
			return rc;
		}
	}

	snode->enabled = false;
	return 0;
}
@@ -1039,15 +1042,6 @@ static int qpnp_flash_led_switch_set(struct flash_switch_data *snode, bool on)

		val |= FLASH_LED_ENABLE << led->fnode[i].id;

		if (led->fnode[i].pinctrl) {
			rc = pinctrl_select_state(led->fnode[i].pinctrl,
					led->fnode[i].gpio_state_active);
			if (rc < 0) {
				pr_err("failed to enable GPIO rc=%d\n", rc);
				return rc;
			}
		}

		if (led->fnode[i].trigger & FLASH_LED_HW_SW_STROBE_SEL_BIT) {
			rc = qpnp_flash_led_hw_strobe_enable(&led->fnode[i],
					led->pdata->hw_strobe_option, true);
@@ -1059,6 +1053,17 @@ static int qpnp_flash_led_switch_set(struct flash_switch_data *snode, bool on)
		}
	}

	if (snode->led_en_pinctrl) {
		pr_debug("Selecting active state for %s\n", snode->cdev.name);
		rc = pinctrl_select_state(snode->led_en_pinctrl,
				snode->gpio_state_active);
		if (rc < 0) {
			pr_err("failed to select pinctrl active state rc=%d\n",
				rc);
			return rc;
		}
	}

	if (led->enable == 0) {
		rc = qpnp_flash_led_masked_write(led,
				FLASH_LED_REG_MOD_CTRL(led->base),
@@ -1461,6 +1466,20 @@ static int qpnp_flash_led_parse_each_led_dt(struct qpnp_flash_led *led,
	}
	fnode->trigger = (strobe_sel << 2) | (edge_trigger << 1) | active_high;

	rc = led_classdev_register(&led->pdev->dev, &fnode->cdev);
	if (rc < 0) {
		pr_err("Unable to register led node %d\n", fnode->id);
		return rc;
	}

	fnode->cdev.dev->of_node = node;
	fnode->strobe_pinctrl = devm_pinctrl_get(fnode->cdev.dev);
	if (IS_ERR_OR_NULL(fnode->strobe_pinctrl)) {
		pr_debug("No pinctrl defined for %s, err=%ld\n",
			fnode->cdev.name, PTR_ERR(fnode->strobe_pinctrl));
		fnode->strobe_pinctrl = NULL;
	}

	if (fnode->trigger & FLASH_LED_HW_SW_STROBE_SEL_BIT) {
		if (of_find_property(node, "qcom,hw-strobe-gpio", NULL)) {
			fnode->hw_strobe_gpio = of_get_named_gpio(node,
@@ -1470,10 +1489,10 @@ static int qpnp_flash_led_parse_each_led_dt(struct qpnp_flash_led *led,
				return fnode->hw_strobe_gpio;
			}
			gpio_direction_output(fnode->hw_strobe_gpio, 0);
		} else {
		} else if (fnode->strobe_pinctrl) {
			fnode->hw_strobe_gpio = -1;
			fnode->hw_strobe_state_active =
				pinctrl_lookup_state(fnode->pinctrl,
				pinctrl_lookup_state(fnode->strobe_pinctrl,
							"strobe_enable");
			if (IS_ERR_OR_NULL(fnode->hw_strobe_state_active)) {
				pr_err("No active pin for hardware strobe, rc=%ld\n",
@@ -1482,7 +1501,7 @@ static int qpnp_flash_led_parse_each_led_dt(struct qpnp_flash_led *led,
			}

			fnode->hw_strobe_state_suspend =
				pinctrl_lookup_state(fnode->pinctrl,
				pinctrl_lookup_state(fnode->strobe_pinctrl,
							"strobe_disable");
			if (IS_ERR_OR_NULL(fnode->hw_strobe_state_suspend)) {
				pr_err("No suspend pin for hardware strobe, rc=%ld\n",
@@ -1493,38 +1512,6 @@ static int qpnp_flash_led_parse_each_led_dt(struct qpnp_flash_led *led,
		}
	}

	rc = led_classdev_register(&led->pdev->dev, &fnode->cdev);
	if (rc < 0) {
		pr_err("Unable to register led node %d\n", fnode->id);
		return rc;
	}

	fnode->cdev.dev->of_node = node;

	fnode->pinctrl = devm_pinctrl_get(fnode->cdev.dev);
	if (IS_ERR_OR_NULL(fnode->pinctrl)) {
		pr_debug("No pinctrl defined\n");
		fnode->pinctrl = NULL;
	} else {
		fnode->gpio_state_active =
			pinctrl_lookup_state(fnode->pinctrl, "led_enable");
		if (IS_ERR_OR_NULL(fnode->gpio_state_active)) {
			pr_err("Cannot lookup LED active state\n");
			devm_pinctrl_put(fnode->pinctrl);
			fnode->pinctrl = NULL;
			return PTR_ERR(fnode->gpio_state_active);
		}

		fnode->gpio_state_suspend =
			pinctrl_lookup_state(fnode->pinctrl, "led_disable");
		if (IS_ERR_OR_NULL(fnode->gpio_state_suspend)) {
			pr_err("Cannot lookup LED disable state\n");
			devm_pinctrl_put(fnode->pinctrl);
			fnode->pinctrl = NULL;
			return PTR_ERR(fnode->gpio_state_suspend);
		}
	}

	return 0;
}

@@ -1589,6 +1576,36 @@ static int qpnp_flash_led_parse_and_register_switch(struct qpnp_flash_led *led,
	}

	snode->cdev.dev->of_node = node;

	snode->led_en_pinctrl = devm_pinctrl_get(snode->cdev.dev);
	if (IS_ERR_OR_NULL(snode->led_en_pinctrl)) {
		pr_debug("No pinctrl defined for %s, err=%ld\n",
			snode->cdev.name, PTR_ERR(snode->led_en_pinctrl));
		snode->led_en_pinctrl = NULL;
	}

	if (snode->led_en_pinctrl) {
		snode->gpio_state_active =
			pinctrl_lookup_state(snode->led_en_pinctrl,
						"led_enable");
		if (IS_ERR_OR_NULL(snode->gpio_state_active)) {
			pr_err("Cannot lookup LED active state\n");
			devm_pinctrl_put(snode->led_en_pinctrl);
			snode->led_en_pinctrl = NULL;
			return PTR_ERR(snode->gpio_state_active);
		}

		snode->gpio_state_suspend =
			pinctrl_lookup_state(snode->led_en_pinctrl,
						"led_disable");
		if (IS_ERR_OR_NULL(snode->gpio_state_suspend)) {
			pr_err("Cannot lookup LED disable state\n");
			devm_pinctrl_put(snode->led_en_pinctrl);
			snode->led_en_pinctrl = NULL;
			return PTR_ERR(snode->gpio_state_suspend);
		}
	}

	return 0;
}