RE: [PATCH v2 2/7] usb: phy: dsps: adding usbphy driver for am33xx platform

2013-06-12 Thread B, Ravi
 +
 +  res = platform_get_resource_byname(pdev, IORESOURCE_MEM, phy_wkup);
 +  phy-phy_wkup = ioremap(res-start, resource_size(res));

 devm_ioremap?

 The phy_wakeup register is common across two instances of phy, 
 devm_ioremap_resource() will fail to map for twice for same register space.

   I've already told you the register can't be shared between devices like 
 this.
  BTW, you haven't replied to my request concerning your /proc/iomem 
 contents... 

I have missed that specific mail. The /proc/iomem does show this common 
register. As you suggest to create a third device for this shared register? I 
agree it can be done. 
Initially I thought this should be part of control module, but do we have 
control module frame work for every SoC(am335x)?
Every SoC has many such shared register to handle control/status logic for Soc 
specific IP(s)? 
If we create separate device node for each such registers, this will end up in 
adding more files to kernel. 

We should create single control module node for each SoC,

cm: control_module@44e1 {
compatible = ti,dsps-usbphy;
reg = 0x44e10648 0x4
 
   0x44e10XXX 0x4

reg-names = phy_wkup, mmc_control, xxxreg_ctrl, 
xxxreg_status;
id = 0;
};
Have common control module APIs to control these registers, can be used by 
other driver modules. 

--
Ravi B
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH v2 2/7] usb: phy: dsps: adding usbphy driver for am33xx platform

2013-06-12 Thread B, Ravi
Typo.. corrected
The /proc/iomem does not show this common register

-Original Message-
From: linux-usb-ow...@vger.kernel.org [mailto:linux-usb-ow...@vger.kernel.org] 
On Behalf Of B, Ravi
Sent: Wednesday, June 12, 2013 12:51 PM
To: Sergei Shtylyov
Cc: ABRAHAM, KISHON VIJAY; linux-usb@vger.kernel.org; 
linux-ker...@vger.kernel.org; Balbi, Felipe
Subject: RE: [PATCH v2 2/7] usb: phy: dsps: adding usbphy driver for am33xx 
platform

 +
 +  res = platform_get_resource_byname(pdev, IORESOURCE_MEM, phy_wkup);
 +  phy-phy_wkup = ioremap(res-start, resource_size(res));

 devm_ioremap?

 The phy_wakeup register is common across two instances of phy, 
 devm_ioremap_resource() will fail to map for twice for same register space.

   I've already told you the register can't be shared between devices like 
 this.
  BTW, you haven't replied to my request concerning your /proc/iomem 
 contents... 

I have missed that specific mail. The /proc/iomem does not show this common 
register. As you suggest to create a third device for this shared register? I 
agree it can be done. 
Initially I thought this should be part of control module, but do we have 
control module frame work for every SoC(am335x)?
Every SoC has many such shared register to handle control/status logic for Soc 
specific IP(s)? 
If we create separate device node for each such registers, this will end up in 
adding more files to kernel. 

We should create single control module node for each SoC,

cm: control_module@44e1 {
compatible = ti,dsps-usbphy;
reg = 0x44e10648 0x4
 
   0x44e10XXX 0x4

reg-names = phy_wkup, mmc_control, xxxreg_ctrl, 
xxxreg_status;
id = 0;
};
Have common control module APIs to control these registers, can be used by 
other driver modules. 

--
Ravi B
--
To unsubscribe from this list: send the line unsubscribe linux-usb in the 
body of a message to majord...@vger.kernel.org More majordomo info at  
http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 2/7] usb: phy: dsps: adding usbphy driver for am33xx platform

2013-06-11 Thread Ravi Babu
Adds usb-phy driver support for am33xx platform, the host/device
peripheral controller shall get this phy object to control the phy
operations.

Signed-off-by: Ravi Babu ravib...@ti.com
---
 drivers/usb/phy/Kconfig|9 ++
 drivers/usb/phy/Makefile   |1 +
 drivers/usb/phy/phy-dsps-usb.c |  236 
 3 files changed, 246 insertions(+), 0 deletions(-)
 create mode 100644 drivers/usb/phy/phy-dsps-usb.c

diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
index 372db48..b55c265 100644
--- a/drivers/usb/phy/Kconfig
+++ b/drivers/usb/phy/Kconfig
@@ -85,6 +85,15 @@ config OMAP_USB3
  This driver interacts with the OMAP Control USB Driver to power
  on/off the PHY.
 
+config DSPS_USB2PHY
+   tristate DSPS USB2 PHY Driver
+   depends on SOC_AM33XX
+   help
+ Enable this to support the transceiver that is part of SOC. This
+ phy supports all LS/FS/HS speed and also supports OTG functionality.
+ The USB OTG controller communicates with this phy through stand UTMI
+ interface.
+
 config SAMSUNG_USBPHY
tristate Samsung USB PHY Driver
help
diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile
index 33863c0..0b16fb3 100644
--- a/drivers/usb/phy/Makefile
+++ b/drivers/usb/phy/Makefile
@@ -17,6 +17,7 @@ obj-$(CONFIG_NOP_USB_XCEIV)   += phy-nop.o
 obj-$(CONFIG_OMAP_CONTROL_USB) += phy-omap-control.o
 obj-$(CONFIG_OMAP_USB2)+= phy-omap-usb2.o
 obj-$(CONFIG_OMAP_USB3)+= phy-omap-usb3.o
+obj-$(CONFIG_DSPS_USB2PHY) += phy-dsps-usb.o
 obj-$(CONFIG_SAMSUNG_USBPHY)   += phy-samsung-usb.o
 obj-$(CONFIG_SAMSUNG_USB2PHY)  += phy-samsung-usb2.o
 obj-$(CONFIG_SAMSUNG_USB3PHY)  += phy-samsung-usb3.o
diff --git a/drivers/usb/phy/phy-dsps-usb.c b/drivers/usb/phy/phy-dsps-usb.c
new file mode 100644
index 000..aae97b3
--- /dev/null
+++ b/drivers/usb/phy/phy-dsps-usb.c
@@ -0,0 +1,236 @@
+/*
+ * phy-dsps-usb.c - TI gs70 based usb phy driver used by usb controller
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include linux/module.h
+#include linux/platform_device.h
+#include linux/slab.h
+#include linux/of.h
+#include linux/io.h
+#include linux/usb/omap_usb.h
+#include linux/usb/phy_companion.h
+#include linux/clk.h
+#include linux/err.h
+#include linux/pm_runtime.h
+#include linux/delay.h
+#include linux/usb/phy.h
+
+struct dsps_phy {
+   struct usb_phy phy;
+   struct device *dev;
+   struct platform_device *pdev;
+   void __iomem *phy_ctrl;
+   void __iomem *phy_wkup;
+   u8  is_suspended:1;
+   int id;
+};
+
+#define DSPS_USBPHY_CM_PWRDN   (1  0)
+#define DSPS_USBPHY_OTG_PWRDN  (1  1)
+#define DSPS_USBPHY_OTGVDET_EN (1  19)
+#define DSPS_USBPHY_OTGSESSEND_EN  (1  20)
+#define DSPS_USB0_WKUP_CTRL_ENABLE (1  0)
+#define DSPS_USB1_WKUP_CTRL_ENABLE (1  8)
+#define phy_to_dspsphy(x)  container_of((x), struct dsps_phy, phy)
+
+static void dsps_usbphy_power(struct usb_phy *phy, bool is_on)
+{
+   struct dsps_phy *dsps_phy = phy_to_dspsphy(phy);
+   u32 val;
+
+   val = readl(dsps_phy-phy_ctrl);
+
+   if (is_on) {
+   val = ~(DSPS_USBPHY_CM_PWRDN | DSPS_USBPHY_OTG_PWRDN);
+   val |= DSPS_USBPHY_OTGVDET_EN |
+   DSPS_USBPHY_OTGSESSEND_EN;
+   } else
+   val |= DSPS_USBPHY_CM_PWRDN | DSPS_USBPHY_OTG_PWRDN;
+
+   writel(val, dsps_phy-phy_ctrl);
+}
+
+static void dsps_usbphy_wakeup(struct usb_phy *phy, bool enable)
+{
+   struct dsps_phy *dsps_phy = phy_to_dspsphy(phy);
+   int id = dsps_phy-id;
+   u32 val, wkup_flag;
+
+   val = readl(dsps_phy-phy_wkup);
+   wkup_flag = id ? DSPS_USB1_WKUP_CTRL_ENABLE :
+   DSPS_USB0_WKUP_CTRL_ENABLE;
+
+   if (enable)
+   val |= wkup_flag;
+   else
+   val = ~wkup_flag;
+
+   writel(val, dsps_phy-phy_wkup);
+}
+
+static int dsps_usbphy_suspend(struct usb_phy *x, int suspend)
+{
+   struct dsps_phy *dsps_phy = phy_to_dspsphy(x);
+
+   if (suspend) {
+   if (!pm_runtime_suspended(dsps_phy-pdev-dev))
+   pm_runtime_put(dsps_phy-pdev-dev);
+   } else if (!suspend)
+   pm_runtime_get(dsps_phy-pdev-dev);
+
+   return 0;
+}
+
+static int 

Re: [PATCH v2 2/7] usb: phy: dsps: adding usbphy driver for am33xx platform

2013-06-11 Thread Kishon Vijay Abraham I

Hi,

On Tuesday 11 June 2013 12:47 PM, Ravi Babu wrote:

Adds usb-phy driver support for am33xx platform, the host/device
peripheral controller shall get this phy object to control the phy
operations.

Signed-off-by: Ravi Babu ravib...@ti.com
---
  drivers/usb/phy/Kconfig|9 ++
  drivers/usb/phy/Makefile   |1 +
  drivers/usb/phy/phy-dsps-usb.c |  236 
  3 files changed, 246 insertions(+), 0 deletions(-)
  create mode 100644 drivers/usb/phy/phy-dsps-usb.c

diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
index 372db48..b55c265 100644
--- a/drivers/usb/phy/Kconfig
+++ b/drivers/usb/phy/Kconfig
@@ -85,6 +85,15 @@ config OMAP_USB3
  This driver interacts with the OMAP Control USB Driver to power
  on/off the PHY.

+config DSPS_USB2PHY
+   tristate DSPS USB2 PHY Driver
+   depends on SOC_AM33XX
+   help
+ Enable this to support the transceiver that is part of SOC. This
+ phy supports all LS/FS/HS speed and also supports OTG functionality.
+ The USB OTG controller communicates with this phy through stand UTMI
+ interface.
+
  config SAMSUNG_USBPHY
tristate Samsung USB PHY Driver
help
diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile
index 33863c0..0b16fb3 100644
--- a/drivers/usb/phy/Makefile
+++ b/drivers/usb/phy/Makefile
@@ -17,6 +17,7 @@ obj-$(CONFIG_NOP_USB_XCEIV)   += phy-nop.o
  obj-$(CONFIG_OMAP_CONTROL_USB)+= phy-omap-control.o
  obj-$(CONFIG_OMAP_USB2)   += phy-omap-usb2.o
  obj-$(CONFIG_OMAP_USB3)   += phy-omap-usb3.o
+obj-$(CONFIG_DSPS_USB2PHY) += phy-dsps-usb.o
  obj-$(CONFIG_SAMSUNG_USBPHY)  += phy-samsung-usb.o
  obj-$(CONFIG_SAMSUNG_USB2PHY) += phy-samsung-usb2.o
  obj-$(CONFIG_SAMSUNG_USB3PHY) += phy-samsung-usb3.o
diff --git a/drivers/usb/phy/phy-dsps-usb.c b/drivers/usb/phy/phy-dsps-usb.c
new file mode 100644
index 000..aae97b3
--- /dev/null
+++ b/drivers/usb/phy/phy-dsps-usb.c
@@ -0,0 +1,236 @@
+/*
+ * phy-dsps-usb.c - TI gs70 based usb phy driver used by usb controller
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include linux/module.h
+#include linux/platform_device.h
+#include linux/slab.h
+#include linux/of.h
+#include linux/io.h
+#include linux/usb/omap_usb.h
+#include linux/usb/phy_companion.h
+#include linux/clk.h
+#include linux/err.h
+#include linux/pm_runtime.h
+#include linux/delay.h
+#include linux/usb/phy.h
+
+struct dsps_phy {
+   struct usb_phy phy;
+   struct device *dev;
+   struct platform_device *pdev;
+   void __iomem *phy_ctrl;
+   void __iomem *phy_wkup;
+   u8  is_suspended:1;
+   int id;
+};
+
+#define DSPS_USBPHY_CM_PWRDN   (1  0)
+#define DSPS_USBPHY_OTG_PWRDN  (1  1)
+#define DSPS_USBPHY_OTGVDET_EN (1  19)
+#define DSPS_USBPHY_OTGSESSEND_EN  (1  20)
+#define DSPS_USB0_WKUP_CTRL_ENABLE (1  0)
+#define DSPS_USB1_WKUP_CTRL_ENABLE (1  8)
+#define phy_to_dspsphy(x)  container_of((x), struct dsps_phy, phy)
+
+static void dsps_usbphy_power(struct usb_phy *phy, bool is_on)
+{
+   struct dsps_phy *dsps_phy = phy_to_dspsphy(phy);
+   u32 val;
+
+   val = readl(dsps_phy-phy_ctrl);
+
+   if (is_on) {
+   val = ~(DSPS_USBPHY_CM_PWRDN | DSPS_USBPHY_OTG_PWRDN);
+   val |= DSPS_USBPHY_OTGVDET_EN |
+   DSPS_USBPHY_OTGSESSEND_EN;
+   } else
+   val |= DSPS_USBPHY_CM_PWRDN | DSPS_USBPHY_OTG_PWRDN;
+
+   writel(val, dsps_phy-phy_ctrl);
+}
+
+static void dsps_usbphy_wakeup(struct usb_phy *phy, bool enable)
+{

Where is this function called from?

+   struct dsps_phy *dsps_phy = phy_to_dspsphy(phy);
+   int id = dsps_phy-id;
+   u32 val, wkup_flag;
+
+   val = readl(dsps_phy-phy_wkup);
+   wkup_flag = id ? DSPS_USB1_WKUP_CTRL_ENABLE :
+   DSPS_USB0_WKUP_CTRL_ENABLE;
+
+   if (enable)
+   val |= wkup_flag;
+   else
+   val = ~wkup_flag;
+
+   writel(val, dsps_phy-phy_wkup);
+}
+
+static int dsps_usbphy_suspend(struct usb_phy *x, int suspend)
+{
+   struct dsps_phy *dsps_phy = phy_to_dspsphy(x);
+
+   if (suspend) {
+   if (!pm_runtime_suspended(dsps_phy-pdev-dev))
+   pm_runtime_put(dsps_phy-pdev-dev);
+   } 

RE: [PATCH v2 2/7] usb: phy: dsps: adding usbphy driver for am33xx platform

2013-06-11 Thread B, Ravi
Kishon

 Cc: linux-usb@vger.kernel.org; linux-ker...@vger.kernel.org; Balbi, Felipe
 Subject: Re: [PATCH v2 2/7] usb: phy: dsps: adding usbphy driver for am33xx 
 platform

 +
 +res = platform_get_resource_byname(pdev, IORESOURCE_MEM, phy_wkup);
 +phy-phy_wkup = ioremap(res-start, resource_size(res));

devm_ioremap?

The phy_wakeup register is common across two instances of phy, 
devm_ioremap_resource() will fail to map for twice for same register space.

 +if (IS_ERR(phy-phy_wkup))
 +return PTR_ERR(phy-phy_wkup);
 +
 +if (np)
 +of_property_read_u32(np, id, phy-id);

 Is this property documented somewhere?

Not it is not documented.

 +
 +phy-phy.dev= phy-dev;
 +phy-phy.label  = dsps-usbphy;
 +dsps_usbphy_power(dsps_phy-phy, 0);
 +dsps_phy-is_suspended = 1;

 Are you using this is_suspended anywhere else?

Currently not used.
--
Ravi B
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 2/7] usb: phy: dsps: adding usbphy driver for am33xx platform

2013-06-11 Thread Sergei Shtylyov

Hello.

On 06/11/2013 01:45 PM, B, Ravi wrote:


+
+   res = platform_get_resource_byname(pdev, IORESOURCE_MEM, phy_wkup);
+   phy-phy_wkup = ioremap(res-start, resource_size(res));



devm_ioremap?



The phy_wakeup register is common across two instances of phy, 
devm_ioremap_resource() will fail to map for twice for same register space.


I've already told you the register can't be shared between devices 
like this. BTW, you haven't replied to my request concerning your 
/proc/iomem contents...


WBR, Sergei

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html