Lines Matching full:omap
3 * omap-usb-host.c - The USBHS core driver for OMAP EHCI & OHCI
18 #include <linux/platform_data/usb-omap.h>
24 #include "omap-usb.h"
27 #define OMAP_EHCI_DEVICE "ehci-omap"
30 /* OMAP USBHOST Register addresses */
124 * Map 'enum usbhs_omap_port_mode' found in <linux/platform_data/usb-omap.h>
126 * 'Documentation/devicetree/bindings/mfd/omap-usb-host.txt'
280 struct usbhs_hcd_omap *omap = dev_get_drvdata(dev); in usbhs_runtime_resume() local
281 struct usbhs_omap_platform_data *pdata = omap->pdata; in usbhs_runtime_resume()
288 if (!IS_ERR(omap->ehci_logic_fck)) in usbhs_runtime_resume()
289 clk_prepare_enable(omap->ehci_logic_fck); in usbhs_runtime_resume()
291 for (i = 0; i < omap->nports; i++) { in usbhs_runtime_resume()
294 if (!IS_ERR(omap->hsic60m_clk[i])) { in usbhs_runtime_resume()
295 r = clk_prepare_enable(omap->hsic60m_clk[i]); in usbhs_runtime_resume()
303 if (!IS_ERR(omap->hsic480m_clk[i])) { in usbhs_runtime_resume()
304 r = clk_prepare_enable(omap->hsic480m_clk[i]); in usbhs_runtime_resume()
314 if (!IS_ERR(omap->utmi_clk[i])) { in usbhs_runtime_resume()
315 r = clk_prepare_enable(omap->utmi_clk[i]); in usbhs_runtime_resume()
333 struct usbhs_hcd_omap *omap = dev_get_drvdata(dev); in usbhs_runtime_suspend() local
334 struct usbhs_omap_platform_data *pdata = omap->pdata; in usbhs_runtime_suspend()
339 for (i = 0; i < omap->nports; i++) { in usbhs_runtime_suspend()
342 if (!IS_ERR(omap->hsic60m_clk[i])) in usbhs_runtime_suspend()
343 clk_disable_unprepare(omap->hsic60m_clk[i]); in usbhs_runtime_suspend()
345 if (!IS_ERR(omap->hsic480m_clk[i])) in usbhs_runtime_suspend()
346 clk_disable_unprepare(omap->hsic480m_clk[i]); in usbhs_runtime_suspend()
350 if (!IS_ERR(omap->utmi_clk[i])) in usbhs_runtime_suspend()
351 clk_disable_unprepare(omap->utmi_clk[i]); in usbhs_runtime_suspend()
358 if (!IS_ERR(omap->ehci_logic_fck)) in usbhs_runtime_suspend()
359 clk_disable_unprepare(omap->ehci_logic_fck); in usbhs_runtime_suspend()
366 static unsigned omap_usbhs_rev1_hostconfig(struct usbhs_hcd_omap *omap, in omap_usbhs_rev1_hostconfig() argument
369 struct usbhs_omap_platform_data *pdata = omap->pdata; in omap_usbhs_rev1_hostconfig()
372 for (i = 0; i < omap->nports; i++) { in omap_usbhs_rev1_hostconfig()
404 for (i = 0; i < omap->nports; i++) { in omap_usbhs_rev1_hostconfig()
415 static unsigned omap_usbhs_rev2_hostconfig(struct usbhs_hcd_omap *omap, in omap_usbhs_rev2_hostconfig() argument
418 struct usbhs_omap_platform_data *pdata = omap->pdata; in omap_usbhs_rev2_hostconfig()
421 for (i = 0; i < omap->nports; i++) { in omap_usbhs_rev2_hostconfig()
437 struct usbhs_hcd_omap *omap = dev_get_drvdata(dev); in omap_usbhs_init() local
444 reg = usbhs_read(omap->uhh_base, OMAP_UHH_HOSTCONFIG); in omap_usbhs_init()
452 switch (omap->usbhs_rev) { in omap_usbhs_init()
454 reg = omap_usbhs_rev1_hostconfig(omap, reg); in omap_usbhs_init()
458 reg = omap_usbhs_rev2_hostconfig(omap, reg); in omap_usbhs_init()
462 reg = omap_usbhs_rev2_hostconfig(omap, reg); in omap_usbhs_init()
466 usbhs_write(omap->uhh_base, OMAP_UHH_HOSTCONFIG, reg); in omap_usbhs_init()
520 { .compatible = "ti,ehci-omap", },
536 struct usbhs_hcd_omap *omap; in usbhs_omap_probe() local
565 omap = devm_kzalloc(dev, sizeof(*omap), GFP_KERNEL); in usbhs_omap_probe()
566 if (!omap) { in usbhs_omap_probe()
571 omap->uhh_base = devm_platform_ioremap_resource(pdev, 0); in usbhs_omap_probe()
572 if (IS_ERR(omap->uhh_base)) in usbhs_omap_probe()
573 return PTR_ERR(omap->uhh_base); in usbhs_omap_probe()
575 omap->pdata = pdata; in usbhs_omap_probe()
582 platform_set_drvdata(pdev, omap); in usbhs_omap_probe()
585 omap->usbhs_rev = usbhs_read(omap->uhh_base, OMAP_UHH_REVISION); in usbhs_omap_probe()
587 /* we need to call runtime suspend before we update omap->nports in usbhs_omap_probe()
597 omap->nports = pdata->nports; in usbhs_omap_probe()
599 switch (omap->usbhs_rev) { in usbhs_omap_probe()
601 omap->nports = 3; in usbhs_omap_probe()
604 omap->nports = 2; in usbhs_omap_probe()
607 omap->nports = OMAP3_HS_USB_PORTS; in usbhs_omap_probe()
610 omap->usbhs_rev, omap->nports); in usbhs_omap_probe()
613 pdata->nports = omap->nports; in usbhs_omap_probe()
616 i = sizeof(struct clk *) * omap->nports; in usbhs_omap_probe()
617 omap->utmi_clk = devm_kzalloc(dev, i, GFP_KERNEL); in usbhs_omap_probe()
618 omap->hsic480m_clk = devm_kzalloc(dev, i, GFP_KERNEL); in usbhs_omap_probe()
619 omap->hsic60m_clk = devm_kzalloc(dev, i, GFP_KERNEL); in usbhs_omap_probe()
621 if (!omap->utmi_clk || !omap->hsic480m_clk || !omap->hsic60m_clk) { in usbhs_omap_probe()
628 omap->ehci_logic_fck = ERR_PTR(-ENODEV); in usbhs_omap_probe()
629 omap->init_60m_fclk = ERR_PTR(-ENODEV); in usbhs_omap_probe()
630 omap->utmi_p1_gfclk = ERR_PTR(-ENODEV); in usbhs_omap_probe()
631 omap->utmi_p2_gfclk = ERR_PTR(-ENODEV); in usbhs_omap_probe()
632 omap->xclk60mhsp1_ck = ERR_PTR(-ENODEV); in usbhs_omap_probe()
633 omap->xclk60mhsp2_ck = ERR_PTR(-ENODEV); in usbhs_omap_probe()
635 for (i = 0; i < omap->nports; i++) { in usbhs_omap_probe()
636 omap->utmi_clk[i] = ERR_PTR(-ENODEV); in usbhs_omap_probe()
637 omap->hsic480m_clk[i] = ERR_PTR(-ENODEV); in usbhs_omap_probe()
638 omap->hsic60m_clk[i] = ERR_PTR(-ENODEV); in usbhs_omap_probe()
642 if (omap->usbhs_rev == OMAP_USBHS_REV1) { in usbhs_omap_probe()
644 for (i = 0; i < omap->nports; i++) { in usbhs_omap_probe()
653 omap->ehci_logic_fck = devm_clk_get(dev, in usbhs_omap_probe()
655 if (IS_ERR(omap->ehci_logic_fck)) { in usbhs_omap_probe()
656 ret = PTR_ERR(omap->ehci_logic_fck); in usbhs_omap_probe()
666 omap->utmi_p1_gfclk = devm_clk_get(dev, "utmi_p1_gfclk"); in usbhs_omap_probe()
667 if (IS_ERR(omap->utmi_p1_gfclk)) { in usbhs_omap_probe()
668 ret = PTR_ERR(omap->utmi_p1_gfclk); in usbhs_omap_probe()
673 omap->utmi_p2_gfclk = devm_clk_get(dev, "utmi_p2_gfclk"); in usbhs_omap_probe()
674 if (IS_ERR(omap->utmi_p2_gfclk)) { in usbhs_omap_probe()
675 ret = PTR_ERR(omap->utmi_p2_gfclk); in usbhs_omap_probe()
680 omap->xclk60mhsp1_ck = devm_clk_get(dev, "refclk_60m_ext_p1"); in usbhs_omap_probe()
681 if (IS_ERR(omap->xclk60mhsp1_ck)) { in usbhs_omap_probe()
682 ret = PTR_ERR(omap->xclk60mhsp1_ck); in usbhs_omap_probe()
687 omap->xclk60mhsp2_ck = devm_clk_get(dev, "refclk_60m_ext_p2"); in usbhs_omap_probe()
688 if (IS_ERR(omap->xclk60mhsp2_ck)) { in usbhs_omap_probe()
689 ret = PTR_ERR(omap->xclk60mhsp2_ck); in usbhs_omap_probe()
694 omap->init_60m_fclk = devm_clk_get(dev, "refclk_60m_int"); in usbhs_omap_probe()
695 if (IS_ERR(omap->init_60m_fclk)) { in usbhs_omap_probe()
696 ret = PTR_ERR(omap->init_60m_fclk); in usbhs_omap_probe()
701 for (i = 0; i < omap->nports; i++) { in usbhs_omap_probe()
712 omap->utmi_clk[i] = devm_clk_get(dev, clkname); in usbhs_omap_probe()
713 if (IS_ERR(omap->utmi_clk[i])) { in usbhs_omap_probe()
714 ret = PTR_ERR(omap->utmi_clk[i]); in usbhs_omap_probe()
722 omap->hsic480m_clk[i] = devm_clk_get(dev, clkname); in usbhs_omap_probe()
723 if (IS_ERR(omap->hsic480m_clk[i])) { in usbhs_omap_probe()
724 ret = PTR_ERR(omap->hsic480m_clk[i]); in usbhs_omap_probe()
732 omap->hsic60m_clk[i] = devm_clk_get(dev, clkname); in usbhs_omap_probe()
733 if (IS_ERR(omap->hsic60m_clk[i])) { in usbhs_omap_probe()
734 ret = PTR_ERR(omap->hsic60m_clk[i]); in usbhs_omap_probe()
742 ret = clk_set_parent(omap->utmi_p1_gfclk, in usbhs_omap_probe()
743 omap->xclk60mhsp1_ck); in usbhs_omap_probe()
750 ret = clk_set_parent(omap->utmi_p1_gfclk, in usbhs_omap_probe()
751 omap->init_60m_fclk); in usbhs_omap_probe()
760 ret = clk_set_parent(omap->utmi_p2_gfclk, in usbhs_omap_probe()
761 omap->xclk60mhsp2_ck); in usbhs_omap_probe()
768 ret = clk_set_parent(omap->utmi_p2_gfclk, in usbhs_omap_probe()
769 omap->init_60m_fclk); in usbhs_omap_probe()
853 MODULE_DESCRIPTION("usb host common core driver for omap EHCI and OHCI");
863 * the omap ehci and ohci probe functions are called.