* [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250
@ 2013-01-11 15:02 Vivek Gautam
[not found] ` <1357916550-11421-1-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
` (2 more replies)
0 siblings, 3 replies; 23+ messages in thread
From: Vivek Gautam @ 2013-01-11 15:02 UTC (permalink / raw)
To: linux-usb-u79uwXL29TY76Z2rM5mHXA
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA,
gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, balbi-l0cyMroinI0,
kgene.kim-Sze3O3UU22JBDgjK7y7TUQ,
thomas.abraham-QSEj5FYQhm4dnm+yROfE0A,
rob.herring-bsGFqQB8/DxBDgjK7y7TUQ,
grant.likely-s3s/WqlpOiPyB63q8FvJNQ,
sylvester.nawrocki-Re5JQEeQqe8AvxtiuMwx3w,
dianders-F7+t8E8rja9g9hUCZPvPmw, jg1.han-Sze3O3UU22JBDgjK7y7TUQ,
p.paneri-Sze3O3UU22JBDgjK7y7TUQ
Changes from v5:
- Rebased on top of latest patches:
usb: phy: samsung: Introducing usb phy driver for hsotg (v9)
usb: phy: samsung: Add support to set pmu isolation (v6)
As a result adding hostphy enable mask and hostphy register offsets
to driver data in order to access the HOSTPHY CONTROL register.
- Adding member 'otg' to struct samsung-usbphy so that its consumers
can call otg->set_host so as to make 'phy' aware of the consumer type:
HOST/DEVICE
- Adding 'otg' to 'struct s5p_ehci_hcd' and 'struct exynos_ohci_hcd'
which keeps track of 'otg' of the controllers' phy. This then sets
the host.
- Moved samsung_usbphy_set_type() calls from ehci-s5p and ohci-exynos
to phy driver itself where based on phy_type it is called.
- Added separate macro definition for USB20PHY_CFG register to select
between host/device type usb link.
- Removing unnecessary argument 'phy_type' from samsung_usbphy_set_type()
and samsung_usbphy_cfg_sel().
- Addressed few nits:
-- added macro for 'KHZ'
-- removing useless 'if' from samsung_usbphy_cfg_sel()
-- keeping the place of clk_get intact and requesting driver
data before that.
Vivek Gautam (4):
ARM: EXYNOS: Update & move usb-phy types to generic include layer
usb: phy: samsung: Add host phy support to samsung-phy driver
USB: ehci-s5p: Add phy driver support
USB: ohci-exynos: Add phy driver support
.../devicetree/bindings/usb/samsung-usbphy.txt | 12 +-
drivers/usb/host/ehci-s5p.c | 81 +++-
drivers/usb/host/ohci-exynos.c | 85 +++-
drivers/usb/phy/Kconfig | 2 +-
drivers/usb/phy/samsung-usbphy.c | 512 ++++++++++++++++++--
include/linux/usb/samsung_usb_phy.h | 16 +
6 files changed, 635 insertions(+), 73 deletions(-)
create mode 100644 include/linux/usb/samsung_usb_phy.h
--
1.7.6.5
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 23+ messages in thread[parent not found: <1357916550-11421-1-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>]
* [PATCH v6 1/4] ARM: EXYNOS: Update & move usb-phy types to generic include layer [not found] ` <1357916550-11421-1-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2013-01-11 15:02 ` Vivek Gautam 2013-01-11 15:02 ` [PATCH v6 4/4] USB: ohci-exynos: Add phy driver support Vivek Gautam 2013-01-22 5:23 ` [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250 Kukjin Kim 2 siblings, 0 replies; 23+ messages in thread From: Vivek Gautam @ 2013-01-11 15:02 UTC (permalink / raw) To: linux-usb-u79uwXL29TY76Z2rM5mHXA Cc: kgene.kim-Sze3O3UU22JBDgjK7y7TUQ, p.paneri-Sze3O3UU22JBDgjK7y7TUQ, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, jg1.han-Sze3O3UU22JBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, sylvester.nawrocki-Re5JQEeQqe8AvxtiuMwx3w Updating the names of usb-phy types to more generic names: USB_PHY_TYPE_DEIVCE & USB_PHY_TYPE_HOST; and further update its dependencies. Signed-off-by: Praveen Paneri <p.paneri-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> Signed-off-by: Vivek Gautam <gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> --- Changes from v5: - None drivers/usb/host/ehci-s5p.c | 9 +++++---- drivers/usb/host/ohci-exynos.c | 9 +++++---- include/linux/usb/samsung_usb_phy.h | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 include/linux/usb/samsung_usb_phy.h diff --git a/drivers/usb/host/ehci-s5p.c b/drivers/usb/host/ehci-s5p.c index 319dcfa..46ca5ef 100644 --- a/drivers/usb/host/ehci-s5p.c +++ b/drivers/usb/host/ehci-s5p.c @@ -17,6 +17,7 @@ #include <linux/platform_device.h> #include <linux/of_gpio.h> #include <linux/platform_data/usb-ehci-s5p.h> +#include <linux/usb/samsung_usb_phy.h> #include <plat/usb-phy.h> #define EHCI_INSNREG00(base) (base + 0x90) @@ -164,7 +165,7 @@ static int s5p_ehci_probe(struct platform_device *pdev) } if (pdata->phy_init) - pdata->phy_init(pdev, S5P_USB_PHY_HOST); + pdata->phy_init(pdev, USB_PHY_TYPE_HOST); ehci = hcd_to_ehci(hcd); ehci->caps = hcd->regs; @@ -198,7 +199,7 @@ static int s5p_ehci_remove(struct platform_device *pdev) usb_remove_hcd(hcd); if (pdata && pdata->phy_exit) - pdata->phy_exit(pdev, S5P_USB_PHY_HOST); + pdata->phy_exit(pdev, USB_PHY_TYPE_HOST); clk_disable_unprepare(s5p_ehci->clk); @@ -229,7 +230,7 @@ static int s5p_ehci_suspend(struct device *dev) rc = ehci_suspend(hcd, do_wakeup); if (pdata && pdata->phy_exit) - pdata->phy_exit(pdev, S5P_USB_PHY_HOST); + pdata->phy_exit(pdev, USB_PHY_TYPE_HOST); clk_disable_unprepare(s5p_ehci->clk); @@ -246,7 +247,7 @@ static int s5p_ehci_resume(struct device *dev) clk_prepare_enable(s5p_ehci->clk); if (pdata && pdata->phy_init) - pdata->phy_init(pdev, S5P_USB_PHY_HOST); + pdata->phy_init(pdev, USB_PHY_TYPE_HOST); /* DMA burst Enable */ writel(EHCI_INSNREG00_ENABLE_DMA_BURST, EHCI_INSNREG00(hcd->regs)); diff --git a/drivers/usb/host/ohci-exynos.c b/drivers/usb/host/ohci-exynos.c index aa3b884..804fb62 100644 --- a/drivers/usb/host/ohci-exynos.c +++ b/drivers/usb/host/ohci-exynos.c @@ -15,6 +15,7 @@ #include <linux/of.h> #include <linux/platform_device.h> #include <linux/platform_data/usb-exynos.h> +#include <linux/usb/samsung_usb_phy.h> #include <plat/usb-phy.h> struct exynos_ohci_hcd { @@ -153,7 +154,7 @@ static int exynos_ohci_probe(struct platform_device *pdev) } if (pdata->phy_init) - pdata->phy_init(pdev, S5P_USB_PHY_HOST); + pdata->phy_init(pdev, USB_PHY_TYPE_HOST); ohci = hcd_to_ohci(hcd); ohci_hcd_init(ohci); @@ -184,7 +185,7 @@ static int exynos_ohci_remove(struct platform_device *pdev) usb_remove_hcd(hcd); if (pdata && pdata->phy_exit) - pdata->phy_exit(pdev, S5P_USB_PHY_HOST); + pdata->phy_exit(pdev, USB_PHY_TYPE_HOST); clk_disable_unprepare(exynos_ohci->clk); @@ -229,7 +230,7 @@ static int exynos_ohci_suspend(struct device *dev) clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); if (pdata && pdata->phy_exit) - pdata->phy_exit(pdev, S5P_USB_PHY_HOST); + pdata->phy_exit(pdev, USB_PHY_TYPE_HOST); clk_disable_unprepare(exynos_ohci->clk); @@ -249,7 +250,7 @@ static int exynos_ohci_resume(struct device *dev) clk_prepare_enable(exynos_ohci->clk); if (pdata && pdata->phy_init) - pdata->phy_init(pdev, S5P_USB_PHY_HOST); + pdata->phy_init(pdev, USB_PHY_TYPE_HOST); ohci_resume(hcd, false); diff --git a/include/linux/usb/samsung_usb_phy.h b/include/linux/usb/samsung_usb_phy.h new file mode 100644 index 0000000..9167826 --- /dev/null +++ b/include/linux/usb/samsung_usb_phy.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2012 Samsung Electronics Co.Ltd + * http://www.samsung.com/ + * + * Defines phy types for samsung usb phy controllers - HOST or DEIVCE. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +enum samsung_usb_phy_type { + USB_PHY_TYPE_DEVICE, + USB_PHY_TYPE_HOST, +}; -- 1.7.6.5 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v6 4/4] USB: ohci-exynos: Add phy driver support [not found] ` <1357916550-11421-1-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2013-01-11 15:02 ` [PATCH v6 1/4] ARM: EXYNOS: Update & move usb-phy types to generic include layer Vivek Gautam @ 2013-01-11 15:02 ` Vivek Gautam 2013-01-18 15:38 ` Alan Stern 2013-01-22 5:23 ` [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250 Kukjin Kim 2 siblings, 1 reply; 23+ messages in thread From: Vivek Gautam @ 2013-01-11 15:02 UTC (permalink / raw) To: linux-usb-u79uwXL29TY76Z2rM5mHXA Cc: kgene.kim-Sze3O3UU22JBDgjK7y7TUQ, p.paneri-Sze3O3UU22JBDgjK7y7TUQ, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, jg1.han-Sze3O3UU22JBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, sylvester.nawrocki-Re5JQEeQqe8AvxtiuMwx3w Adding the phy-driver to ohci-exynos. Keeping the platform data for continuing the smooth operation for boards which still uses it Signed-off-by: Vivek Gautam <gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> Acked-by: Jingoo Han <jg1.han-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> --- drivers/usb/host/ohci-exynos.c | 84 ++++++++++++++++++++++++++++++---------- 1 files changed, 63 insertions(+), 21 deletions(-) diff --git a/drivers/usb/host/ohci-exynos.c b/drivers/usb/host/ohci-exynos.c index 804fb62..1b38409 100644 --- a/drivers/usb/host/ohci-exynos.c +++ b/drivers/usb/host/ohci-exynos.c @@ -15,6 +15,7 @@ #include <linux/of.h> #include <linux/platform_device.h> #include <linux/platform_data/usb-exynos.h> +#include <linux/usb/phy.h> #include <linux/usb/samsung_usb_phy.h> #include <plat/usb-phy.h> @@ -22,8 +23,31 @@ struct exynos_ohci_hcd { struct device *dev; struct usb_hcd *hcd; struct clk *clk; + struct usb_phy *phy; + struct usb_otg *otg; + struct exynos4_ohci_platdata *pdata; }; +static void exynos_ohci_phy_enable(struct exynos_ohci_hcd *exynos_ohci) +{ + struct platform_device *pdev = to_platform_device(exynos_ohci->dev); + + if (exynos_ohci->phy) + usb_phy_init(exynos_ohci->phy); + else if (exynos_ohci->pdata->phy_init) + exynos_ohci->pdata->phy_init(pdev, USB_PHY_TYPE_HOST); +} + +static void exynos_ohci_phy_disable(struct exynos_ohci_hcd *exynos_ohci) +{ + struct platform_device *pdev = to_platform_device(exynos_ohci->dev); + + if (exynos_ohci->phy) + usb_phy_shutdown(exynos_ohci->phy); + else if (exynos_ohci->pdata->phy_exit) + exynos_ohci->pdata->phy_exit(pdev, USB_PHY_TYPE_HOST); +} + static int ohci_exynos_reset(struct usb_hcd *hcd) { return ohci_init(hcd_to_ohci(hcd)); @@ -79,20 +103,15 @@ static u64 ohci_exynos_dma_mask = DMA_BIT_MASK(32); static int exynos_ohci_probe(struct platform_device *pdev) { - struct exynos4_ohci_platdata *pdata; + struct exynos4_ohci_platdata *pdata = pdev->dev.platform_data; struct exynos_ohci_hcd *exynos_ohci; struct usb_hcd *hcd; struct ohci_hcd *ohci; struct resource *res; + struct usb_phy *phy; int irq; int err; - pdata = pdev->dev.platform_data; - if (!pdata) { - dev_err(&pdev->dev, "No platform data defined\n"); - return -EINVAL; - } - /* * Right now device-tree probed devices don't get dma_mask set. * Since shared usb code relies on it, set it here for now. @@ -108,6 +127,20 @@ static int exynos_ohci_probe(struct platform_device *pdev) if (!exynos_ohci) return -ENOMEM; + phy = devm_usb_get_phy(&pdev->dev, USB_PHY_TYPE_USB2); + if (IS_ERR_OR_NULL(phy)) { + /* Fallback to pdata */ + if (!pdata) { + dev_warn(&pdev->dev, "no platform data or transceiver defined\n"); + return -EPROBE_DEFER; + } else { + exynos_ohci->pdata = pdata; + } + } else { + exynos_ohci->phy = phy; + exynos_ohci->otg = phy->otg; + } + exynos_ohci->dev = &pdev->dev; hcd = usb_create_hcd(&exynos_ohci_hc_driver, &pdev->dev, @@ -153,8 +186,11 @@ static int exynos_ohci_probe(struct platform_device *pdev) goto fail_io; } - if (pdata->phy_init) - pdata->phy_init(pdev, USB_PHY_TYPE_HOST); + if (exynos_ohci->otg) + exynos_ohci->otg->set_host(exynos_ohci->otg, + &exynos_ohci->hcd->self); + + exynos_ohci_phy_enable(exynos_ohci); ohci = hcd_to_ohci(hcd); ohci_hcd_init(ohci); @@ -162,13 +198,15 @@ static int exynos_ohci_probe(struct platform_device *pdev) err = usb_add_hcd(hcd, irq, IRQF_SHARED); if (err) { dev_err(&pdev->dev, "Failed to add USB HCD\n"); - goto fail_io; + goto fail_add_hcd; } platform_set_drvdata(pdev, exynos_ohci); return 0; +fail_add_hcd: + exynos_ohci_phy_disable(exynos_ohci); fail_io: clk_disable_unprepare(exynos_ohci->clk); fail_clk: @@ -178,14 +216,16 @@ fail_clk: static int exynos_ohci_remove(struct platform_device *pdev) { - struct exynos4_ohci_platdata *pdata = pdev->dev.platform_data; struct exynos_ohci_hcd *exynos_ohci = platform_get_drvdata(pdev); struct usb_hcd *hcd = exynos_ohci->hcd; usb_remove_hcd(hcd); - if (pdata && pdata->phy_exit) - pdata->phy_exit(pdev, USB_PHY_TYPE_HOST); + if (exynos_ohci->otg) + exynos_ohci->otg->set_host(exynos_ohci->otg, + &exynos_ohci->hcd->self); + + exynos_ohci_phy_disable(exynos_ohci); clk_disable_unprepare(exynos_ohci->clk); @@ -209,8 +249,6 @@ static int exynos_ohci_suspend(struct device *dev) struct exynos_ohci_hcd *exynos_ohci = dev_get_drvdata(dev); struct usb_hcd *hcd = exynos_ohci->hcd; struct ohci_hcd *ohci = hcd_to_ohci(hcd); - struct platform_device *pdev = to_platform_device(dev); - struct exynos4_ohci_platdata *pdata = pdev->dev.platform_data; unsigned long flags; int rc = 0; @@ -229,8 +267,11 @@ static int exynos_ohci_suspend(struct device *dev) clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); - if (pdata && pdata->phy_exit) - pdata->phy_exit(pdev, USB_PHY_TYPE_HOST); + if (exynos_ohci->otg) + exynos_ohci->otg->set_host(exynos_ohci->otg, + &exynos_ohci->hcd->self); + + exynos_ohci_phy_disable(exynos_ohci); clk_disable_unprepare(exynos_ohci->clk); @@ -244,13 +285,14 @@ static int exynos_ohci_resume(struct device *dev) { struct exynos_ohci_hcd *exynos_ohci = dev_get_drvdata(dev); struct usb_hcd *hcd = exynos_ohci->hcd; - struct platform_device *pdev = to_platform_device(dev); - struct exynos4_ohci_platdata *pdata = pdev->dev.platform_data; clk_prepare_enable(exynos_ohci->clk); - if (pdata && pdata->phy_init) - pdata->phy_init(pdev, USB_PHY_TYPE_HOST); + if (exynos_ohci->otg) + exynos_ohci->otg->set_host(exynos_ohci->otg, + &exynos_ohci->hcd->self); + + exynos_ohci_phy_enable(exynos_ohci); ohci_resume(hcd, false); -- 1.7.6.5 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v6 4/4] USB: ohci-exynos: Add phy driver support 2013-01-11 15:02 ` [PATCH v6 4/4] USB: ohci-exynos: Add phy driver support Vivek Gautam @ 2013-01-18 15:38 ` Alan Stern 0 siblings, 0 replies; 23+ messages in thread From: Alan Stern @ 2013-01-18 15:38 UTC (permalink / raw) To: Vivek Gautam Cc: linux-usb, devicetree-discuss, linux-kernel, linux-samsung-soc, gregkh, balbi, kgene.kim, thomas.abraham, rob.herring, grant.likely, sylvester.nawrocki, dianders, jg1.han, p.paneri On Fri, 11 Jan 2013, Vivek Gautam wrote: > Adding the phy-driver to ohci-exynos. Keeping the platform data > for continuing the smooth operation for boards which still uses it > > Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com> > Acked-by: Jingoo Han <jg1.han@samsung.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> ^ permalink raw reply [flat|nested] 23+ messages in thread
* RE: [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250 [not found] ` <1357916550-11421-1-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2013-01-11 15:02 ` [PATCH v6 1/4] ARM: EXYNOS: Update & move usb-phy types to generic include layer Vivek Gautam 2013-01-11 15:02 ` [PATCH v6 4/4] USB: ohci-exynos: Add phy driver support Vivek Gautam @ 2013-01-22 5:23 ` Kukjin Kim 2013-01-22 8:50 ` Felipe Balbi 2 siblings, 1 reply; 23+ messages in thread From: Kukjin Kim @ 2013-01-22 5:23 UTC (permalink / raw) To: 'Vivek Gautam', linux-usb-u79uwXL29TY76Z2rM5mHXA Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, balbi-l0cyMroinI0, thomas.abraham-QSEj5FYQhm4dnm+yROfE0A, rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, grant.likely-s3s/WqlpOiPyB63q8FvJNQ, sylvester.nawrocki-Re5JQEeQqe8AvxtiuMwx3w, dianders-F7+t8E8rja9g9hUCZPvPmw, jg1.han-Sze3O3UU22JBDgjK7y7TUQ, p.paneri-Sze3O3UU22JBDgjK7y7TUQ, cpgs-Sze3O3UU22JBDgjK7y7TUQ Vivek Gautam wrote: > > Changes from v5: > - Rebased on top of latest patches: > usb: phy: samsung: Introducing usb phy driver for hsotg (v9) > usb: phy: samsung: Add support to set pmu isolation (v6) > As a result adding hostphy enable mask and hostphy register offsets > to driver data in order to access the HOSTPHY CONTROL register. > > - Adding member 'otg' to struct samsung-usbphy so that its consumers > can call otg->set_host so as to make 'phy' aware of the consumer type: > HOST/DEVICE > > - Adding 'otg' to 'struct s5p_ehci_hcd' and 'struct exynos_ohci_hcd' > which keeps track of 'otg' of the controllers' phy. This then sets > the host. > > - Moved samsung_usbphy_set_type() calls from ehci-s5p and ohci-exynos > to phy driver itself where based on phy_type it is called. > > - Added separate macro definition for USB20PHY_CFG register to select > between host/device type usb link. > > - Removing unnecessary argument 'phy_type' from > samsung_usbphy_set_type() > and samsung_usbphy_cfg_sel(). > > - Addressed few nits: > -- added macro for 'KHZ' > -- removing useless 'if' from samsung_usbphy_cfg_sel() > -- keeping the place of clk_get intact and requesting driver > data before that. > > Vivek Gautam (4): > ARM: EXYNOS: Update & move usb-phy types to generic include layer > usb: phy: samsung: Add host phy support to samsung-phy driver > USB: ehci-s5p: Add phy driver support > USB: ohci-exynos: Add phy driver support > > .../devicetree/bindings/usb/samsung-usbphy.txt | 12 +- > drivers/usb/host/ehci-s5p.c | 81 +++- > drivers/usb/host/ohci-exynos.c | 85 +++- > drivers/usb/phy/Kconfig | 2 +- > drivers/usb/phy/samsung-usbphy.c | 512 ++++++++++++++++++-- > include/linux/usb/samsung_usb_phy.h | 16 + > 6 files changed, 635 insertions(+), 73 deletions(-) > create mode 100644 include/linux/usb/samsung_usb_phy.h > > -- > 1.7.6.5 Looks good to me, Felipe and Greg, I don't know who should take this series anyway, feel free to add my ack: Acked-by: Kukjin Kim <kgene.kim-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> Thanks. - Kukjin -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250 2013-01-22 5:23 ` [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250 Kukjin Kim @ 2013-01-22 8:50 ` Felipe Balbi 2013-01-22 9:15 ` Vivek Gautam 0 siblings, 1 reply; 23+ messages in thread From: Felipe Balbi @ 2013-01-22 8:50 UTC (permalink / raw) To: Kukjin Kim Cc: 'Vivek Gautam', linux-usb, devicetree-discuss, linux-kernel, linux-samsung-soc, gregkh, balbi, thomas.abraham, rob.herring, grant.likely, sylvester.nawrocki, dianders, jg1.han, p.paneri, cpgs, Alan Stern [-- Attachment #1: Type: text/plain, Size: 2543 bytes --] HI, On Mon, Jan 21, 2013 at 09:23:28PM -0800, Kukjin Kim wrote: > Vivek Gautam wrote: > > > > Changes from v5: > > - Rebased on top of latest patches: > > usb: phy: samsung: Introducing usb phy driver for hsotg (v9) > > usb: phy: samsung: Add support to set pmu isolation (v6) > > As a result adding hostphy enable mask and hostphy register offsets > > to driver data in order to access the HOSTPHY CONTROL register. > > > > - Adding member 'otg' to struct samsung-usbphy so that its consumers > > can call otg->set_host so as to make 'phy' aware of the consumer type: > > HOST/DEVICE > > > > - Adding 'otg' to 'struct s5p_ehci_hcd' and 'struct exynos_ohci_hcd' > > which keeps track of 'otg' of the controllers' phy. This then sets > > the host. > > > > - Moved samsung_usbphy_set_type() calls from ehci-s5p and ohci-exynos > > to phy driver itself where based on phy_type it is called. > > > > - Added separate macro definition for USB20PHY_CFG register to select > > between host/device type usb link. > > > > - Removing unnecessary argument 'phy_type' from > > samsung_usbphy_set_type() > > and samsung_usbphy_cfg_sel(). > > > > - Addressed few nits: > > -- added macro for 'KHZ' > > -- removing useless 'if' from samsung_usbphy_cfg_sel() > > -- keeping the place of clk_get intact and requesting driver > > data before that. > > > > Vivek Gautam (4): > > ARM: EXYNOS: Update & move usb-phy types to generic include layer > > usb: phy: samsung: Add host phy support to samsung-phy driver > > USB: ehci-s5p: Add phy driver support > > USB: ohci-exynos: Add phy driver support > > > > .../devicetree/bindings/usb/samsung-usbphy.txt | 12 +- > > drivers/usb/host/ehci-s5p.c | 81 +++- > > drivers/usb/host/ohci-exynos.c | 85 +++- > > drivers/usb/phy/Kconfig | 2 +- > > drivers/usb/phy/samsung-usbphy.c | 512 > ++++++++++++++++++-- > > include/linux/usb/samsung_usb_phy.h | 16 + > > 6 files changed, 635 insertions(+), 73 deletions(-) > > create mode 100644 include/linux/usb/samsung_usb_phy.h > > > > -- > > 1.7.6.5 > > Looks good to me, > > Felipe and Greg, I don't know who should take this series anyway, feel free > to add my ack: > > Acked-by: Kukjin Kim <kgene.kim@samsung.com> I will take care of it. But I need Alan's Acked-by for EHCI and OHCI parts. -- balbi [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250 2013-01-22 8:50 ` Felipe Balbi @ 2013-01-22 9:15 ` Vivek Gautam 2013-01-22 9:29 ` Felipe Balbi 0 siblings, 1 reply; 23+ messages in thread From: Vivek Gautam @ 2013-01-22 9:15 UTC (permalink / raw) To: balbi Cc: Kukjin Kim, Vivek Gautam, linux-usb, devicetree-discuss, linux-kernel, linux-samsung-soc, gregkh, thomas.abraham, rob.herring, grant.likely, sylvester.nawrocki, dianders, jg1.han, p.paneri, cpgs, Alan Stern Hi Felipe, On Tue, Jan 22, 2013 at 2:20 PM, Felipe Balbi <balbi@ti.com> wrote: > HI, > > On Mon, Jan 21, 2013 at 09:23:28PM -0800, Kukjin Kim wrote: >> Vivek Gautam wrote: >> > >> > Changes from v5: >> > - Rebased on top of latest patches: >> > usb: phy: samsung: Introducing usb phy driver for hsotg (v9) >> > usb: phy: samsung: Add support to set pmu isolation (v6) >> > As a result adding hostphy enable mask and hostphy register offsets >> > to driver data in order to access the HOSTPHY CONTROL register. >> > >> > - Adding member 'otg' to struct samsung-usbphy so that its consumers >> > can call otg->set_host so as to make 'phy' aware of the consumer type: >> > HOST/DEVICE >> > >> > - Adding 'otg' to 'struct s5p_ehci_hcd' and 'struct exynos_ohci_hcd' >> > which keeps track of 'otg' of the controllers' phy. This then sets >> > the host. >> > >> > - Moved samsung_usbphy_set_type() calls from ehci-s5p and ohci-exynos >> > to phy driver itself where based on phy_type it is called. >> > >> > - Added separate macro definition for USB20PHY_CFG register to select >> > between host/device type usb link. >> > >> > - Removing unnecessary argument 'phy_type' from >> > samsung_usbphy_set_type() >> > and samsung_usbphy_cfg_sel(). >> > >> > - Addressed few nits: >> > -- added macro for 'KHZ' >> > -- removing useless 'if' from samsung_usbphy_cfg_sel() >> > -- keeping the place of clk_get intact and requesting driver >> > data before that. >> > >> > Vivek Gautam (4): >> > ARM: EXYNOS: Update & move usb-phy types to generic include layer >> > usb: phy: samsung: Add host phy support to samsung-phy driver >> > USB: ehci-s5p: Add phy driver support >> > USB: ohci-exynos: Add phy driver support >> > >> > .../devicetree/bindings/usb/samsung-usbphy.txt | 12 +- >> > drivers/usb/host/ehci-s5p.c | 81 +++- >> > drivers/usb/host/ohci-exynos.c | 85 +++- >> > drivers/usb/phy/Kconfig | 2 +- >> > drivers/usb/phy/samsung-usbphy.c | 512 >> ++++++++++++++++++-- >> > include/linux/usb/samsung_usb_phy.h | 16 + >> > 6 files changed, 635 insertions(+), 73 deletions(-) >> > create mode 100644 include/linux/usb/samsung_usb_phy.h >> > >> > -- >> > 1.7.6.5 >> >> Looks good to me, >> >> Felipe and Greg, I don't know who should take this series anyway, feel free >> to add my ack: >> >> Acked-by: Kukjin Kim <kgene.kim@samsung.com> > > I will take care of it. But I need Alan's Acked-by for EHCI and OHCI > parts. > We got Alan's ACK for: USB: ehci-s5p: Add phy driver support USB: ohci-exynos: Add phy driver support -- Thanks & Regards Vivek ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250 2013-01-22 9:15 ` Vivek Gautam @ 2013-01-22 9:29 ` Felipe Balbi [not found] ` <20130122092947.GJ16143-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Felipe Balbi @ 2013-01-22 9:29 UTC (permalink / raw) To: Vivek Gautam Cc: balbi, Kukjin Kim, Vivek Gautam, linux-usb, devicetree-discuss, linux-kernel, linux-samsung-soc, gregkh, thomas.abraham, rob.herring, grant.likely, sylvester.nawrocki, dianders, jg1.han, p.paneri, cpgs, Alan Stern [-- Attachment #1: Type: text/plain, Size: 3121 bytes --] On Tue, Jan 22, 2013 at 02:45:26PM +0530, Vivek Gautam wrote: > Hi Felipe, > > > On Tue, Jan 22, 2013 at 2:20 PM, Felipe Balbi <balbi@ti.com> wrote: > > HI, > > > > On Mon, Jan 21, 2013 at 09:23:28PM -0800, Kukjin Kim wrote: > >> Vivek Gautam wrote: > >> > > >> > Changes from v5: > >> > - Rebased on top of latest patches: > >> > usb: phy: samsung: Introducing usb phy driver for hsotg (v9) > >> > usb: phy: samsung: Add support to set pmu isolation (v6) > >> > As a result adding hostphy enable mask and hostphy register offsets > >> > to driver data in order to access the HOSTPHY CONTROL register. > >> > > >> > - Adding member 'otg' to struct samsung-usbphy so that its consumers > >> > can call otg->set_host so as to make 'phy' aware of the consumer type: > >> > HOST/DEVICE > >> > > >> > - Adding 'otg' to 'struct s5p_ehci_hcd' and 'struct exynos_ohci_hcd' > >> > which keeps track of 'otg' of the controllers' phy. This then sets > >> > the host. > >> > > >> > - Moved samsung_usbphy_set_type() calls from ehci-s5p and ohci-exynos > >> > to phy driver itself where based on phy_type it is called. > >> > > >> > - Added separate macro definition for USB20PHY_CFG register to select > >> > between host/device type usb link. > >> > > >> > - Removing unnecessary argument 'phy_type' from > >> > samsung_usbphy_set_type() > >> > and samsung_usbphy_cfg_sel(). > >> > > >> > - Addressed few nits: > >> > -- added macro for 'KHZ' > >> > -- removing useless 'if' from samsung_usbphy_cfg_sel() > >> > -- keeping the place of clk_get intact and requesting driver > >> > data before that. > >> > > >> > Vivek Gautam (4): > >> > ARM: EXYNOS: Update & move usb-phy types to generic include layer > >> > usb: phy: samsung: Add host phy support to samsung-phy driver > >> > USB: ehci-s5p: Add phy driver support > >> > USB: ohci-exynos: Add phy driver support > >> > > >> > .../devicetree/bindings/usb/samsung-usbphy.txt | 12 +- > >> > drivers/usb/host/ehci-s5p.c | 81 +++- > >> > drivers/usb/host/ohci-exynos.c | 85 +++- > >> > drivers/usb/phy/Kconfig | 2 +- > >> > drivers/usb/phy/samsung-usbphy.c | 512 > >> ++++++++++++++++++-- > >> > include/linux/usb/samsung_usb_phy.h | 16 + > >> > 6 files changed, 635 insertions(+), 73 deletions(-) > >> > create mode 100644 include/linux/usb/samsung_usb_phy.h > >> > > >> > -- > >> > 1.7.6.5 > >> > >> Looks good to me, > >> > >> Felipe and Greg, I don't know who should take this series anyway, feel free > >> to add my ack: > >> > >> Acked-by: Kukjin Kim <kgene.kim@samsung.com> > > > > I will take care of it. But I need Alan's Acked-by for EHCI and OHCI > > parts. > > > > We got Alan's ACK for: > USB: ehci-s5p: Add phy driver support > USB: ohci-exynos: Add phy driver support Ok, then as soon as I get back to the office (in a few hours), I'll start queueing those. cheers -- balbi [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <20130122092947.GJ16143-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>]
* Re: [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250 [not found] ` <20130122092947.GJ16143-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org> @ 2013-01-22 9:32 ` Felipe Balbi 2013-01-22 9:37 ` Vivek Gautam 0 siblings, 1 reply; 23+ messages in thread From: Felipe Balbi @ 2013-01-22 9:32 UTC (permalink / raw) To: Felipe Balbi Cc: jg1.han-Sze3O3UU22JBDgjK7y7TUQ, Kukjin Kim, p.paneri-Sze3O3UU22JBDgjK7y7TUQ, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-usb-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, Vivek Gautam, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, Vivek Gautam, cpgs-Sze3O3UU22JBDgjK7y7TUQ, Alan Stern, sylvester.nawrocki-Re5JQEeQqe8AvxtiuMwx3w [-- Attachment #1.1: Type: text/plain, Size: 3594 bytes --] HI, On Tue, Jan 22, 2013 at 11:29:47AM +0200, Felipe Balbi wrote: > On Tue, Jan 22, 2013 at 02:45:26PM +0530, Vivek Gautam wrote: > > Hi Felipe, > > > > > > On Tue, Jan 22, 2013 at 2:20 PM, Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org> wrote: > > > HI, > > > > > > On Mon, Jan 21, 2013 at 09:23:28PM -0800, Kukjin Kim wrote: > > >> Vivek Gautam wrote: > > >> > > > >> > Changes from v5: > > >> > - Rebased on top of latest patches: > > >> > usb: phy: samsung: Introducing usb phy driver for hsotg (v9) > > >> > usb: phy: samsung: Add support to set pmu isolation (v6) > > >> > As a result adding hostphy enable mask and hostphy register offsets > > >> > to driver data in order to access the HOSTPHY CONTROL register. > > >> > > > >> > - Adding member 'otg' to struct samsung-usbphy so that its consumers > > >> > can call otg->set_host so as to make 'phy' aware of the consumer type: > > >> > HOST/DEVICE > > >> > > > >> > - Adding 'otg' to 'struct s5p_ehci_hcd' and 'struct exynos_ohci_hcd' > > >> > which keeps track of 'otg' of the controllers' phy. This then sets > > >> > the host. > > >> > > > >> > - Moved samsung_usbphy_set_type() calls from ehci-s5p and ohci-exynos > > >> > to phy driver itself where based on phy_type it is called. > > >> > > > >> > - Added separate macro definition for USB20PHY_CFG register to select > > >> > between host/device type usb link. > > >> > > > >> > - Removing unnecessary argument 'phy_type' from > > >> > samsung_usbphy_set_type() > > >> > and samsung_usbphy_cfg_sel(). > > >> > > > >> > - Addressed few nits: > > >> > -- added macro for 'KHZ' > > >> > -- removing useless 'if' from samsung_usbphy_cfg_sel() > > >> > -- keeping the place of clk_get intact and requesting driver > > >> > data before that. > > >> > > > >> > Vivek Gautam (4): > > >> > ARM: EXYNOS: Update & move usb-phy types to generic include layer > > >> > usb: phy: samsung: Add host phy support to samsung-phy driver > > >> > USB: ehci-s5p: Add phy driver support > > >> > USB: ohci-exynos: Add phy driver support > > >> > > > >> > .../devicetree/bindings/usb/samsung-usbphy.txt | 12 +- > > >> > drivers/usb/host/ehci-s5p.c | 81 +++- > > >> > drivers/usb/host/ohci-exynos.c | 85 +++- > > >> > drivers/usb/phy/Kconfig | 2 +- > > >> > drivers/usb/phy/samsung-usbphy.c | 512 > > >> ++++++++++++++++++-- > > >> > include/linux/usb/samsung_usb_phy.h | 16 + > > >> > 6 files changed, 635 insertions(+), 73 deletions(-) > > >> > create mode 100644 include/linux/usb/samsung_usb_phy.h > > >> > > > >> > -- > > >> > 1.7.6.5 > > >> > > >> Looks good to me, > > >> > > >> Felipe and Greg, I don't know who should take this series anyway, feel free > > >> to add my ack: > > >> > > >> Acked-by: Kukjin Kim <kgene.kim-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > > > > > > I will take care of it. But I need Alan's Acked-by for EHCI and OHCI > > > parts. > > > > > > > We got Alan's ACK for: > > USB: ehci-s5p: Add phy driver support > > USB: ohci-exynos: Add phy driver support > > Ok, then as soon as I get back to the office (in a few hours), I'll > start queueing those. Actually, if you want to make my life a little easier today, you could resend the series with all Acks in place ;-) ps: hehe, I'm about to go a little nuts today, too many things happening at once ;-) -- balbi [-- Attachment #1.2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] [-- Attachment #2: Type: text/plain, Size: 192 bytes --] _______________________________________________ devicetree-discuss mailing list devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org https://lists.ozlabs.org/listinfo/devicetree-discuss ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250 2013-01-22 9:32 ` Felipe Balbi @ 2013-01-22 9:37 ` Vivek Gautam 0 siblings, 0 replies; 23+ messages in thread From: Vivek Gautam @ 2013-01-22 9:37 UTC (permalink / raw) To: balbi Cc: Kukjin Kim, Vivek Gautam, linux-usb, devicetree-discuss, linux-kernel, linux-samsung-soc, gregkh, thomas.abraham, rob.herring, grant.likely, sylvester.nawrocki, dianders, jg1.han, p.paneri, cpgs, Alan Stern Hi Felipe, On Tue, Jan 22, 2013 at 3:02 PM, Felipe Balbi <balbi@ti.com> wrote: > HI, > > On Tue, Jan 22, 2013 at 11:29:47AM +0200, Felipe Balbi wrote: >> On Tue, Jan 22, 2013 at 02:45:26PM +0530, Vivek Gautam wrote: >> > Hi Felipe, >> > >> > >> > On Tue, Jan 22, 2013 at 2:20 PM, Felipe Balbi <balbi@ti.com> wrote: >> > > HI, >> > > >> > > On Mon, Jan 21, 2013 at 09:23:28PM -0800, Kukjin Kim wrote: >> > >> Vivek Gautam wrote: >> > >> > >> > >> > Changes from v5: >> > >> > - Rebased on top of latest patches: >> > >> > usb: phy: samsung: Introducing usb phy driver for hsotg (v9) >> > >> > usb: phy: samsung: Add support to set pmu isolation (v6) >> > >> > As a result adding hostphy enable mask and hostphy register offsets >> > >> > to driver data in order to access the HOSTPHY CONTROL register. >> > >> > >> > >> > - Adding member 'otg' to struct samsung-usbphy so that its consumers >> > >> > can call otg->set_host so as to make 'phy' aware of the consumer type: >> > >> > HOST/DEVICE >> > >> > >> > >> > - Adding 'otg' to 'struct s5p_ehci_hcd' and 'struct exynos_ohci_hcd' >> > >> > which keeps track of 'otg' of the controllers' phy. This then sets >> > >> > the host. >> > >> > >> > >> > - Moved samsung_usbphy_set_type() calls from ehci-s5p and ohci-exynos >> > >> > to phy driver itself where based on phy_type it is called. >> > >> > >> > >> > - Added separate macro definition for USB20PHY_CFG register to select >> > >> > between host/device type usb link. >> > >> > >> > >> > - Removing unnecessary argument 'phy_type' from >> > >> > samsung_usbphy_set_type() >> > >> > and samsung_usbphy_cfg_sel(). >> > >> > >> > >> > - Addressed few nits: >> > >> > -- added macro for 'KHZ' >> > >> > -- removing useless 'if' from samsung_usbphy_cfg_sel() >> > >> > -- keeping the place of clk_get intact and requesting driver >> > >> > data before that. >> > >> > >> > >> > Vivek Gautam (4): >> > >> > ARM: EXYNOS: Update & move usb-phy types to generic include layer >> > >> > usb: phy: samsung: Add host phy support to samsung-phy driver >> > >> > USB: ehci-s5p: Add phy driver support >> > >> > USB: ohci-exynos: Add phy driver support >> > >> > >> > >> > .../devicetree/bindings/usb/samsung-usbphy.txt | 12 +- >> > >> > drivers/usb/host/ehci-s5p.c | 81 +++- >> > >> > drivers/usb/host/ohci-exynos.c | 85 +++- >> > >> > drivers/usb/phy/Kconfig | 2 +- >> > >> > drivers/usb/phy/samsung-usbphy.c | 512 >> > >> ++++++++++++++++++-- >> > >> > include/linux/usb/samsung_usb_phy.h | 16 + >> > >> > 6 files changed, 635 insertions(+), 73 deletions(-) >> > >> > create mode 100644 include/linux/usb/samsung_usb_phy.h >> > >> > >> > >> > -- >> > >> > 1.7.6.5 >> > >> >> > >> Looks good to me, >> > >> >> > >> Felipe and Greg, I don't know who should take this series anyway, feel free >> > >> to add my ack: >> > >> >> > >> Acked-by: Kukjin Kim <kgene.kim@samsung.com> >> > > >> > > I will take care of it. But I need Alan's Acked-by for EHCI and OHCI >> > > parts. >> > > >> > >> > We got Alan's ACK for: >> > USB: ehci-s5p: Add phy driver support >> > USB: ohci-exynos: Add phy driver support >> >> Ok, then as soon as I get back to the office (in a few hours), I'll >> start queueing those. > > Actually, if you want to make my life a little easier today, you could > resend the series with all Acks in place ;-) > Sure, will resend the patches with proper Acks and version :-) > ps: hehe, I'm about to go a little nuts today, too many things happening > at once ;-) > :-) -- Thanks & Regards Vivek ^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v6 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver 2013-01-11 15:02 [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250 Vivek Gautam [not found] ` <1357916550-11421-1-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2013-01-11 15:02 ` Vivek Gautam 2013-01-14 12:22 ` [PATCH v7 " Vivek Gautam 2013-01-11 15:02 ` [PATCH v6 3/4] USB: ehci-s5p: Add phy driver support Vivek Gautam 2 siblings, 1 reply; 23+ messages in thread From: Vivek Gautam @ 2013-01-11 15:02 UTC (permalink / raw) To: linux-usb Cc: devicetree-discuss, linux-kernel, linux-samsung-soc, gregkh, balbi, kgene.kim, thomas.abraham, rob.herring, grant.likely, sylvester.nawrocki, dianders, jg1.han, p.paneri This patch adds host phy support to samsung-usbphy driver and further adds support for samsung's exynos5250 usb-phy. Signed-off-by: Praveen Paneri <p.paneri@samsung.com> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com> --- .../devicetree/bindings/usb/samsung-usbphy.txt | 12 +- drivers/usb/phy/Kconfig | 2 +- drivers/usb/phy/samsung-usbphy.c | 512 ++++++++++++++++++-- 3 files changed, 495 insertions(+), 31 deletions(-) diff --git a/Documentation/devicetree/bindings/usb/samsung-usbphy.txt b/Documentation/devicetree/bindings/usb/samsung-usbphy.txt index 22d06cf..0331949 100644 --- a/Documentation/devicetree/bindings/usb/samsung-usbphy.txt +++ b/Documentation/devicetree/bindings/usb/samsung-usbphy.txt @@ -1,15 +1,23 @@ * Samsung's usb phy transceiver -The Samsung's phy transceiver is used for controlling usb otg phy for -s3c-hsotg usb device controller. +The Samsung's phy transceiver is used for controlling usb phy for +s3c-hsotg as well as ehci-s5p and ohci-exynos usb controllers +across Samsung SOCs. TODO: Adding the PHY binding with controller(s) according to the under developement generic PHY driver. Required properties: + +Exynos4210: - compatible : should be "samsung,exynos4210-usbphy" - reg : base physical address of the phy registers and length of memory mapped region. +Exynos5250: +- compatible : should be "samsung,exynos5250-usbphy" +- reg : base physical address of the phy registers and length of memory mapped + region. + Optional properties: - #address-cells: should be '1' when usbphy node has a child node with 'reg' property. diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig index 36a85b6..fae4d08 100644 --- a/drivers/usb/phy/Kconfig +++ b/drivers/usb/phy/Kconfig @@ -48,7 +48,7 @@ config USB_RCAR_PHY config SAMSUNG_USBPHY bool "Samsung USB PHY controller Driver" - depends on USB_S3C_HSOTG + depends on USB_S3C_HSOTG || USB_EHCI_S5P || USB_OHCI_EXYNOS select USB_OTG_UTILS help Enable this to support Samsung USB phy controller for samsung diff --git a/drivers/usb/phy/samsung-usbphy.c b/drivers/usb/phy/samsung-usbphy.c index 7eec7c3..d2b6642 100644 --- a/drivers/usb/phy/samsung-usbphy.c +++ b/drivers/usb/phy/samsung-usbphy.c @@ -5,7 +5,8 @@ * * Author: Praveen Paneri <p.paneri@samsung.com> * - * Samsung USB2.0 High-speed OTG transceiver, talks to S3C HS OTG controller + * Samsung USB2.0 PHY transceiver; talks to S3C HS OTG controller, EHCI-S5P and + * OHCI-EXYNOS controllers. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -21,11 +22,13 @@ #include <linux/platform_device.h> #include <linux/clk.h> #include <linux/delay.h> +#include <linux/device.h> #include <linux/err.h> #include <linux/io.h> #include <linux/of.h> #include <linux/of_address.h> #include <linux/usb/otg.h> +#include <linux/usb/samsung_usb_phy.h> #include <linux/platform_data/samsung-usbphy.h> /* Register definitions */ @@ -57,24 +60,131 @@ #define RSTCON_HLINK_SWRST (0x1 << 1) #define RSTCON_SWRST (0x1 << 0) +/* EXYNOS5 */ +#define EXYNOS5_PHY_HOST_CTRL0 (0x00) + +#define HOST_CTRL0_PHYSWRSTALL (0x1 << 31) + +#define HOST_CTRL0_REFCLKSEL_MASK (0x3) +#define HOST_CTRL0_REFCLKSEL_XTAL (0x0 << 19) +#define HOST_CTRL0_REFCLKSEL_EXTL (0x1 << 19) +#define HOST_CTRL0_REFCLKSEL_CLKCORE (0x2 << 19) + +#define HOST_CTRL0_FSEL_MASK (0x7 << 16) +#define HOST_CTRL0_FSEL(_x) ((_x) << 16) +#define HOST_CTRL0_FSEL_CLKSEL_50M (0x7) +#define HOST_CTRL0_FSEL_CLKSEL_24M (0x5) +#define HOST_CTRL0_FSEL_CLKSEL_20M (0x4) +#define HOST_CTRL0_FSEL_CLKSEL_19200K (0x3) +#define HOST_CTRL0_FSEL_CLKSEL_12M (0x2) +#define HOST_CTRL0_FSEL_CLKSEL_10M (0x1) +#define HOST_CTRL0_FSEL_CLKSEL_9600K (0x0) + +#define HOST_CTRL0_TESTBURNIN (0x1 << 11) +#define HOST_CTRL0_RETENABLE (0x1 << 10) +#define HOST_CTRL0_COMMONON_N (0x1 << 9) +#define HOST_CTRL0_SIDDQ (0x1 << 6) +#define HOST_CTRL0_FORCESLEEP (0x1 << 5) +#define HOST_CTRL0_FORCESUSPEND (0x1 << 4) +#define HOST_CTRL0_WORDINTERFACE (0x1 << 3) +#define HOST_CTRL0_UTMISWRST (0x1 << 2) +#define HOST_CTRL0_LINKSWRST (0x1 << 1) +#define HOST_CTRL0_PHYSWRST (0x1 << 0) + +#define EXYNOS5_PHY_HOST_TUNE0 (0x04) + +#define EXYNOS5_PHY_HSIC_CTRL1 (0x10) + +#define EXYNOS5_PHY_HSIC_TUNE1 (0x14) + +#define EXYNOS5_PHY_HSIC_CTRL2 (0x20) + +#define EXYNOS5_PHY_HSIC_TUNE2 (0x24) + +#define HSIC_CTRL_REFCLKSEL_MASK (0x3) +#define HSIC_CTRL_REFCLKSEL (0x2 << 23) + +#define HSIC_CTRL_REFCLKDIV_MASK (0x7f) +#define HSIC_CTRL_REFCLKDIV(_x) ((_x) << 16) +#define HSIC_CTRL_REFCLKDIV_12 (0x24 << 16) +#define HSIC_CTRL_REFCLKDIV_15 (0x1c << 16) +#define HSIC_CTRL_REFCLKDIV_16 (0x1a << 16) +#define HSIC_CTRL_REFCLKDIV_19_2 (0x15 << 16) +#define HSIC_CTRL_REFCLKDIV_20 (0x14) + +#define HSIC_CTRL_SIDDQ (0x1 << 6) +#define HSIC_CTRL_FORCESLEEP (0x1 << 5) +#define HSIC_CTRL_FORCESUSPEND (0x1 << 4) +#define HSIC_CTRL_WORDINTERFACE (0x1 << 3) +#define HSIC_CTRL_UTMISWRST (0x1 << 2) +#define HSIC_CTRL_PHYSWRST (0x1 << 0) + +#define EXYNOS5_PHY_HOST_EHCICTRL (0x30) + +#define HOST_EHCICTRL_ENAINCRXALIGN (0x1 << 29) +#define HOST_EHCICTRL_ENAINCR4 (0x1 << 28) +#define HOST_EHCICTRL_ENAINCR8 (0x1 << 27) +#define HOST_EHCICTRL_ENAINCR16 (0x1 << 26) + +#define EXYNOS5_PHY_HOST_OHCICTRL (0x34) + +#define HOST_OHCICTRL_SUSPLGCY (0x1 << 3) +#define HOST_OHCICTRL_APPSTARTCLK (0x1 << 2) +#define HOST_OHCICTRL_CNTSEL (0x1 << 1) +#define HOST_OHCICTRL_CLKCKTRST (0x1 << 0) + +#define EXYNOS5_PHY_OTG_SYS (0x38) + +#define OTG_SYS_PHYLINK_SWRESET (0x1 << 14) +#define OTG_SYS_LINKSWRST_UOTG (0x1 << 13) +#define OTG_SYS_PHY0_SWRST (0x1 << 12) + +#define OTG_SYS_REFCLKSEL_MASK (0x3 << 9) +#define OTG_SYS_REFCLKSEL_XTAL (0x0 << 9) +#define OTG_SYS_REFCLKSEL_EXTL (0x1 << 9) +#define OTG_SYS_REFCLKSEL_CLKCORE (0x2 << 9) + +#define OTG_SYS_IDPULLUP_UOTG (0x1 << 8) +#define OTG_SYS_COMMON_ON (0x1 << 7) + +#define OTG_SYS_FSEL_MASK (0x7 << 4) +#define OTG_SYS_FSEL(_x) ((_x) << 4) + +#define OTG_SYS_FORCESLEEP (0x1 << 3) +#define OTG_SYS_OTGDISABLE (0x1 << 2) +#define OTG_SYS_SIDDQ_UOTG (0x1 << 1) +#define OTG_SYS_FORCESUSPEND (0x1 << 0) + +#define EXYNOS5_PHY_OTG_TUNE (0x40) + #ifndef MHZ #define MHZ (1000*1000) #endif +#ifndef KHZ +#define KHZ (1000) +#endif + +#define EXYNOS_USBHOST_PHY_CTRL_OFFSET (0x4) #define S3C64XX_USBPHY_ENABLE (0x1 << 16) #define EXYNOS_USBPHY_ENABLE (0x1 << 0) +#define EXYNOS_USB20PHY_CFG_HOST_LINK (0x1 << 0) enum samsung_cpu_type { TYPE_S3C64XX, TYPE_EXYNOS4210, + TYPE_EXYNOS5250, }; /* * struct samsung_usbphy_drvdata - driver data for various SoC variants * @cpu_type: machine identifier * @devphy_en_mask: device phy enable mask for PHY CONTROL register + * @hostphy_en_mask: host phy enable mask for PHY CONTROL register * @devphy_reg_offset: offset to DEVICE PHY CONTROL register from * mapped address of system controller. + * @hostphy_reg_offset: offset to HOST PHY CONTROL register from + * mapped address of system controller. * * Here we have a separate mask for device type phy. * Having different masks for host and device type phy helps @@ -87,7 +197,9 @@ enum samsung_cpu_type { struct samsung_usbphy_drvdata { int cpu_type; int devphy_en_mask; + int hostphy_en_mask; u32 devphy_reg_offset; + u32 hostphy_reg_offset; }; /* @@ -98,8 +210,12 @@ struct samsung_usbphy_drvdata { * @clk: usb phy clock * @regs: usb phy controller registers memory base * @pmuregs: USB device PHY_CONTROL register memory base + * @sysreg: USB2.0 PHY_CFG register memory base * @ref_clk_freq: reference clock frequency selection * @drv_data: driver data available for different SoCs + * @phy_type: Samsung SoCs specific phy types: #HOST + * #DEVICE + * @phy_usage: usage count for phy * @lock: lock for phy operations */ struct samsung_usbphy { @@ -109,13 +225,27 @@ struct samsung_usbphy { struct clk *clk; void __iomem *regs; void __iomem *pmuregs; + void __iomem *sysreg; int ref_clk_freq; const struct samsung_usbphy_drvdata *drv_data; + enum samsung_usb_phy_type phy_type; + atomic_t phy_usage; spinlock_t lock; }; #define phy_to_sphy(x) container_of((x), struct samsung_usbphy, phy) +int samsung_usbphy_set_host(struct usb_otg *otg, struct usb_bus *host) +{ + if (!otg) + return -ENODEV; + + if (!otg->host) + otg->host = host; + + return 0; +} + static int samsung_usbphy_parse_dt(struct samsung_usbphy *sphy) { struct device_node *usbphy_sys; @@ -127,14 +257,27 @@ static int samsung_usbphy_parse_dt(struct samsung_usbphy *sphy) sphy->pmuregs = of_iomap(usbphy_sys, 0); - of_node_put(usbphy_sys); - if (sphy->pmuregs == NULL) { dev_err(sphy->dev, "Can't get usb-phy pmu control register\n"); - return -ENODEV; + goto err0; } + sphy->sysreg = of_iomap(usbphy_sys, 1); + + /* + * Not returning error code here, since this situation is not fatal. + * Few SoCs may not have this switch available + */ + if (sphy->sysreg == NULL) + dev_warn(sphy->dev, "Can't get usb-phy sysreg cfg register\n"); + + of_node_put(usbphy_sys); + return 0; + +err0: + of_node_put(usbphy_sys); + return -ENXIO; } /* @@ -144,17 +287,42 @@ static int samsung_usbphy_parse_dt(struct samsung_usbphy *sphy) */ static void samsung_usbphy_set_isolation(struct samsung_usbphy *sphy, bool on) { - void __iomem *reg; + void __iomem *reg = NULL; u32 reg_val; - u32 en_mask; + u32 en_mask = 0; if (!sphy->pmuregs) { dev_warn(sphy->dev, "Can't set pmu isolation\n"); return; } - reg = sphy->pmuregs + sphy->drv_data->devphy_reg_offset; - en_mask = sphy->drv_data->devphy_en_mask; + switch (sphy->drv_data->cpu_type) { + case TYPE_S3C64XX: + /* + * Do nothing: We will add here once S3C64xx goes for DT support + */ + break; + case TYPE_EXYNOS4210: + /* + * Fall through since exynos4210 and exynos5250 have similar + * register architecture: two separate registers for host and + * device phy control with enable bit at position 0. + */ + case TYPE_EXYNOS5250: + if (sphy->phy_type == USB_PHY_TYPE_DEVICE) { + reg = sphy->pmuregs + + sphy->drv_data->devphy_reg_offset; + en_mask = sphy->drv_data->devphy_en_mask; + } else if (sphy->phy_type == USB_PHY_TYPE_HOST) { + reg = sphy->pmuregs + + sphy->drv_data->hostphy_reg_offset; + en_mask = sphy->drv_data->hostphy_en_mask; + } + break; + default: + dev_err(sphy->dev, "Invalid SoC type\n"); + return; + } reg_val = readl(reg); @@ -167,6 +335,43 @@ static void samsung_usbphy_set_isolation(struct samsung_usbphy *sphy, bool on) } /* + * Configure the mode of working of usb-phy here: HOST/DEVICE. + */ +static void samsung_usbphy_cfg_sel(struct samsung_usbphy *sphy) +{ + u32 reg; + + if (!sphy->sysreg) { + dev_warn(sphy->dev, "Can't configure specified phy mode\n"); + return; + } + + reg = readl(sphy->sysreg); + + if (sphy->phy_type == USB_PHY_TYPE_DEVICE) + reg &= ~EXYNOS_USB20PHY_CFG_HOST_LINK; + else if (sphy->phy_type == USB_PHY_TYPE_HOST) + reg |= EXYNOS_USB20PHY_CFG_HOST_LINK; + + writel(reg, sphy->sysreg); +} + +/* + * PHYs are different for USB Device and USB Host. + * This make sure that correct PHY type is selected before + * any operation on PHY. + */ +static int samsung_usbphy_set_type(struct usb_phy *phy, + enum samsung_usb_phy_type phy_type) +{ + struct samsung_usbphy *sphy = phy_to_sphy(phy); + + sphy->phy_type = phy_type; + + return 0; +} + +/* * Returns reference clock frequency selection value */ static int samsung_usbphy_get_refclk_freq(struct samsung_usbphy *sphy) @@ -174,34 +379,185 @@ static int samsung_usbphy_get_refclk_freq(struct samsung_usbphy *sphy) struct clk *ref_clk; int refclk_freq = 0; - ref_clk = clk_get(sphy->dev, "xusbxti"); + /* + * In exynos5250 USB host and device PHY use + * external crystal clock XXTI + */ + if (sphy->drv_data->cpu_type == TYPE_EXYNOS5250) + ref_clk = clk_get(sphy->dev, "ext_xtal"); + else + ref_clk = clk_get(sphy->dev, "xusbxti"); if (IS_ERR(ref_clk)) { dev_err(sphy->dev, "Failed to get reference clock\n"); return PTR_ERR(ref_clk); } - switch (clk_get_rate(ref_clk)) { - case 12 * MHZ: - refclk_freq = PHYCLK_CLKSEL_12M; - break; - case 24 * MHZ: - refclk_freq = PHYCLK_CLKSEL_24M; - break; - case 48 * MHZ: - refclk_freq = PHYCLK_CLKSEL_48M; - break; - default: - if (sphy->drv_data->cpu_type == TYPE_S3C64XX) - refclk_freq = PHYCLK_CLKSEL_48M; - else + if (sphy->drv_data->cpu_type == TYPE_EXYNOS5250) { + /* set clock frequency for PLL */ + switch (clk_get_rate(ref_clk)) { + case 9600 * KHZ: + refclk_freq |= HOST_CTRL0_FSEL_CLKSEL_9600K; + break; + case 10 * MHZ: + refclk_freq |= HOST_CTRL0_FSEL_CLKSEL_10M; + break; + case 12 * MHZ: + refclk_freq |= HOST_CTRL0_FSEL_CLKSEL_12M; + break; + case 19200 * KHZ: + refclk_freq |= HOST_CTRL0_FSEL_CLKSEL_19200K; + break; + case 20 * MHZ: + refclk_freq |= HOST_CTRL0_FSEL_CLKSEL_20M; + break; + case 50 * MHZ: + refclk_freq |= HOST_CTRL0_FSEL_CLKSEL_50M; + break; + case 24 * MHZ: + default: + /* default reference clock */ + refclk_freq |= HOST_CTRL0_FSEL_CLKSEL_24M; + break; + } + } else { + switch (clk_get_rate(ref_clk)) { + case 12 * MHZ: + refclk_freq = PHYCLK_CLKSEL_12M; + break; + case 24 * MHZ: refclk_freq = PHYCLK_CLKSEL_24M; - break; + break; + case 48 * MHZ: + refclk_freq = PHYCLK_CLKSEL_48M; + break; + default: + if (sphy->drv_data->cpu_type == TYPE_S3C64XX) + refclk_freq = PHYCLK_CLKSEL_48M; + else + refclk_freq = PHYCLK_CLKSEL_24M; + break; + } } clk_put(ref_clk); return refclk_freq; } +static bool exynos5_phyhost_is_on(void *regs) +{ + u32 reg; + + reg = readl(regs + EXYNOS5_PHY_HOST_CTRL0); + + return !(reg & HOST_CTRL0_SIDDQ); +} + +static void samsung_exynos5_usbphy_enable(struct samsung_usbphy *sphy) +{ + void __iomem *regs = sphy->regs; + u32 phyclk = sphy->ref_clk_freq; + u32 phyhost; + u32 phyotg; + u32 phyhsic; + u32 ehcictrl; + u32 ohcictrl; + + /* + * phy_usage helps in keeping usage count for phy + * so that the first consumer enabling the phy is also + * the last consumer to disable it. + */ + + atomic_inc(&sphy->phy_usage); + + if (exynos5_phyhost_is_on(regs)) { + dev_info(sphy->dev, "Already power on PHY\n"); + return; + } + + /* Host configuration */ + phyhost = readl(regs + EXYNOS5_PHY_HOST_CTRL0); + + /* phy reference clock configuration */ + phyhost &= ~HOST_CTRL0_FSEL_MASK; + phyhost |= HOST_CTRL0_FSEL(phyclk); + + /* host phy reset */ + phyhost &= ~(HOST_CTRL0_PHYSWRST | + HOST_CTRL0_PHYSWRSTALL | + HOST_CTRL0_SIDDQ | + /* Enable normal mode of operation */ + HOST_CTRL0_FORCESUSPEND | + HOST_CTRL0_FORCESLEEP); + + /* Link reset */ + phyhost |= (HOST_CTRL0_LINKSWRST | + HOST_CTRL0_UTMISWRST | + /* COMMON Block configuration during suspend */ + HOST_CTRL0_COMMONON_N); + writel(phyhost, regs + EXYNOS5_PHY_HOST_CTRL0); + udelay(10); + phyhost &= ~(HOST_CTRL0_LINKSWRST | + HOST_CTRL0_UTMISWRST); + writel(phyhost, regs + EXYNOS5_PHY_HOST_CTRL0); + + /* OTG configuration */ + phyotg = readl(regs + EXYNOS5_PHY_OTG_SYS); + + /* phy reference clock configuration */ + phyotg &= ~OTG_SYS_FSEL_MASK; + phyotg |= OTG_SYS_FSEL(phyclk); + + /* Enable normal mode of operation */ + phyotg &= ~(OTG_SYS_FORCESUSPEND | + OTG_SYS_SIDDQ_UOTG | + OTG_SYS_FORCESLEEP | + OTG_SYS_REFCLKSEL_MASK | + /* COMMON Block configuration during suspend */ + OTG_SYS_COMMON_ON); + + /* OTG phy & link reset */ + phyotg |= (OTG_SYS_PHY0_SWRST | + OTG_SYS_LINKSWRST_UOTG | + OTG_SYS_PHYLINK_SWRESET | + OTG_SYS_OTGDISABLE | + /* Set phy refclk */ + OTG_SYS_REFCLKSEL_CLKCORE); + + writel(phyotg, regs + EXYNOS5_PHY_OTG_SYS); + udelay(10); + phyotg &= ~(OTG_SYS_PHY0_SWRST | + OTG_SYS_LINKSWRST_UOTG | + OTG_SYS_PHYLINK_SWRESET); + writel(phyotg, regs + EXYNOS5_PHY_OTG_SYS); + + /* HSIC phy configuration */ + phyhsic = (HSIC_CTRL_REFCLKDIV_12 | + HSIC_CTRL_REFCLKSEL | + HSIC_CTRL_PHYSWRST); + writel(phyhsic, regs + EXYNOS5_PHY_HSIC_CTRL1); + writel(phyhsic, regs + EXYNOS5_PHY_HSIC_CTRL2); + udelay(10); + phyhsic &= ~HSIC_CTRL_PHYSWRST; + writel(phyhsic, regs + EXYNOS5_PHY_HSIC_CTRL1); + writel(phyhsic, regs + EXYNOS5_PHY_HSIC_CTRL2); + + udelay(80); + + /* enable EHCI DMA burst */ + ehcictrl = readl(regs + EXYNOS5_PHY_HOST_EHCICTRL); + ehcictrl |= (HOST_EHCICTRL_ENAINCRXALIGN | + HOST_EHCICTRL_ENAINCR4 | + HOST_EHCICTRL_ENAINCR8 | + HOST_EHCICTRL_ENAINCR16); + writel(ehcictrl, regs + EXYNOS5_PHY_HOST_EHCICTRL); + + /* set ohci_suspend_on_n */ + ohcictrl = readl(regs + EXYNOS5_PHY_HOST_OHCICTRL); + ohcictrl |= HOST_OHCICTRL_SUSPLGCY; + writel(ohcictrl, regs + EXYNOS5_PHY_HOST_OHCICTRL); +} + static void samsung_usbphy_enable(struct samsung_usbphy *sphy) { void __iomem *regs = sphy->regs; @@ -237,6 +593,41 @@ static void samsung_usbphy_enable(struct samsung_usbphy *sphy) writel(rstcon, regs + SAMSUNG_RSTCON); } +static void samsung_exynos5_usbphy_disable(struct samsung_usbphy *sphy) +{ + void __iomem *regs = sphy->regs; + u32 phyhost; + u32 phyotg; + u32 phyhsic; + + if (atomic_dec_return(&sphy->phy_usage) > 0) { + dev_info(sphy->dev, "still being used\n"); + return; + } + + phyhsic = (HSIC_CTRL_REFCLKDIV_12 | + HSIC_CTRL_REFCLKSEL | + HSIC_CTRL_SIDDQ | + HSIC_CTRL_FORCESLEEP | + HSIC_CTRL_FORCESUSPEND); + writel(phyhsic, regs + EXYNOS5_PHY_HSIC_CTRL1); + writel(phyhsic, regs + EXYNOS5_PHY_HSIC_CTRL2); + + phyhost = readl(regs + EXYNOS5_PHY_HOST_CTRL0); + phyhost |= (HOST_CTRL0_SIDDQ | + HOST_CTRL0_FORCESUSPEND | + HOST_CTRL0_FORCESLEEP | + HOST_CTRL0_PHYSWRST | + HOST_CTRL0_PHYSWRSTALL); + writel(phyhost, regs + EXYNOS5_PHY_HOST_CTRL0); + + phyotg = readl(regs + EXYNOS5_PHY_OTG_SYS); + phyotg |= (OTG_SYS_FORCESUSPEND | + OTG_SYS_SIDDQ_UOTG | + OTG_SYS_FORCESLEEP); + writel(phyotg, regs + EXYNOS5_PHY_OTG_SYS); +} + static void samsung_usbphy_disable(struct samsung_usbphy *sphy) { void __iomem *regs = sphy->regs; @@ -264,11 +655,14 @@ static void samsung_usbphy_disable(struct samsung_usbphy *sphy) static int samsung_usbphy_init(struct usb_phy *phy) { struct samsung_usbphy *sphy; + struct usb_bus *host = NULL; unsigned long flags; int ret = 0; sphy = phy_to_sphy(phy); + host = phy->otg->host; + /* Enable the phy clock */ ret = clk_prepare_enable(sphy->clk); if (ret) { @@ -278,19 +672,35 @@ static int samsung_usbphy_init(struct usb_phy *phy) spin_lock_irqsave(&sphy->lock, flags); + if (host) { + /* setting default phy-type for USB 2.0 */ + if (!strstr(dev_name(host->controller), "ehci") || + !strstr(dev_name(host->controller), "ohci")) + samsung_usbphy_set_type(&sphy->phy, USB_PHY_TYPE_HOST); + } else { + samsung_usbphy_set_type(&sphy->phy, USB_PHY_TYPE_DEVICE); + } + /* Disable phy isolation */ if (sphy->plat && sphy->plat->pmu_isolation) sphy->plat->pmu_isolation(false); else samsung_usbphy_set_isolation(sphy, false); + /* Selecting Host/OTG mode; After reset USB2.0PHY_CFG: HOST */ + samsung_usbphy_cfg_sel(sphy); + /* Initialize usb phy registers */ - samsung_usbphy_enable(sphy); + if (sphy->drv_data->cpu_type == TYPE_EXYNOS5250) + samsung_exynos5_usbphy_enable(sphy); + else + samsung_usbphy_enable(sphy); spin_unlock_irqrestore(&sphy->lock, flags); /* Disable the phy clock */ clk_disable_unprepare(sphy->clk); + return ret; } @@ -300,10 +710,13 @@ static int samsung_usbphy_init(struct usb_phy *phy) static void samsung_usbphy_shutdown(struct usb_phy *phy) { struct samsung_usbphy *sphy; + struct usb_bus *host = NULL; unsigned long flags; sphy = phy_to_sphy(phy); + host = phy->otg->host; + if (clk_prepare_enable(sphy->clk)) { dev_err(sphy->dev, "%s: clk_prepare_enable failed\n", __func__); return; @@ -311,8 +724,20 @@ static void samsung_usbphy_shutdown(struct usb_phy *phy) spin_lock_irqsave(&sphy->lock, flags); + if (host) { + /* setting default phy-type for USB 2.0 */ + if (!strstr(dev_name(host->controller), "ehci") || + !strstr(dev_name(host->controller), "ohci")) + samsung_usbphy_set_type(&sphy->phy, USB_PHY_TYPE_HOST); + } else { + samsung_usbphy_set_type(&sphy->phy, USB_PHY_TYPE_DEVICE); + } + /* De-initialize usb phy registers */ - samsung_usbphy_disable(sphy); + if (sphy->drv_data->cpu_type == TYPE_EXYNOS5250) + samsung_exynos5_usbphy_disable(sphy); + else + samsung_usbphy_disable(sphy); /* Enable phy isolation */ if (sphy->plat && sphy->plat->pmu_isolation) @@ -344,7 +769,9 @@ static inline const struct samsung_usbphy_drvdata static int __devinit samsung_usbphy_probe(struct platform_device *pdev) { struct samsung_usbphy *sphy; + struct usb_otg *otg; struct samsung_usbphy_data *pdata = pdev->dev.platform_data; + const struct samsung_usbphy_drvdata *drv_data; struct device *dev = &pdev->dev; struct resource *phy_mem; void __iomem *phy_base; @@ -367,7 +794,17 @@ static int __devinit samsung_usbphy_probe(struct platform_device *pdev) if (!sphy) return -ENOMEM; - clk = devm_clk_get(dev, "otg"); + otg = devm_kzalloc(dev, sizeof(*otg), GFP_KERNEL); + if (!otg) + return -ENOMEM; + + drv_data = samsung_usbphy_get_driver_data(pdev); + + if (drv_data->cpu_type == TYPE_EXYNOS5250) + clk = devm_clk_get(dev, "usbhost"); + else + clk = devm_clk_get(dev, "otg"); + if (IS_ERR(clk)) { dev_err(dev, "Failed to get otg clock\n"); return PTR_ERR(clk); @@ -389,13 +826,17 @@ static int __devinit samsung_usbphy_probe(struct platform_device *pdev) sphy->plat = pdata; sphy->regs = phy_base; sphy->clk = clk; + sphy->drv_data = drv_data; sphy->phy.dev = sphy->dev; sphy->phy.label = "samsung-usbphy"; sphy->phy.init = samsung_usbphy_init; sphy->phy.shutdown = samsung_usbphy_shutdown; - sphy->drv_data = samsung_usbphy_get_driver_data(pdev); sphy->ref_clk_freq = samsung_usbphy_get_refclk_freq(sphy); + sphy->phy.otg = otg; + sphy->phy.otg->phy = &sphy->phy; + sphy->phy.otg->set_host = samsung_usbphy_set_host; + spin_lock_init(&sphy->lock); platform_set_drvdata(pdev, sphy); @@ -411,6 +852,8 @@ static int __exit samsung_usbphy_remove(struct platform_device *pdev) if (sphy->pmuregs) iounmap(sphy->pmuregs); + if (sphy->sysreg) + iounmap(sphy->sysreg); return 0; } @@ -423,6 +866,13 @@ static const struct samsung_usbphy_drvdata usbphy_s3c64xx = { static const struct samsung_usbphy_drvdata usbphy_exynos4 = { .cpu_type = TYPE_EXYNOS4210, .devphy_en_mask = EXYNOS_USBPHY_ENABLE, + .hostphy_en_mask = EXYNOS_USBPHY_ENABLE, +}; + +static struct samsung_usbphy_drvdata usbphy_exynos5 = { + .cpu_type = TYPE_EXYNOS5250, + .hostphy_en_mask = EXYNOS_USBPHY_ENABLE, + .hostphy_reg_offset = EXYNOS_USBHOST_PHY_CTRL_OFFSET, }; #ifdef CONFIG_OF @@ -433,6 +883,9 @@ static const struct of_device_id samsung_usbphy_dt_match[] = { }, { .compatible = "samsung,exynos4210-usbphy", .data = &usbphy_exynos4, + }, { + .compatible = "samsung,exynos5250-usbphy", + .data = &usbphy_exynos5 }, {}, }; @@ -446,6 +899,9 @@ static struct platform_device_id samsung_usbphy_driver_ids[] = { }, { .name = "exynos4210-usbphy", .driver_data = (unsigned long)&usbphy_exynos4, + }, { + .name = "exynos5250-usbphy", + .driver_data = (unsigned long)&usbphy_exynos5, }, {}, }; -- 1.7.6.5 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v7 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver 2013-01-11 15:02 ` [PATCH v6 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver Vivek Gautam @ 2013-01-14 12:22 ` Vivek Gautam [not found] ` <1358166135-22073-1-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Vivek Gautam @ 2013-01-14 12:22 UTC (permalink / raw) To: linux-usb Cc: devicetree-discuss, linux-kernel, linux-samsung-soc, gregkh, balbi, kgene.kim, thomas.abraham, rob.herring, grant.likely, sylvester.nawrocki, dianders, jg1.han, p.paneri This patch adds host phy support to samsung-usbphy driver and further adds support for samsung's exynos5250 usb-phy. Signed-off-by: Praveen Paneri <p.paneri@samsung.com> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com> --- Changes from v6: - Changing macro names from 'HOST_CTRL0_FSEL_CLKSEL_XX' to 'FSEL_CLKSEL_XX' since it's being used by HOST and OTG block to prepare reference clock. - Directly Assigning 'FSEL_CLKSEL_XX' to refclk_freq in samsung_usbphy_get_refclk_freq() instead of ORing them since we are anyways using macros: "HOST_CTRL0_FSEL(_x) ((_x) << 16)" "OTG_SYS_FSEL(_x) ((_x) << 4)" .../devicetree/bindings/usb/samsung-usbphy.txt | 12 +- drivers/usb/phy/Kconfig | 2 +- drivers/usb/phy/samsung-usbphy.c | 513 ++++++++++++++++++-- 3 files changed, 496 insertions(+), 31 deletions(-) diff --git a/Documentation/devicetree/bindings/usb/samsung-usbphy.txt b/Documentation/devicetree/bindings/usb/samsung-usbphy.txt index 22d06cf..0331949 100644 --- a/Documentation/devicetree/bindings/usb/samsung-usbphy.txt +++ b/Documentation/devicetree/bindings/usb/samsung-usbphy.txt @@ -1,15 +1,23 @@ * Samsung's usb phy transceiver -The Samsung's phy transceiver is used for controlling usb otg phy for -s3c-hsotg usb device controller. +The Samsung's phy transceiver is used for controlling usb phy for +s3c-hsotg as well as ehci-s5p and ohci-exynos usb controllers +across Samsung SOCs. TODO: Adding the PHY binding with controller(s) according to the under developement generic PHY driver. Required properties: + +Exynos4210: - compatible : should be "samsung,exynos4210-usbphy" - reg : base physical address of the phy registers and length of memory mapped region. +Exynos5250: +- compatible : should be "samsung,exynos5250-usbphy" +- reg : base physical address of the phy registers and length of memory mapped + region. + Optional properties: - #address-cells: should be '1' when usbphy node has a child node with 'reg' property. diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig index 36a85b6..fae4d08 100644 --- a/drivers/usb/phy/Kconfig +++ b/drivers/usb/phy/Kconfig @@ -48,7 +48,7 @@ config USB_RCAR_PHY config SAMSUNG_USBPHY bool "Samsung USB PHY controller Driver" - depends on USB_S3C_HSOTG + depends on USB_S3C_HSOTG || USB_EHCI_S5P || USB_OHCI_EXYNOS select USB_OTG_UTILS help Enable this to support Samsung USB phy controller for samsung diff --git a/drivers/usb/phy/samsung-usbphy.c b/drivers/usb/phy/samsung-usbphy.c index 7eec7c3..355c6b2 100644 --- a/drivers/usb/phy/samsung-usbphy.c +++ b/drivers/usb/phy/samsung-usbphy.c @@ -5,7 +5,8 @@ * * Author: Praveen Paneri <p.paneri@samsung.com> * - * Samsung USB2.0 High-speed OTG transceiver, talks to S3C HS OTG controller + * Samsung USB2.0 PHY transceiver; talks to S3C HS OTG controller, EHCI-S5P and + * OHCI-EXYNOS controllers. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -21,11 +22,13 @@ #include <linux/platform_device.h> #include <linux/clk.h> #include <linux/delay.h> +#include <linux/device.h> #include <linux/err.h> #include <linux/io.h> #include <linux/of.h> #include <linux/of_address.h> #include <linux/usb/otg.h> +#include <linux/usb/samsung_usb_phy.h> #include <linux/platform_data/samsung-usbphy.h> /* Register definitions */ @@ -57,24 +60,132 @@ #define RSTCON_HLINK_SWRST (0x1 << 1) #define RSTCON_SWRST (0x1 << 0) +/* EXYNOS5 */ +#define EXYNOS5_PHY_HOST_CTRL0 (0x00) + +#define HOST_CTRL0_PHYSWRSTALL (0x1 << 31) + +#define HOST_CTRL0_REFCLKSEL_MASK (0x3 << 19) +#define HOST_CTRL0_REFCLKSEL_XTAL (0x0 << 19) +#define HOST_CTRL0_REFCLKSEL_EXTL (0x1 << 19) +#define HOST_CTRL0_REFCLKSEL_CLKCORE (0x2 << 19) + +#define HOST_CTRL0_FSEL_MASK (0x7 << 16) +#define HOST_CTRL0_FSEL(_x) ((_x) << 16) + +#define FSEL_CLKSEL_50M (0x7) +#define FSEL_CLKSEL_24M (0x5) +#define FSEL_CLKSEL_20M (0x4) +#define FSEL_CLKSEL_19200K (0x3) +#define FSEL_CLKSEL_12M (0x2) +#define FSEL_CLKSEL_10M (0x1) +#define FSEL_CLKSEL_9600K (0x0) + +#define HOST_CTRL0_TESTBURNIN (0x1 << 11) +#define HOST_CTRL0_RETENABLE (0x1 << 10) +#define HOST_CTRL0_COMMONON_N (0x1 << 9) +#define HOST_CTRL0_SIDDQ (0x1 << 6) +#define HOST_CTRL0_FORCESLEEP (0x1 << 5) +#define HOST_CTRL0_FORCESUSPEND (0x1 << 4) +#define HOST_CTRL0_WORDINTERFACE (0x1 << 3) +#define HOST_CTRL0_UTMISWRST (0x1 << 2) +#define HOST_CTRL0_LINKSWRST (0x1 << 1) +#define HOST_CTRL0_PHYSWRST (0x1 << 0) + +#define EXYNOS5_PHY_HOST_TUNE0 (0x04) + +#define EXYNOS5_PHY_HSIC_CTRL1 (0x10) + +#define EXYNOS5_PHY_HSIC_TUNE1 (0x14) + +#define EXYNOS5_PHY_HSIC_CTRL2 (0x20) + +#define EXYNOS5_PHY_HSIC_TUNE2 (0x24) + +#define HSIC_CTRL_REFCLKSEL_MASK (0x3 << 23) +#define HSIC_CTRL_REFCLKSEL (0x2 << 23) + +#define HSIC_CTRL_REFCLKDIV_MASK (0x7f << 16) +#define HSIC_CTRL_REFCLKDIV(_x) ((_x) << 16) +#define HSIC_CTRL_REFCLKDIV_12 (0x24 << 16) +#define HSIC_CTRL_REFCLKDIV_15 (0x1c << 16) +#define HSIC_CTRL_REFCLKDIV_16 (0x1a << 16) +#define HSIC_CTRL_REFCLKDIV_19_2 (0x15 << 16) +#define HSIC_CTRL_REFCLKDIV_20 (0x14 << 16) + +#define HSIC_CTRL_SIDDQ (0x1 << 6) +#define HSIC_CTRL_FORCESLEEP (0x1 << 5) +#define HSIC_CTRL_FORCESUSPEND (0x1 << 4) +#define HSIC_CTRL_WORDINTERFACE (0x1 << 3) +#define HSIC_CTRL_UTMISWRST (0x1 << 2) +#define HSIC_CTRL_PHYSWRST (0x1 << 0) + +#define EXYNOS5_PHY_HOST_EHCICTRL (0x30) + +#define HOST_EHCICTRL_ENAINCRXALIGN (0x1 << 29) +#define HOST_EHCICTRL_ENAINCR4 (0x1 << 28) +#define HOST_EHCICTRL_ENAINCR8 (0x1 << 27) +#define HOST_EHCICTRL_ENAINCR16 (0x1 << 26) + +#define EXYNOS5_PHY_HOST_OHCICTRL (0x34) + +#define HOST_OHCICTRL_SUSPLGCY (0x1 << 3) +#define HOST_OHCICTRL_APPSTARTCLK (0x1 << 2) +#define HOST_OHCICTRL_CNTSEL (0x1 << 1) +#define HOST_OHCICTRL_CLKCKTRST (0x1 << 0) + +#define EXYNOS5_PHY_OTG_SYS (0x38) + +#define OTG_SYS_PHYLINK_SWRESET (0x1 << 14) +#define OTG_SYS_LINKSWRST_UOTG (0x1 << 13) +#define OTG_SYS_PHY0_SWRST (0x1 << 12) + +#define OTG_SYS_REFCLKSEL_MASK (0x3 << 9) +#define OTG_SYS_REFCLKSEL_XTAL (0x0 << 9) +#define OTG_SYS_REFCLKSEL_EXTL (0x1 << 9) +#define OTG_SYS_REFCLKSEL_CLKCORE (0x2 << 9) + +#define OTG_SYS_IDPULLUP_UOTG (0x1 << 8) +#define OTG_SYS_COMMON_ON (0x1 << 7) + +#define OTG_SYS_FSEL_MASK (0x7 << 4) +#define OTG_SYS_FSEL(_x) ((_x) << 4) + +#define OTG_SYS_FORCESLEEP (0x1 << 3) +#define OTG_SYS_OTGDISABLE (0x1 << 2) +#define OTG_SYS_SIDDQ_UOTG (0x1 << 1) +#define OTG_SYS_FORCESUSPEND (0x1 << 0) + +#define EXYNOS5_PHY_OTG_TUNE (0x40) + #ifndef MHZ #define MHZ (1000*1000) #endif +#ifndef KHZ +#define KHZ (1000) +#endif + +#define EXYNOS_USBHOST_PHY_CTRL_OFFSET (0x4) #define S3C64XX_USBPHY_ENABLE (0x1 << 16) #define EXYNOS_USBPHY_ENABLE (0x1 << 0) +#define EXYNOS_USB20PHY_CFG_HOST_LINK (0x1 << 0) enum samsung_cpu_type { TYPE_S3C64XX, TYPE_EXYNOS4210, + TYPE_EXYNOS5250, }; /* * struct samsung_usbphy_drvdata - driver data for various SoC variants * @cpu_type: machine identifier * @devphy_en_mask: device phy enable mask for PHY CONTROL register + * @hostphy_en_mask: host phy enable mask for PHY CONTROL register * @devphy_reg_offset: offset to DEVICE PHY CONTROL register from * mapped address of system controller. + * @hostphy_reg_offset: offset to HOST PHY CONTROL register from + * mapped address of system controller. * * Here we have a separate mask for device type phy. * Having different masks for host and device type phy helps @@ -87,7 +198,9 @@ enum samsung_cpu_type { struct samsung_usbphy_drvdata { int cpu_type; int devphy_en_mask; + int hostphy_en_mask; u32 devphy_reg_offset; + u32 hostphy_reg_offset; }; /* @@ -98,8 +211,12 @@ struct samsung_usbphy_drvdata { * @clk: usb phy clock * @regs: usb phy controller registers memory base * @pmuregs: USB device PHY_CONTROL register memory base + * @sysreg: USB2.0 PHY_CFG register memory base * @ref_clk_freq: reference clock frequency selection * @drv_data: driver data available for different SoCs + * @phy_type: Samsung SoCs specific phy types: #HOST + * #DEVICE + * @phy_usage: usage count for phy * @lock: lock for phy operations */ struct samsung_usbphy { @@ -109,13 +226,27 @@ struct samsung_usbphy { struct clk *clk; void __iomem *regs; void __iomem *pmuregs; + void __iomem *sysreg; int ref_clk_freq; const struct samsung_usbphy_drvdata *drv_data; + enum samsung_usb_phy_type phy_type; + atomic_t phy_usage; spinlock_t lock; }; #define phy_to_sphy(x) container_of((x), struct samsung_usbphy, phy) +int samsung_usbphy_set_host(struct usb_otg *otg, struct usb_bus *host) +{ + if (!otg) + return -ENODEV; + + if (!otg->host) + otg->host = host; + + return 0; +} + static int samsung_usbphy_parse_dt(struct samsung_usbphy *sphy) { struct device_node *usbphy_sys; @@ -127,14 +258,27 @@ static int samsung_usbphy_parse_dt(struct samsung_usbphy *sphy) sphy->pmuregs = of_iomap(usbphy_sys, 0); - of_node_put(usbphy_sys); - if (sphy->pmuregs == NULL) { dev_err(sphy->dev, "Can't get usb-phy pmu control register\n"); - return -ENODEV; + goto err0; } + sphy->sysreg = of_iomap(usbphy_sys, 1); + + /* + * Not returning error code here, since this situation is not fatal. + * Few SoCs may not have this switch available + */ + if (sphy->sysreg == NULL) + dev_warn(sphy->dev, "Can't get usb-phy sysreg cfg register\n"); + + of_node_put(usbphy_sys); + return 0; + +err0: + of_node_put(usbphy_sys); + return -ENXIO; } /* @@ -144,17 +288,42 @@ static int samsung_usbphy_parse_dt(struct samsung_usbphy *sphy) */ static void samsung_usbphy_set_isolation(struct samsung_usbphy *sphy, bool on) { - void __iomem *reg; + void __iomem *reg = NULL; u32 reg_val; - u32 en_mask; + u32 en_mask = 0; if (!sphy->pmuregs) { dev_warn(sphy->dev, "Can't set pmu isolation\n"); return; } - reg = sphy->pmuregs + sphy->drv_data->devphy_reg_offset; - en_mask = sphy->drv_data->devphy_en_mask; + switch (sphy->drv_data->cpu_type) { + case TYPE_S3C64XX: + /* + * Do nothing: We will add here once S3C64xx goes for DT support + */ + break; + case TYPE_EXYNOS4210: + /* + * Fall through since exynos4210 and exynos5250 have similar + * register architecture: two separate registers for host and + * device phy control with enable bit at position 0. + */ + case TYPE_EXYNOS5250: + if (sphy->phy_type == USB_PHY_TYPE_DEVICE) { + reg = sphy->pmuregs + + sphy->drv_data->devphy_reg_offset; + en_mask = sphy->drv_data->devphy_en_mask; + } else if (sphy->phy_type == USB_PHY_TYPE_HOST) { + reg = sphy->pmuregs + + sphy->drv_data->hostphy_reg_offset; + en_mask = sphy->drv_data->hostphy_en_mask; + } + break; + default: + dev_err(sphy->dev, "Invalid SoC type\n"); + return; + } reg_val = readl(reg); @@ -167,6 +336,43 @@ static void samsung_usbphy_set_isolation(struct samsung_usbphy *sphy, bool on) } /* + * Configure the mode of working of usb-phy here: HOST/DEVICE. + */ +static void samsung_usbphy_cfg_sel(struct samsung_usbphy *sphy) +{ + u32 reg; + + if (!sphy->sysreg) { + dev_warn(sphy->dev, "Can't configure specified phy mode\n"); + return; + } + + reg = readl(sphy->sysreg); + + if (sphy->phy_type == USB_PHY_TYPE_DEVICE) + reg &= ~EXYNOS_USB20PHY_CFG_HOST_LINK; + else if (sphy->phy_type == USB_PHY_TYPE_HOST) + reg |= EXYNOS_USB20PHY_CFG_HOST_LINK; + + writel(reg, sphy->sysreg); +} + +/* + * PHYs are different for USB Device and USB Host. + * This make sure that correct PHY type is selected before + * any operation on PHY. + */ +static int samsung_usbphy_set_type(struct usb_phy *phy, + enum samsung_usb_phy_type phy_type) +{ + struct samsung_usbphy *sphy = phy_to_sphy(phy); + + sphy->phy_type = phy_type; + + return 0; +} + +/* * Returns reference clock frequency selection value */ static int samsung_usbphy_get_refclk_freq(struct samsung_usbphy *sphy) @@ -174,34 +380,185 @@ static int samsung_usbphy_get_refclk_freq(struct samsung_usbphy *sphy) struct clk *ref_clk; int refclk_freq = 0; - ref_clk = clk_get(sphy->dev, "xusbxti"); + /* + * In exynos5250 USB host and device PHY use + * external crystal clock XXTI + */ + if (sphy->drv_data->cpu_type == TYPE_EXYNOS5250) + ref_clk = clk_get(sphy->dev, "ext_xtal"); + else + ref_clk = clk_get(sphy->dev, "xusbxti"); if (IS_ERR(ref_clk)) { dev_err(sphy->dev, "Failed to get reference clock\n"); return PTR_ERR(ref_clk); } - switch (clk_get_rate(ref_clk)) { - case 12 * MHZ: - refclk_freq = PHYCLK_CLKSEL_12M; - break; - case 24 * MHZ: - refclk_freq = PHYCLK_CLKSEL_24M; - break; - case 48 * MHZ: - refclk_freq = PHYCLK_CLKSEL_48M; - break; - default: - if (sphy->drv_data->cpu_type == TYPE_S3C64XX) - refclk_freq = PHYCLK_CLKSEL_48M; - else + if (sphy->drv_data->cpu_type == TYPE_EXYNOS5250) { + /* set clock frequency for PLL */ + switch (clk_get_rate(ref_clk)) { + case 9600 * KHZ: + refclk_freq = FSEL_CLKSEL_9600K; + break; + case 10 * MHZ: + refclk_freq = FSEL_CLKSEL_10M; + break; + case 12 * MHZ: + refclk_freq = FSEL_CLKSEL_12M; + break; + case 19200 * KHZ: + refclk_freq = FSEL_CLKSEL_19200K; + break; + case 20 * MHZ: + refclk_freq = FSEL_CLKSEL_20M; + break; + case 50 * MHZ: + refclk_freq = FSEL_CLKSEL_50M; + break; + case 24 * MHZ: + default: + /* default reference clock */ + refclk_freq = FSEL_CLKSEL_24M; + break; + } + } else { + switch (clk_get_rate(ref_clk)) { + case 12 * MHZ: + refclk_freq = PHYCLK_CLKSEL_12M; + break; + case 24 * MHZ: refclk_freq = PHYCLK_CLKSEL_24M; - break; + break; + case 48 * MHZ: + refclk_freq = PHYCLK_CLKSEL_48M; + break; + default: + if (sphy->drv_data->cpu_type == TYPE_S3C64XX) + refclk_freq = PHYCLK_CLKSEL_48M; + else + refclk_freq = PHYCLK_CLKSEL_24M; + break; + } } clk_put(ref_clk); return refclk_freq; } +static bool exynos5_phyhost_is_on(void *regs) +{ + u32 reg; + + reg = readl(regs + EXYNOS5_PHY_HOST_CTRL0); + + return !(reg & HOST_CTRL0_SIDDQ); +} + +static void samsung_exynos5_usbphy_enable(struct samsung_usbphy *sphy) +{ + void __iomem *regs = sphy->regs; + u32 phyclk = sphy->ref_clk_freq; + u32 phyhost; + u32 phyotg; + u32 phyhsic; + u32 ehcictrl; + u32 ohcictrl; + + /* + * phy_usage helps in keeping usage count for phy + * so that the first consumer enabling the phy is also + * the last consumer to disable it. + */ + + atomic_inc(&sphy->phy_usage); + + if (exynos5_phyhost_is_on(regs)) { + dev_info(sphy->dev, "Already power on PHY\n"); + return; + } + + /* Host configuration */ + phyhost = readl(regs + EXYNOS5_PHY_HOST_CTRL0); + + /* phy reference clock configuration */ + phyhost &= ~HOST_CTRL0_FSEL_MASK; + phyhost |= HOST_CTRL0_FSEL(phyclk); + + /* host phy reset */ + phyhost &= ~(HOST_CTRL0_PHYSWRST | + HOST_CTRL0_PHYSWRSTALL | + HOST_CTRL0_SIDDQ | + /* Enable normal mode of operation */ + HOST_CTRL0_FORCESUSPEND | + HOST_CTRL0_FORCESLEEP); + + /* Link reset */ + phyhost |= (HOST_CTRL0_LINKSWRST | + HOST_CTRL0_UTMISWRST | + /* COMMON Block configuration during suspend */ + HOST_CTRL0_COMMONON_N); + writel(phyhost, regs + EXYNOS5_PHY_HOST_CTRL0); + udelay(10); + phyhost &= ~(HOST_CTRL0_LINKSWRST | + HOST_CTRL0_UTMISWRST); + writel(phyhost, regs + EXYNOS5_PHY_HOST_CTRL0); + + /* OTG configuration */ + phyotg = readl(regs + EXYNOS5_PHY_OTG_SYS); + + /* phy reference clock configuration */ + phyotg &= ~OTG_SYS_FSEL_MASK; + phyotg |= OTG_SYS_FSEL(phyclk); + + /* Enable normal mode of operation */ + phyotg &= ~(OTG_SYS_FORCESUSPEND | + OTG_SYS_SIDDQ_UOTG | + OTG_SYS_FORCESLEEP | + OTG_SYS_REFCLKSEL_MASK | + /* COMMON Block configuration during suspend */ + OTG_SYS_COMMON_ON); + + /* OTG phy & link reset */ + phyotg |= (OTG_SYS_PHY0_SWRST | + OTG_SYS_LINKSWRST_UOTG | + OTG_SYS_PHYLINK_SWRESET | + OTG_SYS_OTGDISABLE | + /* Set phy refclk */ + OTG_SYS_REFCLKSEL_CLKCORE); + + writel(phyotg, regs + EXYNOS5_PHY_OTG_SYS); + udelay(10); + phyotg &= ~(OTG_SYS_PHY0_SWRST | + OTG_SYS_LINKSWRST_UOTG | + OTG_SYS_PHYLINK_SWRESET); + writel(phyotg, regs + EXYNOS5_PHY_OTG_SYS); + + /* HSIC phy configuration */ + phyhsic = (HSIC_CTRL_REFCLKDIV_12 | + HSIC_CTRL_REFCLKSEL | + HSIC_CTRL_PHYSWRST); + writel(phyhsic, regs + EXYNOS5_PHY_HSIC_CTRL1); + writel(phyhsic, regs + EXYNOS5_PHY_HSIC_CTRL2); + udelay(10); + phyhsic &= ~HSIC_CTRL_PHYSWRST; + writel(phyhsic, regs + EXYNOS5_PHY_HSIC_CTRL1); + writel(phyhsic, regs + EXYNOS5_PHY_HSIC_CTRL2); + + udelay(80); + + /* enable EHCI DMA burst */ + ehcictrl = readl(regs + EXYNOS5_PHY_HOST_EHCICTRL); + ehcictrl |= (HOST_EHCICTRL_ENAINCRXALIGN | + HOST_EHCICTRL_ENAINCR4 | + HOST_EHCICTRL_ENAINCR8 | + HOST_EHCICTRL_ENAINCR16); + writel(ehcictrl, regs + EXYNOS5_PHY_HOST_EHCICTRL); + + /* set ohci_suspend_on_n */ + ohcictrl = readl(regs + EXYNOS5_PHY_HOST_OHCICTRL); + ohcictrl |= HOST_OHCICTRL_SUSPLGCY; + writel(ohcictrl, regs + EXYNOS5_PHY_HOST_OHCICTRL); +} + static void samsung_usbphy_enable(struct samsung_usbphy *sphy) { void __iomem *regs = sphy->regs; @@ -237,6 +594,41 @@ static void samsung_usbphy_enable(struct samsung_usbphy *sphy) writel(rstcon, regs + SAMSUNG_RSTCON); } +static void samsung_exynos5_usbphy_disable(struct samsung_usbphy *sphy) +{ + void __iomem *regs = sphy->regs; + u32 phyhost; + u32 phyotg; + u32 phyhsic; + + if (atomic_dec_return(&sphy->phy_usage) > 0) { + dev_info(sphy->dev, "still being used\n"); + return; + } + + phyhsic = (HSIC_CTRL_REFCLKDIV_12 | + HSIC_CTRL_REFCLKSEL | + HSIC_CTRL_SIDDQ | + HSIC_CTRL_FORCESLEEP | + HSIC_CTRL_FORCESUSPEND); + writel(phyhsic, regs + EXYNOS5_PHY_HSIC_CTRL1); + writel(phyhsic, regs + EXYNOS5_PHY_HSIC_CTRL2); + + phyhost = readl(regs + EXYNOS5_PHY_HOST_CTRL0); + phyhost |= (HOST_CTRL0_SIDDQ | + HOST_CTRL0_FORCESUSPEND | + HOST_CTRL0_FORCESLEEP | + HOST_CTRL0_PHYSWRST | + HOST_CTRL0_PHYSWRSTALL); + writel(phyhost, regs + EXYNOS5_PHY_HOST_CTRL0); + + phyotg = readl(regs + EXYNOS5_PHY_OTG_SYS); + phyotg |= (OTG_SYS_FORCESUSPEND | + OTG_SYS_SIDDQ_UOTG | + OTG_SYS_FORCESLEEP); + writel(phyotg, regs + EXYNOS5_PHY_OTG_SYS); +} + static void samsung_usbphy_disable(struct samsung_usbphy *sphy) { void __iomem *regs = sphy->regs; @@ -264,11 +656,14 @@ static void samsung_usbphy_disable(struct samsung_usbphy *sphy) static int samsung_usbphy_init(struct usb_phy *phy) { struct samsung_usbphy *sphy; + struct usb_bus *host = NULL; unsigned long flags; int ret = 0; sphy = phy_to_sphy(phy); + host = phy->otg->host; + /* Enable the phy clock */ ret = clk_prepare_enable(sphy->clk); if (ret) { @@ -278,19 +673,35 @@ static int samsung_usbphy_init(struct usb_phy *phy) spin_lock_irqsave(&sphy->lock, flags); + if (host) { + /* setting default phy-type for USB 2.0 */ + if (!strstr(dev_name(host->controller), "ehci") || + !strstr(dev_name(host->controller), "ohci")) + samsung_usbphy_set_type(&sphy->phy, USB_PHY_TYPE_HOST); + } else { + samsung_usbphy_set_type(&sphy->phy, USB_PHY_TYPE_DEVICE); + } + /* Disable phy isolation */ if (sphy->plat && sphy->plat->pmu_isolation) sphy->plat->pmu_isolation(false); else samsung_usbphy_set_isolation(sphy, false); + /* Selecting Host/OTG mode; After reset USB2.0PHY_CFG: HOST */ + samsung_usbphy_cfg_sel(sphy); + /* Initialize usb phy registers */ - samsung_usbphy_enable(sphy); + if (sphy->drv_data->cpu_type == TYPE_EXYNOS5250) + samsung_exynos5_usbphy_enable(sphy); + else + samsung_usbphy_enable(sphy); spin_unlock_irqrestore(&sphy->lock, flags); /* Disable the phy clock */ clk_disable_unprepare(sphy->clk); + return ret; } @@ -300,10 +711,13 @@ static int samsung_usbphy_init(struct usb_phy *phy) static void samsung_usbphy_shutdown(struct usb_phy *phy) { struct samsung_usbphy *sphy; + struct usb_bus *host = NULL; unsigned long flags; sphy = phy_to_sphy(phy); + host = phy->otg->host; + if (clk_prepare_enable(sphy->clk)) { dev_err(sphy->dev, "%s: clk_prepare_enable failed\n", __func__); return; @@ -311,8 +725,20 @@ static void samsung_usbphy_shutdown(struct usb_phy *phy) spin_lock_irqsave(&sphy->lock, flags); + if (host) { + /* setting default phy-type for USB 2.0 */ + if (!strstr(dev_name(host->controller), "ehci") || + !strstr(dev_name(host->controller), "ohci")) + samsung_usbphy_set_type(&sphy->phy, USB_PHY_TYPE_HOST); + } else { + samsung_usbphy_set_type(&sphy->phy, USB_PHY_TYPE_DEVICE); + } + /* De-initialize usb phy registers */ - samsung_usbphy_disable(sphy); + if (sphy->drv_data->cpu_type == TYPE_EXYNOS5250) + samsung_exynos5_usbphy_disable(sphy); + else + samsung_usbphy_disable(sphy); /* Enable phy isolation */ if (sphy->plat && sphy->plat->pmu_isolation) @@ -344,7 +770,9 @@ static inline const struct samsung_usbphy_drvdata static int __devinit samsung_usbphy_probe(struct platform_device *pdev) { struct samsung_usbphy *sphy; + struct usb_otg *otg; struct samsung_usbphy_data *pdata = pdev->dev.platform_data; + const struct samsung_usbphy_drvdata *drv_data; struct device *dev = &pdev->dev; struct resource *phy_mem; void __iomem *phy_base; @@ -367,7 +795,17 @@ static int __devinit samsung_usbphy_probe(struct platform_device *pdev) if (!sphy) return -ENOMEM; - clk = devm_clk_get(dev, "otg"); + otg = devm_kzalloc(dev, sizeof(*otg), GFP_KERNEL); + if (!otg) + return -ENOMEM; + + drv_data = samsung_usbphy_get_driver_data(pdev); + + if (drv_data->cpu_type == TYPE_EXYNOS5250) + clk = devm_clk_get(dev, "usbhost"); + else + clk = devm_clk_get(dev, "otg"); + if (IS_ERR(clk)) { dev_err(dev, "Failed to get otg clock\n"); return PTR_ERR(clk); @@ -389,13 +827,17 @@ static int __devinit samsung_usbphy_probe(struct platform_device *pdev) sphy->plat = pdata; sphy->regs = phy_base; sphy->clk = clk; + sphy->drv_data = drv_data; sphy->phy.dev = sphy->dev; sphy->phy.label = "samsung-usbphy"; sphy->phy.init = samsung_usbphy_init; sphy->phy.shutdown = samsung_usbphy_shutdown; - sphy->drv_data = samsung_usbphy_get_driver_data(pdev); sphy->ref_clk_freq = samsung_usbphy_get_refclk_freq(sphy); + sphy->phy.otg = otg; + sphy->phy.otg->phy = &sphy->phy; + sphy->phy.otg->set_host = samsung_usbphy_set_host; + spin_lock_init(&sphy->lock); platform_set_drvdata(pdev, sphy); @@ -411,6 +853,8 @@ static int __exit samsung_usbphy_remove(struct platform_device *pdev) if (sphy->pmuregs) iounmap(sphy->pmuregs); + if (sphy->sysreg) + iounmap(sphy->sysreg); return 0; } @@ -423,6 +867,13 @@ static const struct samsung_usbphy_drvdata usbphy_s3c64xx = { static const struct samsung_usbphy_drvdata usbphy_exynos4 = { .cpu_type = TYPE_EXYNOS4210, .devphy_en_mask = EXYNOS_USBPHY_ENABLE, + .hostphy_en_mask = EXYNOS_USBPHY_ENABLE, +}; + +static struct samsung_usbphy_drvdata usbphy_exynos5 = { + .cpu_type = TYPE_EXYNOS5250, + .hostphy_en_mask = EXYNOS_USBPHY_ENABLE, + .hostphy_reg_offset = EXYNOS_USBHOST_PHY_CTRL_OFFSET, }; #ifdef CONFIG_OF @@ -433,6 +884,9 @@ static const struct of_device_id samsung_usbphy_dt_match[] = { }, { .compatible = "samsung,exynos4210-usbphy", .data = &usbphy_exynos4, + }, { + .compatible = "samsung,exynos5250-usbphy", + .data = &usbphy_exynos5 }, {}, }; @@ -446,6 +900,9 @@ static struct platform_device_id samsung_usbphy_driver_ids[] = { }, { .name = "exynos4210-usbphy", .driver_data = (unsigned long)&usbphy_exynos4, + }, { + .name = "exynos5250-usbphy", + .driver_data = (unsigned long)&usbphy_exynos5, }, {}, }; -- 1.7.6.5 ^ permalink raw reply related [flat|nested] 23+ messages in thread
[parent not found: <1358166135-22073-1-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>]
* Re: [PATCH v7 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver [not found] ` <1358166135-22073-1-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2013-01-18 13:16 ` Felipe Balbi 2013-01-18 14:21 ` Vivek Gautam 0 siblings, 1 reply; 23+ messages in thread From: Felipe Balbi @ 2013-01-18 13:16 UTC (permalink / raw) To: Vivek Gautam Cc: jg1.han-Sze3O3UU22JBDgjK7y7TUQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, p.paneri-Sze3O3UU22JBDgjK7y7TUQ, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-usb-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0, kgene.kim-Sze3O3UU22JBDgjK7y7TUQ, rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, sylvester.nawrocki-Re5JQEeQqe8AvxtiuMwx3w [-- Attachment #1.1: Type: text/plain, Size: 415 bytes --] Hi, On Mon, Jan 14, 2013 at 05:52:15PM +0530, Vivek Gautam wrote: > This patch adds host phy support to samsung-usbphy driver and > further adds support for samsung's exynos5250 usb-phy. > > Signed-off-by: Praveen Paneri <p.paneri-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > Signed-off-by: Vivek Gautam <gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> Missing Kukjim's Acked-by here -- balbi [-- Attachment #1.2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] [-- Attachment #2: Type: text/plain, Size: 192 bytes --] _______________________________________________ devicetree-discuss mailing list devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org https://lists.ozlabs.org/listinfo/devicetree-discuss ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v7 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver 2013-01-18 13:16 ` Felipe Balbi @ 2013-01-18 14:21 ` Vivek Gautam [not found] ` <CAFp+6iF9H+n1Fwr89es-jtDAN=ht1PuXQER9vQ=jG2RZQTceWw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Vivek Gautam @ 2013-01-18 14:21 UTC (permalink / raw) To: balbi Cc: Vivek Gautam, jg1.han, linux-samsung-soc, p.paneri, gregkh, devicetree-discuss, linux-usb, linux-kernel, kgene.kim, rob.herring, sylvester.nawrocki Hi Felipe, On Fri, Jan 18, 2013 at 6:46 PM, Felipe Balbi <balbi@ti.com> wrote: > Hi, > > On Mon, Jan 14, 2013 at 05:52:15PM +0530, Vivek Gautam wrote: >> This patch adds host phy support to samsung-usbphy driver and >> further adds support for samsung's exynos5250 usb-phy. >> >> Signed-off-by: Praveen Paneri <p.paneri@samsung.com> >> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com> > > Missing Kukjim's Acked-by here > Hope you are fine with the changes happened after discussion in thread: [PATCH v5 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver Is it something you want me to modify in this patch ? -- Thanks & Regards Vivek ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <CAFp+6iF9H+n1Fwr89es-jtDAN=ht1PuXQER9vQ=jG2RZQTceWw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v7 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver [not found] ` <CAFp+6iF9H+n1Fwr89es-jtDAN=ht1PuXQER9vQ=jG2RZQTceWw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2013-01-18 14:22 ` Felipe Balbi 2013-01-18 14:29 ` Vivek Gautam 0 siblings, 1 reply; 23+ messages in thread From: Felipe Balbi @ 2013-01-18 14:22 UTC (permalink / raw) To: Vivek Gautam Cc: balbi-l0cyMroinI0, Vivek Gautam, jg1.han-Sze3O3UU22JBDgjK7y7TUQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, p.paneri-Sze3O3UU22JBDgjK7y7TUQ, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-usb-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, kgene.kim-Sze3O3UU22JBDgjK7y7TUQ, rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, sylvester.nawrocki-Re5JQEeQqe8AvxtiuMwx3w [-- Attachment #1: Type: text/plain, Size: 1039 bytes --] On Fri, Jan 18, 2013 at 07:51:08PM +0530, Vivek Gautam wrote: > Hi Felipe, > > > On Fri, Jan 18, 2013 at 6:46 PM, Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org> wrote: > > Hi, > > > > On Mon, Jan 14, 2013 at 05:52:15PM +0530, Vivek Gautam wrote: > >> This patch adds host phy support to samsung-usbphy driver and > >> further adds support for samsung's exynos5250 usb-phy. > >> > >> Signed-off-by: Praveen Paneri <p.paneri-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > >> Signed-off-by: Vivek Gautam <gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > > > > Missing Kukjim's Acked-by here > > > > Hope you are fine with the changes happened after discussion in thread: > [PATCH v5 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver > > Is it something you want me to modify in this patch ? please send the final patch and we shall see. After quickly browsing that thread, I didn't see anything scary, but I'd like to see your final version before giving my final answer ;-) -- balbi [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v7 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver 2013-01-18 14:22 ` Felipe Balbi @ 2013-01-18 14:29 ` Vivek Gautam [not found] ` <CAFp+6iE5gU5QrheYyHLV2yfO=d3j3fVA7qq8CQ4KLysjXFRh3w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 23+ messages in thread From: Vivek Gautam @ 2013-01-18 14:29 UTC (permalink / raw) To: balbi Cc: Vivek Gautam, jg1.han, linux-samsung-soc, p.paneri, gregkh, devicetree-discuss, linux-usb, linux-kernel, kgene.kim, rob.herring, sylvester.nawrocki HI Balbi, On Fri, Jan 18, 2013 at 7:52 PM, Felipe Balbi <balbi@ti.com> wrote: > On Fri, Jan 18, 2013 at 07:51:08PM +0530, Vivek Gautam wrote: >> Hi Felipe, >> >> >> On Fri, Jan 18, 2013 at 6:46 PM, Felipe Balbi <balbi@ti.com> wrote: >> > Hi, >> > >> > On Mon, Jan 14, 2013 at 05:52:15PM +0530, Vivek Gautam wrote: >> >> This patch adds host phy support to samsung-usbphy driver and >> >> further adds support for samsung's exynos5250 usb-phy. >> >> >> >> Signed-off-by: Praveen Paneri <p.paneri@samsung.com> >> >> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com> >> > >> > Missing Kukjim's Acked-by here >> > >> >> Hope you are fine with the changes happened after discussion in thread: >> [PATCH v5 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver >> >> Is it something you want me to modify in this patch ? > > please send the final patch and we shall see. After quickly browsing > that thread, I didn't see anything scary, but I'd like to see your final > version before giving my final answer ;-) > this series of patch is the final version from my side unless Doug or you have any further comments on the thread : https://lkml.org/lkml/2013/1/14/481 Seems like Doug wanted to know your opinion in this regard. ;-) -- Thanks & Regards Vivek ^ permalink raw reply [flat|nested] 23+ messages in thread
[parent not found: <CAFp+6iE5gU5QrheYyHLV2yfO=d3j3fVA7qq8CQ4KLysjXFRh3w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v7 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver [not found] ` <CAFp+6iE5gU5QrheYyHLV2yfO=d3j3fVA7qq8CQ4KLysjXFRh3w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2013-01-18 15:07 ` Felipe Balbi 2013-01-21 10:03 ` Vivek Gautam 0 siblings, 1 reply; 23+ messages in thread From: Felipe Balbi @ 2013-01-18 15:07 UTC (permalink / raw) To: Vivek Gautam Cc: linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, p.paneri-Sze3O3UU22JBDgjK7y7TUQ, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, jg1.han-Sze3O3UU22JBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0, linux-usb-u79uwXL29TY76Z2rM5mHXA, Vivek Gautam, kgene.kim-Sze3O3UU22JBDgjK7y7TUQ, sylvester.nawrocki-Re5JQEeQqe8AvxtiuMwx3w, rob.herring-bsGFqQB8/DxBDgjK7y7TUQ [-- Attachment #1.1: Type: text/plain, Size: 1573 bytes --] On Fri, Jan 18, 2013 at 07:59:52PM +0530, Vivek Gautam wrote: > HI Balbi, > > > On Fri, Jan 18, 2013 at 7:52 PM, Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org> wrote: > > On Fri, Jan 18, 2013 at 07:51:08PM +0530, Vivek Gautam wrote: > >> Hi Felipe, > >> > >> > >> On Fri, Jan 18, 2013 at 6:46 PM, Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org> wrote: > >> > Hi, > >> > > >> > On Mon, Jan 14, 2013 at 05:52:15PM +0530, Vivek Gautam wrote: > >> >> This patch adds host phy support to samsung-usbphy driver and > >> >> further adds support for samsung's exynos5250 usb-phy. > >> >> > >> >> Signed-off-by: Praveen Paneri <p.paneri-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > >> >> Signed-off-by: Vivek Gautam <gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > >> > > >> > Missing Kukjim's Acked-by here > >> > > >> > >> Hope you are fine with the changes happened after discussion in thread: > >> [PATCH v5 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver > >> > >> Is it something you want me to modify in this patch ? > > > > please send the final patch and we shall see. After quickly browsing > > that thread, I didn't see anything scary, but I'd like to see your final > > version before giving my final answer ;-) > > > > this series of patch is the final version from my side unless Doug or > you have any further comments > on the thread : > https://lkml.org/lkml/2013/1/14/481 > > Seems like Doug wanted to know your opinion in this regard. ;-) only Kukjim's Acked-by missing ;-) -- balbi [-- Attachment #1.2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] [-- Attachment #2: Type: text/plain, Size: 192 bytes --] _______________________________________________ devicetree-discuss mailing list devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org https://lists.ozlabs.org/listinfo/devicetree-discuss ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v7 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver 2013-01-18 15:07 ` Felipe Balbi @ 2013-01-21 10:03 ` Vivek Gautam 0 siblings, 0 replies; 23+ messages in thread From: Vivek Gautam @ 2013-01-21 10:03 UTC (permalink / raw) To: kgene.kim Cc: balbi, Vivek Gautam, jg1.han, linux-samsung-soc, p.paneri, gregkh, devicetree-discuss, linux-usb, linux-kernel, rob.herring, sylvester.nawrocki, Doug Anderson, Tomasz Figa Hi Kukjin, On Fri, Jan 18, 2013 at 8:37 PM, Felipe Balbi <balbi@ti.com> wrote: > On Fri, Jan 18, 2013 at 07:59:52PM +0530, Vivek Gautam wrote: >> HI Balbi, >> >> >> On Fri, Jan 18, 2013 at 7:52 PM, Felipe Balbi <balbi@ti.com> wrote: >> > On Fri, Jan 18, 2013 at 07:51:08PM +0530, Vivek Gautam wrote: >> >> Hi Felipe, >> >> >> >> >> >> On Fri, Jan 18, 2013 at 6:46 PM, Felipe Balbi <balbi@ti.com> wrote: >> >> > Hi, >> >> > >> >> > On Mon, Jan 14, 2013 at 05:52:15PM +0530, Vivek Gautam wrote: >> >> >> This patch adds host phy support to samsung-usbphy driver and >> >> >> further adds support for samsung's exynos5250 usb-phy. >> >> >> >> >> >> Signed-off-by: Praveen Paneri <p.paneri@samsung.com> >> >> >> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com> >> >> > >> >> > Missing Kukjim's Acked-by here >> >> > >> >> >> >> Hope you are fine with the changes happened after discussion in thread: >> >> [PATCH v5 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver >> >> >> >> Is it something you want me to modify in this patch ? >> > >> > please send the final patch and we shall see. After quickly browsing >> > that thread, I didn't see anything scary, but I'd like to see your final >> > version before giving my final answer ;-) >> > >> >> this series of patch is the final version from my side unless Doug or >> you have any further comments >> on the thread : >> https://lkml.org/lkml/2013/1/14/481 >> >> Seems like Doug wanted to know your opinion in this regard. ;-) > > only Kukjim's Acked-by missing ;-) > Any comments on this patch-series please ? -- Thanks & Regards Vivek ^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v6 3/4] USB: ehci-s5p: Add phy driver support 2013-01-11 15:02 [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250 Vivek Gautam [not found] ` <1357916550-11421-1-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2013-01-11 15:02 ` [PATCH v6 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver Vivek Gautam @ 2013-01-11 15:02 ` Vivek Gautam [not found] ` <1357916550-11421-4-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> 2013-01-18 15:37 ` Alan Stern 2 siblings, 2 replies; 23+ messages in thread From: Vivek Gautam @ 2013-01-11 15:02 UTC (permalink / raw) To: linux-usb Cc: devicetree-discuss, linux-kernel, linux-samsung-soc, gregkh, balbi, kgene.kim, thomas.abraham, rob.herring, grant.likely, sylvester.nawrocki, dianders, jg1.han, p.paneri Adding the phy driver to ehci-s5p. Keeping the platform data for continuing the smooth operation for boards which still uses it Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com> Acked-by: Jingoo Han <jg1.han@samsung.com> --- drivers/usb/host/ehci-s5p.c | 80 +++++++++++++++++++++++++++++++----------- 1 files changed, 59 insertions(+), 21 deletions(-) diff --git a/drivers/usb/host/ehci-s5p.c b/drivers/usb/host/ehci-s5p.c index 46ca5ef..d603e6e 100644 --- a/drivers/usb/host/ehci-s5p.c +++ b/drivers/usb/host/ehci-s5p.c @@ -17,6 +17,7 @@ #include <linux/platform_device.h> #include <linux/of_gpio.h> #include <linux/platform_data/usb-ehci-s5p.h> +#include <linux/usb/phy.h> #include <linux/usb/samsung_usb_phy.h> #include <plat/usb-phy.h> @@ -33,6 +34,9 @@ struct s5p_ehci_hcd { struct device *dev; struct usb_hcd *hcd; struct clk *clk; + struct usb_phy *phy; + struct usb_otg *otg; + struct s5p_ehci_platdata *pdata; }; static const struct hc_driver s5p_ehci_hc_driver = { @@ -66,6 +70,26 @@ static const struct hc_driver s5p_ehci_hc_driver = { .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, }; +static void s5p_ehci_phy_enable(struct s5p_ehci_hcd *s5p_ehci) +{ + struct platform_device *pdev = to_platform_device(s5p_ehci->dev); + + if (s5p_ehci->phy) + usb_phy_init(s5p_ehci->phy); + else if (s5p_ehci->pdata->phy_init) + s5p_ehci->pdata->phy_init(pdev, USB_PHY_TYPE_HOST); +} + +static void s5p_ehci_phy_disable(struct s5p_ehci_hcd *s5p_ehci) +{ + struct platform_device *pdev = to_platform_device(s5p_ehci->dev); + + if (s5p_ehci->phy) + usb_phy_shutdown(s5p_ehci->phy); + else if (s5p_ehci->pdata->phy_exit) + s5p_ehci->pdata->phy_exit(pdev, USB_PHY_TYPE_HOST); +} + static void s5p_setup_vbus_gpio(struct platform_device *pdev) { int err; @@ -88,20 +112,15 @@ static u64 ehci_s5p_dma_mask = DMA_BIT_MASK(32); static int s5p_ehci_probe(struct platform_device *pdev) { - struct s5p_ehci_platdata *pdata; + struct s5p_ehci_platdata *pdata = pdev->dev.platform_data; struct s5p_ehci_hcd *s5p_ehci; struct usb_hcd *hcd; struct ehci_hcd *ehci; struct resource *res; + struct usb_phy *phy; int irq; int err; - pdata = pdev->dev.platform_data; - if (!pdata) { - dev_err(&pdev->dev, "No platform data defined\n"); - return -EINVAL; - } - /* * Right now device-tree probed devices don't get dma_mask set. * Since shared usb code relies on it, set it here for now. @@ -119,6 +138,20 @@ static int s5p_ehci_probe(struct platform_device *pdev) if (!s5p_ehci) return -ENOMEM; + phy = devm_usb_get_phy(&pdev->dev, USB_PHY_TYPE_USB2); + if (IS_ERR_OR_NULL(phy)) { + /* Fallback to pdata */ + if (!pdata) { + dev_warn(&pdev->dev, "no platform data or transceiver defined\n"); + return -EPROBE_DEFER; + } else { + s5p_ehci->pdata = pdata; + } + } else { + s5p_ehci->phy = phy; + s5p_ehci->otg = phy->otg; + } + s5p_ehci->dev = &pdev->dev; hcd = usb_create_hcd(&s5p_ehci_hc_driver, &pdev->dev, @@ -164,8 +197,10 @@ static int s5p_ehci_probe(struct platform_device *pdev) goto fail_io; } - if (pdata->phy_init) - pdata->phy_init(pdev, USB_PHY_TYPE_HOST); + if (s5p_ehci->otg) + s5p_ehci->otg->set_host(s5p_ehci->otg, &s5p_ehci->hcd->self); + + s5p_ehci_phy_enable(s5p_ehci); ehci = hcd_to_ehci(hcd); ehci->caps = hcd->regs; @@ -176,13 +211,15 @@ static int s5p_ehci_probe(struct platform_device *pdev) err = usb_add_hcd(hcd, irq, IRQF_SHARED); if (err) { dev_err(&pdev->dev, "Failed to add USB HCD\n"); - goto fail_io; + goto fail_add_hcd; } platform_set_drvdata(pdev, s5p_ehci); return 0; +fail_add_hcd: + s5p_ehci_phy_disable(s5p_ehci); fail_io: clk_disable_unprepare(s5p_ehci->clk); fail_clk: @@ -192,14 +229,15 @@ fail_clk: static int s5p_ehci_remove(struct platform_device *pdev) { - struct s5p_ehci_platdata *pdata = pdev->dev.platform_data; struct s5p_ehci_hcd *s5p_ehci = platform_get_drvdata(pdev); struct usb_hcd *hcd = s5p_ehci->hcd; usb_remove_hcd(hcd); - if (pdata && pdata->phy_exit) - pdata->phy_exit(pdev, USB_PHY_TYPE_HOST); + if (s5p_ehci->otg) + s5p_ehci->otg->set_host(s5p_ehci->otg, &s5p_ehci->hcd->self); + + s5p_ehci_phy_disable(s5p_ehci); clk_disable_unprepare(s5p_ehci->clk); @@ -223,14 +261,14 @@ static int s5p_ehci_suspend(struct device *dev) struct s5p_ehci_hcd *s5p_ehci = dev_get_drvdata(dev); struct usb_hcd *hcd = s5p_ehci->hcd; bool do_wakeup = device_may_wakeup(dev); - struct platform_device *pdev = to_platform_device(dev); - struct s5p_ehci_platdata *pdata = pdev->dev.platform_data; int rc; rc = ehci_suspend(hcd, do_wakeup); - if (pdata && pdata->phy_exit) - pdata->phy_exit(pdev, USB_PHY_TYPE_HOST); + if (s5p_ehci->otg) + s5p_ehci->otg->set_host(s5p_ehci->otg, &s5p_ehci->hcd->self); + + s5p_ehci_phy_disable(s5p_ehci); clk_disable_unprepare(s5p_ehci->clk); @@ -241,13 +279,13 @@ static int s5p_ehci_resume(struct device *dev) { struct s5p_ehci_hcd *s5p_ehci = dev_get_drvdata(dev); struct usb_hcd *hcd = s5p_ehci->hcd; - struct platform_device *pdev = to_platform_device(dev); - struct s5p_ehci_platdata *pdata = pdev->dev.platform_data; clk_prepare_enable(s5p_ehci->clk); - if (pdata && pdata->phy_init) - pdata->phy_init(pdev, USB_PHY_TYPE_HOST); + if (s5p_ehci->otg) + s5p_ehci->otg->set_host(s5p_ehci->otg, &s5p_ehci->hcd->self); + + s5p_ehci_phy_enable(s5p_ehci); /* DMA burst Enable */ writel(EHCI_INSNREG00_ENABLE_DMA_BURST, EHCI_INSNREG00(hcd->regs)); -- 1.7.6.5 ^ permalink raw reply related [flat|nested] 23+ messages in thread
[parent not found: <1357916550-11421-4-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>]
* Re: [PATCH v6 3/4] USB: ehci-s5p: Add phy driver support [not found] ` <1357916550-11421-4-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2013-01-18 13:16 ` Felipe Balbi 2013-01-18 14:31 ` Vivek Gautam 0 siblings, 1 reply; 23+ messages in thread From: Felipe Balbi @ 2013-01-18 13:16 UTC (permalink / raw) To: Vivek Gautam Cc: jg1.han-Sze3O3UU22JBDgjK7y7TUQ, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, p.paneri-Sze3O3UU22JBDgjK7y7TUQ, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-usb-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0, kgene.kim-Sze3O3UU22JBDgjK7y7TUQ, rob.herring-bsGFqQB8/DxBDgjK7y7TUQ, sylvester.nawrocki-Re5JQEeQqe8AvxtiuMwx3w [-- Attachment #1.1: Type: text/plain, Size: 408 bytes --] On Fri, Jan 11, 2013 at 08:32:29PM +0530, Vivek Gautam wrote: > Adding the phy driver to ehci-s5p. Keeping the platform data > for continuing the smooth operation for boards which still uses it > > Signed-off-by: Vivek Gautam <gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> > Acked-by: Jingoo Han <jg1.han-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> Missing Alan's Acked-by here. -- balbi [-- Attachment #1.2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] [-- Attachment #2: Type: text/plain, Size: 192 bytes --] _______________________________________________ devicetree-discuss mailing list devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org https://lists.ozlabs.org/listinfo/devicetree-discuss ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v6 3/4] USB: ehci-s5p: Add phy driver support 2013-01-18 13:16 ` Felipe Balbi @ 2013-01-18 14:31 ` Vivek Gautam 2013-01-18 15:39 ` Alan Stern 0 siblings, 1 reply; 23+ messages in thread From: Vivek Gautam @ 2013-01-18 14:31 UTC (permalink / raw) To: balbi, Alan Stern Cc: Vivek Gautam, jg1.han, linux-samsung-soc, p.paneri, gregkh, devicetree-discuss, linux-usb, linux-kernel, kgene.kim, rob.herring, sylvester.nawrocki, Doug Anderson Hi Alan, On Fri, Jan 18, 2013 at 6:46 PM, Felipe Balbi <balbi@ti.com> wrote: > On Fri, Jan 11, 2013 at 08:32:29PM +0530, Vivek Gautam wrote: >> Adding the phy driver to ehci-s5p. Keeping the platform data >> for continuing the smooth operation for boards which still uses it >> >> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com> >> Acked-by: Jingoo Han <jg1.han@samsung.com> > > Missing Alan's Acked-by here. > Any comments on this patch-series ? -- Thanks & Regards Vivek ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v6 3/4] USB: ehci-s5p: Add phy driver support 2013-01-18 14:31 ` Vivek Gautam @ 2013-01-18 15:39 ` Alan Stern 0 siblings, 0 replies; 23+ messages in thread From: Alan Stern @ 2013-01-18 15:39 UTC (permalink / raw) To: Vivek Gautam Cc: balbi, Vivek Gautam, jg1.han, linux-samsung-soc, p.paneri, gregkh, devicetree-discuss, linux-usb, linux-kernel, kgene.kim, rob.herring, sylvester.nawrocki, Doug Anderson On Fri, 18 Jan 2013, Vivek Gautam wrote: > Hi Alan, > > > On Fri, Jan 18, 2013 at 6:46 PM, Felipe Balbi <balbi@ti.com> wrote: > > On Fri, Jan 11, 2013 at 08:32:29PM +0530, Vivek Gautam wrote: > >> Adding the phy driver to ehci-s5p. Keeping the platform data > >> for continuing the smooth operation for boards which still uses it > >> > >> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com> > >> Acked-by: Jingoo Han <jg1.han@samsung.com> > > > > Missing Alan's Acked-by here. > > > > Any comments on this patch-series ? Sorry, this patch and the ohci-exynos one slipped through my net. Acked-by's have been sent. Alan Stern ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v6 3/4] USB: ehci-s5p: Add phy driver support 2013-01-11 15:02 ` [PATCH v6 3/4] USB: ehci-s5p: Add phy driver support Vivek Gautam [not found] ` <1357916550-11421-4-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2013-01-18 15:37 ` Alan Stern 1 sibling, 0 replies; 23+ messages in thread From: Alan Stern @ 2013-01-18 15:37 UTC (permalink / raw) To: Vivek Gautam Cc: linux-usb, devicetree-discuss, linux-kernel, linux-samsung-soc, gregkh, balbi, kgene.kim, thomas.abraham, rob.herring, grant.likely, sylvester.nawrocki, dianders, jg1.han, p.paneri On Fri, 11 Jan 2013, Vivek Gautam wrote: > Adding the phy driver to ehci-s5p. Keeping the platform data > for continuing the smooth operation for boards which still uses it > > Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com> > Acked-by: Jingoo Han <jg1.han@samsung.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> ^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2013-01-22 9:37 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-11 15:02 [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250 Vivek Gautam
[not found] ` <1357916550-11421-1-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2013-01-11 15:02 ` [PATCH v6 1/4] ARM: EXYNOS: Update & move usb-phy types to generic include layer Vivek Gautam
2013-01-11 15:02 ` [PATCH v6 4/4] USB: ohci-exynos: Add phy driver support Vivek Gautam
2013-01-18 15:38 ` Alan Stern
2013-01-22 5:23 ` [PATCH v6 0/4] Adding usb2.0 host-phy support for exynos5250 Kukjin Kim
2013-01-22 8:50 ` Felipe Balbi
2013-01-22 9:15 ` Vivek Gautam
2013-01-22 9:29 ` Felipe Balbi
[not found] ` <20130122092947.GJ16143-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>
2013-01-22 9:32 ` Felipe Balbi
2013-01-22 9:37 ` Vivek Gautam
2013-01-11 15:02 ` [PATCH v6 2/4] usb: phy: samsung: Add host phy support to samsung-phy driver Vivek Gautam
2013-01-14 12:22 ` [PATCH v7 " Vivek Gautam
[not found] ` <1358166135-22073-1-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2013-01-18 13:16 ` Felipe Balbi
2013-01-18 14:21 ` Vivek Gautam
[not found] ` <CAFp+6iF9H+n1Fwr89es-jtDAN=ht1PuXQER9vQ=jG2RZQTceWw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-01-18 14:22 ` Felipe Balbi
2013-01-18 14:29 ` Vivek Gautam
[not found] ` <CAFp+6iE5gU5QrheYyHLV2yfO=d3j3fVA7qq8CQ4KLysjXFRh3w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-01-18 15:07 ` Felipe Balbi
2013-01-21 10:03 ` Vivek Gautam
2013-01-11 15:02 ` [PATCH v6 3/4] USB: ehci-s5p: Add phy driver support Vivek Gautam
[not found] ` <1357916550-11421-4-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2013-01-18 13:16 ` Felipe Balbi
2013-01-18 14:31 ` Vivek Gautam
2013-01-18 15:39 ` Alan Stern
2013-01-18 15:37 ` Alan Stern
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).