diff mbox series

[v2,2/2] dmaengine: fsl-edma: use _Generic to handle difference type

Message ID 20240209213606.367025-2-Frank.Li@nxp.com (mailing list archive)
State Superseded
Headers show
Series [v2,1/2] dmaengine: fsl-edma: add trace event support | expand

Commit Message

Frank Li Feb. 9, 2024, 9:36 p.m. UTC
Introduce the use of C11 standard _Generic in the fsl-edma driver for
handling different TCD field types. Improve code clarity and help
compiler optimization.

Signed-off-by: Frank Li <Frank.Li@nxp.com>
---

Notes:
    Change from v1 to v2
    - Fixed sparse build warnings

 drivers/dma/fsl-edma-common.h | 61 +++++++++++++----------------------
 1 file changed, 22 insertions(+), 39 deletions(-)

Comments

Frank Li April 9, 2024, 4:33 p.m. UTC | #1
On Fri, Feb 09, 2024 at 04:36:04PM -0500, Frank Li wrote:
> Introduce the use of C11 standard _Generic in the fsl-edma driver for
> handling different TCD field types. Improve code clarity and help
> compiler optimization.
> 
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
> ---

Vinod:
	Do you have chance to check these two patches?

Frank

> 
> Notes:
>     Change from v1 to v2
>     - Fixed sparse build warnings
> 
>  drivers/dma/fsl-edma-common.h | 61 +++++++++++++----------------------
>  1 file changed, 22 insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/dma/fsl-edma-common.h b/drivers/dma/fsl-edma-common.h
> index 365affd5b0764..cb3e0f00c80eb 100644
> --- a/drivers/dma/fsl-edma-common.h
> +++ b/drivers/dma/fsl-edma-common.h
> @@ -255,12 +255,11 @@ static inline u32 fsl_edma_drvflags(struct fsl_edma_chan *fsl_chan)
>  }
>  
>  #define edma_read_tcdreg_c(chan, _tcd,  __name)				\
> -(sizeof((_tcd)->__name) == sizeof(u64) ?				\
> -	edma_readq(chan->edma, &(_tcd)->__name) :			\
> -		((sizeof((_tcd)->__name) == sizeof(u32)) ?		\
> -			edma_readl(chan->edma, &(_tcd)->__name) :	\
> -			edma_readw(chan->edma, &(_tcd)->__name)		\
> -		))
> +_Generic(((_tcd)->__name),						\
> +	__iomem __le64 : edma_readq(chan->edma, &(_tcd)->__name),		\
> +	__iomem __le32 : edma_readl(chan->edma, &(_tcd)->__name),		\
> +	__iomem __le16 : edma_readw(chan->edma, &(_tcd)->__name)		\
> +	)
>  
>  #define edma_read_tcdreg(chan, __name)								\
>  ((fsl_edma_drvflags(chan) & FSL_EDMA_DRV_TCD64) ?						\
> @@ -268,23 +267,13 @@ static inline u32 fsl_edma_drvflags(struct fsl_edma_chan *fsl_chan)
>  	edma_read_tcdreg_c(chan, ((struct fsl_edma_hw_tcd __iomem *)chan->tcd), __name)		\
>  )
>  
> -#define edma_write_tcdreg_c(chan, _tcd, _val, __name)				\
> -do {										\
> -	switch (sizeof(_tcd->__name)) {						\
> -	case sizeof(u64):							\
> -		edma_writeq(chan->edma, (u64 __force)_val, &_tcd->__name);	\
> -		break;								\
> -	case sizeof(u32):							\
> -		edma_writel(chan->edma, (u32 __force)_val, &_tcd->__name);	\
> -		break;								\
> -	case sizeof(u16):							\
> -		edma_writew(chan->edma, (u16 __force)_val, &_tcd->__name);	\
> -		break;								\
> -	case sizeof(u8):							\
> -		edma_writeb(chan->edma, (u8 __force)_val, &_tcd->__name);	\
> -		break;								\
> -	}									\
> -} while (0)
> +#define edma_write_tcdreg_c(chan, _tcd, _val, __name)					\
> +_Generic((_tcd->__name),								\
> +	__iomem __le64 : edma_writeq(chan->edma, (u64 __force)(_val), &_tcd->__name),	\
> +	__iomem __le32 : edma_writel(chan->edma, (u32 __force)(_val), &_tcd->__name),	\
> +	__iomem __le16 : edma_writew(chan->edma, (u16 __force)(_val), &_tcd->__name),	\
> +	__iomem u8 : edma_writeb(chan->edma, _val, &_tcd->__name)			\
> +	)
>  
>  #define edma_write_tcdreg(chan, val, __name)							   \
>  do {												   \
> @@ -325,9 +314,11 @@ do {	\
>  						 (((struct fsl_edma_hw_tcd *)_tcd)->_field))
>  
>  #define fsl_edma_le_to_cpu(x)						\
> -(sizeof(x) == sizeof(u64) ? le64_to_cpu((__force __le64)(x)) :		\
> -	(sizeof(x) == sizeof(u32) ? le32_to_cpu((__force __le32)(x)) :	\
> -				    le16_to_cpu((__force __le16)(x))))
> +_Generic((x),								\
> +	__le64 : le64_to_cpu((x)),					\
> +	__le32 : le32_to_cpu((x)),					\
> +	__le16 : le16_to_cpu((x))					\
> +)
>  
>  #define fsl_edma_get_tcd_to_cpu(_chan, _tcd, _field)				\
>  (fsl_edma_drvflags(_chan) & FSL_EDMA_DRV_TCD64 ?				\
> @@ -335,19 +326,11 @@ do {	\
>  	fsl_edma_le_to_cpu(((struct fsl_edma_hw_tcd *)_tcd)->_field))
>  
>  #define fsl_edma_set_tcd_to_le_c(_tcd, _val, _field)					\
> -do {											\
> -	switch (sizeof((_tcd)->_field)) {						\
> -	case sizeof(u64):								\
> -		*(__force __le64 *)(&((_tcd)->_field)) = cpu_to_le64(_val);		\
> -		break;									\
> -	case sizeof(u32):								\
> -		*(__force __le32 *)(&((_tcd)->_field)) = cpu_to_le32(_val);		\
> -		break;									\
> -	case sizeof(u16):								\
> -		*(__force __le16 *)(&((_tcd)->_field)) = cpu_to_le16(_val);		\
> -		break;									\
> -	}										\
> -} while (0)
> +_Generic(((_tcd)->_field),								\
> +	__le64 : (_tcd)->_field = cpu_to_le64(_val),					\
> +	__le32 : (_tcd)->_field = cpu_to_le32(_val),					\
> +	__le16 : (_tcd)->_field = cpu_to_le16(_val)					\
> +)
>  
>  #define fsl_edma_set_tcd_to_le(_chan, _tcd, _val, _field)	\
>  do {								\
> -- 
> 2.34.1
>
diff mbox series

Patch

diff --git a/drivers/dma/fsl-edma-common.h b/drivers/dma/fsl-edma-common.h
index 365affd5b0764..cb3e0f00c80eb 100644
--- a/drivers/dma/fsl-edma-common.h
+++ b/drivers/dma/fsl-edma-common.h
@@ -255,12 +255,11 @@  static inline u32 fsl_edma_drvflags(struct fsl_edma_chan *fsl_chan)
 }
 
 #define edma_read_tcdreg_c(chan, _tcd,  __name)				\
-(sizeof((_tcd)->__name) == sizeof(u64) ?				\
-	edma_readq(chan->edma, &(_tcd)->__name) :			\
-		((sizeof((_tcd)->__name) == sizeof(u32)) ?		\
-			edma_readl(chan->edma, &(_tcd)->__name) :	\
-			edma_readw(chan->edma, &(_tcd)->__name)		\
-		))
+_Generic(((_tcd)->__name),						\
+	__iomem __le64 : edma_readq(chan->edma, &(_tcd)->__name),		\
+	__iomem __le32 : edma_readl(chan->edma, &(_tcd)->__name),		\
+	__iomem __le16 : edma_readw(chan->edma, &(_tcd)->__name)		\
+	)
 
 #define edma_read_tcdreg(chan, __name)								\
 ((fsl_edma_drvflags(chan) & FSL_EDMA_DRV_TCD64) ?						\
@@ -268,23 +267,13 @@  static inline u32 fsl_edma_drvflags(struct fsl_edma_chan *fsl_chan)
 	edma_read_tcdreg_c(chan, ((struct fsl_edma_hw_tcd __iomem *)chan->tcd), __name)		\
 )
 
-#define edma_write_tcdreg_c(chan, _tcd, _val, __name)				\
-do {										\
-	switch (sizeof(_tcd->__name)) {						\
-	case sizeof(u64):							\
-		edma_writeq(chan->edma, (u64 __force)_val, &_tcd->__name);	\
-		break;								\
-	case sizeof(u32):							\
-		edma_writel(chan->edma, (u32 __force)_val, &_tcd->__name);	\
-		break;								\
-	case sizeof(u16):							\
-		edma_writew(chan->edma, (u16 __force)_val, &_tcd->__name);	\
-		break;								\
-	case sizeof(u8):							\
-		edma_writeb(chan->edma, (u8 __force)_val, &_tcd->__name);	\
-		break;								\
-	}									\
-} while (0)
+#define edma_write_tcdreg_c(chan, _tcd, _val, __name)					\
+_Generic((_tcd->__name),								\
+	__iomem __le64 : edma_writeq(chan->edma, (u64 __force)(_val), &_tcd->__name),	\
+	__iomem __le32 : edma_writel(chan->edma, (u32 __force)(_val), &_tcd->__name),	\
+	__iomem __le16 : edma_writew(chan->edma, (u16 __force)(_val), &_tcd->__name),	\
+	__iomem u8 : edma_writeb(chan->edma, _val, &_tcd->__name)			\
+	)
 
 #define edma_write_tcdreg(chan, val, __name)							   \
 do {												   \
@@ -325,9 +314,11 @@  do {	\
 						 (((struct fsl_edma_hw_tcd *)_tcd)->_field))
 
 #define fsl_edma_le_to_cpu(x)						\
-(sizeof(x) == sizeof(u64) ? le64_to_cpu((__force __le64)(x)) :		\
-	(sizeof(x) == sizeof(u32) ? le32_to_cpu((__force __le32)(x)) :	\
-				    le16_to_cpu((__force __le16)(x))))
+_Generic((x),								\
+	__le64 : le64_to_cpu((x)),					\
+	__le32 : le32_to_cpu((x)),					\
+	__le16 : le16_to_cpu((x))					\
+)
 
 #define fsl_edma_get_tcd_to_cpu(_chan, _tcd, _field)				\
 (fsl_edma_drvflags(_chan) & FSL_EDMA_DRV_TCD64 ?				\
@@ -335,19 +326,11 @@  do {	\
 	fsl_edma_le_to_cpu(((struct fsl_edma_hw_tcd *)_tcd)->_field))
 
 #define fsl_edma_set_tcd_to_le_c(_tcd, _val, _field)					\
-do {											\
-	switch (sizeof((_tcd)->_field)) {						\
-	case sizeof(u64):								\
-		*(__force __le64 *)(&((_tcd)->_field)) = cpu_to_le64(_val);		\
-		break;									\
-	case sizeof(u32):								\
-		*(__force __le32 *)(&((_tcd)->_field)) = cpu_to_le32(_val);		\
-		break;									\
-	case sizeof(u16):								\
-		*(__force __le16 *)(&((_tcd)->_field)) = cpu_to_le16(_val);		\
-		break;									\
-	}										\
-} while (0)
+_Generic(((_tcd)->_field),								\
+	__le64 : (_tcd)->_field = cpu_to_le64(_val),					\
+	__le32 : (_tcd)->_field = cpu_to_le32(_val),					\
+	__le16 : (_tcd)->_field = cpu_to_le16(_val)					\
+)
 
 #define fsl_edma_set_tcd_to_le(_chan, _tcd, _val, _field)	\
 do {								\