From: Ming Lei <tom.leiming@xxxxxxxxx> This patch introduces musb_readb/musb_writeb function pointer, so that we can use same musb_readb/musb_writeb in one single binary image to help to support multiple machines. Signed-off-by: Ming Lei <tom.leiming@xxxxxxxxx> --- drivers/usb/musb/musb_core.c | 55 ++++++++++++++++++++++++++++++++++++++++++ drivers/usb/musb/musb_core.h | 3 ++ drivers/usb/musb/musb_io.h | 49 ------------------------------------- 3 files changed, 58 insertions(+), 49 deletions(-) diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index dba20f8..ca3ae8b 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c @@ -135,6 +135,10 @@ MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_LICENSE("GPL"); MODULE_ALIAS("platform:" MUSB_DRIVER_NAME); +u8 (*musb_readb)(const void __iomem *addr, unsigned offset); +EXPORT_SYMBOL(musb_readb); +void (*musb_writeb)(void __iomem *addr, unsigned offset, u8 data); +EXPORT_SYMBOL(musb_writeb); /*-------------------------------------------------------------------------*/ @@ -151,6 +155,43 @@ static inline struct musb *dev_to_musb(struct device *dev) /*-------------------------------------------------------------------------*/ #ifndef CONFIG_BLACKFIN + +/* + * TUSB6010 doesn't allow 8-bit access; 16-bit access is the minimum. + */ +static inline u8 __tusb_musb_readb(const void __iomem *addr, unsigned offset) +{ + u16 tmp; + u8 val; + + tmp = __raw_readw(addr + (offset & ~1)); + if (offset & 1) + val = (tmp >> 8); + else + val = tmp & 0xff; + + return val; +} + +static inline void __tusb_musb_writeb(void __iomem *addr, unsigned offset, u8 data) +{ + u16 tmp; + + tmp = __raw_readw(addr + (offset & ~1)); + if (offset & 1) + tmp = (data << 8) | (tmp & 0xff); + else + tmp = (tmp & 0xff00) | data; + + __raw_writew(tmp, addr + (offset & ~1)); +} + +static inline u8 __musb_readb(const void __iomem *addr, unsigned offset) + { return __raw_readb(addr + offset); } + +static inline void __musb_writeb(void __iomem *addr, unsigned offset, u8 data) + { __raw_writeb(data, addr + offset); } + static int musb_ulpi_read(struct otg_transceiver *otg, u32 offset) { void __iomem *addr = otg->io_priv; @@ -220,6 +261,12 @@ static int musb_ulpi_write(struct otg_transceiver *otg, return 0; } #else +static inline u8 __musb_readb(const void __iomem *addr, unsigned offset) + { return (u8) (bfin_read16(addr + offset)); } + +static inline void __musb_writeb(void __iomem *addr, unsigned offset, u8 data) + { bfin_write16(addr + offset, (u16) data); } + #define musb_ulpi_read NULL #define musb_ulpi_write NULL #endif @@ -1990,6 +2037,14 @@ bad_config: if (fifo_mode == -1) fifo_mode = musb->ops->fifo_mode; + if (musb->ops->flags & MUSB_GLUE_TUSB_STYLE) { + musb_readb = __tusb_musb_readb; + musb_writeb = __tusb_musb_writeb; + } else { + musb_readb = __musb_readb; + musb_writeb = __musb_writeb; + } + /* The musb_platform_init() call: * - adjusts musb->mregs and musb->isr if needed, * - may initialize an integrated tranceiver diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index aeca586..042b7fc 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h @@ -62,6 +62,9 @@ struct musb_ep; #define MUSB_HWVERS_1900 0x784 #define MUSB_HWVERS_2000 0x800 +extern u8 (*musb_readb)(const void __iomem *addr, unsigned offset); +extern void (*musb_writeb)(void __iomem *addr, unsigned offset, u8 data); + #include "musb_debug.h" #include "musb_dma.h" diff --git a/drivers/usb/musb/musb_io.h b/drivers/usb/musb/musb_io.h index 03c6ccd..dced1c6 100644 --- a/drivers/usb/musb/musb_io.h +++ b/drivers/usb/musb/musb_io.h @@ -73,63 +73,14 @@ static inline void musb_writew(void __iomem *addr, unsigned offset, u16 data) static inline void musb_writel(void __iomem *addr, unsigned offset, u32 data) { __raw_writel(data, addr + offset); } - -#ifdef CONFIG_USB_MUSB_TUSB6010 - -/* - * TUSB6010 doesn't allow 8-bit access; 16-bit access is the minimum. - */ -static inline u8 musb_readb(const void __iomem *addr, unsigned offset) -{ - u16 tmp; - u8 val; - - tmp = __raw_readw(addr + (offset & ~1)); - if (offset & 1) - val = (tmp >> 8); - else - val = tmp & 0xff; - - return val; -} - -static inline void musb_writeb(void __iomem *addr, unsigned offset, u8 data) -{ - u16 tmp; - - tmp = __raw_readw(addr + (offset & ~1)); - if (offset & 1) - tmp = (data << 8) | (tmp & 0xff); - else - tmp = (tmp & 0xff00) | data; - - __raw_writew(tmp, addr + (offset & ~1)); -} - #else -static inline u8 musb_readb(const void __iomem *addr, unsigned offset) - { return __raw_readb(addr + offset); } - -static inline void musb_writeb(void __iomem *addr, unsigned offset, u8 data) - { __raw_writeb(data, addr + offset); } - -#endif /* CONFIG_USB_MUSB_TUSB6010 */ - -#else - -static inline u8 musb_readb(const void __iomem *addr, unsigned offset) - { return (u8) (bfin_read16(addr + offset)); } - static inline u16 musb_readw(const void __iomem *addr, unsigned offset) { return bfin_read16(addr + offset); } static inline u32 musb_readl(const void __iomem *addr, unsigned offset) { return (u32) (bfin_read16(addr + offset)); } -static inline void musb_writeb(void __iomem *addr, unsigned offset, u8 data) - { bfin_write16(addr + offset, (u16) data); } - static inline void musb_writew(void __iomem *addr, unsigned offset, u16 data) { bfin_write16(addr + offset, data); } -- 1.7.3 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html