Lines Matching full:omap
2 * omap-usb-host.c - The USBHS core driver for OMAP EHCI & OHCI
29 #include <linux/platform_data/usb-omap.h>
35 #include "omap-usb.h"
38 #define OMAP_EHCI_DEVICE "ehci-omap"
41 /* OMAP USBHOST Register addresses */
135 * Map 'enum usbhs_omap_port_mode' found in <linux/platform_data/usb-omap.h>
137 * 'Documentation/devicetree/bindings/mfd/omap-usb-host.txt'
291 struct usbhs_hcd_omap *omap = dev_get_drvdata(dev); in usbhs_runtime_resume() local
292 struct usbhs_omap_platform_data *pdata = omap->pdata; in usbhs_runtime_resume()
299 if (!IS_ERR(omap->ehci_logic_fck)) in usbhs_runtime_resume()
300 clk_prepare_enable(omap->ehci_logic_fck); in usbhs_runtime_resume()
302 for (i = 0; i < omap->nports; i++) { in usbhs_runtime_resume()
305 if (!IS_ERR(omap->hsic60m_clk[i])) { in usbhs_runtime_resume()
306 r = clk_prepare_enable(omap->hsic60m_clk[i]); in usbhs_runtime_resume()
314 if (!IS_ERR(omap->hsic480m_clk[i])) { in usbhs_runtime_resume()
315 r = clk_prepare_enable(omap->hsic480m_clk[i]); in usbhs_runtime_resume()
325 if (!IS_ERR(omap->utmi_clk[i])) { in usbhs_runtime_resume()
326 r = clk_prepare_enable(omap->utmi_clk[i]); in usbhs_runtime_resume()
344 struct usbhs_hcd_omap *omap = dev_get_drvdata(dev); in usbhs_runtime_suspend() local
345 struct usbhs_omap_platform_data *pdata = omap->pdata; in usbhs_runtime_suspend()
350 for (i = 0; i < omap->nports; i++) { in usbhs_runtime_suspend()
353 if (!IS_ERR(omap->hsic60m_clk[i])) in usbhs_runtime_suspend()
354 clk_disable_unprepare(omap->hsic60m_clk[i]); in usbhs_runtime_suspend()
356 if (!IS_ERR(omap->hsic480m_clk[i])) in usbhs_runtime_suspend()
357 clk_disable_unprepare(omap->hsic480m_clk[i]); in usbhs_runtime_suspend()
361 if (!IS_ERR(omap->utmi_clk[i])) in usbhs_runtime_suspend()
362 clk_disable_unprepare(omap->utmi_clk[i]); in usbhs_runtime_suspend()
369 if (!IS_ERR(omap->ehci_logic_fck)) in usbhs_runtime_suspend()
370 clk_disable_unprepare(omap->ehci_logic_fck); in usbhs_runtime_suspend()
377 static unsigned omap_usbhs_rev1_hostconfig(struct usbhs_hcd_omap *omap, in omap_usbhs_rev1_hostconfig() argument
380 struct usbhs_omap_platform_data *pdata = omap->pdata; in omap_usbhs_rev1_hostconfig()
383 for (i = 0; i < omap->nports; i++) { in omap_usbhs_rev1_hostconfig()
415 for (i = 0; i < omap->nports; i++) { in omap_usbhs_rev1_hostconfig()
426 static unsigned omap_usbhs_rev2_hostconfig(struct usbhs_hcd_omap *omap, in omap_usbhs_rev2_hostconfig() argument
429 struct usbhs_omap_platform_data *pdata = omap->pdata; in omap_usbhs_rev2_hostconfig()
432 for (i = 0; i < omap->nports; i++) { in omap_usbhs_rev2_hostconfig()
448 struct usbhs_hcd_omap *omap = dev_get_drvdata(dev); in omap_usbhs_init() local
455 reg = usbhs_read(omap->uhh_base, OMAP_UHH_HOSTCONFIG); in omap_usbhs_init()
463 switch (omap->usbhs_rev) { in omap_usbhs_init()
465 reg = omap_usbhs_rev1_hostconfig(omap, reg); in omap_usbhs_init()
469 reg = omap_usbhs_rev2_hostconfig(omap, reg); in omap_usbhs_init()
473 reg = omap_usbhs_rev2_hostconfig(omap, reg); in omap_usbhs_init()
477 usbhs_write(omap->uhh_base, OMAP_UHH_HOSTCONFIG, reg); in omap_usbhs_init()
531 { .compatible = "ti,ehci-omap", },
545 struct usbhs_hcd_omap *omap; in usbhs_omap_probe() local
575 omap = devm_kzalloc(dev, sizeof(*omap), GFP_KERNEL); in usbhs_omap_probe()
576 if (!omap) { in usbhs_omap_probe()
582 omap->uhh_base = devm_ioremap_resource(dev, res); in usbhs_omap_probe()
583 if (IS_ERR(omap->uhh_base)) in usbhs_omap_probe()
584 return PTR_ERR(omap->uhh_base); in usbhs_omap_probe()
586 omap->pdata = pdata; in usbhs_omap_probe()
593 platform_set_drvdata(pdev, omap); in usbhs_omap_probe()
596 omap->usbhs_rev = usbhs_read(omap->uhh_base, OMAP_UHH_REVISION); in usbhs_omap_probe()
598 /* we need to call runtime suspend before we update omap->nports in usbhs_omap_probe()
608 omap->nports = pdata->nports; in usbhs_omap_probe()
610 switch (omap->usbhs_rev) { in usbhs_omap_probe()
612 omap->nports = 3; in usbhs_omap_probe()
615 omap->nports = 2; in usbhs_omap_probe()
618 omap->nports = OMAP3_HS_USB_PORTS; in usbhs_omap_probe()
621 omap->usbhs_rev, omap->nports); in usbhs_omap_probe()
624 pdata->nports = omap->nports; in usbhs_omap_probe()
627 i = sizeof(struct clk *) * omap->nports; in usbhs_omap_probe()
628 omap->utmi_clk = devm_kzalloc(dev, i, GFP_KERNEL); in usbhs_omap_probe()
629 omap->hsic480m_clk = devm_kzalloc(dev, i, GFP_KERNEL); in usbhs_omap_probe()
630 omap->hsic60m_clk = devm_kzalloc(dev, i, GFP_KERNEL); in usbhs_omap_probe()
632 if (!omap->utmi_clk || !omap->hsic480m_clk || !omap->hsic60m_clk) { in usbhs_omap_probe()
639 omap->ehci_logic_fck = ERR_PTR(-ENODEV); in usbhs_omap_probe()
640 omap->init_60m_fclk = ERR_PTR(-ENODEV); in usbhs_omap_probe()
641 omap->utmi_p1_gfclk = ERR_PTR(-ENODEV); in usbhs_omap_probe()
642 omap->utmi_p2_gfclk = ERR_PTR(-ENODEV); in usbhs_omap_probe()
643 omap->xclk60mhsp1_ck = ERR_PTR(-ENODEV); in usbhs_omap_probe()
644 omap->xclk60mhsp2_ck = ERR_PTR(-ENODEV); in usbhs_omap_probe()
646 for (i = 0; i < omap->nports; i++) { in usbhs_omap_probe()
647 omap->utmi_clk[i] = ERR_PTR(-ENODEV); in usbhs_omap_probe()
648 omap->hsic480m_clk[i] = ERR_PTR(-ENODEV); in usbhs_omap_probe()
649 omap->hsic60m_clk[i] = ERR_PTR(-ENODEV); in usbhs_omap_probe()
653 if (omap->usbhs_rev == OMAP_USBHS_REV1) { in usbhs_omap_probe()
655 for (i = 0; i < omap->nports; i++) { in usbhs_omap_probe()
664 omap->ehci_logic_fck = devm_clk_get(dev, in usbhs_omap_probe()
666 if (IS_ERR(omap->ehci_logic_fck)) { in usbhs_omap_probe()
667 ret = PTR_ERR(omap->ehci_logic_fck); in usbhs_omap_probe()
677 omap->utmi_p1_gfclk = devm_clk_get(dev, "utmi_p1_gfclk"); in usbhs_omap_probe()
678 if (IS_ERR(omap->utmi_p1_gfclk)) { in usbhs_omap_probe()
679 ret = PTR_ERR(omap->utmi_p1_gfclk); in usbhs_omap_probe()
684 omap->utmi_p2_gfclk = devm_clk_get(dev, "utmi_p2_gfclk"); in usbhs_omap_probe()
685 if (IS_ERR(omap->utmi_p2_gfclk)) { in usbhs_omap_probe()
686 ret = PTR_ERR(omap->utmi_p2_gfclk); in usbhs_omap_probe()
691 omap->xclk60mhsp1_ck = devm_clk_get(dev, "refclk_60m_ext_p1"); in usbhs_omap_probe()
692 if (IS_ERR(omap->xclk60mhsp1_ck)) { in usbhs_omap_probe()
693 ret = PTR_ERR(omap->xclk60mhsp1_ck); in usbhs_omap_probe()
698 omap->xclk60mhsp2_ck = devm_clk_get(dev, "refclk_60m_ext_p2"); in usbhs_omap_probe()
699 if (IS_ERR(omap->xclk60mhsp2_ck)) { in usbhs_omap_probe()
700 ret = PTR_ERR(omap->xclk60mhsp2_ck); in usbhs_omap_probe()
705 omap->init_60m_fclk = devm_clk_get(dev, "refclk_60m_int"); in usbhs_omap_probe()
706 if (IS_ERR(omap->init_60m_fclk)) { in usbhs_omap_probe()
707 ret = PTR_ERR(omap->init_60m_fclk); in usbhs_omap_probe()
712 for (i = 0; i < omap->nports; i++) { in usbhs_omap_probe()
723 omap->utmi_clk[i] = devm_clk_get(dev, clkname); in usbhs_omap_probe()
724 if (IS_ERR(omap->utmi_clk[i])) { in usbhs_omap_probe()
725 ret = PTR_ERR(omap->utmi_clk[i]); in usbhs_omap_probe()
733 omap->hsic480m_clk[i] = devm_clk_get(dev, clkname); in usbhs_omap_probe()
734 if (IS_ERR(omap->hsic480m_clk[i])) { in usbhs_omap_probe()
735 ret = PTR_ERR(omap->hsic480m_clk[i]); in usbhs_omap_probe()
743 omap->hsic60m_clk[i] = devm_clk_get(dev, clkname); in usbhs_omap_probe()
744 if (IS_ERR(omap->hsic60m_clk[i])) { in usbhs_omap_probe()
745 ret = PTR_ERR(omap->hsic60m_clk[i]); in usbhs_omap_probe()
753 ret = clk_set_parent(omap->utmi_p1_gfclk, in usbhs_omap_probe()
754 omap->xclk60mhsp1_ck); in usbhs_omap_probe()
761 ret = clk_set_parent(omap->utmi_p1_gfclk, in usbhs_omap_probe()
762 omap->init_60m_fclk); in usbhs_omap_probe()
771 ret = clk_set_parent(omap->utmi_p2_gfclk, in usbhs_omap_probe()
772 omap->xclk60mhsp2_ck); in usbhs_omap_probe()
779 ret = clk_set_parent(omap->utmi_p2_gfclk, in usbhs_omap_probe()
780 omap->init_60m_fclk); in usbhs_omap_probe()
866 MODULE_DESCRIPTION("usb host common core driver for omap EHCI and OHCI");
876 * the omap ehci and ohci probe functions are called.