Commit 9c93d7fd authored by Min Guo's avatar Min Guo Committed by Greg Kroah-Hartman

usb: musb: Add musb_clearb/w() interface

Delete the const attribute of addr parameter in readb/w/l hooks, these
changes are for implementing clearing W1C registers.
Replace musb_readb/w with musb_clearb/w to clear the interrupt status.

While at here, change some unsigned type to u32 to fix checkpatch.pl
warnings.
Signed-off-by: default avatarMin Guo <min.guo@mediatek.com>
[b-liu@ti.com: fix checkpatch.pl warnings.]
Signed-off-by: default avatarBin Liu <b-liu@ti.com>
Link: https://lore.kernel.org/r/20200115132547.364-23-b-liu@ti.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent edce6177
...@@ -247,7 +247,7 @@ static u32 musb_default_busctl_offset(u8 epnum, u16 offset) ...@@ -247,7 +247,7 @@ static u32 musb_default_busctl_offset(u8 epnum, u16 offset)
return 0x80 + (0x08 * epnum) + offset; return 0x80 + (0x08 * epnum) + offset;
} }
static u8 musb_default_readb(const void __iomem *addr, unsigned offset) static u8 musb_default_readb(void __iomem *addr, u32 offset)
{ {
u8 data = __raw_readb(addr + offset); u8 data = __raw_readb(addr + offset);
...@@ -255,13 +255,13 @@ static u8 musb_default_readb(const void __iomem *addr, unsigned offset) ...@@ -255,13 +255,13 @@ static u8 musb_default_readb(const void __iomem *addr, unsigned offset)
return data; return data;
} }
static void musb_default_writeb(void __iomem *addr, unsigned offset, u8 data) static void musb_default_writeb(void __iomem *addr, u32 offset, u8 data)
{ {
trace_musb_writeb(__builtin_return_address(0), addr, offset, data); trace_musb_writeb(__builtin_return_address(0), addr, offset, data);
__raw_writeb(data, addr + offset); __raw_writeb(data, addr + offset);
} }
static u16 musb_default_readw(const void __iomem *addr, unsigned offset) static u16 musb_default_readw(void __iomem *addr, u32 offset)
{ {
u16 data = __raw_readw(addr + offset); u16 data = __raw_readw(addr + offset);
...@@ -269,7 +269,7 @@ static u16 musb_default_readw(const void __iomem *addr, unsigned offset) ...@@ -269,7 +269,7 @@ static u16 musb_default_readw(const void __iomem *addr, unsigned offset)
return data; return data;
} }
static void musb_default_writew(void __iomem *addr, unsigned offset, u16 data) static void musb_default_writew(void __iomem *addr, u32 offset, u16 data)
{ {
trace_musb_writew(__builtin_return_address(0), addr, offset, data); trace_musb_writew(__builtin_return_address(0), addr, offset, data);
__raw_writew(data, addr + offset); __raw_writew(data, addr + offset);
...@@ -397,19 +397,25 @@ static void musb_default_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst) ...@@ -397,19 +397,25 @@ static void musb_default_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
/* /*
* Old style IO functions * Old style IO functions
*/ */
u8 (*musb_readb)(const void __iomem *addr, unsigned offset); u8 (*musb_readb)(void __iomem *addr, u32 offset);
EXPORT_SYMBOL_GPL(musb_readb); EXPORT_SYMBOL_GPL(musb_readb);
void (*musb_writeb)(void __iomem *addr, unsigned offset, u8 data); void (*musb_writeb)(void __iomem *addr, u32 offset, u8 data);
EXPORT_SYMBOL_GPL(musb_writeb); EXPORT_SYMBOL_GPL(musb_writeb);
u16 (*musb_readw)(const void __iomem *addr, unsigned offset); u8 (*musb_clearb)(void __iomem *addr, u32 offset);
EXPORT_SYMBOL_GPL(musb_clearb);
u16 (*musb_readw)(void __iomem *addr, u32 offset);
EXPORT_SYMBOL_GPL(musb_readw); EXPORT_SYMBOL_GPL(musb_readw);
void (*musb_writew)(void __iomem *addr, unsigned offset, u16 data); void (*musb_writew)(void __iomem *addr, u32 offset, u16 data);
EXPORT_SYMBOL_GPL(musb_writew); EXPORT_SYMBOL_GPL(musb_writew);
u32 musb_readl(const void __iomem *addr, unsigned offset) u16 (*musb_clearw)(void __iomem *addr, u32 offset);
EXPORT_SYMBOL_GPL(musb_clearw);
u32 musb_readl(void __iomem *addr, u32 offset)
{ {
u32 data = __raw_readl(addr + offset); u32 data = __raw_readl(addr + offset);
...@@ -418,7 +424,7 @@ u32 musb_readl(const void __iomem *addr, unsigned offset) ...@@ -418,7 +424,7 @@ u32 musb_readl(const void __iomem *addr, unsigned offset)
} }
EXPORT_SYMBOL_GPL(musb_readl); EXPORT_SYMBOL_GPL(musb_readl);
void musb_writel(void __iomem *addr, unsigned offset, u32 data) void musb_writel(void __iomem *addr, u32 offset, u32 data)
{ {
trace_musb_writel(__builtin_return_address(0), addr, offset, data); trace_musb_writel(__builtin_return_address(0), addr, offset, data);
__raw_writel(data, addr + offset); __raw_writel(data, addr + offset);
...@@ -1149,7 +1155,6 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, ...@@ -1149,7 +1155,6 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
static void musb_disable_interrupts(struct musb *musb) static void musb_disable_interrupts(struct musb *musb)
{ {
void __iomem *mbase = musb->mregs; void __iomem *mbase = musb->mregs;
u16 temp;
/* disable interrupts */ /* disable interrupts */
musb_writeb(mbase, MUSB_INTRUSBE, 0); musb_writeb(mbase, MUSB_INTRUSBE, 0);
...@@ -1159,9 +1164,9 @@ static void musb_disable_interrupts(struct musb *musb) ...@@ -1159,9 +1164,9 @@ static void musb_disable_interrupts(struct musb *musb)
musb_writew(mbase, MUSB_INTRRXE, 0); musb_writew(mbase, MUSB_INTRRXE, 0);
/* flush pending interrupts */ /* flush pending interrupts */
temp = musb_readb(mbase, MUSB_INTRUSB); musb_clearb(mbase, MUSB_INTRUSB);
temp = musb_readw(mbase, MUSB_INTRTX); musb_clearw(mbase, MUSB_INTRTX);
temp = musb_readw(mbase, MUSB_INTRRX); musb_clearw(mbase, MUSB_INTRRX);
} }
static void musb_enable_interrupts(struct musb *musb) static void musb_enable_interrupts(struct musb *musb)
...@@ -2388,10 +2393,19 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) ...@@ -2388,10 +2393,19 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
musb_readb = musb->ops->readb; musb_readb = musb->ops->readb;
if (musb->ops->writeb) if (musb->ops->writeb)
musb_writeb = musb->ops->writeb; musb_writeb = musb->ops->writeb;
if (musb->ops->clearb)
musb_clearb = musb->ops->clearb;
else
musb_clearb = musb_readb;
if (musb->ops->readw) if (musb->ops->readw)
musb_readw = musb->ops->readw; musb_readw = musb->ops->readw;
if (musb->ops->writew) if (musb->ops->writew)
musb_writew = musb->ops->writew; musb_writew = musb->ops->writew;
if (musb->ops->clearw)
musb_clearw = musb->ops->clearw;
else
musb_clearw = musb_readw;
#ifndef CONFIG_MUSB_PIO_ONLY #ifndef CONFIG_MUSB_PIO_ONLY
if (!musb->ops->dma_init || !musb->ops->dma_exit) { if (!musb->ops->dma_init || !musb->ops->dma_exit) {
......
...@@ -120,8 +120,10 @@ struct musb_io; ...@@ -120,8 +120,10 @@ struct musb_io;
* @fifo_offset: returns the fifo offset * @fifo_offset: returns the fifo offset
* @readb: read 8 bits * @readb: read 8 bits
* @writeb: write 8 bits * @writeb: write 8 bits
* @clearb: could be clear-on-readb or W1C
* @readw: read 16 bits * @readw: read 16 bits
* @writew: write 16 bits * @writew: write 16 bits
* @clearw: could be clear-on-readw or W1C
* @read_fifo: reads the fifo * @read_fifo: reads the fifo
* @write_fifo: writes to fifo * @write_fifo: writes to fifo
* @get_toggle: platform specific get toggle function * @get_toggle: platform specific get toggle function
...@@ -164,10 +166,12 @@ struct musb_platform_ops { ...@@ -164,10 +166,12 @@ struct musb_platform_ops {
u16 fifo_mode; u16 fifo_mode;
u32 (*fifo_offset)(u8 epnum); u32 (*fifo_offset)(u8 epnum);
u32 (*busctl_offset)(u8 epnum, u16 offset); u32 (*busctl_offset)(u8 epnum, u16 offset);
u8 (*readb)(const void __iomem *addr, unsigned offset); u8 (*readb)(void __iomem *addr, u32 offset);
void (*writeb)(void __iomem *addr, unsigned offset, u8 data); void (*writeb)(void __iomem *addr, u32 offset, u8 data);
u16 (*readw)(const void __iomem *addr, unsigned offset); u8 (*clearb)(void __iomem *addr, u32 offset);
void (*writew)(void __iomem *addr, unsigned offset, u16 data); u16 (*readw)(void __iomem *addr, u32 offset);
void (*writew)(void __iomem *addr, u32 offset, u16 data);
u16 (*clearw)(void __iomem *addr, u32 offset);
void (*read_fifo)(struct musb_hw_ep *hw_ep, u16 len, u8 *buf); void (*read_fifo)(struct musb_hw_ep *hw_ep, u16 len, u8 *buf);
void (*write_fifo)(struct musb_hw_ep *hw_ep, u16 len, const u8 *buf); void (*write_fifo)(struct musb_hw_ep *hw_ep, u16 len, const u8 *buf);
u16 (*get_toggle)(struct musb_qh *qh, int is_out); u16 (*get_toggle)(struct musb_qh *qh, int is_out);
......
...@@ -37,11 +37,13 @@ struct musb_io { ...@@ -37,11 +37,13 @@ struct musb_io {
}; };
/* Do not add new entries here, add them the struct musb_io instead */ /* Do not add new entries here, add them the struct musb_io instead */
extern u8 (*musb_readb)(const void __iomem *addr, unsigned offset); extern u8 (*musb_readb)(void __iomem *addr, u32 offset);
extern void (*musb_writeb)(void __iomem *addr, unsigned offset, u8 data); extern void (*musb_writeb)(void __iomem *addr, u32 offset, u8 data);
extern u16 (*musb_readw)(const void __iomem *addr, unsigned offset); extern u8 (*musb_clearb)(void __iomem *addr, u32 offset);
extern void (*musb_writew)(void __iomem *addr, unsigned offset, u16 data); extern u16 (*musb_readw)(void __iomem *addr, u32 offset);
extern u32 musb_readl(const void __iomem *addr, unsigned offset); extern void (*musb_writew)(void __iomem *addr, u32 offset, u16 data);
extern void musb_writel(void __iomem *addr, unsigned offset, u32 data); extern u16 (*musb_clearw)(void __iomem *addr, u32 offset);
extern u32 musb_readl(void __iomem *addr, u32 offset);
extern void musb_writel(void __iomem *addr, u32 offset, u32 data);
#endif #endif
...@@ -284,7 +284,7 @@ irqreturn_t dma_controller_irq(int irq, void *private_data) ...@@ -284,7 +284,7 @@ irqreturn_t dma_controller_irq(int irq, void *private_data)
spin_lock_irqsave(&musb->lock, flags); spin_lock_irqsave(&musb->lock, flags);
int_hsdma = musb_readb(mbase, MUSB_HSDMA_INTR); int_hsdma = musb_clearb(mbase, MUSB_HSDMA_INTR);
if (!int_hsdma) { if (!int_hsdma) {
musb_dbg(musb, "spurious DMA irq"); musb_dbg(musb, "spurious DMA irq");
......
...@@ -407,7 +407,7 @@ static u32 sunxi_musb_busctl_offset(u8 epnum, u16 offset) ...@@ -407,7 +407,7 @@ static u32 sunxi_musb_busctl_offset(u8 epnum, u16 offset)
return SUNXI_MUSB_TXFUNCADDR + offset; return SUNXI_MUSB_TXFUNCADDR + offset;
} }
static u8 sunxi_musb_readb(const void __iomem *addr, unsigned offset) static u8 sunxi_musb_readb(void __iomem *addr, u32 offset)
{ {
struct sunxi_glue *glue; struct sunxi_glue *glue;
...@@ -520,7 +520,7 @@ static void sunxi_musb_writeb(void __iomem *addr, unsigned offset, u8 data) ...@@ -520,7 +520,7 @@ static void sunxi_musb_writeb(void __iomem *addr, unsigned offset, u8 data)
(int)(addr - sunxi_musb->mregs)); (int)(addr - sunxi_musb->mregs));
} }
static u16 sunxi_musb_readw(const void __iomem *addr, unsigned offset) static u16 sunxi_musb_readw(void __iomem *addr, u32 offset)
{ {
if (addr == sunxi_musb->mregs) { if (addr == sunxi_musb->mregs) {
/* generic control or fifo control reg access */ /* generic control or fifo control reg access */
......
...@@ -142,7 +142,7 @@ static void tusb_ep_select(void __iomem *mbase, u8 epnum) ...@@ -142,7 +142,7 @@ static void tusb_ep_select(void __iomem *mbase, u8 epnum)
/* /*
* TUSB6010 doesn't allow 8-bit access; 16-bit access is the minimum. * TUSB6010 doesn't allow 8-bit access; 16-bit access is the minimum.
*/ */
static u8 tusb_readb(const void __iomem *addr, unsigned offset) static u8 tusb_readb(void __iomem *addr, u32 offset)
{ {
u16 tmp; u16 tmp;
u8 val; u8 val;
......
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