* [PATCH v2] staging: sm750fb: replace magic number with jiffies timeout
@ 2026-01-27 15:40 Madhumitha Sundar
2026-01-28 11:55 ` Dan Carpenter
0 siblings, 1 reply; 5+ messages in thread
From: Madhumitha Sundar @ 2026-01-27 15:40 UTC (permalink / raw)
To: sudipm.mukherjee, teddy.wang, gregkh
Cc: linux-fbdev, linux-staging, linux-kernel, Madhumitha Sundar
The hardware wait loop in hw_sm750_de_wait used a hardcoded loop
counter (0x10000000), which depends on CPU speed and is unreliable.
Replace the loop counter with a jiffies-based timeout (1 second)
using time_before(). This ensures consistent delays across architectures.
Signed-off-by: Madhumitha Sundar <madhuananda18@gmail.com>
---
Changes in v2:
- Switched from loop counter to jiffies + cpu_relax() as requested by Greg KH.
---
drivers/staging/sm750fb/sm750_hw.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/staging/sm750fb/sm750_hw.c b/drivers/staging/sm750fb/sm750_hw.c
index ce46f240c..b24d27a77 100644
--- a/drivers/staging/sm750fb/sm750_hw.c
+++ b/drivers/staging/sm750fb/sm750_hw.c
@@ -523,19 +523,32 @@ int hw_sm750le_de_wait(void)
int hw_sm750_de_wait(void)
{
- int i = 0x10000000;
+ /* Wait for 1 second (HZ) */
+ unsigned long timeout = jiffies + HZ;
unsigned int mask = SYSTEM_CTRL_DE_STATUS_BUSY |
SYSTEM_CTRL_DE_FIFO_EMPTY |
SYSTEM_CTRL_DE_MEM_FIFO_EMPTY;
+ unsigned int val;
- while (i--) {
- unsigned int val = peek32(SYSTEM_CTRL);
+ /* Run while Current Time is BEFORE the Deadline */
+ while (time_before(jiffies, timeout)) {
+ val = peek32(SYSTEM_CTRL);
+ /* If Not Busy (0) AND Buffers Empty (1), we are good */
if ((val & mask) ==
(SYSTEM_CTRL_DE_FIFO_EMPTY | SYSTEM_CTRL_DE_MEM_FIFO_EMPTY))
return 0;
+
+ /* Polite pause to save power */
+ cpu_relax();
}
- /* timeout error */
+
+ /* Final check in case we succeeded at the last millisecond */
+ val = peek32(SYSTEM_CTRL);
+ if ((val & mask) ==
+ (SYSTEM_CTRL_DE_FIFO_EMPTY | SYSTEM_CTRL_DE_MEM_FIFO_EMPTY))
+ return 0;
+
return -1;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH v2] staging: sm750fb: replace magic number with jiffies timeout
2026-01-27 15:40 [PATCH v2] staging: sm750fb: replace magic number with jiffies timeout Madhumitha Sundar
@ 2026-01-28 11:55 ` Dan Carpenter
0 siblings, 0 replies; 5+ messages in thread
From: Dan Carpenter @ 2026-01-28 11:55 UTC (permalink / raw)
To: Madhumitha Sundar
Cc: sudipm.mukherjee, teddy.wang, gregkh, linux-fbdev, linux-staging,
linux-kernel
On Tue, Jan 27, 2026 at 03:40:56PM +0000, Madhumitha Sundar wrote:
> The hardware wait loop in hw_sm750_de_wait used a hardcoded loop
> counter (0x10000000), which depends on CPU speed and is unreliable.
>
> Replace the loop counter with a jiffies-based timeout (1 second)
> using time_before(). This ensures consistent delays across architectures.
>
> Signed-off-by: Madhumitha Sundar <madhuananda18@gmail.com>
> ---
This feels like an AI patch? AI patches need to be disclosed.
Anyway, we couldn't merge something like this without testing.
regards,
dan carpenter
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2] staging: sm750fb: make fix_id array fully const
@ 2026-01-27 16:48 Madhumitha Sundar
2026-01-27 16:48 ` [PATCH v2] staging: sm750fb: replace magic number with jiffies timeout Madhumitha Sundar
0 siblings, 1 reply; 5+ messages in thread
From: Madhumitha Sundar @ 2026-01-27 16:48 UTC (permalink / raw)
To: gregkh; +Cc: linux-staging, linux-kernel, Madhumitha Sundar
The fix_id array contains constant string literals, but the array itself
is currently mutable. Make the array const so that the compiler can
place it in the .rodata section.
This fixes the checkpatch warning:
static const char * array should probably be static const char * const
Signed-off-by: Madhumitha Sundar <madhuananda18@gmail.com>
---
drivers/staging/sm750fb/sm750.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/staging/sm750fb/sm750.c b/drivers/staging/sm750fb/sm750.c
index d100b9e1d3d5..092cfbadada4 100644
--- a/drivers/staging/sm750fb/sm750.c
+++ b/drivers/staging/sm750fb/sm750.c
@@ -740,7 +740,7 @@ static int lynxfb_set_fbinfo(struct fb_info *info, int index)
"kernel HELPERS prepared vesa_modes",
};
- static const char *fix_id[2] = {
+ static const char * const fix_id[2] = {
"sm750_fb1", "sm750_fb2",
};
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH v2] staging: sm750fb: replace magic number with jiffies timeout
2026-01-27 16:48 [PATCH v2] staging: sm750fb: make fix_id array fully const Madhumitha Sundar
@ 2026-01-27 16:48 ` Madhumitha Sundar
2026-01-28 5:57 ` Greg KH
0 siblings, 1 reply; 5+ messages in thread
From: Madhumitha Sundar @ 2026-01-27 16:48 UTC (permalink / raw)
To: gregkh; +Cc: linux-staging, linux-kernel, Madhumitha Sundar
The hardware wait loop in hw_sm750_de_wait used a hardcoded loop
counter (0x10000000), which depends on CPU speed and is unreliable.
Replace the loop counter with a jiffies-based timeout (1 second)
using time_before(). This ensures consistent delays across architectures.
Signed-off-by: Madhumitha Sundar <madhuananda18@gmail.com>
---
Changes in v2:
- Switched from loop counter to jiffies + cpu_relax() as requested by Greg KH.
---
drivers/staging/sm750fb/sm750_hw.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/staging/sm750fb/sm750_hw.c b/drivers/staging/sm750fb/sm750_hw.c
index ce46f240c..b24d27a77 100644
--- a/drivers/staging/sm750fb/sm750_hw.c
+++ b/drivers/staging/sm750fb/sm750_hw.c
@@ -523,19 +523,32 @@ int hw_sm750le_de_wait(void)
int hw_sm750_de_wait(void)
{
- int i = 0x10000000;
+ /* Wait for 1 second (HZ) */
+ unsigned long timeout = jiffies + HZ;
unsigned int mask = SYSTEM_CTRL_DE_STATUS_BUSY |
SYSTEM_CTRL_DE_FIFO_EMPTY |
SYSTEM_CTRL_DE_MEM_FIFO_EMPTY;
+ unsigned int val;
- while (i--) {
- unsigned int val = peek32(SYSTEM_CTRL);
+ /* Run while Current Time is BEFORE the Deadline */
+ while (time_before(jiffies, timeout)) {
+ val = peek32(SYSTEM_CTRL);
+ /* If Not Busy (0) AND Buffers Empty (1), we are good */
if ((val & mask) ==
(SYSTEM_CTRL_DE_FIFO_EMPTY | SYSTEM_CTRL_DE_MEM_FIFO_EMPTY))
return 0;
+
+ /* Polite pause to save power */
+ cpu_relax();
}
- /* timeout error */
+
+ /* Final check in case we succeeded at the last millisecond */
+ val = peek32(SYSTEM_CTRL);
+ if ((val & mask) ==
+ (SYSTEM_CTRL_DE_FIFO_EMPTY | SYSTEM_CTRL_DE_MEM_FIFO_EMPTY))
+ return 0;
+
return -1;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH v2] staging: sm750fb: replace magic number with jiffies timeout
2026-01-27 16:48 ` [PATCH v2] staging: sm750fb: replace magic number with jiffies timeout Madhumitha Sundar
@ 2026-01-28 5:57 ` Greg KH
[not found] ` <CAPn_1uMTAJYCWE08qd-abag77pDUu52yFsNu_x5=zGPL5b8n+g@mail.gmail.com>
0 siblings, 1 reply; 5+ messages in thread
From: Greg KH @ 2026-01-28 5:57 UTC (permalink / raw)
To: Madhumitha Sundar; +Cc: linux-staging, linux-kernel
On Tue, Jan 27, 2026 at 04:48:16PM +0000, Madhumitha Sundar wrote:
> The hardware wait loop in hw_sm750_de_wait used a hardcoded loop
> counter (0x10000000), which depends on CPU speed and is unreliable.
>
> Replace the loop counter with a jiffies-based timeout (1 second)
> using time_before(). This ensures consistent delays across architectures.
>
> Signed-off-by: Madhumitha Sundar <madhuananda18@gmail.com>
> ---
> Changes in v2:
> - Switched from loop counter to jiffies + cpu_relax() as requested by Greg KH.
> ---
> drivers/staging/sm750fb/sm750_hw.c | 21 +++++++++++++++++----
> 1 file changed, 17 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/staging/sm750fb/sm750_hw.c b/drivers/staging/sm750fb/sm750_hw.c
> index ce46f240c..b24d27a77 100644
> --- a/drivers/staging/sm750fb/sm750_hw.c
> +++ b/drivers/staging/sm750fb/sm750_hw.c
> @@ -523,19 +523,32 @@ int hw_sm750le_de_wait(void)
>
> int hw_sm750_de_wait(void)
> {
> - int i = 0x10000000;
> + /* Wait for 1 second (HZ) */
No need for a comment, right?
> + unsigned long timeout = jiffies + HZ;
Why is a variable needed?
And are you sure 1 second is ok? How short was the original timeout?
> unsigned int mask = SYSTEM_CTRL_DE_STATUS_BUSY |
> SYSTEM_CTRL_DE_FIFO_EMPTY |
> SYSTEM_CTRL_DE_MEM_FIFO_EMPTY;
> + unsigned int val;
Why move this?
> - while (i--) {
> - unsigned int val = peek32(SYSTEM_CTRL);
> + /* Run while Current Time is BEFORE the Deadline */
Run what?
> + while (time_before(jiffies, timeout)) {
> + val = peek32(SYSTEM_CTRL);
>
> + /* If Not Busy (0) AND Buffers Empty (1), we are good */
> if ((val & mask) ==
> (SYSTEM_CTRL_DE_FIFO_EMPTY | SYSTEM_CTRL_DE_MEM_FIFO_EMPTY))
> return 0;
> +
> + /* Polite pause to save power */
> + cpu_relax();
Are you sure you can sleep here?
> }
> - /* timeout error */
> +
> + /* Final check in case we succeeded at the last millisecond */
I do not understand this, why would this matter?
> + val = peek32(SYSTEM_CTRL);
> + if ((val & mask) ==
> + (SYSTEM_CTRL_DE_FIFO_EMPTY | SYSTEM_CTRL_DE_MEM_FIFO_EMPTY))
> + return 0;
> +
Was this tested on real hardware?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-01-28 11:55 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-27 15:40 [PATCH v2] staging: sm750fb: replace magic number with jiffies timeout Madhumitha Sundar
2026-01-28 11:55 ` Dan Carpenter
-- strict thread matches above, loose matches on Subject: below --
2026-01-27 16:48 [PATCH v2] staging: sm750fb: make fix_id array fully const Madhumitha Sundar
2026-01-27 16:48 ` [PATCH v2] staging: sm750fb: replace magic number with jiffies timeout Madhumitha Sundar
2026-01-28 5:57 ` Greg KH
[not found] ` <CAPn_1uMTAJYCWE08qd-abag77pDUu52yFsNu_x5=zGPL5b8n+g@mail.gmail.com>
2026-01-28 10:31 ` Greg KH
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox