linux-leds.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] leds: flash: leds-qcom-flash: update torch current clamp setting
@ 2025-07-25 10:04 Fenglin Wu via B4 Relay
  2025-07-25 10:04 ` [PATCH 1/2] " Fenglin Wu via B4 Relay
  2025-07-25 10:04 ` [PATCH 2/2] leds: flash: leds-qcom-flash: add a separate register map for PMI8998 Fenglin Wu via B4 Relay
  0 siblings, 2 replies; 8+ messages in thread
From: Fenglin Wu via B4 Relay @ 2025-07-25 10:04 UTC (permalink / raw)
  To: kernel, Lee Jones, Pavel Machek, Fenglin Wu
  Cc: Subbaraman Narayanamurthy, linux-leds, linux-kernel, Fenglin Wu

There is a current clamp register needs to be updated when enabling
torch LED, and the register address is different between different
PMIC flash LED modules. Add changes to address it.

Signed-off-by: Fenglin Wu <fenglin.wu@oss.qualcomm.com>
---
Fenglin Wu (2):
      leds: flash: leds-qcom-flash: update torch current clamp setting
      leds: flash: leds-qcom-flash: add a separate register map for PMI8998

 drivers/leds/flash/leds-qcom-flash.c | 41 ++++++++++++++++++++++++++++++++----
 1 file changed, 37 insertions(+), 4 deletions(-)
---
base-commit: 4903924ac7ef31fbbe48b3261b1bc86ce6cd7e97
change-id: 20250725-fix-torch-clamp-issue-ca25212aa224

Best regards,
-- 
Fenglin Wu <fenglin.wu@oss.qualcomm.com>



^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/2] leds: flash: leds-qcom-flash: update torch current clamp setting
  2025-07-25 10:04 [PATCH 0/2] leds: flash: leds-qcom-flash: update torch current clamp setting Fenglin Wu via B4 Relay
@ 2025-07-25 10:04 ` Fenglin Wu via B4 Relay
  2025-07-25 12:37   ` Konrad Dybcio
  2025-07-25 10:04 ` [PATCH 2/2] leds: flash: leds-qcom-flash: add a separate register map for PMI8998 Fenglin Wu via B4 Relay
  1 sibling, 1 reply; 8+ messages in thread
From: Fenglin Wu via B4 Relay @ 2025-07-25 10:04 UTC (permalink / raw)
  To: kernel, Lee Jones, Pavel Machek, Fenglin Wu
  Cc: Subbaraman Narayanamurthy, linux-leds, linux-kernel, Fenglin Wu

From: Fenglin Wu <fenglin.wu@oss.qualcomm.com>

There is a register to clamp the flash current per LED channel when
safety timer is disabled. It needs to be updated according to the
maximum torch LED current setting to ensure the torch current won't
be clamped unexpectedly.

Fixes: 96a2e242a5dc ("leds: flash: Add driver to support flash LED module in QCOM PMICs")
Signed-off-by: Fenglin Wu <fenglin.wu@oss.qualcomm.com>
---
 drivers/leds/flash/leds-qcom-flash.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/leds/flash/leds-qcom-flash.c b/drivers/leds/flash/leds-qcom-flash.c
index 89cf5120f5d55bbb7e24faa8c3a946416f8fed46..9c2e41cfddcf2d50d5a633cb157084371a631d74 100644
--- a/drivers/leds/flash/leds-qcom-flash.c
+++ b/drivers/leds/flash/leds-qcom-flash.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022, 2024-2025 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/bitfield.h>
@@ -111,6 +111,7 @@ enum {
 	REG_IRESOLUTION,
 	REG_CHAN_STROBE,
 	REG_CHAN_EN,
+	REG_TORCH_CLAMP,
 	REG_THERM_THRSH1,
 	REG_THERM_THRSH2,
 	REG_THERM_THRSH3,
@@ -127,6 +128,7 @@ static const struct reg_field mvflash_3ch_regs[REG_MAX_COUNT] = {
 	REG_FIELD(0x47, 0, 5),                  /* iresolution	*/
 	REG_FIELD_ID(0x49, 0, 2, 3, 1),         /* chan_strobe	*/
 	REG_FIELD(0x4c, 0, 2),                  /* chan_en	*/
+	REG_FIELD(0xec, 0, 6),			/* torch_clamp	*/
 	REG_FIELD(0x56, 0, 2),			/* therm_thrsh1 */
 	REG_FIELD(0x57, 0, 2),			/* therm_thrsh2 */
 	REG_FIELD(0x58, 0, 2),			/* therm_thrsh3 */
@@ -142,6 +144,7 @@ static const struct reg_field mvflash_4ch_regs[REG_MAX_COUNT] = {
 	REG_FIELD(0x49, 0, 3),			/* iresolution	*/
 	REG_FIELD_ID(0x4a, 0, 6, 4, 1),		/* chan_strobe	*/
 	REG_FIELD(0x4e, 0, 3),			/* chan_en	*/
+	REG_FIELD(0xed, 0, 6),			/* torch_clamp	*/
 	REG_FIELD(0x7a, 0, 2),			/* therm_thrsh1 */
 	REG_FIELD(0x78, 0, 2),			/* therm_thrsh2 */
 };
@@ -156,6 +159,7 @@ struct qcom_flash_data {
 	u8			max_channels;
 	u8			chan_en_bits;
 	u8			revision;
+	u8			torch_clamp;
 };
 
 struct qcom_flash_led {
@@ -702,6 +706,7 @@ static int qcom_flash_register_led_device(struct device *dev,
 	u32 current_ua, timeout_us;
 	u32 channels[4];
 	int i, rc, count;
+	u8 torch_clamp;
 
 	count = fwnode_property_count_u32(node, "led-sources");
 	if (count <= 0) {
@@ -751,6 +756,12 @@ static int qcom_flash_register_led_device(struct device *dev,
 	current_ua = min_t(u32, current_ua, TORCH_CURRENT_MAX_UA * led->chan_count);
 	led->max_torch_current_ma = current_ua / UA_PER_MA;
 
+	torch_clamp = (current_ua / led->chan_count) / TORCH_IRES_UA;
+	if (torch_clamp != 0)
+		torch_clamp--;
+
+	flash_data->torch_clamp = max_t(u8, flash_data->torch_clamp, torch_clamp);
+
 	if (fwnode_property_present(node, "flash-max-microamp")) {
 		flash->led_cdev.flags |= LED_DEV_CAP_FLASH;
 
@@ -917,8 +928,7 @@ static int qcom_flash_led_probe(struct platform_device *pdev)
 		flash_data->leds_count++;
 	}
 
-	return 0;
-
+	return regmap_field_write(flash_data->r_fields[REG_TORCH_CLAMP], flash_data->torch_clamp);
 release:
 	while (flash_data->v4l2_flash[flash_data->leds_count] && flash_data->leds_count)
 		v4l2_flash_release(flash_data->v4l2_flash[flash_data->leds_count--]);

-- 
2.34.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/2] leds: flash: leds-qcom-flash: add a separate register map for PMI8998
  2025-07-25 10:04 [PATCH 0/2] leds: flash: leds-qcom-flash: update torch current clamp setting Fenglin Wu via B4 Relay
  2025-07-25 10:04 ` [PATCH 1/2] " Fenglin Wu via B4 Relay
@ 2025-07-25 10:04 ` Fenglin Wu via B4 Relay
  2025-07-25 12:42   ` Konrad Dybcio
  1 sibling, 1 reply; 8+ messages in thread
From: Fenglin Wu via B4 Relay @ 2025-07-25 10:04 UTC (permalink / raw)
  To: kernel, Lee Jones, Pavel Machek, Fenglin Wu
  Cc: Subbaraman Narayanamurthy, linux-leds, linux-kernel, Fenglin Wu

From: Fenglin Wu <fenglin.wu@oss.qualcomm.com>

The 3-channel flash module in PMI8998 has several registers different
than the others, such as: torch_clamp. Add different register fields
for it.

Signed-off-by: Fenglin Wu <fenglin.wu@oss.qualcomm.com>
---
 drivers/leds/flash/leds-qcom-flash.c | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/drivers/leds/flash/leds-qcom-flash.c b/drivers/leds/flash/leds-qcom-flash.c
index 9c2e41cfddcf2d50d5a633cb157084371a631d74..2554ef7bcae6bc8f66edbffc7c885a9386b263ad 100644
--- a/drivers/leds/flash/leds-qcom-flash.c
+++ b/drivers/leds/flash/leds-qcom-flash.c
@@ -118,6 +118,22 @@ enum {
 	REG_MAX_COUNT,
 };
 
+static const struct reg_field mvflash_3ch_pmi8998_regs[REG_MAX_COUNT] = {
+	REG_FIELD(0x08, 0, 7),			/* status1	*/
+	REG_FIELD(0x09, 0, 7),			/* status2	*/
+	REG_FIELD(0x0a, 0, 7),			/* status3	*/
+	REG_FIELD_ID(0x40, 0, 7, 3, 1),		/* chan_timer	*/
+	REG_FIELD_ID(0x43, 0, 6, 3, 1),		/* itarget	*/
+	REG_FIELD(0x46, 7, 7),			/* module_en	*/
+	REG_FIELD(0x47, 0, 5),			/* iresolution	*/
+	REG_FIELD_ID(0x49, 0, 2, 3, 1),		/* chan_strobe	*/
+	REG_FIELD(0x4c, 0, 2),			/* chan_en	*/
+	REG_FIELD(0xea, 0, 6),			/* torch_clamp	*/
+	REG_FIELD(0x56, 0, 2),			/* therm_thrsh1 */
+	REG_FIELD(0x57, 0, 2),			/* therm_thrsh2 */
+	REG_FIELD(0x58, 0, 2),			/* therm_thrsh3 */
+};
+
 static const struct reg_field mvflash_3ch_regs[REG_MAX_COUNT] = {
 	REG_FIELD(0x08, 0, 7),			/* status1	*/
 	REG_FIELD(0x09, 0, 7),                  /* status2	*/
@@ -862,13 +878,20 @@ static int qcom_flash_led_probe(struct platform_device *pdev)
 		return rc;
 	}
 
-	if (val == FLASH_SUBTYPE_3CH_PM8150_VAL || val == FLASH_SUBTYPE_3CH_PMI8998_VAL) {
+	if (val == FLASH_SUBTYPE_3CH_PM8150_VAL) {
 		flash_data->hw_type = QCOM_MVFLASH_3CH;
 		flash_data->max_channels = 3;
 		regs = devm_kmemdup(dev, mvflash_3ch_regs, sizeof(mvflash_3ch_regs),
 				    GFP_KERNEL);
 		if (!regs)
 			return -ENOMEM;
+	} else if (val == FLASH_SUBTYPE_3CH_PMI8998_VAL) {
+		flash_data->hw_type = QCOM_MVFLASH_3CH;
+		flash_data->max_channels = 3;
+		regs = devm_kmemdup(dev, mvflash_3ch_pmi8998_regs,
+				    sizeof(mvflash_3ch_pmi8998_regs), GFP_KERNEL);
+		if (!regs)
+			return -ENOMEM;
 	} else if (val == FLASH_SUBTYPE_4CH_VAL) {
 		flash_data->hw_type = QCOM_MVFLASH_4CH;
 		flash_data->max_channels = 4;

-- 
2.34.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/2] leds: flash: leds-qcom-flash: update torch current clamp setting
  2025-07-25 10:04 ` [PATCH 1/2] " Fenglin Wu via B4 Relay
@ 2025-07-25 12:37   ` Konrad Dybcio
  2025-07-25 12:45     ` Konrad Dybcio
  2025-07-28  2:27     ` Fenglin Wu
  0 siblings, 2 replies; 8+ messages in thread
From: Konrad Dybcio @ 2025-07-25 12:37 UTC (permalink / raw)
  To: fenglin.wu, kernel, Lee Jones, Pavel Machek, Fenglin Wu
  Cc: Subbaraman Narayanamurthy, linux-leds, linux-kernel

On 7/25/25 12:04 PM, 'Fenglin Wu via B4 Relay' via kernel wrote:
> From: Fenglin Wu <fenglin.wu@oss.qualcomm.com>
> 
> There is a register to clamp the flash current per LED channel when
> safety timer is disabled. It needs to be updated according to the
> maximum torch LED current setting to ensure the torch current won't
> be clamped unexpectedly.
> 
> Fixes: 96a2e242a5dc ("leds: flash: Add driver to support flash LED module in QCOM PMICs")
> Signed-off-by: Fenglin Wu <fenglin.wu@oss.qualcomm.com>
> ---
>  drivers/leds/flash/leds-qcom-flash.c | 16 +++++++++++++---
>  1 file changed, 13 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/leds/flash/leds-qcom-flash.c b/drivers/leds/flash/leds-qcom-flash.c
> index 89cf5120f5d55bbb7e24faa8c3a946416f8fed46..9c2e41cfddcf2d50d5a633cb157084371a631d74 100644
> --- a/drivers/leds/flash/leds-qcom-flash.c
> +++ b/drivers/leds/flash/leds-qcom-flash.c
> @@ -1,6 +1,6 @@
>  // SPDX-License-Identifier: GPL-2.0-only
>  /*
> - * Copyright (c) 2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved.
> + * Copyright (c) 2022, 2024-2025 Qualcomm Innovation Center, Inc. All rights reserved.
>   */
>  
>  #include <linux/bitfield.h>
> @@ -111,6 +111,7 @@ enum {
>  	REG_IRESOLUTION,
>  	REG_CHAN_STROBE,
>  	REG_CHAN_EN,
> +	REG_TORCH_CLAMP,

This is not the name of this register on at least PM8150L

>  	REG_THERM_THRSH1,
>  	REG_THERM_THRSH2,
>  	REG_THERM_THRSH3,
> @@ -127,6 +128,7 @@ static const struct reg_field mvflash_3ch_regs[REG_MAX_COUNT] = {
>  	REG_FIELD(0x47, 0, 5),                  /* iresolution	*/
>  	REG_FIELD_ID(0x49, 0, 2, 3, 1),         /* chan_strobe	*/
>  	REG_FIELD(0x4c, 0, 2),                  /* chan_en	*/
> +	REG_FIELD(0xec, 0, 6),			/* torch_clamp	*/

Please keep it sorted by address


>  	REG_FIELD(0x56, 0, 2),			/* therm_thrsh1 */
>  	REG_FIELD(0x57, 0, 2),			/* therm_thrsh2 */
>  	REG_FIELD(0x58, 0, 2),			/* therm_thrsh3 */
> @@ -142,6 +144,7 @@ static const struct reg_field mvflash_4ch_regs[REG_MAX_COUNT] = {
>  	REG_FIELD(0x49, 0, 3),			/* iresolution	*/
>  	REG_FIELD_ID(0x4a, 0, 6, 4, 1),		/* chan_strobe	*/
>  	REG_FIELD(0x4e, 0, 3),			/* chan_en	*/
> +	REG_FIELD(0xed, 0, 6),			/* torch_clamp	*/
>  	REG_FIELD(0x7a, 0, 2),			/* therm_thrsh1 */
>  	REG_FIELD(0x78, 0, 2),			/* therm_thrsh2 */
>  };
> @@ -156,6 +159,7 @@ struct qcom_flash_data {
>  	u8			max_channels;
>  	u8			chan_en_bits;
>  	u8			revision;
> +	u8			torch_clamp;
>  };
>  
>  struct qcom_flash_led {
> @@ -702,6 +706,7 @@ static int qcom_flash_register_led_device(struct device *dev,
>  	u32 current_ua, timeout_us;
>  	u32 channels[4];
>  	int i, rc, count;
> +	u8 torch_clamp;
>  
>  	count = fwnode_property_count_u32(node, "led-sources");
>  	if (count <= 0) {
> @@ -751,6 +756,12 @@ static int qcom_flash_register_led_device(struct device *dev,
>  	current_ua = min_t(u32, current_ua, TORCH_CURRENT_MAX_UA * led->chan_count);
>  	led->max_torch_current_ma = current_ua / UA_PER_MA;
>  
> +	torch_clamp = (current_ua / led->chan_count) / TORCH_IRES_UA;
> +	if (torch_clamp != 0)
> +		torch_clamp--;

In case anyone's wondering, ((1<<6) + 1) 4 * 5000 == 1280000 which we set
on some (all?) devices

Konrad

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] leds: flash: leds-qcom-flash: add a separate register map for PMI8998
  2025-07-25 10:04 ` [PATCH 2/2] leds: flash: leds-qcom-flash: add a separate register map for PMI8998 Fenglin Wu via B4 Relay
@ 2025-07-25 12:42   ` Konrad Dybcio
  0 siblings, 0 replies; 8+ messages in thread
From: Konrad Dybcio @ 2025-07-25 12:42 UTC (permalink / raw)
  To: fenglin.wu, kernel, Lee Jones, Pavel Machek, Fenglin Wu
  Cc: Subbaraman Narayanamurthy, linux-leds, linux-kernel

On 7/25/25 12:04 PM, 'Fenglin Wu via B4 Relay' via kernel wrote:
> From: Fenglin Wu <fenglin.wu@oss.qualcomm.com>
> 
> The 3-channel flash module in PMI8998 has several registers different
> than the others, such as: torch_clamp. Add different register fields
> for it.
> 
> Signed-off-by: Fenglin Wu <fenglin.wu@oss.qualcomm.com>
> ---
>  drivers/leds/flash/leds-qcom-flash.c | 25 ++++++++++++++++++++++++-
>  1 file changed, 24 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/leds/flash/leds-qcom-flash.c b/drivers/leds/flash/leds-qcom-flash.c
> index 9c2e41cfddcf2d50d5a633cb157084371a631d74..2554ef7bcae6bc8f66edbffc7c885a9386b263ad 100644
> --- a/drivers/leds/flash/leds-qcom-flash.c
> +++ b/drivers/leds/flash/leds-qcom-flash.c
> @@ -118,6 +118,22 @@ enum {
>  	REG_MAX_COUNT,
>  };
>  
> +static const struct reg_field mvflash_3ch_pmi8998_regs[REG_MAX_COUNT] = {
> +	REG_FIELD(0x08, 0, 7),			/* status1	*/

bits 0-5

> +	REG_FIELD(0x09, 0, 7),			/* status2	*/
> +	REG_FIELD(0x0a, 0, 7),			/* status3	*/
> +	REG_FIELD_ID(0x40, 0, 7, 3, 1),		/* chan_timer	*/
> +	REG_FIELD_ID(0x43, 0, 6, 3, 1),		/* itarget	*/
> +	REG_FIELD(0x46, 7, 7),			/* module_en	*/
> +	REG_FIELD(0x47, 0, 5),			/* iresolution	*/
> +	REG_FIELD_ID(0x49, 0, 2, 3, 1),		/* chan_strobe	*/
> +	REG_FIELD(0x4c, 0, 2),			/* chan_en	*/
> +	REG_FIELD(0xea, 0, 6),			/* torch_clamp	*/
> +	REG_FIELD(0x56, 0, 2),			/* therm_thrsh1 */
> +	REG_FIELD(0x57, 0, 2),			/* therm_thrsh2 */
> +	REG_FIELD(0x58, 0, 2),			/* therm_thrsh3 */

Please keep them sorted

Konrad

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/2] leds: flash: leds-qcom-flash: update torch current clamp setting
  2025-07-25 12:37   ` Konrad Dybcio
@ 2025-07-25 12:45     ` Konrad Dybcio
  2025-07-28  2:27     ` Fenglin Wu
  1 sibling, 0 replies; 8+ messages in thread
From: Konrad Dybcio @ 2025-07-25 12:45 UTC (permalink / raw)
  To: fenglin.wu, kernel, Lee Jones, Pavel Machek, Fenglin Wu
  Cc: Subbaraman Narayanamurthy, linux-leds, linux-kernel

On 7/25/25 2:37 PM, Konrad Dybcio wrote:
> On 7/25/25 12:04 PM, 'Fenglin Wu via B4 Relay' via kernel wrote:
>> From: Fenglin Wu <fenglin.wu@oss.qualcomm.com>
>>
>> There is a register to clamp the flash current per LED channel when
>> safety timer is disabled. It needs to be updated according to the
>> maximum torch LED current setting to ensure the torch current won't
>> be clamped unexpectedly.
>>
>> Fixes: 96a2e242a5dc ("leds: flash: Add driver to support flash LED module in QCOM PMICs")
>> Signed-off-by: Fenglin Wu <fenglin.wu@oss.qualcomm.com>
>> ---
>>  drivers/leds/flash/leds-qcom-flash.c | 16 +++++++++++++---
>>  1 file changed, 13 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/leds/flash/leds-qcom-flash.c b/drivers/leds/flash/leds-qcom-flash.c
>> index 89cf5120f5d55bbb7e24faa8c3a946416f8fed46..9c2e41cfddcf2d50d5a633cb157084371a631d74 100644
>> --- a/drivers/leds/flash/leds-qcom-flash.c
>> +++ b/drivers/leds/flash/leds-qcom-flash.c
>> @@ -1,6 +1,6 @@
>>  // SPDX-License-Identifier: GPL-2.0-only
>>  /*
>> - * Copyright (c) 2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved.
>> + * Copyright (c) 2022, 2024-2025 Qualcomm Innovation Center, Inc. All rights reserved.
>>   */
>>  
>>  #include <linux/bitfield.h>
>> @@ -111,6 +111,7 @@ enum {
>>  	REG_IRESOLUTION,
>>  	REG_CHAN_STROBE,
>>  	REG_CHAN_EN,
>> +	REG_TORCH_CLAMP,
> 
> This is not the name of this register on at least PM8150L
> 
>>  	REG_THERM_THRSH1,
>>  	REG_THERM_THRSH2,
>>  	REG_THERM_THRSH3,
>> @@ -127,6 +128,7 @@ static const struct reg_field mvflash_3ch_regs[REG_MAX_COUNT] = {
>>  	REG_FIELD(0x47, 0, 5),                  /* iresolution	*/
>>  	REG_FIELD_ID(0x49, 0, 2, 3, 1),         /* chan_strobe	*/
>>  	REG_FIELD(0x4c, 0, 2),                  /* chan_en	*/
>> +	REG_FIELD(0xec, 0, 6),			/* torch_clamp	*/
> 
> Please keep it sorted by address
> 
> 
>>  	REG_FIELD(0x56, 0, 2),			/* therm_thrsh1 */
>>  	REG_FIELD(0x57, 0, 2),			/* therm_thrsh2 */
>>  	REG_FIELD(0x58, 0, 2),			/* therm_thrsh3 */
>> @@ -142,6 +144,7 @@ static const struct reg_field mvflash_4ch_regs[REG_MAX_COUNT] = {
>>  	REG_FIELD(0x49, 0, 3),			/* iresolution	*/
>>  	REG_FIELD_ID(0x4a, 0, 6, 4, 1),		/* chan_strobe	*/
>>  	REG_FIELD(0x4e, 0, 3),			/* chan_en	*/
>> +	REG_FIELD(0xed, 0, 6),			/* torch_clamp	*/
>>  	REG_FIELD(0x7a, 0, 2),			/* therm_thrsh1 */
>>  	REG_FIELD(0x78, 0, 2),			/* therm_thrsh2 */
>>  };
>> @@ -156,6 +159,7 @@ struct qcom_flash_data {
>>  	u8			max_channels;
>>  	u8			chan_en_bits;
>>  	u8			revision;
>> +	u8			torch_clamp;
>>  };
>>  
>>  struct qcom_flash_led {
>> @@ -702,6 +706,7 @@ static int qcom_flash_register_led_device(struct device *dev,
>>  	u32 current_ua, timeout_us;
>>  	u32 channels[4];
>>  	int i, rc, count;
>> +	u8 torch_clamp;
>>  
>>  	count = fwnode_property_count_u32(node, "led-sources");
>>  	if (count <= 0) {
>> @@ -751,6 +756,12 @@ static int qcom_flash_register_led_device(struct device *dev,
>>  	current_ua = min_t(u32, current_ua, TORCH_CURRENT_MAX_UA * led->chan_count);
>>  	led->max_torch_current_ma = current_ua / UA_PER_MA;
>>  
>> +	torch_clamp = (current_ua / led->chan_count) / TORCH_IRES_UA;
>> +	if (torch_clamp != 0)
>> +		torch_clamp--;
> 
> In case anyone's wondering, ((1<<6) + 1) 4 * 5000 == 1280000 which we set
> on some (all?) devices

Scratch "the + 1", I had both the width of the field and its max
value in mind.. the rhs still matches..

Konrad

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/2] leds: flash: leds-qcom-flash: update torch current clamp setting
  2025-07-25 12:37   ` Konrad Dybcio
  2025-07-25 12:45     ` Konrad Dybcio
@ 2025-07-28  2:27     ` Fenglin Wu
  2025-07-28  9:18       ` Konrad Dybcio
  1 sibling, 1 reply; 8+ messages in thread
From: Fenglin Wu @ 2025-07-28  2:27 UTC (permalink / raw)
  To: Konrad Dybcio, kernel, Lee Jones, Pavel Machek, Fenglin Wu
  Cc: Subbaraman Narayanamurthy, linux-leds, linux-kernel


On 7/25/2025 8:37 PM, Konrad Dybcio wrote:
> On 7/25/25 12:04 PM, 'Fenglin Wu via B4 Relay' via kernel wrote:
>> From: Fenglin Wu <fenglin.wu@oss.qualcomm.com>
>>
>> There is a register to clamp the flash current per LED channel when
>> safety timer is disabled. It needs to be updated according to the
>> maximum torch LED current setting to ensure the torch current won't
>> be clamped unexpectedly.
>>
>> Fixes: 96a2e242a5dc ("leds: flash: Add driver to support flash LED module in QCOM PMICs")
>> Signed-off-by: Fenglin Wu <fenglin.wu@oss.qualcomm.com>
>> ---
>>   drivers/leds/flash/leds-qcom-flash.c | 16 +++++++++++++---
>>   1 file changed, 13 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/leds/flash/leds-qcom-flash.c b/drivers/leds/flash/leds-qcom-flash.c
>> index 89cf5120f5d55bbb7e24faa8c3a946416f8fed46..9c2e41cfddcf2d50d5a633cb157084371a631d74 100644
>> --- a/drivers/leds/flash/leds-qcom-flash.c
>> +++ b/drivers/leds/flash/leds-qcom-flash.c
>> @@ -1,6 +1,6 @@
>>   // SPDX-License-Identifier: GPL-2.0-only
>>   /*
>> - * Copyright (c) 2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved.
>> + * Copyright (c) 2022, 2024-2025 Qualcomm Innovation Center, Inc. All rights reserved.
>>    */
>>   
>>   #include <linux/bitfield.h>
>> @@ -111,6 +111,7 @@ enum {
>>   	REG_IRESOLUTION,
>>   	REG_CHAN_STROBE,
>>   	REG_CHAN_EN,
>> +	REG_TORCH_CLAMP,
> This is not the name of this register on at least PM8150L
The register is referred to as 'TIMER_DISA_MITIGATION_CLAMP' in the 
documentation. 'TIMER_DISA' indicates the flash module operating in 
torch mode. We can remove 'MITIGATION' to create a shorter name for the 
enum.
>
>>   	REG_THERM_THRSH1,
>>   	REG_THERM_THRSH2,
>>   	REG_THERM_THRSH3,
>> @@ -127,6 +128,7 @@ static const struct reg_field mvflash_3ch_regs[REG_MAX_COUNT] = {
>>   	REG_FIELD(0x47, 0, 5),                  /* iresolution	*/
>>   	REG_FIELD_ID(0x49, 0, 2, 3, 1),         /* chan_strobe	*/
>>   	REG_FIELD(0x4c, 0, 2),                  /* chan_en	*/
>> +	REG_FIELD(0xec, 0, 6),			/* torch_clamp	*/
> Please keep it sorted by address
I need to keep the 'therm_thrsh1/2/3' register fields at the end of this 
array because 'mvflash_4ch_regs' doesn't include a 'therm_thrsh3' 
register. Placing the 'therm_thrshx' registers in the middle would 
require creating a placeholder, which I couldn't figure out how to do 
effectively. Do you have any suggestions?
>
>
>>   	REG_FIELD(0x56, 0, 2),			/* therm_thrsh1 */
>>   	REG_FIELD(0x57, 0, 2),			/* therm_thrsh2 */
>>   	REG_FIELD(0x58, 0, 2),			/* therm_thrsh3 */
>> @@ -142,6 +144,7 @@ static const struct reg_field mvflash_4ch_regs[REG_MAX_COUNT] = {
>>   	REG_FIELD(0x49, 0, 3),			/* iresolution	*/
>>   	REG_FIELD_ID(0x4a, 0, 6, 4, 1),		/* chan_strobe	*/
>>   	REG_FIELD(0x4e, 0, 3),			/* chan_en	*/
>> +	REG_FIELD(0xed, 0, 6),			/* torch_clamp	*/
>>   	REG_FIELD(0x7a, 0, 2),			/* therm_thrsh1 */
>>   	REG_FIELD(0x78, 0, 2),			/* therm_thrsh2 */
>>   };
>> @@ -156,6 +159,7 @@ struct qcom_flash_data {
>>   	u8			max_channels;
>>   	u8			chan_en_bits;
>>   	u8			revision;
>> +	u8			torch_clamp;
>>   };
>>   
>>   struct qcom_flash_led {
>> @@ -702,6 +706,7 @@ static int qcom_flash_register_led_device(struct device *dev,
>>   	u32 current_ua, timeout_us;
>>   	u32 channels[4];
>>   	int i, rc, count;
>> +	u8 torch_clamp;
>>   
>>   	count = fwnode_property_count_u32(node, "led-sources");
>>   	if (count <= 0) {
>> @@ -751,6 +756,12 @@ static int qcom_flash_register_led_device(struct device *dev,
>>   	current_ua = min_t(u32, current_ua, TORCH_CURRENT_MAX_UA * led->chan_count);
>>   	led->max_torch_current_ma = current_ua / UA_PER_MA;
>>   
>> +	torch_clamp = (current_ua / led->chan_count) / TORCH_IRES_UA;
>> +	if (torch_clamp != 0)
>> +		torch_clamp--;
> In case anyone's wondering, ((1<<6) + 1) 4 * 5000 == 1280000 which we set
> on some (all?) devices
>
> Konrad

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/2] leds: flash: leds-qcom-flash: update torch current clamp setting
  2025-07-28  2:27     ` Fenglin Wu
@ 2025-07-28  9:18       ` Konrad Dybcio
  0 siblings, 0 replies; 8+ messages in thread
From: Konrad Dybcio @ 2025-07-28  9:18 UTC (permalink / raw)
  To: Fenglin Wu, kernel, Lee Jones, Pavel Machek, Fenglin Wu
  Cc: Subbaraman Narayanamurthy, linux-leds, linux-kernel

On 7/28/25 4:27 AM, Fenglin Wu wrote:
> 
> On 7/25/2025 8:37 PM, Konrad Dybcio wrote:
>> On 7/25/25 12:04 PM, 'Fenglin Wu via B4 Relay' via kernel wrote:
>>> From: Fenglin Wu <fenglin.wu@oss.qualcomm.com>
>>>
>>> There is a register to clamp the flash current per LED channel when
>>> safety timer is disabled. It needs to be updated according to the
>>> maximum torch LED current setting to ensure the torch current won't
>>> be clamped unexpectedly.
>>>
>>> Fixes: 96a2e242a5dc ("leds: flash: Add driver to support flash LED module in QCOM PMICs")
>>> Signed-off-by: Fenglin Wu <fenglin.wu@oss.qualcomm.com>
>>> ---
>>>   drivers/leds/flash/leds-qcom-flash.c | 16 +++++++++++++---
>>>   1 file changed, 13 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/drivers/leds/flash/leds-qcom-flash.c b/drivers/leds/flash/leds-qcom-flash.c
>>> index 89cf5120f5d55bbb7e24faa8c3a946416f8fed46..9c2e41cfddcf2d50d5a633cb157084371a631d74 100644
>>> --- a/drivers/leds/flash/leds-qcom-flash.c
>>> +++ b/drivers/leds/flash/leds-qcom-flash.c
>>> @@ -1,6 +1,6 @@
>>>   // SPDX-License-Identifier: GPL-2.0-only
>>>   /*
>>> - * Copyright (c) 2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved.
>>> + * Copyright (c) 2022, 2024-2025 Qualcomm Innovation Center, Inc. All rights reserved.
>>>    */
>>>     #include <linux/bitfield.h>
>>> @@ -111,6 +111,7 @@ enum {
>>>       REG_IRESOLUTION,
>>>       REG_CHAN_STROBE,
>>>       REG_CHAN_EN,
>>> +    REG_TORCH_CLAMP,
>> This is not the name of this register on at least PM8150L
> The register is referred to as 'TIMER_DISA_MITIGATION_CLAMP' in the documentation. 'TIMER_DISA' indicates the flash module operating in torch mode. We can remove 'MITIGATION' to create a shorter name for the enum.>>
>>>       REG_THERM_THRSH1,
>>>       REG_THERM_THRSH2,
>>>       REG_THERM_THRSH3,
>>> @@ -127,6 +128,7 @@ static const struct reg_field mvflash_3ch_regs[REG_MAX_COUNT] = {
>>>       REG_FIELD(0x47, 0, 5),                  /* iresolution    */
>>>       REG_FIELD_ID(0x49, 0, 2, 3, 1),         /* chan_strobe    */
>>>       REG_FIELD(0x4c, 0, 2),                  /* chan_en    */
>>> +    REG_FIELD(0xec, 0, 6),            /* torch_clamp    */
>> Please keep it sorted by address
> I need to keep the 'therm_thrsh1/2/3' register fields at the end of this array because 'mvflash_4ch_regs' doesn't include a 'therm_thrsh3' register. Placing the 'therm_thrshx' registers in the middle would require creating a placeholder, which I couldn't figure out how to do effectively. Do you have any suggestions?

Designated initializers (i.e. [REG_CHAN_EN] = REG_FIELD(...),)

Konrad

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2025-07-28  9:18 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-25 10:04 [PATCH 0/2] leds: flash: leds-qcom-flash: update torch current clamp setting Fenglin Wu via B4 Relay
2025-07-25 10:04 ` [PATCH 1/2] " Fenglin Wu via B4 Relay
2025-07-25 12:37   ` Konrad Dybcio
2025-07-25 12:45     ` Konrad Dybcio
2025-07-28  2:27     ` Fenglin Wu
2025-07-28  9:18       ` Konrad Dybcio
2025-07-25 10:04 ` [PATCH 2/2] leds: flash: leds-qcom-flash: add a separate register map for PMI8998 Fenglin Wu via B4 Relay
2025-07-25 12:42   ` Konrad Dybcio

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).