Commit 3f228293 authored by Frank Li's avatar Frank Li Committed by Vinod Koul

dmaengine: fsl-edma: use _Generic to handle difference type

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: default avatarFrank Li <Frank.Li@nxp.com>
Link: https://lore.kernel.org/r/20240425205947.3436501-2-Frank.Li@nxp.comSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent 11102d0c
...@@ -252,12 +252,11 @@ static inline u32 fsl_edma_drvflags(struct fsl_edma_chan *fsl_chan) ...@@ -252,12 +252,11 @@ static inline u32 fsl_edma_drvflags(struct fsl_edma_chan *fsl_chan)
} }
#define edma_read_tcdreg_c(chan, _tcd, __name) \ #define edma_read_tcdreg_c(chan, _tcd, __name) \
(sizeof((_tcd)->__name) == sizeof(u64) ? \ _Generic(((_tcd)->__name), \
edma_readq(chan->edma, &(_tcd)->__name) : \ __iomem __le64 : edma_readq(chan->edma, &(_tcd)->__name), \
((sizeof((_tcd)->__name) == sizeof(u32)) ? \ __iomem __le32 : edma_readl(chan->edma, &(_tcd)->__name), \
edma_readl(chan->edma, &(_tcd)->__name) : \ __iomem __le16 : edma_readw(chan->edma, &(_tcd)->__name) \
edma_readw(chan->edma, &(_tcd)->__name) \ )
))
#define edma_read_tcdreg(chan, __name) \ #define edma_read_tcdreg(chan, __name) \
((fsl_edma_drvflags(chan) & FSL_EDMA_DRV_TCD64) ? \ ((fsl_edma_drvflags(chan) & FSL_EDMA_DRV_TCD64) ? \
...@@ -265,23 +264,13 @@ static inline u32 fsl_edma_drvflags(struct fsl_edma_chan *fsl_chan) ...@@ -265,23 +264,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) \ edma_read_tcdreg_c(chan, ((struct fsl_edma_hw_tcd __iomem *)chan->tcd), __name) \
) )
#define edma_write_tcdreg_c(chan, _tcd, _val, __name) \ #define edma_write_tcdreg_c(chan, _tcd, _val, __name) \
do { \ _Generic((_tcd->__name), \
switch (sizeof(_tcd->__name)) { \ __iomem __le64 : edma_writeq(chan->edma, (u64 __force)(_val), &_tcd->__name), \
case sizeof(u64): \ __iomem __le32 : edma_writel(chan->edma, (u32 __force)(_val), &_tcd->__name), \
edma_writeq(chan->edma, (u64 __force)_val, &_tcd->__name); \ __iomem __le16 : edma_writew(chan->edma, (u16 __force)(_val), &_tcd->__name), \
break; \ __iomem u8 : edma_writeb(chan->edma, _val, &_tcd->__name) \
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(chan, val, __name) \ #define edma_write_tcdreg(chan, val, __name) \
do { \ do { \
...@@ -322,9 +311,11 @@ do { \ ...@@ -322,9 +311,11 @@ do { \
(((struct fsl_edma_hw_tcd *)_tcd)->_field)) (((struct fsl_edma_hw_tcd *)_tcd)->_field))
#define fsl_edma_le_to_cpu(x) \ #define fsl_edma_le_to_cpu(x) \
(sizeof(x) == sizeof(u64) ? le64_to_cpu((__force __le64)(x)) : \ _Generic((x), \
(sizeof(x) == sizeof(u32) ? le32_to_cpu((__force __le32)(x)) : \ __le64 : le64_to_cpu((x)), \
le16_to_cpu((__force __le16)(x)))) __le32 : le32_to_cpu((x)), \
__le16 : le16_to_cpu((x)) \
)
#define fsl_edma_get_tcd_to_cpu(_chan, _tcd, _field) \ #define fsl_edma_get_tcd_to_cpu(_chan, _tcd, _field) \
(fsl_edma_drvflags(_chan) & FSL_EDMA_DRV_TCD64 ? \ (fsl_edma_drvflags(_chan) & FSL_EDMA_DRV_TCD64 ? \
...@@ -332,19 +323,11 @@ do { \ ...@@ -332,19 +323,11 @@ do { \
fsl_edma_le_to_cpu(((struct fsl_edma_hw_tcd *)_tcd)->_field)) fsl_edma_le_to_cpu(((struct fsl_edma_hw_tcd *)_tcd)->_field))
#define fsl_edma_set_tcd_to_le_c(_tcd, _val, _field) \ #define fsl_edma_set_tcd_to_le_c(_tcd, _val, _field) \
do { \ _Generic(((_tcd)->_field), \
switch (sizeof((_tcd)->_field)) { \ __le64 : (_tcd)->_field = cpu_to_le64(_val), \
case sizeof(u64): \ __le32 : (_tcd)->_field = cpu_to_le32(_val), \
*(__force __le64 *)(&((_tcd)->_field)) = cpu_to_le64(_val); \ __le16 : (_tcd)->_field = cpu_to_le16(_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)
#define fsl_edma_set_tcd_to_le(_chan, _tcd, _val, _field) \ #define fsl_edma_set_tcd_to_le(_chan, _tcd, _val, _field) \
do { \ do { \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment