diff mbox series

[v2,1/1] timer: dw-apb: fix compiler warnings

Message ID 20200826202905.11358-1-xypron.glpk@gmx.de
State Accepted, archived
Delegated to: Marek Vasut
Headers show
Series [v2,1/1] timer: dw-apb: fix compiler warnings | expand

Commit Message

Heinrich Schuchardt Aug. 26, 2020, 8:29 p.m. UTC
readl() and writel() expect void *. Do not pass an integer value.

Remove unused include asm/arch/timer.h.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Bin Meng <bin.meng@windriver.com>
---
v2:
	correct typo in commit message
---
 drivers/timer/dw-apb-timer.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

--
2.27.0

Comments

Sean Anderson Aug. 26, 2020, 9:13 p.m. UTC | #1
On 8/26/20 4:29 PM, Heinrich Schuchardt wrote:
> readl() and writel() expect void *. Do not pass an integer value.
> 
> Remove unused include asm/arch/timer.h.
> 
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> Reviewed-by: Bin Meng <bin.meng@windriver.com>
> ---
> v2:
> 	correct typo in commit message
> ---
>  drivers/timer/dw-apb-timer.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/timer/dw-apb-timer.c b/drivers/timer/dw-apb-timer.c
> index 35271b20c8..c8be4417fd 100644
> --- a/drivers/timer/dw-apb-timer.c
> +++ b/drivers/timer/dw-apb-timer.c
> @@ -14,7 +14,6 @@
>  #include <dm/device_compat.h>
> 
>  #include <asm/io.h>
> -#include <asm/arch/timer.h>
> 
>  #define DW_APB_LOAD_VAL		0x0
>  #define DW_APB_CURR_VAL		0x4
> @@ -34,7 +33,7 @@ static int dw_apb_timer_get_count(struct udevice *dev, u64 *count)
>  	 * requires the count to be incrementing. Invert the
>  	 * result.
>  	 */
> -	*count = timer_conv_64(~readl(priv->regs + DW_APB_CURR_VAL));
> +	*count = timer_conv_64(~readl((void *)(priv->regs + DW_APB_CURR_VAL)));

How about changing the type of priv.regs to void * and using
dev_read_addr_ptr instead of dev_read_addr in probe?

> 
>  	return 0;
>  }
> @@ -61,8 +60,8 @@ static int dw_apb_timer_probe(struct udevice *dev)
>  	clk_free(&clk);
> 
>  	/* init timer */
> -	writel(0xffffffff, priv->regs + DW_APB_LOAD_VAL);
> -	writel(0xffffffff, priv->regs + DW_APB_CURR_VAL);
> +	writel(0xffffffff, (void *)(priv->regs + DW_APB_LOAD_VAL));
> +	writel(0xffffffff, (void *)(priv->regs + DW_APB_CURR_VAL));
>  	setbits_le32(priv->regs + DW_APB_CTRL, 0x3);
> 
>  	return 0;
> --
> 2.27.0
>
Heinrich Schuchardt Aug. 27, 2020, 3:35 a.m. UTC | #2
Am 26. August 2020 23:13:01 MESZ schrieb Sean Anderson <seanga2@gmail.com>:
>On 8/26/20 4:29 PM, Heinrich Schuchardt wrote:
>> readl() and writel() expect void *. Do not pass an integer value.
>> 
>> Remove unused include asm/arch/timer.h.
>> 
>> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
>> Reviewed-by: Bin Meng <bin.meng@windriver.com> 
>> ---
>> v2:
>> 	correct typo in commit message
>> ---
>>  drivers/timer/dw-apb-timer.c | 7 +++----
>>  1 file changed, 3 insertions(+), 4 deletions(-)
>> 
>> diff --git a/drivers/timer/dw-apb-timer.c
>b/drivers/timer/dw-apb-timer.c
>> index 35271b20c8..c8be4417fd 100644
>> --- a/drivers/timer/dw-apb-timer.c
>> +++ b/drivers/timer/dw-apb-timer.c
>> @@ -14,7 +14,6 @@
>>  #include <dm/device_compat.h>
>> 
>>  #include <asm/io.h>
>> -#include <asm/arch/timer.h>
>> 
>>  #define DW_APB_LOAD_VAL		0x0
>>  #define DW_APB_CURR_VAL		0x4
>> @@ -34,7 +33,7 @@ static int dw_apb_timer_get_count(struct udevice
>*dev, u64 *count)
>>  	 * requires the count to be incrementing. Invert the
>>  	 * result.
>>  	 */
>> -	*count = timer_conv_64(~readl(priv->regs + DW_APB_CURR_VAL));
>> +	*count = timer_conv_64(~readl((void *)(priv->regs +
>DW_APB_CURR_VAL)));
>
>How about changing the type of priv.regs to void * and using
>dev_read_addr_ptr instead of dev_read_addr in probe?

Adding to void* results undefined behavior in C. I know gcc currently supports it, but that does not make it recommendable.

If you wanted to change the type, you could use u8*.

A cleaner way would be to change regs to a pointer to a structure with all registers and to eliminate the offsets.

@Marek
Which way do you want it?

Best regards

Heinrich

>
>> 
>>  	return 0;
>>  }
>> @@ -61,8 +60,8 @@ static int dw_apb_timer_probe(struct udevice *dev)
>>  	clk_free(&clk);
>> 
>>  	/* init timer */
>> -	writel(0xffffffff, priv->regs + DW_APB_LOAD_VAL);
>> -	writel(0xffffffff, priv->regs + DW_APB_CURR_VAL);
>> +	writel(0xffffffff, (void *)(priv->regs + DW_APB_LOAD_VAL));
>> +	writel(0xffffffff, (void *)(priv->regs + DW_APB_CURR_VAL));
>>  	setbits_le32(priv->regs + DW_APB_CTRL, 0x3);
>> 
>>  	return 0;
>> --
>> 2.27.0
>>
Heinrich Schuchardt Feb. 18, 2021, 9:12 a.m. UTC | #3
On 27.08.20 05:35, Heinrich Schuchardt wrote:
> Am 26. August 2020 23:13:01 MESZ schrieb Sean Anderson <seanga2@gmail.com>:
>> On 8/26/20 4:29 PM, Heinrich Schuchardt wrote:
>>> readl() and writel() expect void *. Do not pass an integer value.
>>>
>>> Remove unused include asm/arch/timer.h.
>>>
>>> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
>>> Reviewed-by: Bin Meng <bin.meng@windriver.com>
>>> ---
>>> v2:
>>> 	correct typo in commit message
>>> ---
>>>  drivers/timer/dw-apb-timer.c | 7 +++----
>>>  1 file changed, 3 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/drivers/timer/dw-apb-timer.c
>> b/drivers/timer/dw-apb-timer.c
>>> index 35271b20c8..c8be4417fd 100644
>>> --- a/drivers/timer/dw-apb-timer.c
>>> +++ b/drivers/timer/dw-apb-timer.c
>>> @@ -14,7 +14,6 @@
>>>  #include <dm/device_compat.h>
>>>
>>>  #include <asm/io.h>
>>> -#include <asm/arch/timer.h>
>>>
>>>  #define DW_APB_LOAD_VAL		0x0
>>>  #define DW_APB_CURR_VAL		0x4
>>> @@ -34,7 +33,7 @@ static int dw_apb_timer_get_count(struct udevice
>> *dev, u64 *count)
>>>  	 * requires the count to be incrementing. Invert the
>>>  	 * result.
>>>  	 */
>>> -	*count = timer_conv_64(~readl(priv->regs + DW_APB_CURR_VAL));
>>> +	*count = timer_conv_64(~readl((void *)(priv->regs +
>> DW_APB_CURR_VAL)));
>>
>> How about changing the type of priv.regs to void * and using
>> dev_read_addr_ptr instead of dev_read_addr in probe?
>
> Adding to void* results in undefined behavior in C. I know gcc currently supports it, but that does not make it recommendable.
>
> If you wanted to change the type, you could use u8*.
>
> A cleaner way would be to change regs to a pointer to a structure with all registers and to eliminate the offsets.
>
> @Marek
> Which way do you want it?

Hello Marek,

What are your thoughts?

Best regards

Heinrich
>
>>
>>>
>>>  	return 0;
>>>  }
>>> @@ -61,8 +60,8 @@ static int dw_apb_timer_probe(struct udevice *dev)
>>>  	clk_free(&clk);
>>>
>>>  	/* init timer */
>>> -	writel(0xffffffff, priv->regs + DW_APB_LOAD_VAL);
>>> -	writel(0xffffffff, priv->regs + DW_APB_CURR_VAL);
>>> +	writel(0xffffffff, (void *)(priv->regs + DW_APB_LOAD_VAL));
>>> +	writel(0xffffffff, (void *)(priv->regs + DW_APB_CURR_VAL));
>>>  	setbits_le32(priv->regs + DW_APB_CTRL, 0x3);
>>>
>>>  	return 0;
>>> --
>>> 2.27.0
>>>
>
diff mbox series

Patch

diff --git a/drivers/timer/dw-apb-timer.c b/drivers/timer/dw-apb-timer.c
index 35271b20c8..c8be4417fd 100644
--- a/drivers/timer/dw-apb-timer.c
+++ b/drivers/timer/dw-apb-timer.c
@@ -14,7 +14,6 @@ 
 #include <dm/device_compat.h>

 #include <asm/io.h>
-#include <asm/arch/timer.h>

 #define DW_APB_LOAD_VAL		0x0
 #define DW_APB_CURR_VAL		0x4
@@ -34,7 +33,7 @@  static int dw_apb_timer_get_count(struct udevice *dev, u64 *count)
 	 * requires the count to be incrementing. Invert the
 	 * result.
 	 */
-	*count = timer_conv_64(~readl(priv->regs + DW_APB_CURR_VAL));
+	*count = timer_conv_64(~readl((void *)(priv->regs + DW_APB_CURR_VAL)));

 	return 0;
 }
@@ -61,8 +60,8 @@  static int dw_apb_timer_probe(struct udevice *dev)
 	clk_free(&clk);

 	/* init timer */
-	writel(0xffffffff, priv->regs + DW_APB_LOAD_VAL);
-	writel(0xffffffff, priv->regs + DW_APB_CURR_VAL);
+	writel(0xffffffff, (void *)(priv->regs + DW_APB_LOAD_VAL));
+	writel(0xffffffff, (void *)(priv->regs + DW_APB_CURR_VAL));
 	setbits_le32(priv->regs + DW_APB_CTRL, 0x3);

 	return 0;