Message ID | 20191018125234.21825-5-linux@rasmusvillemoes.dk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | towards QE support on ARM | expand |
On Fri, Oct 18, 2019 at 02:52:31PM +0200, Rasmus Villemoes wrote: > /* wait for the QE_CR_FLG to clear */ > - ret = spin_event_timeout((ioread32be(&qe_immr->cp.cecr) & QE_CR_FLG) == 0, > - 100, 0); > - /* On timeout (e.g. failure), the expression will be false (ret == 0), > - otherwise it will be true (ret == 1). */ > + ret = readx_poll_timeout_atomic(ioread32be, &qe_immr->cp.cecr, val, (val & QE_CR_FLG) == 0, This creates an overly long line. Btw, given how few users of spin_event_timeout we have it might be good idea to just kill it entirely.
On 18/10/2019 18.08, Christoph Hellwig wrote: > On Fri, Oct 18, 2019 at 02:52:31PM +0200, Rasmus Villemoes wrote: >> /* wait for the QE_CR_FLG to clear */ >> - ret = spin_event_timeout((ioread32be(&qe_immr->cp.cecr) & QE_CR_FLG) == 0, >> - 100, 0); >> - /* On timeout (e.g. failure), the expression will be false (ret == 0), >> - otherwise it will be true (ret == 1). */ >> + ret = readx_poll_timeout_atomic(ioread32be, &qe_immr->cp.cecr, val, (val & QE_CR_FLG) == 0, > > This creates an overly long line. Yeah, readx_poll_timeout_atomic is a mouthful, and then one also has to put in the name of the accessor... I'll wrap it when I respin the series, thanks. > Btw, given how few users of spin_event_timeout we have it might be good > idea to just kill it entirely. Maybe. That's for the ppc folks to comment on; the iopoll.h helpers are not completely equivalent (because obviously they don't read tbl directly). Maybe the generic versions should be taught spin_begin/spin_end/spin_cpu_relax so at least that part would be drop-in replacement. Rasmus
Rasmus Villemoes <linux@rasmusvillemoes.dk> writes: > On 18/10/2019 18.08, Christoph Hellwig wrote: >> On Fri, Oct 18, 2019 at 02:52:31PM +0200, Rasmus Villemoes wrote: >>> /* wait for the QE_CR_FLG to clear */ >>> - ret = spin_event_timeout((ioread32be(&qe_immr->cp.cecr) & QE_CR_FLG) == 0, >>> - 100, 0); >>> - /* On timeout (e.g. failure), the expression will be false (ret == 0), >>> - otherwise it will be true (ret == 1). */ >>> + ret = readx_poll_timeout_atomic(ioread32be, &qe_immr->cp.cecr, val, (val & QE_CR_FLG) == 0, >> >> This creates an overly long line. > > Yeah, readx_poll_timeout_atomic is a mouthful, and then one also has to > put in the name of the accessor... I'll wrap it when I respin the > series, thanks. > >> Btw, given how few users of spin_event_timeout we have it might be good >> idea to just kill it entirely. > > Maybe. That's for the ppc folks to comment on; the iopoll.h helpers are > not completely equivalent (because obviously they don't read tbl > directly). AFAICS it was added by and only ever used by Freescale folks, most of whom have now moved on to other things. I'd be happy to see it replaced with something generic. I created an issue in our github to remind us to do that cleanup. Though in practice that probably just means we'll never get around to it: https://github.com/linuxppc/issues/issues/280 > Maybe the generic versions should be taught > spin_begin/spin_end/spin_cpu_relax so at least that part would be > drop-in replacement. That would be nice. Though TBH the intersection of platforms that use spin_event_timeout() and also define a non-empty spin_begin() etc. is close to if not zero. cheers
diff --git a/drivers/soc/fsl/qe/qe.c b/drivers/soc/fsl/qe/qe.c index 60bf047001be..d18b25a685ca 100644 --- a/drivers/soc/fsl/qe/qe.c +++ b/drivers/soc/fsl/qe/qe.c @@ -22,6 +22,7 @@ #include <linux/module.h> #include <linux/delay.h> #include <linux/ioport.h> +#include <linux/iopoll.h> #include <linux/crc32.h> #include <linux/mod_devicetable.h> #include <linux/of_platform.h> @@ -108,7 +109,8 @@ int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input) { unsigned long flags; u8 mcn_shift = 0, dev_shift = 0; - u32 ret; + u32 val; + int ret; spin_lock_irqsave(&qe_lock, flags); if (cmd == QE_RESET) { @@ -135,13 +137,12 @@ int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input) } /* wait for the QE_CR_FLG to clear */ - ret = spin_event_timeout((ioread32be(&qe_immr->cp.cecr) & QE_CR_FLG) == 0, - 100, 0); - /* On timeout (e.g. failure), the expression will be false (ret == 0), - otherwise it will be true (ret == 1). */ + ret = readx_poll_timeout_atomic(ioread32be, &qe_immr->cp.cecr, val, (val & QE_CR_FLG) == 0, + 0, 100); + /* On timeout, ret is -ETIMEDOUT, otherwise it will be 0. */ spin_unlock_irqrestore(&qe_lock, flags); - return ret == 1; + return ret == 0; } EXPORT_SYMBOL(qe_issue_cmd);
In preparation for allowing QE to be built for architectures other than ppc, use the generic readx_poll_timeout_atomic() helper from iopoll.h rather than the ppc-only spin_event_timeout(). Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> --- drivers/soc/fsl/qe/qe.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)