usb: musb: make all glue layer export struct musb_platform_ops

preparing to a big refactor on musb code. We need
to be able to compile in all glue layers (or at
least all ARM-based ones) together and have a
working binary.

While preparing for that, we move every glue
layer to export only one symbol, which is
a struct musb_platform_ops, and make all
other functions static.

Later patches will come to allow for compiling
all glue layers together and have a working
binary.

Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
Felipe Balbi 2010-12-01 13:22:05 +02:00
parent 3ca8abb845
commit 743411b3f3
9 changed files with 335 additions and 177 deletions

View File

@ -122,9 +122,9 @@ static inline void phy_off(void)
} }
/* /*
* musb_platform_enable - enable interrupts * am35x_musb_enable - enable interrupts
*/ */
void musb_platform_enable(struct musb *musb) static void am35x_musb_enable(struct musb *musb)
{ {
void __iomem *reg_base = musb->ctrl_base; void __iomem *reg_base = musb->ctrl_base;
u32 epmask; u32 epmask;
@ -143,9 +143,9 @@ void musb_platform_enable(struct musb *musb)
} }
/* /*
* musb_platform_disable - disable HDRC and flush interrupts * am35x_musb_disable - disable HDRC and flush interrupts
*/ */
void musb_platform_disable(struct musb *musb) static void am35x_musb_disable(struct musb *musb)
{ {
void __iomem *reg_base = musb->ctrl_base; void __iomem *reg_base = musb->ctrl_base;
@ -162,7 +162,7 @@ void musb_platform_disable(struct musb *musb)
#define portstate(stmt) #define portstate(stmt)
#endif #endif
static void am35x_set_vbus(struct musb *musb, int is_on) static void am35x_musb_set_vbus(struct musb *musb, int is_on)
{ {
WARN_ON(is_on && is_peripheral_active(musb)); WARN_ON(is_on && is_peripheral_active(musb));
} }
@ -221,7 +221,7 @@ static void otg_timer(unsigned long _musb)
spin_unlock_irqrestore(&musb->lock, flags); spin_unlock_irqrestore(&musb->lock, flags);
} }
void musb_platform_try_idle(struct musb *musb, unsigned long timeout) static void am35x_musb_try_idle(struct musb *musb, unsigned long timeout)
{ {
static unsigned long last_timer; static unsigned long last_timer;
@ -251,7 +251,7 @@ void musb_platform_try_idle(struct musb *musb, unsigned long timeout)
mod_timer(&otg_workaround, timeout); mod_timer(&otg_workaround, timeout);
} }
static irqreturn_t am35x_interrupt(int irq, void *hci) static irqreturn_t am35x_musb_interrupt(int irq, void *hci)
{ {
struct musb *musb = hci; struct musb *musb = hci;
void __iomem *reg_base = musb->ctrl_base; void __iomem *reg_base = musb->ctrl_base;
@ -362,7 +362,7 @@ eoi:
return ret; return ret;
} }
int musb_platform_set_mode(struct musb *musb, u8 musb_mode) static int am35x_musb_set_mode(struct musb *musb, u8 musb_mode)
{ {
u32 devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2); u32 devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2);
@ -391,7 +391,7 @@ int musb_platform_set_mode(struct musb *musb, u8 musb_mode)
return 0; return 0;
} }
int __init musb_platform_init(struct musb *musb, void *board_data) static int am35x_musb_init(struct musb *musb)
{ {
void __iomem *reg_base = musb->ctrl_base; void __iomem *reg_base = musb->ctrl_base;
u32 rev, lvl_intr, sw_reset; u32 rev, lvl_intr, sw_reset;
@ -427,7 +427,7 @@ int __init musb_platform_init(struct musb *musb, void *board_data)
if (is_host_enabled(musb)) if (is_host_enabled(musb))
setup_timer(&otg_workaround, otg_timer, (unsigned long) musb); setup_timer(&otg_workaround, otg_timer, (unsigned long) musb);
musb->board_set_vbus = am35x_set_vbus; musb->board_set_vbus = am35x_musb_set_vbus;
/* Global reset */ /* Global reset */
sw_reset = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); sw_reset = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
@ -446,7 +446,7 @@ int __init musb_platform_init(struct musb *musb, void *board_data)
msleep(5); msleep(5);
musb->isr = am35x_interrupt; musb->isr = am35x_musb_interrupt;
/* clear level interrupt */ /* clear level interrupt */
lvl_intr = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); lvl_intr = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
@ -461,7 +461,7 @@ exit0:
return status; return status;
} }
int musb_platform_exit(struct musb *musb) static int am35x_musb_exit(struct musb *musb)
{ {
if (is_host_enabled(musb)) if (is_host_enabled(musb))
del_timer_sync(&otg_workaround); del_timer_sync(&otg_workaround);
@ -522,3 +522,16 @@ void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
memcpy(dst, &val, len); memcpy(dst, &val, len);
} }
} }
const struct musb_platform_ops musb_ops = {
.init = am35x_musb_init,
.exit = am35x_musb_exit,
.enable = am35x_musb_enable,
.disable = am35x_musb_disable,
.set_mode = am35x_musb_set_mode,
.try_idle = am35x_musb_try_idle,
.set_vbus = am35x_musb_set_vbus,
};

View File

@ -277,7 +277,7 @@ static void musb_conn_timer_handler(unsigned long _musb)
DBG(4, "state is %s\n", otg_state_string(musb)); DBG(4, "state is %s\n", otg_state_string(musb));
} }
void musb_platform_enable(struct musb *musb) static void bfin_musb_enable(struct musb *musb)
{ {
if (!is_otg_enabled(musb) && is_host_enabled(musb)) { if (!is_otg_enabled(musb) && is_host_enabled(musb)) {
mod_timer(&musb_conn_timer, jiffies + TIMER_DELAY); mod_timer(&musb_conn_timer, jiffies + TIMER_DELAY);
@ -285,11 +285,11 @@ void musb_platform_enable(struct musb *musb)
} }
} }
void musb_platform_disable(struct musb *musb) static void bfin_musb_disable(struct musb *musb)
{ {
} }
static void bfin_set_vbus(struct musb *musb, int is_on) static void bfin_musb_set_vbus(struct musb *musb, int is_on)
{ {
int value = musb->config->gpio_vrsel_active; int value = musb->config->gpio_vrsel_active;
if (!is_on) if (!is_on)
@ -302,51 +302,29 @@ static void bfin_set_vbus(struct musb *musb, int is_on)
musb_readb(musb->mregs, MUSB_DEVCTL)); musb_readb(musb->mregs, MUSB_DEVCTL));
} }
static int bfin_set_power(struct otg_transceiver *x, unsigned mA) static int bfin_musb_set_power(struct otg_transceiver *x, unsigned mA)
{ {
return 0; return 0;
} }
void musb_platform_try_idle(struct musb *musb, unsigned long timeout) static void bfin_musb_try_idle(struct musb *musb, unsigned long timeout)
{ {
if (!is_otg_enabled(musb) && is_host_enabled(musb)) if (!is_otg_enabled(musb) && is_host_enabled(musb))
mod_timer(&musb_conn_timer, jiffies + TIMER_DELAY); mod_timer(&musb_conn_timer, jiffies + TIMER_DELAY);
} }
int musb_platform_get_vbus_status(struct musb *musb) static int bfin_musb_get_vbus_status(struct musb *musb)
{ {
return 0; return 0;
} }
int musb_platform_set_mode(struct musb *musb, u8 musb_mode) static int bfin_musb_set_mode(struct musb *musb, u8 musb_mode)
{ {
return -EIO; return -EIO;
} }
int __init musb_platform_init(struct musb *musb) static void bfin_musb_reg_init(struct musb *musb)
{ {
/*
* Rev 1.0 BF549 EZ-KITs require PE7 to be high for both DEVICE
* and OTG HOST modes, while rev 1.1 and greater require PE7 to
* be low for DEVICE mode and high for HOST mode. We set it high
* here because we are in host mode
*/
if (gpio_request(musb->config->gpio_vrsel, "USB_VRSEL")) {
printk(KERN_ERR "Failed ro request USB_VRSEL GPIO_%d \n",
musb->config->gpio_vrsel);
return -ENODEV;
}
gpio_direction_output(musb->config->gpio_vrsel, 0);
usb_nop_xceiv_register();
musb->xceiv = otg_get_transceiver();
if (!musb->xceiv) {
gpio_free(musb->config->gpio_vrsel);
return -ENODEV;
}
if (ANOMALY_05000346) { if (ANOMALY_05000346) {
bfin_write_USB_APHY_CALIB(ANOMALY_05000346_value); bfin_write_USB_APHY_CALIB(ANOMALY_05000346_value);
SSYNC(); SSYNC();
@ -380,21 +358,69 @@ int __init musb_platform_init(struct musb *musb)
EP2_RX_ENA | EP3_RX_ENA | EP4_RX_ENA | EP2_RX_ENA | EP3_RX_ENA | EP4_RX_ENA |
EP5_RX_ENA | EP6_RX_ENA | EP7_RX_ENA); EP5_RX_ENA | EP6_RX_ENA | EP7_RX_ENA);
SSYNC(); SSYNC();
}
static int bfin_musb_init(struct musb *musb)
{
/*
* Rev 1.0 BF549 EZ-KITs require PE7 to be high for both DEVICE
* and OTG HOST modes, while rev 1.1 and greater require PE7 to
* be low for DEVICE mode and high for HOST mode. We set it high
* here because we are in host mode
*/
if (gpio_request(musb->config->gpio_vrsel, "USB_VRSEL")) {
printk(KERN_ERR "Failed ro request USB_VRSEL GPIO_%d\n",
musb->config->gpio_vrsel);
return -ENODEV;
}
gpio_direction_output(musb->config->gpio_vrsel, 0);
usb_nop_xceiv_register();
musb->xceiv = otg_get_transceiver();
if (!musb->xceiv) {
gpio_free(musb->config->gpio_vrsel);
return -ENODEV;
}
bfin_musb_reg_init(musb);
if (is_host_enabled(musb)) { if (is_host_enabled(musb)) {
musb->board_set_vbus = bfin_set_vbus; musb->board_set_vbus = bfin_musb_set_vbus;
setup_timer(&musb_conn_timer, setup_timer(&musb_conn_timer,
musb_conn_timer_handler, (unsigned long) musb); musb_conn_timer_handler, (unsigned long) musb);
} }
if (is_peripheral_enabled(musb)) if (is_peripheral_enabled(musb))
musb->xceiv->set_power = bfin_set_power; musb->xceiv->set_power = bfin_musb_set_power;
musb->isr = blackfin_interrupt; musb->isr = blackfin_interrupt;
return 0; return 0;
} }
int musb_platform_exit(struct musb *musb) #ifdef CONFIG_PM
void musb_platform_save_context(struct musb *musb,
struct musb_context_registers *musb_context)
{
if (is_host_active(musb))
/*
* During hibernate gpio_vrsel will change from high to low
* low which will generate wakeup event resume the system
* immediately. Set it to 0 before hibernate to avoid this
* wakeup event.
*/
gpio_set_value(musb->config->gpio_vrsel, 0);
}
void musb_platform_restore_context(struct musb *musb,
struct musb_context_registers *musb_context)
{
bfin_musb_reg_init(musb);
}
#endif
static int bfin_musb_exit(struct musb *musb)
{ {
gpio_free(musb->config->gpio_vrsel); gpio_free(musb->config->gpio_vrsel);
@ -402,3 +428,17 @@ int musb_platform_exit(struct musb *musb)
usb_nop_xceiv_unregister(); usb_nop_xceiv_unregister();
return 0; return 0;
} }
const struct musb_platform_ops musb_ops = {
.init = bfin_musb_init,
.exit = bfin_musb_exit,
.enable = bfin_musb_enable,
.disable = bfin_musb_disable,
.set_mode = bfin_musb_set_mode,
.try_idle = bfin_musb_try_idle,
.vbus_status = bfin_musb_vbus_status,
.set_vbus = bfin_musb_set_vbus,
};

View File

@ -131,9 +131,9 @@ static inline void phy_off(void)
*/ */
/** /**
* musb_platform_enable - enable interrupts * da8xx_musb_enable - enable interrupts
*/ */
void musb_platform_enable(struct musb *musb) static void da8xx_musb_enable(struct musb *musb)
{ {
void __iomem *reg_base = musb->ctrl_base; void __iomem *reg_base = musb->ctrl_base;
u32 mask; u32 mask;
@ -151,9 +151,9 @@ void musb_platform_enable(struct musb *musb)
} }
/** /**
* musb_platform_disable - disable HDRC and flush interrupts * da8xx_musb_disable - disable HDRC and flush interrupts
*/ */
void musb_platform_disable(struct musb *musb) static void da8xx_musb_disable(struct musb *musb)
{ {
void __iomem *reg_base = musb->ctrl_base; void __iomem *reg_base = musb->ctrl_base;
@ -170,7 +170,7 @@ void musb_platform_disable(struct musb *musb)
#define portstate(stmt) #define portstate(stmt)
#endif #endif
static void da8xx_set_vbus(struct musb *musb, int is_on) static void da8xx_musb_set_vbus(struct musb *musb, int is_on)
{ {
WARN_ON(is_on && is_peripheral_active(musb)); WARN_ON(is_on && is_peripheral_active(musb));
} }
@ -252,7 +252,7 @@ static void otg_timer(unsigned long _musb)
spin_unlock_irqrestore(&musb->lock, flags); spin_unlock_irqrestore(&musb->lock, flags);
} }
void musb_platform_try_idle(struct musb *musb, unsigned long timeout) static void da8xx_musb_try_idle(struct musb *musb, unsigned long timeout)
{ {
static unsigned long last_timer; static unsigned long last_timer;
@ -282,7 +282,7 @@ void musb_platform_try_idle(struct musb *musb, unsigned long timeout)
mod_timer(&otg_workaround, timeout); mod_timer(&otg_workaround, timeout);
} }
static irqreturn_t da8xx_interrupt(int irq, void *hci) static irqreturn_t da8xx_musb_interrupt(int irq, void *hci)
{ {
struct musb *musb = hci; struct musb *musb = hci;
void __iomem *reg_base = musb->ctrl_base; void __iomem *reg_base = musb->ctrl_base;
@ -380,7 +380,7 @@ static irqreturn_t da8xx_interrupt(int irq, void *hci)
return ret; return ret;
} }
int musb_platform_set_mode(struct musb *musb, u8 musb_mode) static int da8xx_musb_set_mode(struct musb *musb, u8 musb_mode)
{ {
u32 cfgchip2 = __raw_readl(CFGCHIP2); u32 cfgchip2 = __raw_readl(CFGCHIP2);
@ -409,7 +409,7 @@ int musb_platform_set_mode(struct musb *musb, u8 musb_mode)
return 0; return 0;
} }
int __init musb_platform_init(struct musb *musb, void *board_data) static int da8xx_musb_init(struct musb *musb)
{ {
void __iomem *reg_base = musb->ctrl_base; void __iomem *reg_base = musb->ctrl_base;
u32 rev; u32 rev;
@ -431,7 +431,7 @@ int __init musb_platform_init(struct musb *musb, void *board_data)
if (is_host_enabled(musb)) if (is_host_enabled(musb))
setup_timer(&otg_workaround, otg_timer, (unsigned long)musb); setup_timer(&otg_workaround, otg_timer, (unsigned long)musb);
musb->board_set_vbus = da8xx_set_vbus; musb->board_set_vbus = da8xx_musb_set_vbus;
/* Reset the controller */ /* Reset the controller */
musb_writel(reg_base, DA8XX_USB_CTRL_REG, DA8XX_SOFT_RESET_MASK); musb_writel(reg_base, DA8XX_USB_CTRL_REG, DA8XX_SOFT_RESET_MASK);
@ -446,14 +446,14 @@ int __init musb_platform_init(struct musb *musb, void *board_data)
rev, __raw_readl(CFGCHIP2), rev, __raw_readl(CFGCHIP2),
musb_readb(reg_base, DA8XX_USB_CTRL_REG)); musb_readb(reg_base, DA8XX_USB_CTRL_REG));
musb->isr = da8xx_interrupt; musb->isr = da8xx_musb_interrupt;
return 0; return 0;
fail: fail:
clk_disable(musb->clock); clk_disable(musb->clock);
return -ENODEV; return -ENODEV;
} }
int musb_platform_exit(struct musb *musb) static int da8xx_musb_exit(struct musb *musb)
{ {
if (is_host_enabled(musb)) if (is_host_enabled(musb))
del_timer_sync(&otg_workaround); del_timer_sync(&otg_workaround);
@ -467,3 +467,16 @@ int musb_platform_exit(struct musb *musb)
return 0; return 0;
} }
const struct musb_platform_ops musb_ops = {
.init = da8xx_musb_init,
.exit = da8xx_musb_exit,
.enable = da8xx_musb_enable,
.disable = da8xx_musb_disable,
.set_mode = da8xx_musb_set_mode,
.try_idle = da8xx_musb_try_idle,
.set_vbus = da8xx_musb_set_vbus,
};

View File

@ -83,7 +83,7 @@ static inline void phy_off(void)
static int dma_off = 1; static int dma_off = 1;
void musb_platform_enable(struct musb *musb) static void davinci_musb_enable(struct musb *musb)
{ {
u32 tmp, old, val; u32 tmp, old, val;
@ -116,7 +116,7 @@ void musb_platform_enable(struct musb *musb)
/* /*
* Disable the HDRC and flush interrupts * Disable the HDRC and flush interrupts
*/ */
void musb_platform_disable(struct musb *musb) static void davinci_musb_disable(struct musb *musb)
{ {
/* because we don't set CTRLR.UINT, "important" to: /* because we don't set CTRLR.UINT, "important" to:
* - not read/write INTRUSB/INTRUSBE * - not read/write INTRUSB/INTRUSBE
@ -167,7 +167,7 @@ static void evm_deferred_drvvbus(struct work_struct *ignored)
#endif /* EVM */ #endif /* EVM */
static void davinci_source_power(struct musb *musb, int is_on, int immediate) static void davinci_musb_source_power(struct musb *musb, int is_on, int immediate)
{ {
#ifdef CONFIG_MACH_DAVINCI_EVM #ifdef CONFIG_MACH_DAVINCI_EVM
if (is_on) if (is_on)
@ -190,10 +190,10 @@ static void davinci_source_power(struct musb *musb, int is_on, int immediate)
#endif #endif
} }
static void davinci_set_vbus(struct musb *musb, int is_on) static void davinci_musb_set_vbus(struct musb *musb, int is_on)
{ {
WARN_ON(is_on && is_peripheral_active(musb)); WARN_ON(is_on && is_peripheral_active(musb));
davinci_source_power(musb, is_on, 0); davinci_musb_source_power(musb, is_on, 0);
} }
@ -259,7 +259,7 @@ static void otg_timer(unsigned long _musb)
spin_unlock_irqrestore(&musb->lock, flags); spin_unlock_irqrestore(&musb->lock, flags);
} }
static irqreturn_t davinci_interrupt(int irq, void *__hci) static irqreturn_t davinci_musb_interrupt(int irq, void *__hci)
{ {
unsigned long flags; unsigned long flags;
irqreturn_t retval = IRQ_NONE; irqreturn_t retval = IRQ_NONE;
@ -345,7 +345,7 @@ static irqreturn_t davinci_interrupt(int irq, void *__hci)
/* NOTE: this must complete poweron within 100 msec /* NOTE: this must complete poweron within 100 msec
* (OTG_TIME_A_WAIT_VRISE) but we don't check for that. * (OTG_TIME_A_WAIT_VRISE) but we don't check for that.
*/ */
davinci_source_power(musb, drvvbus, 0); davinci_musb_source_power(musb, drvvbus, 0);
DBG(2, "VBUS %s (%s)%s, devctl %02x\n", DBG(2, "VBUS %s (%s)%s, devctl %02x\n",
drvvbus ? "on" : "off", drvvbus ? "on" : "off",
otg_state_string(musb), otg_state_string(musb),
@ -370,13 +370,13 @@ static irqreturn_t davinci_interrupt(int irq, void *__hci)
return retval; return retval;
} }
int musb_platform_set_mode(struct musb *musb, u8 mode) static int davinci_musb_set_mode(struct musb *musb, u8 mode)
{ {
/* EVM can't do this (right?) */ /* EVM can't do this (right?) */
return -EIO; return -EIO;
} }
int __init musb_platform_init(struct musb *musb) static int davinci_musb_init(struct musb *musb)
{ {
void __iomem *tibase = musb->ctrl_base; void __iomem *tibase = musb->ctrl_base;
u32 revision; u32 revision;
@ -398,8 +398,8 @@ int __init musb_platform_init(struct musb *musb)
if (is_host_enabled(musb)) if (is_host_enabled(musb))
setup_timer(&otg_workaround, otg_timer, (unsigned long) musb); setup_timer(&otg_workaround, otg_timer, (unsigned long) musb);
musb->board_set_vbus = davinci_set_vbus; musb->board_set_vbus = davinci_musb_set_vbus;
davinci_source_power(musb, 0, 1); davinci_musb_source_power(musb, 0, 1);
/* dm355 EVM swaps D+/D- for signal integrity, and /* dm355 EVM swaps D+/D- for signal integrity, and
* is clocked from the main 24 MHz crystal. * is clocked from the main 24 MHz crystal.
@ -440,7 +440,7 @@ int __init musb_platform_init(struct musb *musb)
revision, __raw_readl(USB_PHY_CTRL), revision, __raw_readl(USB_PHY_CTRL),
musb_readb(tibase, DAVINCI_USB_CTRL_REG)); musb_readb(tibase, DAVINCI_USB_CTRL_REG));
musb->isr = davinci_interrupt; musb->isr = davinci_musb_interrupt;
return 0; return 0;
fail: fail:
@ -451,7 +451,7 @@ fail:
return -ENODEV; return -ENODEV;
} }
int musb_platform_exit(struct musb *musb) static int davinci_musb_exit(struct musb *musb)
{ {
if (is_host_enabled(musb)) if (is_host_enabled(musb))
del_timer_sync(&otg_workaround); del_timer_sync(&otg_workaround);
@ -465,7 +465,7 @@ int musb_platform_exit(struct musb *musb)
__raw_writel(deepsleep, DM355_DEEPSLEEP); __raw_writel(deepsleep, DM355_DEEPSLEEP);
} }
davinci_source_power(musb, 0 /*off*/, 1); davinci_musb_source_power(musb, 0 /*off*/, 1);
/* delay, to avoid problems with module reload */ /* delay, to avoid problems with module reload */
if (is_host_enabled(musb) && musb->xceiv->default_a) { if (is_host_enabled(musb) && musb->xceiv->default_a) {
@ -502,3 +502,15 @@ int musb_platform_exit(struct musb *musb)
return 0; return 0;
} }
const struct musb_platform_ops musb_ops = {
.init = davinci_musb_init,
.exit = davinci_musb_exit,
.enable = davinci_musb_enable,
.disable = davinci_musb_disable,
.set_mode = davinci_musb_set_mode,
.set_vbus = davinci_musb_set_vbus,
};

View File

@ -390,7 +390,7 @@ void musb_otg_timer_func(unsigned long data)
case OTG_STATE_A_SUSPEND: case OTG_STATE_A_SUSPEND:
case OTG_STATE_A_WAIT_BCON: case OTG_STATE_A_WAIT_BCON:
DBG(1, "HNP: %s timeout\n", otg_state_string(musb)); DBG(1, "HNP: %s timeout\n", otg_state_string(musb));
musb_set_vbus(musb, 0); musb_platform_set_vbus(musb, 0);
musb->xceiv->state = OTG_STATE_A_WAIT_VFALL; musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
break; break;
default: default:
@ -570,7 +570,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
musb->ep0_stage = MUSB_EP0_START; musb->ep0_stage = MUSB_EP0_START;
musb->xceiv->state = OTG_STATE_A_IDLE; musb->xceiv->state = OTG_STATE_A_IDLE;
MUSB_HST_MODE(musb); MUSB_HST_MODE(musb);
musb_set_vbus(musb, 1); musb_platform_set_vbus(musb, 1);
handled = IRQ_HANDLED; handled = IRQ_HANDLED;
} }
@ -641,7 +641,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
/* go through A_WAIT_VFALL then start a new session */ /* go through A_WAIT_VFALL then start a new session */
if (!ignore) if (!ignore)
musb_set_vbus(musb, 0); musb_platform_set_vbus(musb, 0);
handled = IRQ_HANDLED; handled = IRQ_HANDLED;
} }
@ -1898,6 +1898,8 @@ allocate_instance(struct device *dev,
} }
musb->controller = dev; musb->controller = dev;
musb->ops = &musb_ops;
return musb; return musb;
} }

View File

@ -281,6 +281,8 @@ struct musb_platform_ops {
void (*set_vbus)(struct musb *musb, int on); void (*set_vbus)(struct musb *musb, int on);
}; };
extern const struct musb_platform_ops musb_ops;
/* /*
* struct musb_hw_ep - endpoint hardware (bidirectional) * struct musb_hw_ep - endpoint hardware (bidirectional)
* *
@ -359,6 +361,9 @@ struct musb {
spinlock_t lock; spinlock_t lock;
struct clk *clock; struct clk *clock;
struct clk *phy_clock; struct clk *phy_clock;
const struct musb_platform_ops *ops;
irqreturn_t (*isr)(int, void *); irqreturn_t (*isr)(int, void *);
struct work_struct irq_work; struct work_struct irq_work;
u16 hwvers; u16 hwvers;
@ -486,52 +491,6 @@ struct musb {
#endif #endif
}; };
#ifdef CONFIG_PM
struct musb_csr_regs {
/* FIFO registers */
u16 txmaxp, txcsr, rxmaxp, rxcsr;
u16 rxfifoadd, txfifoadd;
u8 txtype, txinterval, rxtype, rxinterval;
u8 rxfifosz, txfifosz;
u8 txfunaddr, txhubaddr, txhubport;
u8 rxfunaddr, rxhubaddr, rxhubport;
};
struct musb_context_registers {
#if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \
defined(CONFIG_ARCH_OMAP4)
u32 otg_sysconfig, otg_forcestandby;
#endif
u8 power;
u16 intrtxe, intrrxe;
u8 intrusbe;
u16 frame;
u8 index, testmode;
u8 devctl, busctl, misc;
struct musb_csr_regs index_regs[MUSB_C_NUM_EPS];
};
#if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \
defined(CONFIG_ARCH_OMAP4)
extern void musb_platform_save_context(struct musb *musb,
struct musb_context_registers *musb_context);
extern void musb_platform_restore_context(struct musb *musb,
struct musb_context_registers *musb_context);
#else
#define musb_platform_save_context(m, x) do {} while (0)
#define musb_platform_restore_context(m, x) do {} while (0)
#endif
#endif
static inline void musb_set_vbus(struct musb *musb, int is_on)
{
musb->board_set_vbus(musb, is_on);
}
#ifdef CONFIG_USB_GADGET_MUSB_HDRC #ifdef CONFIG_USB_GADGET_MUSB_HDRC
static inline struct musb *gadget_to_musb(struct usb_gadget *g) static inline struct musb *gadget_to_musb(struct usb_gadget *g)
{ {
@ -620,29 +579,120 @@ extern void musb_load_testpacket(struct musb *);
extern irqreturn_t musb_interrupt(struct musb *); extern irqreturn_t musb_interrupt(struct musb *);
extern void musb_platform_enable(struct musb *musb);
extern void musb_platform_disable(struct musb *musb);
extern void musb_hnp_stop(struct musb *musb); extern void musb_hnp_stop(struct musb *musb);
extern int musb_platform_set_mode(struct musb *musb, u8 musb_mode); #ifdef CONFIG_PM
struct musb_csr_regs {
/* FIFO registers */
u16 txmaxp, txcsr, rxmaxp, rxcsr;
u16 rxfifoadd, txfifoadd;
u8 txtype, txinterval, rxtype, rxinterval;
u8 rxfifosz, txfifosz;
u8 txfunaddr, txhubaddr, txhubport;
u8 rxfunaddr, rxhubaddr, rxhubport;
};
#if defined(CONFIG_USB_TUSB6010) || defined(CONFIG_BLACKFIN) || \ struct musb_context_registers {
defined(CONFIG_ARCH_DAVINCI_DA8XX) || \
defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \ #if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \
defined(CONFIG_ARCH_OMAP4) defined(CONFIG_ARCH_OMAP4)
extern void musb_platform_try_idle(struct musb *musb, unsigned long timeout); u32 otg_sysconfig, otg_forcestandby;
#endif
u8 power;
u16 intrtxe, intrrxe;
u8 intrusbe;
u16 frame;
u8 index, testmode;
u8 devctl, busctl, misc;
struct musb_csr_regs index_regs[MUSB_C_NUM_EPS];
};
#if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \
defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_BLACKFIN)
extern void musb_platform_save_context(struct musb *musb,
struct musb_context_registers *musb_context);
extern void musb_platform_restore_context(struct musb *musb,
struct musb_context_registers *musb_context);
#else #else
#define musb_platform_try_idle(x, y) do {} while (0) #define musb_platform_save_context(m, x) do {} while (0)
#define musb_platform_restore_context(m, x) do {} while (0)
#endif #endif
#if defined(CONFIG_USB_TUSB6010) || defined(CONFIG_BLACKFIN)
extern int musb_platform_get_vbus_status(struct musb *musb);
#else
#define musb_platform_get_vbus_status(x) 0
#endif #endif
extern int __init musb_platform_init(struct musb *musb); static inline void musb_platform_set_vbus(struct musb *musb, int is_on)
extern int musb_platform_exit(struct musb *musb); {
if (musb->ops->set_vbus)
musb->ops->set_vbus(musb, is_on);
}
static inline void musb_platform_enable(struct musb *musb)
{
if (musb->ops->enable)
musb->ops->enable(musb);
}
static inline void musb_platform_disable(struct musb *musb)
{
if (musb->ops->disable)
musb->ops->disable(musb);
}
static inline int musb_platform_set_mode(struct musb *musb, u8 mode)
{
if (!musb->ops->set_mode)
return 0;
return musb->ops->set_mode(musb, mode);
}
static inline void musb_platform_try_idle(struct musb *musb,
unsigned long timeout)
{
if (musb->ops->try_idle)
musb->ops->try_idle(musb, timeout);
}
static inline int musb_platform_get_vbus_status(struct musb *musb)
{
if (!musb->ops->vbus_status)
return 0;
return musb->ops->vbus_status(musb);
}
static inline int musb_platform_init(struct musb *musb)
{
if (!musb->ops->init)
return -EINVAL;
return musb->ops->init(musb);
}
static inline int musb_platform_exit(struct musb *musb)
{
if (!musb->ops->exit)
return -EINVAL;
return musb->ops->exit(musb);
}
static inline int musb_platform_suspend(struct musb *musb)
{
if (!musb->ops->suspend)
return 0;
return musb->ops->suspend(musb);
}
static inline int musb_platform_resume(struct musb *musb)
{
if (!musb->ops->resume)
return 0;
return musb->ops->resume(musb);
}
#endif /* __MUSB_CORE_H__ */ #endif /* __MUSB_CORE_H__ */

View File

@ -276,7 +276,7 @@ int musb_hub_control(
break; break;
case USB_PORT_FEAT_POWER: case USB_PORT_FEAT_POWER:
if (!(is_otg_enabled(musb) && hcd->self.is_b_host)) if (!(is_otg_enabled(musb) && hcd->self.is_b_host))
musb_set_vbus(musb, 0); musb_platform_set_vbus(musb, 0);
break; break;
case USB_PORT_FEAT_C_CONNECTION: case USB_PORT_FEAT_C_CONNECTION:
case USB_PORT_FEAT_C_ENABLE: case USB_PORT_FEAT_C_ENABLE:

View File

@ -35,7 +35,6 @@
#include "musb_core.h" #include "musb_core.h"
#include "omap2430.h" #include "omap2430.h"
static struct timer_list musb_idle_timer; static struct timer_list musb_idle_timer;
static void musb_do_idle(unsigned long _musb) static void musb_do_idle(unsigned long _musb)
@ -98,7 +97,7 @@ static void musb_do_idle(unsigned long _musb)
} }
void musb_platform_try_idle(struct musb *musb, unsigned long timeout) static void omap2430_musb_try_idle(struct musb *musb, unsigned long timeout)
{ {
unsigned long default_timeout = jiffies + msecs_to_jiffies(3); unsigned long default_timeout = jiffies + msecs_to_jiffies(3);
static unsigned long last_timer; static unsigned long last_timer;
@ -131,13 +130,15 @@ void musb_platform_try_idle(struct musb *musb, unsigned long timeout)
mod_timer(&musb_idle_timer, timeout); mod_timer(&musb_idle_timer, timeout);
} }
void musb_platform_enable(struct musb *musb) static void omap2430_musb_enable(struct musb *musb)
{ {
} }
void musb_platform_disable(struct musb *musb)
static void omap2430_musb_disable(struct musb *musb)
{ {
} }
static void omap_set_vbus(struct musb *musb, int is_on)
static void omap2430_musb_set_vbus(struct musb *musb, int is_on)
{ {
u8 devctl; u8 devctl;
/* HDRC controls CPEN, but beware current surges during device /* HDRC controls CPEN, but beware current surges during device
@ -175,9 +176,9 @@ static void omap_set_vbus(struct musb *musb, int is_on)
musb_readb(musb->mregs, MUSB_DEVCTL)); musb_readb(musb->mregs, MUSB_DEVCTL));
} }
static int musb_platform_resume(struct musb *musb); static int omap2430_musb_resume(struct musb *musb);
int musb_platform_set_mode(struct musb *musb, u8 musb_mode) static int omap2430_musb_set_mode(struct musb *musb, u8 musb_mode)
{ {
u8 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); u8 devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
@ -187,7 +188,7 @@ int musb_platform_set_mode(struct musb *musb, u8 musb_mode)
return 0; return 0;
} }
int __init musb_platform_init(struct musb *musb) static int omap2430_musb_init(struct musb *musb)
{ {
u32 l; u32 l;
struct device *dev = musb->controller; struct device *dev = musb->controller;
@ -204,7 +205,7 @@ int __init musb_platform_init(struct musb *musb)
return -ENODEV; return -ENODEV;
} }
musb_platform_resume(musb); omap2430_musb_resume(musb);
l = musb_readl(musb->mregs, OTG_SYSCONFIG); l = musb_readl(musb->mregs, OTG_SYSCONFIG);
l &= ~ENABLEWAKEUP; /* disable wakeup */ l &= ~ENABLEWAKEUP; /* disable wakeup */
@ -242,7 +243,7 @@ int __init musb_platform_init(struct musb *musb)
musb_readl(musb->mregs, OTG_SIMENABLE)); musb_readl(musb->mregs, OTG_SIMENABLE));
if (is_host_enabled(musb)) if (is_host_enabled(musb))
musb->board_set_vbus = omap_set_vbus; musb->board_set_vbus = omap2430_musb_set_vbus;
setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb); setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb);
@ -265,7 +266,7 @@ void musb_platform_restore_context(struct musb *musb,
} }
#endif #endif
static int musb_platform_suspend(struct musb *musb) static int omap2430_musb_suspend(struct musb *musb)
{ {
u32 l; u32 l;
@ -291,7 +292,7 @@ static int musb_platform_suspend(struct musb *musb)
return 0; return 0;
} }
static int musb_platform_resume(struct musb *musb) static int omap2430_musb_resume(struct musb *musb)
{ {
u32 l; u32 l;
@ -316,12 +317,27 @@ static int musb_platform_resume(struct musb *musb)
return 0; return 0;
} }
static int omap2430_musb_exit(struct musb *musb)
int musb_platform_exit(struct musb *musb)
{ {
musb_platform_suspend(musb); omap2430_musb_suspend(musb);
otg_put_transceiver(musb->xceiv); otg_put_transceiver(musb->xceiv);
return 0; return 0;
} }
const struct musb_platform_ops musb_ops = {
.init = omap2430_musb_init,
.exit = omap2430_musb_exit,
.suspend = omap2430_musb_suspend,
.resume = omap2430_musb_resume,
.enable = omap2430_musb_enable,
.disable = omap2430_musb_disable,
.set_mode = omap2430_musb_set_mode,
.try_idle = omap2430_musb_try_idle,
.set_vbus = omap2430_musb_set_vbus,
};

View File

@ -24,7 +24,7 @@
#include "musb_core.h" #include "musb_core.h"
static void tusb_source_power(struct musb *musb, int is_on); static void tusb_musb_set_vbus(struct musb *musb, int is_on);
#define TUSB_REV_MAJOR(reg_val) ((reg_val >> 4) & 0xf) #define TUSB_REV_MAJOR(reg_val) ((reg_val >> 4) & 0xf)
#define TUSB_REV_MINOR(reg_val) (reg_val & 0xf) #define TUSB_REV_MINOR(reg_val) (reg_val & 0xf)
@ -50,7 +50,7 @@ u8 tusb_get_revision(struct musb *musb)
return rev; return rev;
} }
static int __init tusb_print_revision(struct musb *musb) static int tusb_print_revision(struct musb *musb)
{ {
void __iomem *tbase = musb->ctrl_base; void __iomem *tbase = musb->ctrl_base;
u8 rev; u8 rev;
@ -348,7 +348,7 @@ static void tusb_set_clock_source(struct musb *musb, unsigned mode)
* USB link is not suspended ... and tells us the relevant wakeup * USB link is not suspended ... and tells us the relevant wakeup
* events. SW_EN for voltage is handled separately. * events. SW_EN for voltage is handled separately.
*/ */
void tusb_allow_idle(struct musb *musb, u32 wakeup_enables) static void tusb_allow_idle(struct musb *musb, u32 wakeup_enables)
{ {
void __iomem *tbase = musb->ctrl_base; void __iomem *tbase = musb->ctrl_base;
u32 reg; u32 reg;
@ -385,7 +385,7 @@ void tusb_allow_idle(struct musb *musb, u32 wakeup_enables)
/* /*
* Updates cable VBUS status. Caller must take care of locking. * Updates cable VBUS status. Caller must take care of locking.
*/ */
int musb_platform_get_vbus_status(struct musb *musb) static int tusb_musb_vbus_status(struct musb *musb)
{ {
void __iomem *tbase = musb->ctrl_base; void __iomem *tbase = musb->ctrl_base;
u32 otg_stat, prcm_mngmt; u32 otg_stat, prcm_mngmt;
@ -431,7 +431,7 @@ static void musb_do_idle(unsigned long _musb)
} }
/* FALLTHROUGH */ /* FALLTHROUGH */
case OTG_STATE_A_IDLE: case OTG_STATE_A_IDLE:
tusb_source_power(musb, 0); tusb_musb_set_vbus(musb, 0);
default: default:
break; break;
} }
@ -475,7 +475,7 @@ done:
* we don't want to treat that full speed J as a wakeup event. * we don't want to treat that full speed J as a wakeup event.
* ... peripherals must draw only suspend current after 10 msec. * ... peripherals must draw only suspend current after 10 msec.
*/ */
void musb_platform_try_idle(struct musb *musb, unsigned long timeout) static void tusb_musb_try_idle(struct musb *musb, unsigned long timeout)
{ {
unsigned long default_timeout = jiffies + msecs_to_jiffies(3); unsigned long default_timeout = jiffies + msecs_to_jiffies(3);
static unsigned long last_timer; static unsigned long last_timer;
@ -515,7 +515,7 @@ void musb_platform_try_idle(struct musb *musb, unsigned long timeout)
| TUSB_DEV_OTG_TIMER_ENABLE) \ | TUSB_DEV_OTG_TIMER_ENABLE) \
: 0) : 0)
static void tusb_source_power(struct musb *musb, int is_on) static void tusb_musb_set_vbus(struct musb *musb, int is_on)
{ {
void __iomem *tbase = musb->ctrl_base; void __iomem *tbase = musb->ctrl_base;
u32 conf, prcm, timer; u32 conf, prcm, timer;
@ -599,7 +599,7 @@ static void tusb_source_power(struct musb *musb, int is_on)
* and peripheral modes in non-OTG configurations by reconfiguring hardware * and peripheral modes in non-OTG configurations by reconfiguring hardware
* and then setting musb->board_mode. For now, only support OTG mode. * and then setting musb->board_mode. For now, only support OTG mode.
*/ */
int musb_platform_set_mode(struct musb *musb, u8 musb_mode) static int tusb_musb_set_mode(struct musb *musb, u8 musb_mode)
{ {
void __iomem *tbase = musb->ctrl_base; void __iomem *tbase = musb->ctrl_base;
u32 otg_stat, phy_otg_ctrl, phy_otg_ena, dev_conf; u32 otg_stat, phy_otg_ctrl, phy_otg_ena, dev_conf;
@ -677,7 +677,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
default_a = is_host_enabled(musb); default_a = is_host_enabled(musb);
DBG(2, "Default-%c\n", default_a ? 'A' : 'B'); DBG(2, "Default-%c\n", default_a ? 'A' : 'B');
musb->xceiv->default_a = default_a; musb->xceiv->default_a = default_a;
tusb_source_power(musb, default_a); tusb_musb_set_vbus(musb, default_a);
/* Don't allow idling immediately */ /* Don't allow idling immediately */
if (default_a) if (default_a)
@ -722,7 +722,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
switch (musb->xceiv->state) { switch (musb->xceiv->state) {
case OTG_STATE_A_IDLE: case OTG_STATE_A_IDLE:
DBG(2, "Got SRP, turning on VBUS\n"); DBG(2, "Got SRP, turning on VBUS\n");
musb_set_vbus(musb, 1); musb_platform_set_vbus(musb, 1);
/* CONNECT can wake if a_wait_bcon is set */ /* CONNECT can wake if a_wait_bcon is set */
if (musb->a_wait_bcon != 0) if (musb->a_wait_bcon != 0)
@ -748,11 +748,11 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
*/ */
if (musb->vbuserr_retry) { if (musb->vbuserr_retry) {
musb->vbuserr_retry--; musb->vbuserr_retry--;
tusb_source_power(musb, 1); tusb_musb_set_vbus(musb, 1);
} else { } else {
musb->vbuserr_retry musb->vbuserr_retry
= VBUSERR_RETRY_COUNT; = VBUSERR_RETRY_COUNT;
tusb_source_power(musb, 0); tusb_musb_set_vbus(musb, 0);
} }
break; break;
default: default:
@ -786,7 +786,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
} else { } else {
/* REVISIT report overcurrent to hub? */ /* REVISIT report overcurrent to hub? */
ERR("vbus too slow, devctl %02x\n", devctl); ERR("vbus too slow, devctl %02x\n", devctl);
tusb_source_power(musb, 0); tusb_musb_set_vbus(musb, 0);
} }
break; break;
case OTG_STATE_A_WAIT_BCON: case OTG_STATE_A_WAIT_BCON:
@ -807,7 +807,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
return idle_timeout; return idle_timeout;
} }
static irqreturn_t tusb_interrupt(int irq, void *__hci) static irqreturn_t tusb_musb_interrupt(int irq, void *__hci)
{ {
struct musb *musb = __hci; struct musb *musb = __hci;
void __iomem *tbase = musb->ctrl_base; void __iomem *tbase = musb->ctrl_base;
@ -911,7 +911,7 @@ static irqreturn_t tusb_interrupt(int irq, void *__hci)
musb_writel(tbase, TUSB_INT_SRC_CLEAR, musb_writel(tbase, TUSB_INT_SRC_CLEAR,
int_src & ~TUSB_INT_MASK_RESERVED_BITS); int_src & ~TUSB_INT_MASK_RESERVED_BITS);
musb_platform_try_idle(musb, idle_timeout); tusb_musb_try_idle(musb, idle_timeout);
musb_writel(tbase, TUSB_INT_MASK, int_mask); musb_writel(tbase, TUSB_INT_MASK, int_mask);
spin_unlock_irqrestore(&musb->lock, flags); spin_unlock_irqrestore(&musb->lock, flags);
@ -926,7 +926,7 @@ static int dma_off;
* REVISIT: * REVISIT:
* - Check what is unnecessary in MGC_HdrcStart() * - Check what is unnecessary in MGC_HdrcStart()
*/ */
void musb_platform_enable(struct musb *musb) static void tusb_musb_enable(struct musb *musb)
{ {
void __iomem *tbase = musb->ctrl_base; void __iomem *tbase = musb->ctrl_base;
@ -970,7 +970,7 @@ void musb_platform_enable(struct musb *musb)
/* /*
* Disables TUSB6010. Caller must take care of locking. * Disables TUSB6010. Caller must take care of locking.
*/ */
void musb_platform_disable(struct musb *musb) static void tusb_musb_disable(struct musb *musb)
{ {
void __iomem *tbase = musb->ctrl_base; void __iomem *tbase = musb->ctrl_base;
@ -995,7 +995,7 @@ void musb_platform_disable(struct musb *musb)
* Sets up TUSB6010 CPU interface specific signals and registers * Sets up TUSB6010 CPU interface specific signals and registers
* Note: Settings optimized for OMAP24xx * Note: Settings optimized for OMAP24xx
*/ */
static void __init tusb_setup_cpu_interface(struct musb *musb) static void tusb_setup_cpu_interface(struct musb *musb)
{ {
void __iomem *tbase = musb->ctrl_base; void __iomem *tbase = musb->ctrl_base;
@ -1022,7 +1022,7 @@ static void __init tusb_setup_cpu_interface(struct musb *musb)
musb_writel(tbase, TUSB_WAIT_COUNT, 1); musb_writel(tbase, TUSB_WAIT_COUNT, 1);
} }
static int __init tusb_start(struct musb *musb) static int tusb_musb_start(struct musb *musb)
{ {
void __iomem *tbase = musb->ctrl_base; void __iomem *tbase = musb->ctrl_base;
int ret = 0; int ret = 0;
@ -1091,7 +1091,7 @@ err:
return -ENODEV; return -ENODEV;
} }
int __init musb_platform_init(struct musb *musb) static int tusb_musb_init(struct musb *musb)
{ {
struct platform_device *pdev; struct platform_device *pdev;
struct resource *mem; struct resource *mem;
@ -1131,16 +1131,14 @@ int __init musb_platform_init(struct musb *musb)
*/ */
musb->mregs += TUSB_BASE_OFFSET; musb->mregs += TUSB_BASE_OFFSET;
ret = tusb_start(musb); ret = tusb_musb_start(musb);
if (ret) { if (ret) {
printk(KERN_ERR "Could not start tusb6010 (%d)\n", printk(KERN_ERR "Could not start tusb6010 (%d)\n",
ret); ret);
goto done; goto done;
} }
musb->isr = tusb_interrupt; musb->isr = tusb_musb_interrupt;
if (is_host_enabled(musb))
musb->board_set_vbus = tusb_source_power;
if (is_peripheral_enabled(musb)) { if (is_peripheral_enabled(musb)) {
musb->xceiv->set_power = tusb_draw_power; musb->xceiv->set_power = tusb_draw_power;
the_musb = musb; the_musb = musb;
@ -1159,7 +1157,7 @@ done:
return ret; return ret;
} }
int musb_platform_exit(struct musb *musb) static int tusb_musb_exit(struct musb *musb)
{ {
del_timer_sync(&musb_idle_timer); del_timer_sync(&musb_idle_timer);
the_musb = NULL; the_musb = NULL;
@ -1173,3 +1171,17 @@ int musb_platform_exit(struct musb *musb)
usb_nop_xceiv_unregister(); usb_nop_xceiv_unregister();
return 0; return 0;
} }
const struct musb_platform_ops musb_ops = {
.init = tusb_musb_init,
.exit = tusb_musb_exit,
.enable = tusb_musb_enable,
.disable = tusb_musb_disable,
.set_mode = tusb_musb_set_mode,
.try_idle = tusb_musb_try_idle,
.vbus_status = tusb_musb_vbus_status,
.set_vbus = tusb_musb_set_vbus,
};