From ecea1591539b1b5d40019203316bdb0f09d5a737 Mon Sep 17 00:00:00 2001 From: Devesh Jhunjhunwala Date: Tue, 9 Aug 2016 01:11:15 -0700 Subject: [PATCH] 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 --- drivers/leds/leds-qpnp-flash-v2.c | 35 ++++++++++++++++++------------- drivers/leds/leds-qpnp-flash.c | 30 ++++++++++++++++++-------- include/linux/leds-qpnp-flash.h | 6 ++++-- 3 files changed, 46 insertions(+), 25 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 & 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, 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 & 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) diff --git a/include/linux/leds-qpnp-flash.h b/include/linux/leds-qpnp-flash.h index 55867e78bba6..3df370a9e6d3 100644 --- a/include/linux/leds-qpnp-flash.h +++ b/include/linux/leds-qpnp-flash.h @@ -16,8 +16,10 @@ #include #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