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);
 
        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);
 
        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);
 /*
  * 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);
 
 }
 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);
 static void musb_disable_interrupts(struct musb *musb)
 {
        void __iomem    *mbase = musb->mregs;
-       u16     temp;
 
        /* disable interrupts */
        musb_writeb(mbase, MUSB_INTRUSBE, 0);
        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)
                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) {
 
  * @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
        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);
 
 };
 
 /* 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