Skip to content

Commit 3f22829

Browse files
nxpfranklivinodkoul
authored andcommitted
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: Frank Li <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Vinod Koul <[email protected]>
1 parent 11102d0 commit 3f22829

File tree

1 file changed

+22
-39
lines changed

1 file changed

+22
-39
lines changed

drivers/dma/fsl-edma-common.h

Lines changed: 22 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -252,36 +252,25 @@ static inline u32 fsl_edma_drvflags(struct fsl_edma_chan *fsl_chan)
252252
}
253253

254254
#define edma_read_tcdreg_c(chan, _tcd, __name) \
255-
(sizeof((_tcd)->__name) == sizeof(u64) ? \
256-
edma_readq(chan->edma, &(_tcd)->__name) : \
257-
((sizeof((_tcd)->__name) == sizeof(u32)) ? \
258-
edma_readl(chan->edma, &(_tcd)->__name) : \
259-
edma_readw(chan->edma, &(_tcd)->__name) \
260-
))
255+
_Generic(((_tcd)->__name), \
256+
__iomem __le64 : edma_readq(chan->edma, &(_tcd)->__name), \
257+
__iomem __le32 : edma_readl(chan->edma, &(_tcd)->__name), \
258+
__iomem __le16 : edma_readw(chan->edma, &(_tcd)->__name) \
259+
)
261260

262261
#define edma_read_tcdreg(chan, __name) \
263262
((fsl_edma_drvflags(chan) & FSL_EDMA_DRV_TCD64) ? \
264263
edma_read_tcdreg_c(chan, ((struct fsl_edma_hw_tcd64 __iomem *)chan->tcd), __name) : \
265264
edma_read_tcdreg_c(chan, ((struct fsl_edma_hw_tcd __iomem *)chan->tcd), __name) \
266265
)
267266

268-
#define edma_write_tcdreg_c(chan, _tcd, _val, __name) \
269-
do { \
270-
switch (sizeof(_tcd->__name)) { \
271-
case sizeof(u64): \
272-
edma_writeq(chan->edma, (u64 __force)_val, &_tcd->__name); \
273-
break; \
274-
case sizeof(u32): \
275-
edma_writel(chan->edma, (u32 __force)_val, &_tcd->__name); \
276-
break; \
277-
case sizeof(u16): \
278-
edma_writew(chan->edma, (u16 __force)_val, &_tcd->__name); \
279-
break; \
280-
case sizeof(u8): \
281-
edma_writeb(chan->edma, (u8 __force)_val, &_tcd->__name); \
282-
break; \
283-
} \
284-
} while (0)
267+
#define edma_write_tcdreg_c(chan, _tcd, _val, __name) \
268+
_Generic((_tcd->__name), \
269+
__iomem __le64 : edma_writeq(chan->edma, (u64 __force)(_val), &_tcd->__name), \
270+
__iomem __le32 : edma_writel(chan->edma, (u32 __force)(_val), &_tcd->__name), \
271+
__iomem __le16 : edma_writew(chan->edma, (u16 __force)(_val), &_tcd->__name), \
272+
__iomem u8 : edma_writeb(chan->edma, _val, &_tcd->__name) \
273+
)
285274

286275
#define edma_write_tcdreg(chan, val, __name) \
287276
do { \
@@ -322,29 +311,23 @@ do { \
322311
(((struct fsl_edma_hw_tcd *)_tcd)->_field))
323312

324313
#define fsl_edma_le_to_cpu(x) \
325-
(sizeof(x) == sizeof(u64) ? le64_to_cpu((__force __le64)(x)) : \
326-
(sizeof(x) == sizeof(u32) ? le32_to_cpu((__force __le32)(x)) : \
327-
le16_to_cpu((__force __le16)(x))))
314+
_Generic((x), \
315+
__le64 : le64_to_cpu((x)), \
316+
__le32 : le32_to_cpu((x)), \
317+
__le16 : le16_to_cpu((x)) \
318+
)
328319

329320
#define fsl_edma_get_tcd_to_cpu(_chan, _tcd, _field) \
330321
(fsl_edma_drvflags(_chan) & FSL_EDMA_DRV_TCD64 ? \
331322
fsl_edma_le_to_cpu(((struct fsl_edma_hw_tcd64 *)_tcd)->_field) : \
332323
fsl_edma_le_to_cpu(((struct fsl_edma_hw_tcd *)_tcd)->_field))
333324

334325
#define fsl_edma_set_tcd_to_le_c(_tcd, _val, _field) \
335-
do { \
336-
switch (sizeof((_tcd)->_field)) { \
337-
case sizeof(u64): \
338-
*(__force __le64 *)(&((_tcd)->_field)) = cpu_to_le64(_val); \
339-
break; \
340-
case sizeof(u32): \
341-
*(__force __le32 *)(&((_tcd)->_field)) = cpu_to_le32(_val); \
342-
break; \
343-
case sizeof(u16): \
344-
*(__force __le16 *)(&((_tcd)->_field)) = cpu_to_le16(_val); \
345-
break; \
346-
} \
347-
} while (0)
326+
_Generic(((_tcd)->_field), \
327+
__le64 : (_tcd)->_field = cpu_to_le64(_val), \
328+
__le32 : (_tcd)->_field = cpu_to_le32(_val), \
329+
__le16 : (_tcd)->_field = cpu_to_le16(_val) \
330+
)
348331

349332
#define fsl_edma_set_tcd_to_le(_chan, _tcd, _val, _field) \
350333
do { \

0 commit comments

Comments
 (0)