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>
This commit is contained in:
Devesh Jhunjhunwala 2016-08-09 01:11:15 -07:00
parent 717ccf3d01
commit ecea159153
3 changed files with 46 additions and 25 deletions

View file

@ -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 & QUERY_MAX_CURRENT) {
val = qpnp_flash_led_get_max_avail_current(led);
if (val < 0) {
if (options & DISABLE_REGULATOR) {
rc = qpnp_flash_led_regulator_enable(led, snode, false);
if (rc < 0) {
dev_err(&led->pdev->dev,
"query max current failed, rc=%d\n", val);
return val;
"disable regulator failed, rc=%d\n", rc);
return rc;
}
}
return val;
if (options & QUERY_MAX_CURRENT) {
rc = qpnp_flash_led_get_max_avail_current(led);
if (rc < 0) {
dev_err(&led->pdev->dev,
"query max current failed, rc=%d\n", rc);
return rc;
}
*max_current = rc;
}
return 0;
}
static void qpnp_flash_led_brightness_set(struct led_classdev *led_cdev,

View file

@ -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 & QUERY_MAX_CURRENT) {
val = qpnp_flash_led_get_max_avail_current(flash_node, led);
if (val < 0) {
if (options & DISABLE_REGULATOR) {
rc = flash_regulator_enable(led, flash_node, false);
if (rc < 0) {
dev_err(&led->pdev->dev,
"query max current failed, rc=%d\n", val);
return val;
"disable regulator failed, rc=%d\n", rc);
return rc;
}
}
return val;
if (options & QUERY_MAX_CURRENT) {
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", rc);
return rc;
}
*max_current = rc;
}
return 0;
}
static void qpnp_flash_led_work(struct work_struct *work)

View file

@ -16,8 +16,10 @@
#include <linux/leds.h>
#define ENABLE_REGULATOR BIT(0)
#define QUERY_MAX_CURRENT BIT(1)
#define DISABLE_REGULATOR BIT(1)
#define QUERY_MAX_CURRENT BIT(2)
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);
#endif