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: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
aa69a8093f
commit
96a274d1da
@@ -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,
|
|||||||
{
|
{
|
||||||
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);
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
#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)
|
|||||||
!(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
|
||||||
|
Reference in New Issue
Block a user