Commit e96bdc3d authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Felipe Balbi

usb: musb: dsps: remove the hardcoded phy pieces

dsps uses a nop driver which is added in dsps itself and does the PHY
on/off calls within dsps. Since those calls are now moved the nop driver
itself, we can now request the phy proper phy and remove those calls.
Currently only the first musb interface is used so we only add one phy
node for now.
Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 3bb869c8
...@@ -120,49 +120,8 @@ struct dsps_glue { ...@@ -120,49 +120,8 @@ struct dsps_glue {
const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */ const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */
struct timer_list timer[2]; /* otg_workaround timer */ struct timer_list timer[2]; /* otg_workaround timer */
unsigned long last_timer[2]; /* last timer data for each instance */ unsigned long last_timer[2]; /* last timer data for each instance */
u32 __iomem *usb_ctrl[2];
}; };
#define DSPS_AM33XX_CONTROL_MODULE_PHYS_0 0x44e10620
#define DSPS_AM33XX_CONTROL_MODULE_PHYS_1 0x44e10628
static const resource_size_t dsps_control_module_phys[] = {
DSPS_AM33XX_CONTROL_MODULE_PHYS_0,
DSPS_AM33XX_CONTROL_MODULE_PHYS_1,
};
#define USBPHY_CM_PWRDN (1 << 0)
#define USBPHY_OTG_PWRDN (1 << 1)
#define USBPHY_OTGVDET_EN (1 << 19)
#define USBPHY_OTGSESSEND_EN (1 << 20)
/**
* musb_dsps_phy_control - phy on/off
* @glue: struct dsps_glue *
* @id: musb instance
* @on: flag for phy to be switched on or off
*
* This is to enable the PHY using usb_ctrl register in system control
* module space.
*
* XXX: This function will be removed once we have a seperate driver for
* control module
*/
static void musb_dsps_phy_control(struct dsps_glue *glue, u8 id, u8 on)
{
u32 usbphycfg;
usbphycfg = readl(glue->usb_ctrl[id]);
if (on) {
usbphycfg &= ~(USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN);
usbphycfg |= USBPHY_OTGVDET_EN | USBPHY_OTGSESSEND_EN;
} else {
usbphycfg |= USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN;
}
writel(usbphycfg, glue->usb_ctrl[id]);
}
/** /**
* dsps_musb_enable - enable interrupts * dsps_musb_enable - enable interrupts
*/ */
...@@ -407,8 +366,7 @@ static int dsps_musb_init(struct musb *musb) ...@@ -407,8 +366,7 @@ static int dsps_musb_init(struct musb *musb)
musb->mregs += wrp->musb_core_offset; musb->mregs += wrp->musb_core_offset;
/* NOP driver needs change if supporting dual instance */ /* NOP driver needs change if supporting dual instance */
usb_nop_xceiv_register(); musb->xceiv = devm_usb_get_phy_by_phandle(glue->dev, "phys", 0);
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
if (IS_ERR_OR_NULL(musb->xceiv)) if (IS_ERR_OR_NULL(musb->xceiv))
return -EPROBE_DEFER; return -EPROBE_DEFER;
...@@ -426,9 +384,6 @@ static int dsps_musb_init(struct musb *musb) ...@@ -426,9 +384,6 @@ static int dsps_musb_init(struct musb *musb)
/* Reset the musb */ /* Reset the musb */
dsps_writel(reg_base, wrp->control, (1 << wrp->reset)); dsps_writel(reg_base, wrp->control, (1 << wrp->reset));
/* Start the on-chip PHY and its PLL. */
musb_dsps_phy_control(glue, pdev->id, 1);
musb->isr = dsps_interrupt; musb->isr = dsps_interrupt;
/* reset the otgdisable bit, needed for host mode to work */ /* reset the otgdisable bit, needed for host mode to work */
...@@ -438,8 +393,6 @@ static int dsps_musb_init(struct musb *musb) ...@@ -438,8 +393,6 @@ static int dsps_musb_init(struct musb *musb)
return 0; return 0;
err0: err0:
usb_put_phy(musb->xceiv);
usb_nop_xceiv_unregister();
return status; return status;
} }
...@@ -451,14 +404,7 @@ static int dsps_musb_exit(struct musb *musb) ...@@ -451,14 +404,7 @@ static int dsps_musb_exit(struct musb *musb)
del_timer_sync(&glue->timer[pdev->id]); del_timer_sync(&glue->timer[pdev->id]);
/* Shutdown the on-chip PHY and its PLL. */
musb_dsps_phy_control(glue, pdev->id, 0);
usb_phy_shutdown(musb->xceiv); usb_phy_shutdown(musb->xceiv);
/* NOP driver needs change if supporting dual instance */
usb_put_phy(musb->xceiv);
usb_nop_xceiv_unregister();
return 0; return 0;
} }
...@@ -487,16 +433,6 @@ static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 id) ...@@ -487,16 +433,6 @@ static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
char res_name[11]; char res_name[11];
int ret; int ret;
resources[0].start = dsps_control_module_phys[id];
resources[0].end = resources[0].start + SZ_4 - 1;
resources[0].flags = IORESOURCE_MEM;
glue->usb_ctrl[id] = devm_ioremap_resource(&pdev->dev, resources);
if (IS_ERR(glue->usb_ctrl[id])) {
ret = PTR_ERR(glue->usb_ctrl[id]);
goto err0;
}
/* first resource is for usbss, so start index from 1 */ /* first resource is for usbss, so start index from 1 */
res = platform_get_resource(pdev, IORESOURCE_MEM, id + 1); res = platform_get_resource(pdev, IORESOURCE_MEM, id + 1);
if (!res) { if (!res) {
...@@ -680,36 +616,6 @@ static int dsps_remove(struct platform_device *pdev) ...@@ -680,36 +616,6 @@ static int dsps_remove(struct platform_device *pdev)
return 0; return 0;
} }
#ifdef CONFIG_PM_SLEEP
static int dsps_suspend(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev->parent);
struct dsps_glue *glue = platform_get_drvdata(pdev);
const struct dsps_musb_wrapper *wrp = glue->wrp;
int i;
for (i = 0; i < wrp->instances; i++)
musb_dsps_phy_control(glue, i, 0);
return 0;
}
static int dsps_resume(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev->parent);
struct dsps_glue *glue = platform_get_drvdata(pdev);
const struct dsps_musb_wrapper *wrp = glue->wrp;
int i;
for (i = 0; i < wrp->instances; i++)
musb_dsps_phy_control(glue, i, 1);
return 0;
}
#endif
static SIMPLE_DEV_PM_OPS(dsps_pm_ops, dsps_suspend, dsps_resume);
static const struct dsps_musb_wrapper am33xx_driver_data = { static const struct dsps_musb_wrapper am33xx_driver_data = {
.revision = 0x00, .revision = 0x00,
.control = 0x14, .control = 0x14,
...@@ -752,7 +658,6 @@ static struct platform_driver dsps_usbss_driver = { ...@@ -752,7 +658,6 @@ static struct platform_driver dsps_usbss_driver = {
.remove = dsps_remove, .remove = dsps_remove,
.driver = { .driver = {
.name = "musb-dsps", .name = "musb-dsps",
.pm = &dsps_pm_ops,
.of_match_table = of_match_ptr(musb_dsps_of_match), .of_match_table = of_match_ptr(musb_dsps_of_match),
}, },
}; };
......
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