Commit 96a274d1 authored by David Brownell's avatar David Brownell Committed by Greg Kroah-Hartman

USB: musb: sysfs mode updates

Fix three omissions in the "mode" sysfs attribute support:
  (a) inability to report errors;
  (b) no DaVinci support ... just report an error;
  (c) for omap2430, accepting unsupportable values

The 2430 stuff is still odd....
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@nokia.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent aa69a809
...@@ -364,6 +364,12 @@ static irqreturn_t davinci_interrupt(int irq, void *__hci) ...@@ -364,6 +364,12 @@ static irqreturn_t davinci_interrupt(int irq, void *__hci)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
int musb_platform_set_mode(struct musb *musb, u8 mode)
{
/* EVM can't do this (right?) */
return -EIO;
}
int __init musb_platform_init(struct musb *musb) int __init musb_platform_init(struct musb *musb)
{ {
void __iomem *tibase = musb->ctrl_base; void __iomem *tibase = musb->ctrl_base;
......
...@@ -1671,17 +1671,20 @@ musb_mode_store(struct device *dev, struct device_attribute *attr, ...@@ -1671,17 +1671,20 @@ musb_mode_store(struct device *dev, struct device_attribute *attr,
{ {
struct musb *musb = dev_to_musb(dev); struct musb *musb = dev_to_musb(dev);
unsigned long flags; unsigned long flags;
int status;
spin_lock_irqsave(&musb->lock, flags); spin_lock_irqsave(&musb->lock, flags);
if (!strncmp(buf, "host", 4)) if (sysfs_streq(buf, "host"))
musb_platform_set_mode(musb, MUSB_HOST); status = musb_platform_set_mode(musb, MUSB_HOST);
if (!strncmp(buf, "peripheral", 10)) else if (sysfs_streq(buf, "peripheral"))
musb_platform_set_mode(musb, MUSB_PERIPHERAL); status = musb_platform_set_mode(musb, MUSB_PERIPHERAL);
if (!strncmp(buf, "otg", 3)) else if (sysfs_streq(buf, "otg"))
musb_platform_set_mode(musb, MUSB_OTG); status = musb_platform_set_mode(musb, MUSB_OTG);
else
status = -EINVAL;
spin_unlock_irqrestore(&musb->lock, flags); spin_unlock_irqrestore(&musb->lock, flags);
return n; return (status == 0) ? n : status;
} }
static DEVICE_ATTR(mode, 0644, musb_mode_show, musb_mode_store); static DEVICE_ATTR(mode, 0644, musb_mode_show, musb_mode_store);
......
...@@ -467,7 +467,7 @@ extern void musb_platform_disable(struct musb *musb); ...@@ -467,7 +467,7 @@ 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 void musb_platform_set_mode(struct musb *musb, u8 musb_mode); extern int musb_platform_set_mode(struct musb *musb, u8 musb_mode);
#if defined(CONFIG_USB_TUSB6010) || \ #if defined(CONFIG_USB_TUSB6010) || \
defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP34XX) defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP34XX)
......
...@@ -196,7 +196,7 @@ static int omap_set_power(struct otg_transceiver *x, unsigned mA) ...@@ -196,7 +196,7 @@ static int omap_set_power(struct otg_transceiver *x, unsigned mA)
static int musb_platform_resume(struct musb *musb); static int musb_platform_resume(struct musb *musb);
void musb_platform_set_mode(struct musb *musb, u8 musb_mode) int musb_platform_set_mode(struct musb *musb, u8 musb_mode)
{ {
u8 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); u8 devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
...@@ -204,15 +204,24 @@ void musb_platform_set_mode(struct musb *musb, u8 musb_mode) ...@@ -204,15 +204,24 @@ void musb_platform_set_mode(struct musb *musb, u8 musb_mode)
musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
switch (musb_mode) { switch (musb_mode) {
#ifdef CONFIG_USB_MUSB_HDRC_HCD
case MUSB_HOST: case MUSB_HOST:
otg_set_host(&musb->xceiv, musb->xceiv.host); otg_set_host(&musb->xceiv, musb->xceiv.host);
break; break;
#endif
#ifdef CONFIG_USB_GADGET_MUSB_HDRC
case MUSB_PERIPHERAL: case MUSB_PERIPHERAL:
otg_set_peripheral(&musb->xceiv, musb->xceiv.gadget); otg_set_peripheral(&musb->xceiv, musb->xceiv.gadget);
break; break;
#endif
#ifdef CONFIG_USB_MUSB_OTG
case MUSB_OTG: case MUSB_OTG:
break; break;
#endif
default:
return -EINVAL;
} }
return 0;
} }
int __init musb_platform_init(struct musb *musb) int __init musb_platform_init(struct musb *musb)
......
...@@ -598,7 +598,7 @@ static void tusb_source_power(struct musb *musb, int is_on) ...@@ -598,7 +598,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.
*/ */
void musb_platform_set_mode(struct musb *musb, u8 musb_mode) int musb_platform_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;
...@@ -641,7 +641,8 @@ void musb_platform_set_mode(struct musb *musb, u8 musb_mode) ...@@ -641,7 +641,8 @@ void musb_platform_set_mode(struct musb *musb, u8 musb_mode)
#endif #endif
default: default:
DBG(2, "Trying to set unknown mode %i\n", musb_mode); DBG(2, "Trying to set mode %i\n", musb_mode);
return -EINVAL;
} }
musb_writel(tbase, TUSB_PHY_OTG_CTRL, musb_writel(tbase, TUSB_PHY_OTG_CTRL,
...@@ -655,6 +656,8 @@ void musb_platform_set_mode(struct musb *musb, u8 musb_mode) ...@@ -655,6 +656,8 @@ void musb_platform_set_mode(struct musb *musb, u8 musb_mode)
!(otg_stat & TUSB_DEV_OTG_STAT_ID_STATUS)) !(otg_stat & TUSB_DEV_OTG_STAT_ID_STATUS))
INFO("Cannot be peripheral with mini-A cable " INFO("Cannot be peripheral with mini-A cable "
"otg_stat: %08x\n", otg_stat); "otg_stat: %08x\n", otg_stat);
return 0;
} }
static inline unsigned long static inline unsigned long
......
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