Re: [PATCH v5 4/4] USB: ohci-exynos: Add phy driver support

2012-12-18 Thread Vivek Gautam
CC: Doug Anderson.


On Tue, Dec 18, 2012 at 8:13 PM, 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 
> Acked-by: Jingoo Han 
> ---
>  drivers/usb/host/ohci-exynos.c |   70 
> 
>  1 files changed, 49 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/usb/host/ohci-exynos.c b/drivers/usb/host/ohci-exynos.c
> index 804fb62..c92ab7b 100644
> --- a/drivers/usb/host/ohci-exynos.c
> +++ b/drivers/usb/host/ohci-exynos.c
> @@ -15,6 +15,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>
> @@ -22,8 +23,34 @@ struct exynos_ohci_hcd {
> struct device *dev;
> struct usb_hcd *hcd;
> struct clk *clk;
> +   struct usb_phy *phy;
> +   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) {
> +   samsung_usbphy_set_type(exynos_ohci->phy, USB_PHY_TYPE_HOST);
> +   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) {
> +   samsung_usbphy_set_type(exynos_ohci->phy, USB_PHY_TYPE_HOST);
> +   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 +106,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(>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 +130,19 @@ static int exynos_ohci_probe(struct platform_device 
> *pdev)
> if (!exynos_ohci)
> return -ENOMEM;
>
> +   phy = devm_usb_get_phy(>dev, USB_PHY_TYPE_USB2);
> +   if (IS_ERR_OR_NULL(phy)) {
> +   /* Fallback to pdata */
> +   if (!pdata) {
> +   dev_err(>dev, "no platform data or transceiver 
> defined\n");
> +   return -EPROBE_DEFER;
> +   } else {
> +   exynos_ohci->pdata = pdata;
> +   }
> +   } else {
> +   exynos_ohci->phy = phy;
> +   }
> +
> exynos_ohci->dev = >dev;
>
> hcd = usb_create_hcd(_ohci_hc_driver, >dev,
> @@ -153,8 +188,7 @@ static int exynos_ohci_probe(struct platform_device *pdev)
> goto fail_io;
> }
>
> -   if (pdata->phy_init)
> -   pdata->phy_init(pdev, USB_PHY_TYPE_HOST);
> +   exynos_ohci_phy_enable(exynos_ohci);
>
> ohci = hcd_to_ohci(hcd);
> ohci_hcd_init(ohci);
> @@ -162,13 +196,15 @@ static int exynos_ohci_probe(struct platform_device 
> *pdev)
> err = usb_add_hcd(hcd, irq, IRQF_SHARED);
> if (err) {
> dev_err(>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 +214,12 @@ 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);
> +   exynos_ohci_phy_disable(exynos_ohci);
>
> clk_disable_unprepare(exynos_ohci->clk);
>
> @@ -209,8 +243,6 @@ static int exynos_ohci_suspend(struct device *dev)
> 

[PATCH v5 4/4] USB: ohci-exynos: Add phy driver support

2012-12-18 Thread Vivek Gautam
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 
Acked-by: Jingoo Han 
---
 drivers/usb/host/ohci-exynos.c |   70 
 1 files changed, 49 insertions(+), 21 deletions(-)

diff --git a/drivers/usb/host/ohci-exynos.c b/drivers/usb/host/ohci-exynos.c
index 804fb62..c92ab7b 100644
--- a/drivers/usb/host/ohci-exynos.c
+++ b/drivers/usb/host/ohci-exynos.c
@@ -15,6 +15,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 
@@ -22,8 +23,34 @@ struct exynos_ohci_hcd {
struct device *dev;
struct usb_hcd *hcd;
struct clk *clk;
+   struct usb_phy *phy;
+   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) {
+   samsung_usbphy_set_type(exynos_ohci->phy, USB_PHY_TYPE_HOST);
+   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) {
+   samsung_usbphy_set_type(exynos_ohci->phy, USB_PHY_TYPE_HOST);
+   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 +106,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(>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 +130,19 @@ static int exynos_ohci_probe(struct platform_device *pdev)
if (!exynos_ohci)
return -ENOMEM;
 
+   phy = devm_usb_get_phy(>dev, USB_PHY_TYPE_USB2);
+   if (IS_ERR_OR_NULL(phy)) {
+   /* Fallback to pdata */
+   if (!pdata) {
+   dev_err(>dev, "no platform data or transceiver 
defined\n");
+   return -EPROBE_DEFER;
+   } else {
+   exynos_ohci->pdata = pdata;
+   }
+   } else {
+   exynos_ohci->phy = phy;
+   }
+
exynos_ohci->dev = >dev;
 
hcd = usb_create_hcd(_ohci_hc_driver, >dev,
@@ -153,8 +188,7 @@ static int exynos_ohci_probe(struct platform_device *pdev)
goto fail_io;
}
 
-   if (pdata->phy_init)
-   pdata->phy_init(pdev, USB_PHY_TYPE_HOST);
+   exynos_ohci_phy_enable(exynos_ohci);
 
ohci = hcd_to_ohci(hcd);
ohci_hcd_init(ohci);
@@ -162,13 +196,15 @@ static int exynos_ohci_probe(struct platform_device *pdev)
err = usb_add_hcd(hcd, irq, IRQF_SHARED);
if (err) {
dev_err(>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 +214,12 @@ 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);
+   exynos_ohci_phy_disable(exynos_ohci);
 
clk_disable_unprepare(exynos_ohci->clk);
 
@@ -209,8 +243,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;
 

[PATCH v5 4/4] USB: ohci-exynos: Add phy driver support

2012-12-18 Thread Vivek Gautam
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.vi...@samsung.com
Acked-by: Jingoo Han jg1@samsung.com
---
 drivers/usb/host/ohci-exynos.c |   70 
 1 files changed, 49 insertions(+), 21 deletions(-)

diff --git a/drivers/usb/host/ohci-exynos.c b/drivers/usb/host/ohci-exynos.c
index 804fb62..c92ab7b 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,34 @@ struct exynos_ohci_hcd {
struct device *dev;
struct usb_hcd *hcd;
struct clk *clk;
+   struct usb_phy *phy;
+   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) {
+   samsung_usbphy_set_type(exynos_ohci-phy, USB_PHY_TYPE_HOST);
+   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) {
+   samsung_usbphy_set_type(exynos_ohci-phy, USB_PHY_TYPE_HOST);
+   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 +106,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 +130,19 @@ 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_err(pdev-dev, no platform data or transceiver 
defined\n);
+   return -EPROBE_DEFER;
+   } else {
+   exynos_ohci-pdata = pdata;
+   }
+   } else {
+   exynos_ohci-phy = phy;
+   }
+
exynos_ohci-dev = pdev-dev;
 
hcd = usb_create_hcd(exynos_ohci_hc_driver, pdev-dev,
@@ -153,8 +188,7 @@ static int exynos_ohci_probe(struct platform_device *pdev)
goto fail_io;
}
 
-   if (pdata-phy_init)
-   pdata-phy_init(pdev, USB_PHY_TYPE_HOST);
+   exynos_ohci_phy_enable(exynos_ohci);
 
ohci = hcd_to_ohci(hcd);
ohci_hcd_init(ohci);
@@ -162,13 +196,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 +214,12 @@ 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);
+   exynos_ohci_phy_disable(exynos_ohci);
 
clk_disable_unprepare(exynos_ohci-clk);
 
@@ -209,8 +243,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 

Re: [PATCH v5 4/4] USB: ohci-exynos: Add phy driver support

2012-12-18 Thread Vivek Gautam
CC: Doug Anderson.


On Tue, Dec 18, 2012 at 8:13 PM, Vivek Gautam gautam.vi...@samsung.com 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.vi...@samsung.com
 Acked-by: Jingoo Han jg1@samsung.com
 ---
  drivers/usb/host/ohci-exynos.c |   70 
 
  1 files changed, 49 insertions(+), 21 deletions(-)

 diff --git a/drivers/usb/host/ohci-exynos.c b/drivers/usb/host/ohci-exynos.c
 index 804fb62..c92ab7b 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,34 @@ struct exynos_ohci_hcd {
 struct device *dev;
 struct usb_hcd *hcd;
 struct clk *clk;
 +   struct usb_phy *phy;
 +   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) {
 +   samsung_usbphy_set_type(exynos_ohci-phy, USB_PHY_TYPE_HOST);
 +   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) {
 +   samsung_usbphy_set_type(exynos_ohci-phy, USB_PHY_TYPE_HOST);
 +   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 +106,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 +130,19 @@ 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_err(pdev-dev, no platform data or transceiver 
 defined\n);
 +   return -EPROBE_DEFER;
 +   } else {
 +   exynos_ohci-pdata = pdata;
 +   }
 +   } else {
 +   exynos_ohci-phy = phy;
 +   }
 +
 exynos_ohci-dev = pdev-dev;

 hcd = usb_create_hcd(exynos_ohci_hc_driver, pdev-dev,
 @@ -153,8 +188,7 @@ static int exynos_ohci_probe(struct platform_device *pdev)
 goto fail_io;
 }

 -   if (pdata-phy_init)
 -   pdata-phy_init(pdev, USB_PHY_TYPE_HOST);
 +   exynos_ohci_phy_enable(exynos_ohci);

 ohci = hcd_to_ohci(hcd);
 ohci_hcd_init(ohci);
 @@ -162,13 +196,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 +214,12 @@ 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);
 +   exynos_ohci_phy_disable(exynos_ohci);

 clk_disable_unprepare(exynos_ohci-clk);

 @@ -209,8 +243,6 @@ static int