Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 59205756 authored by Stephen Boyd's avatar Stephen Boyd
Browse files

ARM: io.h: Fix RTB macros to be side effect safe



Some people may call readl/writel with incrementing addresses,
i.e.

	writel(x, addr++);

but the macro will not handle this properly because addr is
used twice. Fix it.

Change-Id: I66290d8f8a6aac8c261a0d2bfd2fd7373daa6d7e
Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>
parent ec4b001e
Loading
Loading
Loading
Loading
+6 −4
Original line number Original line Diff line number Diff line
@@ -142,10 +142,11 @@ static inline u64 __raw_readq_no_log(const volatile void __iomem *addr)


#define __raw_write_logged(v, a, _t)	({ \
#define __raw_write_logged(v, a, _t)	({ \
	int _ret; \
	int _ret; \
	void *_addr = (void __force *)(a); \
	volatile void __iomem *_a = (a); \
	void *_addr = (void __force *)(_a); \
	_ret = uncached_logk(LOGK_WRITEL, _addr); \
	_ret = uncached_logk(LOGK_WRITEL, _addr); \
	ETB_WAYPOINT; \
	ETB_WAYPOINT; \
	__raw_write##_t##_no_log((v), a); \
	__raw_write##_t##_no_log((v), _a); \
	if (_ret) \
	if (_ret) \
		LOG_BARRIER; \
		LOG_BARRIER; \
	})
	})
@@ -158,11 +159,12 @@ static inline u64 __raw_readq_no_log(const volatile void __iomem *addr)


#define __raw_read_logged(a, _l, _t)		({ \
#define __raw_read_logged(a, _l, _t)		({ \
	unsigned _t __a; \
	unsigned _t __a; \
	void *_addr = (void __force *)(a); \
	const volatile void __iomem *_a = (a); \
	void *_addr = (void __force *)(_a); \
	int _ret; \
	int _ret; \
	_ret = uncached_logk(LOGK_READL, _addr); \
	_ret = uncached_logk(LOGK_READL, _addr); \
	ETB_WAYPOINT; \
	ETB_WAYPOINT; \
	__a = __raw_read##_l##_no_log(a);\
	__a = __raw_read##_l##_no_log(_a);\
	if (_ret) \
	if (_ret) \
		LOG_BARRIER; \
		LOG_BARRIER; \
	__a; \
	__a; \