summaryrefslogtreecommitdiff
path: root/drivers/leds
diff options
context:
space:
mode:
authorDevesh Jhunjhunwala <deveshj@codeaurora.org>2016-08-09 01:11:15 -0700
committerDevesh Jhunjhunwala <deveshj@codeaurora.org>2016-08-16 07:54:03 -0700
commitecea1591539b1b5d40019203316bdb0f09d5a737 (patch)
treea97edaf9d21ae883e5adf4d709a3bd807caede38 /drivers/leds
parent717ccf3d01f70f239c2b7271940a27976f4fddb3 (diff)
leds: qpnp-flash-v2: Update flash_prepare API
Update the flash prepare API to handle the DISABLE_REGULATOR option, and include support to return the max_current value in a parameter instead of the return value. CRs-Fixed: 1043718 Change-Id: Ief86531658cd0e72ceeae062d29133d5505eb5cf Signed-off-by: Devesh Jhunjhunwala <deveshj@codeaurora.org>
Diffstat (limited to 'drivers/leds')
-rw-r--r--drivers/leds/leds-qpnp-flash-v2.c33
-rw-r--r--drivers/leds/leds-qpnp-flash.c28
2 files changed, 40 insertions, 21 deletions
diff --git a/drivers/leds/leds-qpnp-flash-v2.c b/drivers/leds/leds-qpnp-flash-v2.c
index cc4c14e90b3b..2f7529814cd9 100644
--- a/drivers/leds/leds-qpnp-flash-v2.c
+++ b/drivers/leds/leds-qpnp-flash-v2.c
@@ -68,6 +68,7 @@
#define FLASH_LED_VPH_DROOP_THRESHOLD_MASK GENMASK(2, 0)
#define FLASH_LED_THERMAL_THRSH_MASK GENMASK(2, 0)
#define FLASH_LED_THERMAL_OTST_MASK GENMASK(2, 0)
+#define FLASH_LED_PREPARE_OPTIONS_MASK GENMASK(2, 0)
#define FLASH_LED_MOD_CTRL_MASK BIT(7)
#define FLASH_LED_HW_SW_STROBE_SEL_MASK BIT(2)
#define FLASH_LED_VPH_DROOP_FAULT_MASK BIT(4)
@@ -783,7 +784,6 @@ static int qpnp_flash_led_switch_disable(struct flash_switch_data *snode)
}
}
- qpnp_flash_led_regulator_enable(led, snode, false);
snode->enabled = false;
return 0;
}
@@ -805,10 +805,6 @@ static int qpnp_flash_led_switch_set(struct flash_switch_data *snode, bool on)
return rc;
}
- rc = qpnp_flash_led_regulator_enable(led, snode, true);
- if (rc < 0)
- return rc;
-
/* Iterate over all leds for this switch node */
val = 0;
for (i = 0; i < led->num_fnodes; i++)
@@ -906,12 +902,13 @@ static int qpnp_flash_led_switch_set(struct flash_switch_data *snode, bool on)
return 0;
}
-int qpnp_flash_led_prepare(struct led_trigger *trig, int options)
+int qpnp_flash_led_prepare(struct led_trigger *trig, int options,
+ int *max_current)
{
struct led_classdev *led_cdev = trigger_to_lcdev(trig);
struct flash_switch_data *snode;
struct qpnp_flash_led *led;
- int rc, val = 0;
+ int rc;
if (!led_cdev) {
pr_err("Invalid led_trigger provided\n");
@@ -921,7 +918,7 @@ int qpnp_flash_led_prepare(struct led_trigger *trig, int options)
snode = container_of(led_cdev, struct flash_switch_data, cdev);
led = dev_get_drvdata(&snode->pdev->dev);
- if (!(options & (ENABLE_REGULATOR | QUERY_MAX_CURRENT))) {
+ if (!(options & FLASH_LED_PREPARE_OPTIONS_MASK)) {
dev_err(&led->pdev->dev, "Invalid options %d\n", options);
return -EINVAL;
}
@@ -935,16 +932,26 @@ int qpnp_flash_led_prepare(struct led_trigger *trig, int options)
}
}
+ if (options & DISABLE_REGULATOR) {
+ rc = qpnp_flash_led_regulator_enable(led, snode, false);
+ if (rc < 0) {
+ dev_err(&led->pdev->dev,
+ "disable regulator failed, rc=%d\n", rc);
+ return rc;
+ }
+ }
+
if (options & QUERY_MAX_CURRENT) {
- val = qpnp_flash_led_get_max_avail_current(led);
- if (val < 0) {
+ rc = qpnp_flash_led_get_max_avail_current(led);
+ if (rc < 0) {
dev_err(&led->pdev->dev,
- "query max current failed, rc=%d\n", val);
- return val;
+ "query max current failed, rc=%d\n", rc);
+ return rc;
}
+ *max_current = rc;
}
- return val;
+ return 0;
}
static void qpnp_flash_led_brightness_set(struct led_classdev *led_cdev,
diff --git a/drivers/leds/leds-qpnp-flash.c b/drivers/leds/leds-qpnp-flash.c
index 3e19cf6796a3..95b4c42a5adb 100644
--- a/drivers/leds/leds-qpnp-flash.c
+++ b/drivers/leds/leds-qpnp-flash.c
@@ -82,6 +82,7 @@
#define FLASH_LED_HDRM_SNS_ENABLE_MASK 0x81
#define FLASH_MASK_MODULE_CONTRL_MASK 0xE0
#define FLASH_FOLLOW_OTST2_RB_MASK 0x08
+#define FLASH_PREPARE_OPTIONS_MASK 0x08
#define FLASH_LED_TRIGGER_DEFAULT "none"
#define FLASH_LED_HEADROOM_DEFAULT_MV 500
@@ -1155,12 +1156,13 @@ error_regulator_enable:
return rc;
}
-int qpnp_flash_led_prepare(struct led_trigger *trig, int options)
+int qpnp_flash_led_prepare(struct led_trigger *trig, int options,
+ int *max_current)
{
struct led_classdev *led_cdev = trigger_to_lcdev(trig);
struct flash_node_data *flash_node;
struct qpnp_flash_led *led;
- int rc, val = 0;
+ int rc;
if (!led_cdev) {
pr_err("Invalid led_trigger provided\n");
@@ -1170,7 +1172,7 @@ int qpnp_flash_led_prepare(struct led_trigger *trig, int options)
flash_node = container_of(led_cdev, struct flash_node_data, cdev);
led = dev_get_drvdata(&flash_node->pdev->dev);
- if (!(options & (ENABLE_REGULATOR | QUERY_MAX_CURRENT))) {
+ if (!(options & FLASH_PREPARE_OPTIONS_MASK)) {
dev_err(&led->pdev->dev, "Invalid options %d\n", options);
return -EINVAL;
}
@@ -1184,16 +1186,26 @@ int qpnp_flash_led_prepare(struct led_trigger *trig, int options)
}
}
+ if (options & DISABLE_REGULATOR) {
+ rc = flash_regulator_enable(led, flash_node, false);
+ if (rc < 0) {
+ dev_err(&led->pdev->dev,
+ "disable regulator failed, rc=%d\n", rc);
+ return rc;
+ }
+ }
+
if (options & QUERY_MAX_CURRENT) {
- val = qpnp_flash_led_get_max_avail_current(flash_node, led);
- if (val < 0) {
+ rc = qpnp_flash_led_get_max_avail_current(flash_node, led);
+ if (rc < 0) {
dev_err(&led->pdev->dev,
- "query max current failed, rc=%d\n", val);
- return val;
+ "query max current failed, rc=%d\n", rc);
+ return rc;
}
+ *max_current = rc;
}
- return val;
+ return 0;
}
static void qpnp_flash_led_work(struct work_struct *work)