Currently, for WLED5, after FSC register update MOD_SYNC_BIT
is toggled instead of SYNC_BIT. MOD_SYNC_BIT has to be toggled
after the brightness update and SYNC_BIT has to be toggled after
FSC update for WLED5. Fix it.
Signed-off-by: Kiran Gunda <[email protected]>
---
drivers/video/backlight/qcom-wled.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/drivers/video/backlight/qcom-wled.c b/drivers/video/backlight/qcom-wled.c
index 3bc7800..aef52b9 100644
--- a/drivers/video/backlight/qcom-wled.c
+++ b/drivers/video/backlight/qcom-wled.c
@@ -348,7 +348,7 @@ static int wled3_sync_toggle(struct wled *wled)
return rc;
}
-static int wled5_sync_toggle(struct wled *wled)
+static int wled5_mod_sync_toggle(struct wled *wled)
{
int rc;
u8 val;
@@ -445,10 +445,23 @@ static int wled_update_status(struct backlight_device *bl)
goto unlock_mutex;
}
- rc = wled->wled_sync_toggle(wled);
- if (rc < 0) {
- dev_err(wled->dev, "wled sync failed rc:%d\n", rc);
- goto unlock_mutex;
+ if (wled->version < 5) {
+ rc = wled->wled_sync_toggle(wled);
+ if (rc < 0) {
+ dev_err(wled->dev, "wled sync failed rc:%d\n", rc);
+ goto unlock_mutex;
+ }
+ } else {
+ /*
+ * For WLED5 toggling the MOD_SYNC_BIT updates the
+ * brightness
+ */
+ rc = wled5_mod_sync_toggle(wled);
+ if (rc < 0) {
+ dev_err(wled->dev, "wled mod sync failed rc:%d\n",
+ rc);
+ goto unlock_mutex;
+ }
}
}
@@ -1459,7 +1472,7 @@ static int wled_configure(struct wled *wled)
size = ARRAY_SIZE(wled5_opts);
*cfg = wled5_config_defaults;
wled->wled_set_brightness = wled5_set_brightness;
- wled->wled_sync_toggle = wled5_sync_toggle;
+ wled->wled_sync_toggle = wled3_sync_toggle;
wled->wled_cabc_config = wled5_cabc_config;
wled->wled_ovp_delay = wled5_ovp_delay;
wled->wled_auto_detection_required =
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
On Wed, Feb 24, 2021 at 09:20:47AM +0530, Kiran Gunda wrote:
> Currently, for WLED5, after FSC register update MOD_SYNC_BIT
> is toggled instead of SYNC_BIT. MOD_SYNC_BIT has to be toggled
> after the brightness update and SYNC_BIT has to be toggled after
> FSC update for WLED5. Fix it.
Code looks fine but the description is a difficult to read (which makes
mining the history difficult).
Basically the descriptions here are very hard to read without the
context in PATCH 0/2. Since PATCH 0/2 won't enter the version history
that means these descriptions need to integrate some of the text from
what is currently PATCH 0/2.
I would expect this to be more like. It is basically joining together
text from PATCH 0 and PATCH 1 (I also switched to plural form for SYNC
bits... the code in the driver has mask generation based on the number
of strings, is that right?):
~~~
Currently, for WLED5, the FSC (Full scale current) setting is not
updated properly due to driver toggling the wrong register after an FSC
update.
On WLED5 we should only toggle the MOD_SYNC bit after a brightness
update. For an FSC update we need to toggle the SYNC bits instead.
Fix it by adopting the common wled3_sync_toggle() for WLED5 and
introducing new code to the brightness update path to
compensate.
~~~
Daniel.
>
> Signed-off-by: Kiran Gunda <[email protected]>
> ---
> drivers/video/backlight/qcom-wled.c | 25 +++++++++++++++++++------
> 1 file changed, 19 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/video/backlight/qcom-wled.c b/drivers/video/backlight/qcom-wled.c
> index 3bc7800..aef52b9 100644
> --- a/drivers/video/backlight/qcom-wled.c
> +++ b/drivers/video/backlight/qcom-wled.c
> @@ -348,7 +348,7 @@ static int wled3_sync_toggle(struct wled *wled)
> return rc;
> }
>
> -static int wled5_sync_toggle(struct wled *wled)
> +static int wled5_mod_sync_toggle(struct wled *wled)
> {
> int rc;
> u8 val;
> @@ -445,10 +445,23 @@ static int wled_update_status(struct backlight_device *bl)
> goto unlock_mutex;
> }
>
> - rc = wled->wled_sync_toggle(wled);
> - if (rc < 0) {
> - dev_err(wled->dev, "wled sync failed rc:%d\n", rc);
> - goto unlock_mutex;
> + if (wled->version < 5) {
> + rc = wled->wled_sync_toggle(wled);
> + if (rc < 0) {
> + dev_err(wled->dev, "wled sync failed rc:%d\n", rc);
> + goto unlock_mutex;
> + }
> + } else {
> + /*
> + * For WLED5 toggling the MOD_SYNC_BIT updates the
> + * brightness
> + */
> + rc = wled5_mod_sync_toggle(wled);
> + if (rc < 0) {
> + dev_err(wled->dev, "wled mod sync failed rc:%d\n",
> + rc);
> + goto unlock_mutex;
> + }
> }
> }
>
> @@ -1459,7 +1472,7 @@ static int wled_configure(struct wled *wled)
> size = ARRAY_SIZE(wled5_opts);
> *cfg = wled5_config_defaults;
> wled->wled_set_brightness = wled5_set_brightness;
> - wled->wled_sync_toggle = wled5_sync_toggle;
> + wled->wled_sync_toggle = wled3_sync_toggle;
> wled->wled_cabc_config = wled5_cabc_config;
> wled->wled_ovp_delay = wled5_ovp_delay;
> wled->wled_auto_detection_required =
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project
>
On 2021-02-24 16:45, Daniel Thompson wrote:
> On Wed, Feb 24, 2021 at 09:20:47AM +0530, Kiran Gunda wrote:
>> Currently, for WLED5, after FSC register update MOD_SYNC_BIT
>> is toggled instead of SYNC_BIT. MOD_SYNC_BIT has to be toggled
>> after the brightness update and SYNC_BIT has to be toggled after
>> FSC update for WLED5. Fix it.
>
> Code looks fine but the description is a difficult to read (which makes
> mining the history difficult).
>
> Basically the descriptions here are very hard to read without the
> context in PATCH 0/2. Since PATCH 0/2 won't enter the version history
> that means these descriptions need to integrate some of the text from
> what is currently PATCH 0/2.
>
> I would expect this to be more like. It is basically joining together
> text from PATCH 0 and PATCH 1 (I also switched to plural form for SYNC
> bits... the code in the driver has mask generation based on the number
> of strings, is that right?):
Sorry for the trouble. Yes, you are correct. The mask generation is
based on the number of strings defined in the device tree and only those
strings are enabled. However, there is no issue if the SYNC bits of all
the strings are cleared/set. The SYNC takes place only for enabled
strings.
> ~~~
> Currently, for WLED5, the FSC (Full scale current) setting is not
> updated properly due to driver toggling the wrong register after an FSC
> update.
>
> On WLED5 we should only toggle the MOD_SYNC bit after a brightness
> update. For an FSC update we need to toggle the SYNC bits instead.
>
> Fix it by adopting the common wled3_sync_toggle() for WLED5 and
> introducing new code to the brightness update path to
> compensate.
> ~~~
> I will update the Documentation/patch description clearly
as suggested.
>
> Daniel.
>
>
>
>>
>> Signed-off-by: Kiran Gunda <[email protected]>
>> ---
>> drivers/video/backlight/qcom-wled.c | 25 +++++++++++++++++++------
>> 1 file changed, 19 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/video/backlight/qcom-wled.c
>> b/drivers/video/backlight/qcom-wled.c
>> index 3bc7800..aef52b9 100644
>> --- a/drivers/video/backlight/qcom-wled.c
>> +++ b/drivers/video/backlight/qcom-wled.c
>> @@ -348,7 +348,7 @@ static int wled3_sync_toggle(struct wled *wled)
>> return rc;
>> }
>>
>> -static int wled5_sync_toggle(struct wled *wled)
>> +static int wled5_mod_sync_toggle(struct wled *wled)
>> {
>> int rc;
>> u8 val;
>> @@ -445,10 +445,23 @@ static int wled_update_status(struct
>> backlight_device *bl)
>> goto unlock_mutex;
>> }
>>
>> - rc = wled->wled_sync_toggle(wled);
>> - if (rc < 0) {
>> - dev_err(wled->dev, "wled sync failed rc:%d\n", rc);
>> - goto unlock_mutex;
>> + if (wled->version < 5) {
>> + rc = wled->wled_sync_toggle(wled);
>> + if (rc < 0) {
>> + dev_err(wled->dev, "wled sync failed rc:%d\n", rc);
>> + goto unlock_mutex;
>> + }
>> + } else {
>> + /*
>> + * For WLED5 toggling the MOD_SYNC_BIT updates the
>> + * brightness
>> + */
>> + rc = wled5_mod_sync_toggle(wled);
>> + if (rc < 0) {
>> + dev_err(wled->dev, "wled mod sync failed rc:%d\n",
>> + rc);
>> + goto unlock_mutex;
>> + }
>> }
>> }
>>
>> @@ -1459,7 +1472,7 @@ static int wled_configure(struct wled *wled)
>> size = ARRAY_SIZE(wled5_opts);
>> *cfg = wled5_config_defaults;
>> wled->wled_set_brightness = wled5_set_brightness;
>> - wled->wled_sync_toggle = wled5_sync_toggle;
>> + wled->wled_sync_toggle = wled3_sync_toggle;
>> wled->wled_cabc_config = wled5_cabc_config;
>> wled->wled_ovp_delay = wled5_ovp_delay;
>> wled->wled_auto_detection_required =
>> --
>> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora
>> Forum,
>> a Linux Foundation Collaborative Project
>>