linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] usb: phy: omap: Add omap-control Support for AM437x
@ 2013-10-14 12:51 George Cherian
  2013-10-14 13:19 ` Roger Quadros
  0 siblings, 1 reply; 3+ messages in thread
From: George Cherian @ 2013-10-14 12:51 UTC (permalink / raw)
  To: linux-omap, linux-usb, linux-kernel, linux-doc, devicetree
  Cc: tony, rogerq, kishon, gregkh, balbi, rob, ijc+devicetree,
	swarren, mark.rutland, pawel.moll, rob.herring, George Cherian

This adds omap control module support for USBSS in AM437x SoC.
Update DT binding information to reflect these changes.

Signed-off-by: George Cherian <george.cherian@ti.com>
---
 Documentation/devicetree/bindings/usb/omap-usb.txt |  2 ++
 drivers/usb/phy/phy-omap-control.c                 | 17 +++++++++++++++++
 include/linux/usb/omap_control_usb.h               |  6 ++++++
 3 files changed, 25 insertions(+)

diff --git a/Documentation/devicetree/bindings/usb/omap-usb.txt b/Documentation/devicetree/bindings/usb/omap-usb.txt
index 090e5e2..c495135 100644
--- a/Documentation/devicetree/bindings/usb/omap-usb.txt
+++ b/Documentation/devicetree/bindings/usb/omap-usb.txt
@@ -87,6 +87,8 @@ Required properties:
 			e.g. USB3 PHY and SATA PHY on OMAP5.
  "ti,control-phy-dra7usb2" - if it has power down register like USB2 PHY on
 			DRA7 platform.
+ "ti,control-phy-am437usb2" - if it has power down register like USB2 PHY on
+			AM437 platform.
  - reg : Address and length of the register set for the device. It contains
    the address of "otghs_control" for control-phy-otghs or "power" register
    for other types.
diff --git a/drivers/usb/phy/phy-omap-control.c b/drivers/usb/phy/phy-omap-control.c
index 09c5ace..c453b81 100644
--- a/drivers/usb/phy/phy-omap-control.c
+++ b/drivers/usb/phy/phy-omap-control.c
@@ -84,6 +84,18 @@ void omap_control_usb_phy_power(struct device *dev, int on)
 		else
 			val |= OMAP_CTRL_USB2_PHY_PD;
 		break;
+
+	case OMAP_CTRL_TYPE_AM437USB2:
+		if (on) {
+			val &= ~(AM437X_CTRL_USB2_PHY_PD |
+					AM437X_CTRL_USB2_OTG_PD);
+			val |= (AM437X_CTRL_USB2_OTGVDET_EN |
+					AM437X_CTRL_USB2_OTGSESSEND_EN);
+		} else {
+			val |= (AM437X_CTRL_USB2_PHY_PD |
+					 AM437X_CTRL_USB2_OTG_PD);
+		}
+		break;
 	default:
 		dev_err(dev, "%s: type %d not recognized\n",
 					__func__, control_usb->type);
@@ -197,6 +209,7 @@ static const enum omap_control_usb_type otghs_data = OMAP_CTRL_TYPE_OTGHS;
 static const enum omap_control_usb_type usb2_data = OMAP_CTRL_TYPE_USB2;
 static const enum omap_control_usb_type pipe3_data = OMAP_CTRL_TYPE_PIPE3;
 static const enum omap_control_usb_type dra7usb2_data = OMAP_CTRL_TYPE_DRA7USB2;
+static const enum omap_control_usb_type am437usb2_data = OMAP_CTRL_TYPE_AM437USB2;
 
 static const struct of_device_id omap_control_usb_id_table[] = {
 	{
@@ -215,6 +228,10 @@ static const struct of_device_id omap_control_usb_id_table[] = {
 		.compatible = "ti,control-phy-dra7usb2",
 		.data = &dra7usb2_data,
 	},
+	{
+		.compatible = "ti,control-phy-am437usb2",
+		.data = &am437usb2_data,
+	},
 	{},
 };
 MODULE_DEVICE_TABLE(of, omap_control_usb_id_table);
diff --git a/include/linux/usb/omap_control_usb.h b/include/linux/usb/omap_control_usb.h
index 596b019..69ae383 100644
--- a/include/linux/usb/omap_control_usb.h
+++ b/include/linux/usb/omap_control_usb.h
@@ -24,6 +24,7 @@ enum omap_control_usb_type {
 	OMAP_CTRL_TYPE_USB2,	/* USB2_PHY, power down in CONTROL_DEV_CONF */
 	OMAP_CTRL_TYPE_PIPE3,	/* PIPE3 PHY, DPLL & seperate Rx/Tx power */
 	OMAP_CTRL_TYPE_DRA7USB2, /* USB2 PHY, power and power_aux e.g. DRA7 */
+	OMAP_CTRL_TYPE_AM437USB2, /* USB2 PHY, power e.g. AM437x */
 };
 
 struct omap_control_usb {
@@ -64,6 +65,11 @@ enum omap_control_usb_mode {
 
 #define OMAP_CTRL_USB2_PHY_PD		BIT(28)
 
+#define AM437X_CTRL_USB2_PHY_PD		BIT(0)
+#define AM437X_CTRL_USB2_OTG_PD		BIT(1)
+#define AM437X_CTRL_USB2_OTGVDET_EN	BIT(19)
+#define AM437X_CTRL_USB2_OTGSESSEND_EN	BIT(20)
+
 #if IS_ENABLED(CONFIG_OMAP_CONTROL_USB)
 extern void omap_control_usb_phy_power(struct device *dev, int on);
 extern void omap_control_usb_set_mode(struct device *dev,
-- 
1.8.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] usb: phy: omap: Add omap-control Support for AM437x
  2013-10-14 12:51 [PATCH] usb: phy: omap: Add omap-control Support for AM437x George Cherian
@ 2013-10-14 13:19 ` Roger Quadros
  2013-10-15  7:03   ` George Cherian
  0 siblings, 1 reply; 3+ messages in thread
From: Roger Quadros @ 2013-10-14 13:19 UTC (permalink / raw)
  To: George Cherian
  Cc: linux-omap, linux-usb, linux-kernel, linux-doc, devicetree, tony,
	kishon, gregkh, balbi, rob, ijc+devicetree, swarren,
	mark.rutland, pawel.moll, rob.herring

Hi George,

On 10/14/2013 03:51 PM, George Cherian wrote:
> This adds omap control module support for USBSS in AM437x SoC.
> Update DT binding information to reflect these changes.
> 
> Signed-off-by: George Cherian <george.cherian@ti.com>
> ---
>  Documentation/devicetree/bindings/usb/omap-usb.txt |  2 ++
>  drivers/usb/phy/phy-omap-control.c                 | 17 +++++++++++++++++
>  include/linux/usb/omap_control_usb.h               |  6 ++++++
>  3 files changed, 25 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/usb/omap-usb.txt b/Documentation/devicetree/bindings/usb/omap-usb.txt
> index 090e5e2..c495135 100644
> --- a/Documentation/devicetree/bindings/usb/omap-usb.txt
> +++ b/Documentation/devicetree/bindings/usb/omap-usb.txt
> @@ -87,6 +87,8 @@ Required properties:
>  			e.g. USB3 PHY and SATA PHY on OMAP5.
>   "ti,control-phy-dra7usb2" - if it has power down register like USB2 PHY on
>  			DRA7 platform.
> + "ti,control-phy-am437usb2" - if it has power down register like USB2 PHY on
> +			AM437 platform.
>   - reg : Address and length of the register set for the device. It contains
>     the address of "otghs_control" for control-phy-otghs or "power" register
>     for other types.
> diff --git a/drivers/usb/phy/phy-omap-control.c b/drivers/usb/phy/phy-omap-control.c
> index 09c5ace..c453b81 100644
> --- a/drivers/usb/phy/phy-omap-control.c
> +++ b/drivers/usb/phy/phy-omap-control.c
> @@ -84,6 +84,18 @@ void omap_control_usb_phy_power(struct device *dev, int on)
>  		else
>  			val |= OMAP_CTRL_USB2_PHY_PD;
>  		break;
> +
> +	case OMAP_CTRL_TYPE_AM437USB2:
> +		if (on) {
> +			val &= ~(AM437X_CTRL_USB2_PHY_PD |
> +					AM437X_CTRL_USB2_OTG_PD);
> +			val |= (AM437X_CTRL_USB2_OTGVDET_EN |
> +					AM437X_CTRL_USB2_OTGSESSEND_EN);

The ON and OFF operations are not symmetric because of this. Shouldn't the
OTG specific stuff go in otg specific ops?

> +		} else {
> +			val |= (AM437X_CTRL_USB2_PHY_PD |
> +					 AM437X_CTRL_USB2_OTG_PD);
> +		}
> +		break;
>  	default:
>  		dev_err(dev, "%s: type %d not recognized\n",
>  					__func__, control_usb->type);
> @@ -197,6 +209,7 @@ static const enum omap_control_usb_type otghs_data = OMAP_CTRL_TYPE_OTGHS;
>  static const enum omap_control_usb_type usb2_data = OMAP_CTRL_TYPE_USB2;
>  static const enum omap_control_usb_type pipe3_data = OMAP_CTRL_TYPE_PIPE3;
>  static const enum omap_control_usb_type dra7usb2_data = OMAP_CTRL_TYPE_DRA7USB2;
> +static const enum omap_control_usb_type am437usb2_data = OMAP_CTRL_TYPE_AM437USB2;
>  
>  static const struct of_device_id omap_control_usb_id_table[] = {
>  	{
> @@ -215,6 +228,10 @@ static const struct of_device_id omap_control_usb_id_table[] = {
>  		.compatible = "ti,control-phy-dra7usb2",
>  		.data = &dra7usb2_data,
>  	},
> +	{
> +		.compatible = "ti,control-phy-am437usb2",
> +		.data = &am437usb2_data,
> +	},
>  	{},
>  };
>  MODULE_DEVICE_TABLE(of, omap_control_usb_id_table);
> diff --git a/include/linux/usb/omap_control_usb.h b/include/linux/usb/omap_control_usb.h
> index 596b019..69ae383 100644
> --- a/include/linux/usb/omap_control_usb.h
> +++ b/include/linux/usb/omap_control_usb.h
> @@ -24,6 +24,7 @@ enum omap_control_usb_type {
>  	OMAP_CTRL_TYPE_USB2,	/* USB2_PHY, power down in CONTROL_DEV_CONF */
>  	OMAP_CTRL_TYPE_PIPE3,	/* PIPE3 PHY, DPLL & seperate Rx/Tx power */
>  	OMAP_CTRL_TYPE_DRA7USB2, /* USB2 PHY, power and power_aux e.g. DRA7 */
> +	OMAP_CTRL_TYPE_AM437USB2, /* USB2 PHY, power e.g. AM437x */
>  };
>  
>  struct omap_control_usb {
> @@ -64,6 +65,11 @@ enum omap_control_usb_mode {
>  
>  #define OMAP_CTRL_USB2_PHY_PD		BIT(28)
>  
> +#define AM437X_CTRL_USB2_PHY_PD		BIT(0)
> +#define AM437X_CTRL_USB2_OTG_PD		BIT(1)
> +#define AM437X_CTRL_USB2_OTGVDET_EN	BIT(19)
> +#define AM437X_CTRL_USB2_OTGSESSEND_EN	BIT(20)
> +
>  #if IS_ENABLED(CONFIG_OMAP_CONTROL_USB)
>  extern void omap_control_usb_phy_power(struct device *dev, int on);
>  extern void omap_control_usb_set_mode(struct device *dev,
> 

cheers,
-roger

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] usb: phy: omap: Add omap-control Support for AM437x
  2013-10-14 13:19 ` Roger Quadros
@ 2013-10-15  7:03   ` George Cherian
  0 siblings, 0 replies; 3+ messages in thread
From: George Cherian @ 2013-10-15  7:03 UTC (permalink / raw)
  To: Roger Quadros
  Cc: linux-omap, linux-usb, linux-kernel, linux-doc, devicetree, tony,
	kishon, gregkh, balbi, rob, ijc+devicetree, swarren,
	mark.rutland, pawel.moll, rob.herring

On 10/14/2013 6:49 PM, Roger Quadros wrote:
> Hi George,
>
> On 10/14/2013 03:51 PM, George Cherian wrote:
>> This adds omap control module support for USBSS in AM437x SoC.
>> Update DT binding information to reflect these changes.
>>
>> Signed-off-by: George Cherian <george.cherian@ti.com>
>> ---
>>   Documentation/devicetree/bindings/usb/omap-usb.txt |  2 ++
>>   drivers/usb/phy/phy-omap-control.c                 | 17 +++++++++++++++++
>>   include/linux/usb/omap_control_usb.h               |  6 ++++++
>>   3 files changed, 25 insertions(+)
>>
>> diff --git a/Documentation/devicetree/bindings/usb/omap-usb.txt b/Documentation/devicetree/bindings/usb/omap-usb.txt
>> index 090e5e2..c495135 100644
>> --- a/Documentation/devicetree/bindings/usb/omap-usb.txt
>> +++ b/Documentation/devicetree/bindings/usb/omap-usb.txt
>> @@ -87,6 +87,8 @@ Required properties:
>>   			e.g. USB3 PHY and SATA PHY on OMAP5.
>>    "ti,control-phy-dra7usb2" - if it has power down register like USB2 PHY on
>>   			DRA7 platform.
>> + "ti,control-phy-am437usb2" - if it has power down register like USB2 PHY on
>> +			AM437 platform.
>>    - reg : Address and length of the register set for the device. It contains
>>      the address of "otghs_control" for control-phy-otghs or "power" register
>>      for other types.
>> diff --git a/drivers/usb/phy/phy-omap-control.c b/drivers/usb/phy/phy-omap-control.c
>> index 09c5ace..c453b81 100644
>> --- a/drivers/usb/phy/phy-omap-control.c
>> +++ b/drivers/usb/phy/phy-omap-control.c
>> @@ -84,6 +84,18 @@ void omap_control_usb_phy_power(struct device *dev, int on)
>>   		else
>>   			val |= OMAP_CTRL_USB2_PHY_PD;
>>   		break;
>> +
>> +	case OMAP_CTRL_TYPE_AM437USB2:
>> +		if (on) {
>> +			val &= ~(AM437X_CTRL_USB2_PHY_PD |
>> +					AM437X_CTRL_USB2_OTG_PD);
>> +			val |= (AM437X_CTRL_USB2_OTGVDET_EN |
>> +					AM437X_CTRL_USB2_OTGSESSEND_EN);
> The ON and OFF operations are not symmetric because of this. Shouldn't the
> OTG specific stuff go in otg specific ops?

AM437X_CTRL_USB2_OTGVDET_EN - this is basically the VBUS detect comparator.
AM437X_CTRL_USB2_OTGSESSEND_EN - this is Session End Comparator.

The TRM names these bits with OTG. Without these enabled the peripheral mode does not
work properly with HW UTMI mode (UTMI mode in DWC).
These bits have no effect when AM437X_CTRL_USB2_OTG_PD and AM437X_CTRL_USB2_PHY_PD are enabled
(powered down).

Anyways I will make it symmetric during OFF also .

>> +		} else {
>> +			val |= (AM437X_CTRL_USB2_PHY_PD |
>> +					 AM437X_CTRL_USB2_OTG_PD);
>> +		}
>> +		break;
>>   	default:
>>   		dev_err(dev, "%s: type %d not recognized\n",
>>   					__func__, control_usb->type);
>> @@ -197,6 +209,7 @@ static const enum omap_control_usb_type otghs_data = OMAP_CTRL_TYPE_OTGHS;
>>   static const enum omap_control_usb_type usb2_data = OMAP_CTRL_TYPE_USB2;
>>   static const enum omap_control_usb_type pipe3_data = OMAP_CTRL_TYPE_PIPE3;
>>   static const enum omap_control_usb_type dra7usb2_data = OMAP_CTRL_TYPE_DRA7USB2;
>> +static const enum omap_control_usb_type am437usb2_data = OMAP_CTRL_TYPE_AM437USB2;
>>   
>>   static const struct of_device_id omap_control_usb_id_table[] = {
>>   	{
>> @@ -215,6 +228,10 @@ static const struct of_device_id omap_control_usb_id_table[] = {
>>   		.compatible = "ti,control-phy-dra7usb2",
>>   		.data = &dra7usb2_data,
>>   	},
>> +	{
>> +		.compatible = "ti,control-phy-am437usb2",
>> +		.data = &am437usb2_data,
>> +	},
>>   	{},
>>   };
>>   MODULE_DEVICE_TABLE(of, omap_control_usb_id_table);
>> diff --git a/include/linux/usb/omap_control_usb.h b/include/linux/usb/omap_control_usb.h
>> index 596b019..69ae383 100644
>> --- a/include/linux/usb/omap_control_usb.h
>> +++ b/include/linux/usb/omap_control_usb.h
>> @@ -24,6 +24,7 @@ enum omap_control_usb_type {
>>   	OMAP_CTRL_TYPE_USB2,	/* USB2_PHY, power down in CONTROL_DEV_CONF */
>>   	OMAP_CTRL_TYPE_PIPE3,	/* PIPE3 PHY, DPLL & seperate Rx/Tx power */
>>   	OMAP_CTRL_TYPE_DRA7USB2, /* USB2 PHY, power and power_aux e.g. DRA7 */
>> +	OMAP_CTRL_TYPE_AM437USB2, /* USB2 PHY, power e.g. AM437x */
>>   };
>>   
>>   struct omap_control_usb {
>> @@ -64,6 +65,11 @@ enum omap_control_usb_mode {
>>   
>>   #define OMAP_CTRL_USB2_PHY_PD		BIT(28)
>>   
>> +#define AM437X_CTRL_USB2_PHY_PD		BIT(0)
>> +#define AM437X_CTRL_USB2_OTG_PD		BIT(1)
>> +#define AM437X_CTRL_USB2_OTGVDET_EN	BIT(19)
>> +#define AM437X_CTRL_USB2_OTGSESSEND_EN	BIT(20)
>> +
>>   #if IS_ENABLED(CONFIG_OMAP_CONTROL_USB)
>>   extern void omap_control_usb_phy_power(struct device *dev, int on);
>>   extern void omap_control_usb_set_mode(struct device *dev,
>>
> cheers,
> -roger


-- 
-George


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-10-15  7:04 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-10-14 12:51 [PATCH] usb: phy: omap: Add omap-control Support for AM437x George Cherian
2013-10-14 13:19 ` Roger Quadros
2013-10-15  7:03   ` George Cherian

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).