| From 14aa9b3ea6e70a3d736617430b33ef2d5ead7e57 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 31 May 2020 09:12:13 +1000 |
| Subject: m68k: mac: Fix IOP status/control register writes |
| |
| From: Finn Thain <fthain@telegraphics.com.au> |
| |
| [ Upstream commit 931fc82a6aaf4e2e4a5490addaa6a090d78c24a7 ] |
| |
| When writing values to the IOP status/control register make sure those |
| values do not have any extraneous bits that will clear interrupt flags. |
| |
| To place the SCC IOP into bypass mode would be desirable but this is not |
| achieved by writing IOP_DMAINACTIVE | IOP_RUN | IOP_AUTOINC | IOP_BYPASS |
| to the control register. Drop this ineffective register write. |
| |
| Remove the flawed and unused iop_bypass() function. Make use of the |
| unused iop_stop() function. |
| |
| Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") |
| Signed-off-by: Finn Thain <fthain@telegraphics.com.au> |
| Tested-by: Stan Johnson <userm57@yahoo.com> |
| Cc: Joshua Thompson <funaho@jurai.org> |
| Link: https://lore.kernel.org/r/09bcb7359a1719a18b551ee515da3c4c3cf709e6.1590880333.git.fthain@telegraphics.com.au |
| Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/m68k/mac/iop.c | 12 +++--------- |
| 1 file changed, 3 insertions(+), 9 deletions(-) |
| |
| diff --git a/arch/m68k/mac/iop.c b/arch/m68k/mac/iop.c |
| index d8f2282978f9c..c432bfafe63e2 100644 |
| --- a/arch/m68k/mac/iop.c |
| +++ b/arch/m68k/mac/iop.c |
| @@ -183,7 +183,7 @@ static __inline__ void iop_writeb(volatile struct mac_iop *iop, __u16 addr, __u8 |
| |
| static __inline__ void iop_stop(volatile struct mac_iop *iop) |
| { |
| - iop->status_ctrl &= ~IOP_RUN; |
| + iop->status_ctrl = IOP_AUTOINC; |
| } |
| |
| static __inline__ void iop_start(volatile struct mac_iop *iop) |
| @@ -191,14 +191,9 @@ static __inline__ void iop_start(volatile struct mac_iop *iop) |
| iop->status_ctrl = IOP_RUN | IOP_AUTOINC; |
| } |
| |
| -static __inline__ void iop_bypass(volatile struct mac_iop *iop) |
| -{ |
| - iop->status_ctrl |= IOP_BYPASS; |
| -} |
| - |
| static __inline__ void iop_interrupt(volatile struct mac_iop *iop) |
| { |
| - iop->status_ctrl |= IOP_IRQ; |
| + iop->status_ctrl = IOP_IRQ | IOP_RUN | IOP_AUTOINC; |
| } |
| |
| static int iop_alive(volatile struct mac_iop *iop) |
| @@ -244,7 +239,6 @@ void __init iop_preinit(void) |
| } else { |
| iop_base[IOP_NUM_SCC] = (struct mac_iop *) SCC_IOP_BASE_QUADRA; |
| } |
| - iop_base[IOP_NUM_SCC]->status_ctrl = 0x87; |
| iop_scc_present = 1; |
| } else { |
| iop_base[IOP_NUM_SCC] = NULL; |
| @@ -256,7 +250,7 @@ void __init iop_preinit(void) |
| } else { |
| iop_base[IOP_NUM_ISM] = (struct mac_iop *) ISM_IOP_BASE_QUADRA; |
| } |
| - iop_base[IOP_NUM_ISM]->status_ctrl = 0; |
| + iop_stop(iop_base[IOP_NUM_ISM]); |
| iop_ism_present = 1; |
| } else { |
| iop_base[IOP_NUM_ISM] = NULL; |
| -- |
| 2.25.1 |
| |