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

Commit 1188fd79 authored by Min Guo's avatar Min Guo Committed by Macpaul Lin
Browse files

UPSTREAM: 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.

Bug: 158724613
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.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarMacpaul Lin <macpaul.lin@mediatek.com>
(cherry picked from commit 9c93d7fd464e7aad59c2afc261f80e6e0fbe2ca9)
Change-Id: I7c9045ddf9f0958ebb7e6e34b9bf20b622b9210a
parent c43ff3f2
Loading
Loading
Loading
Loading
+28 −14
Original line number Diff line number Diff line
@@ -246,7 +246,7 @@ static u32 musb_default_busctl_offset(u8 epnum, u16 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);

@@ -254,13 +254,13 @@ static u8 musb_default_readb(const void __iomem *addr, unsigned offset)
	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);
	__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);

@@ -268,7 +268,7 @@ static u16 musb_default_readw(const void __iomem *addr, unsigned offset)
	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);
	__raw_writew(data, addr + offset);
@@ -396,19 +396,25 @@ static void musb_default_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
/*
 * 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);

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);

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);

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);

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);

@@ -417,7 +423,7 @@ u32 musb_readl(const void __iomem *addr, unsigned offset)
}
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);
	__raw_writel(data, addr + offset);
@@ -1047,7 +1053,6 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
static void musb_disable_interrupts(struct musb *musb)
{
	void __iomem	*mbase = musb->mregs;
	u16	temp;

	/* disable interrupts */
	musb_writeb(mbase, MUSB_INTRUSBE, 0);
@@ -1057,9 +1062,9 @@ static void musb_disable_interrupts(struct musb *musb)
	musb_writew(mbase, MUSB_INTRRXE, 0);

	/*  flush pending interrupts */
	temp = musb_readb(mbase, MUSB_INTRUSB);
	temp = musb_readw(mbase, MUSB_INTRTX);
	temp = musb_readw(mbase, MUSB_INTRRX);
	musb_clearb(mbase, MUSB_INTRUSB);
	musb_clearw(mbase, MUSB_INTRTX);
	musb_clearw(mbase, MUSB_INTRRX);
}

static void musb_enable_interrupts(struct musb *musb)
@@ -2292,10 +2297,19 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
		musb_readb = musb->ops->readb;
	if (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)
		musb_readw = musb->ops->readw;
	if (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
	if (!musb->ops->dma_init || !musb->ops->dma_exit) {
+8 −4
Original line number Diff line number Diff line
@@ -120,8 +120,10 @@ struct musb_io;
 * @fifo_offset: returns the fifo offset
 * @readb:	read 8 bits
 * @writeb:	write 8 bits
 * @clearb:	could be clear-on-readb or W1C
 * @readw:	read 16 bits
 * @writew:	write 16 bits
 * @clearw:	could be clear-on-readw or W1C
 * @read_fifo:	reads the fifo
 * @write_fifo:	writes to fifo
 * @get_toggle:	platform specific get toggle function
@@ -164,10 +166,12 @@ struct musb_platform_ops {
	u16	fifo_mode;
	u32	(*fifo_offset)(u8 epnum);
	u32	(*busctl_offset)(u8 epnum, u16 offset);
	u8	(*readb)(const void __iomem *addr, unsigned offset);
	void	(*writeb)(void __iomem *addr, unsigned offset, u8 data);
	u16	(*readw)(const void __iomem *addr, unsigned offset);
	void	(*writew)(void __iomem *addr, unsigned offset, u16 data);
	u8	(*readb)(void __iomem *addr, u32 offset);
	void	(*writeb)(void __iomem *addr, u32 offset, u8 data);
	u8	(*clearb)(void __iomem *addr, u32 offset);
	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	(*write_fifo)(struct musb_hw_ep *hw_ep, u16 len, const u8 *buf);
	u16	(*get_toggle)(struct musb_qh *qh, int is_out);
+8 −6
Original line number Diff line number Diff line
@@ -37,11 +37,13 @@ struct musb_io {
};

/* Do not add new entries here, add them the struct musb_io instead */
extern u8 (*musb_readb)(const void __iomem *addr, unsigned offset);
extern void (*musb_writeb)(void __iomem *addr, unsigned offset, u8 data);
extern u16 (*musb_readw)(const void __iomem *addr, unsigned offset);
extern void (*musb_writew)(void __iomem *addr, unsigned offset, u16 data);
extern u32 musb_readl(const void __iomem *addr, unsigned offset);
extern void musb_writel(void __iomem *addr, unsigned offset, u32 data);
extern u8 (*musb_readb)(void __iomem *addr, u32 offset);
extern void (*musb_writeb)(void __iomem *addr, u32 offset, u8 data);
extern u8 (*musb_clearb)(void __iomem *addr, u32 offset);
extern u16 (*musb_readw)(void __iomem *addr, u32 offset);
extern void (*musb_writew)(void __iomem *addr, u32 offset, u16 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
+1 −1
Original line number Diff line number Diff line
@@ -284,7 +284,7 @@ irqreturn_t dma_controller_irq(int irq, void *private_data)

	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) {
		musb_dbg(musb, "spurious DMA irq");
+2 −2
Original line number Diff line number Diff line
@@ -407,7 +407,7 @@ static u32 sunxi_musb_busctl_offset(u8 epnum, u16 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;

@@ -520,7 +520,7 @@ static void sunxi_musb_writeb(void __iomem *addr, unsigned offset, u8 data)
		(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) {
		/* generic control or fifo control reg access */
Loading