diff mbox

[v6,08/12] usb: hcd: Adapt to OTG core

Message ID 1459865117-7032-9-git-send-email-rogerq@ti.com
State Superseded
Headers show

Commit Message

Roger Quadros April 5, 2016, 2:05 p.m. UTC
Introduce usb_otg_add/remove_hcd() for use by host
controllers that are part of OTG/dual-role port.

Non Device tree platforms can use the otg_dev argument
to specify the OTG controller device. If otg_dev is NULL
then the device tree node's otg-controller property is used to
get the otg_dev device.

Signed-off-by: Roger Quadros <rogerq@ti.com>

---
 drivers/usb/core/hcd.c  | 71 +++++++++++++++++++++++++++++++++++++++++++++++++
 include/linux/usb/hcd.h |  4 +++
 2 files changed, 75 insertions(+)

-- 
2.5.0

Comments

Roger Quadros April 20, 2016, 6:46 a.m. UTC | #1
On 18/04/16 09:29, Peter Chen wrote:
> On Tue, Apr 05, 2016 at 05:05:13PM +0300, Roger Quadros wrote:

>> Introduce usb_otg_add/remove_hcd() for use by host

>> controllers that are part of OTG/dual-role port.

>>

>> Non Device tree platforms can use the otg_dev argument

>> to specify the OTG controller device. If otg_dev is NULL

>> then the device tree node's otg-controller property is used to

>> get the otg_dev device.

>>

>> Signed-off-by: Roger Quadros <rogerq@ti.com>

>> ---

>>  drivers/usb/core/hcd.c  | 71 +++++++++++++++++++++++++++++++++++++++++++++++++

>>  include/linux/usb/hcd.h |  4 +++

>>  2 files changed, 75 insertions(+)

>>

>> diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c

>> index 6b1930d..6a80193 100644

>> --- a/drivers/usb/core/hcd.c

>> +++ b/drivers/usb/core/hcd.c

>> @@ -46,6 +46,10 @@

>>  #include <linux/usb.h>

>>  #include <linux/usb/hcd.h>

>>  #include <linux/usb/phy.h>

>> +#include <linux/usb/otg.h>

>> +

>> +#include <linux/of.h>

>> +#include <linux/of_platform.h>

>>  

>>  #include "usb.h"

>>  

>> @@ -3013,6 +3017,73 @@ void usb_remove_hcd(struct usb_hcd *hcd)

>>  }

>>  EXPORT_SYMBOL_GPL(usb_remove_hcd);

>>  

>> +

>> +static struct otg_hcd_ops otg_hcd_intf = {

>> +	.add = usb_add_hcd,

>> +	.remove = usb_remove_hcd,

>> +	.usb_bus_start_enum = usb_bus_start_enum,

>> +	.usb_control_msg = usb_control_msg,

>> +	.usb_hub_find_child = usb_hub_find_child,

>> +};

>> +

>> +/**

>> + * usb_otg_add_hcd - Register the HCD with OTG core.

>> + * @hcd: the usb_hcd structure to initialize

>> + * @irqnum: Interrupt line to allocate

>> + * @irqflags: Interrupt type flags

>> + * @otg_dev: OTG controller device manging this HCD

> 

> %s/manging/managing


OK.

> 

>> + *

>> + * Registers the HCD with OTG core. OTG core will call usb_add_hcd()

>> + * or usb_remove_hcd() as necessary.

>> + * If otg_dev is NULL then device tree node is checked for OTG

>> + * controller device via the otg-controller property.

>> + */

>> +int usb_otg_add_hcd(struct usb_hcd *hcd,

>> +		    unsigned int irqnum, unsigned long irqflags,

>> +		    struct device *otg_dev)

>> +{

> 

> Some users may not want to use default otg_hcd_ops, would you please

> add one more parameter (eg, hcd_ops) for that? If hcd_ops is NULL, just

> use the default one.

> 


Can we please wait to add anything new till we have such users?

>> +	struct device *dev = hcd->self.controller;

>> +

>> +	if (!otg_dev) {

>> +		struct device_node *np;

>> +		struct platform_device *pdev;

>> +

>> +		np = of_parse_phandle(dev->of_node, "otg-controller", 0);

>> +		if (!np) {

>> +			dev_err(dev,

>> +				"otg_dev is NULL and no otg-controller property in DT\n");

>> +			return -EINVAL;

>> +		}

>> +

>> +		pdev = of_find_device_by_node(np);

>> +		of_node_put(np);

>> +		if (!pdev) {

>> +			dev_err(dev,

>> +				"couldn't get otg-controller device\n");

>> +			return -ENODEV;

>> +		}

>> +

>> +		hcd->otg_dev = &pdev->dev;

>> +	} else {

>> +		hcd->otg_dev = otg_dev;

>> +	}

>> +

>> +	return usb_otg_register_hcd(hcd, irqnum, irqflags, &otg_hcd_intf);

>> +}

>> +EXPORT_SYMBOL_GPL(usb_otg_add_hcd);

>> +

> 


--
cheers,
-roger
Roger Quadros April 20, 2016, 6:47 a.m. UTC | #2
On 19/04/16 11:14, Peter Chen wrote:
> On Mon, Apr 18, 2016 at 02:29:37PM +0800, Peter Chen wrote:

>> On Tue, Apr 05, 2016 at 05:05:13PM +0300, Roger Quadros wrote:

>>> Introduce usb_otg_add/remove_hcd() for use by host

>>> controllers that are part of OTG/dual-role port.

>>>

>>> Non Device tree platforms can use the otg_dev argument

>>> to specify the OTG controller device. If otg_dev is NULL

>>> then the device tree node's otg-controller property is used to

>>> get the otg_dev device.

>>>

>>> Signed-off-by: Roger Quadros <rogerq@ti.com>

>>> ---

>>>  drivers/usb/core/hcd.c  | 71 +++++++++++++++++++++++++++++++++++++++++++++++++

>>>  include/linux/usb/hcd.h |  4 +++

>>>  2 files changed, 75 insertions(+)

>>>

>>> diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c

>>> index 6b1930d..6a80193 100644

>>> --- a/drivers/usb/core/hcd.c

>>> +++ b/drivers/usb/core/hcd.c

>>> @@ -46,6 +46,10 @@

>>>  #include <linux/usb.h>

>>>  #include <linux/usb/hcd.h>

>>>  #include <linux/usb/phy.h>

>>> +#include <linux/usb/otg.h>

>>> +

>>> +#include <linux/of.h>

>>> +#include <linux/of_platform.h>

>>>  

>>>  #include "usb.h"

>>>  

>>> @@ -3013,6 +3017,73 @@ void usb_remove_hcd(struct usb_hcd *hcd)

>>>  }

>>>  EXPORT_SYMBOL_GPL(usb_remove_hcd);

>>>  

>>> +

>>> +static struct otg_hcd_ops otg_hcd_intf = {

>>> +	.add = usb_add_hcd,

>>> +	.remove = usb_remove_hcd,

>>> +	.usb_bus_start_enum = usb_bus_start_enum,

>>> +	.usb_control_msg = usb_control_msg,

>>> +	.usb_hub_find_child = usb_hub_find_child,

>>> +};

>>> +

>>> +/**

>>> + * usb_otg_add_hcd - Register the HCD with OTG core.

>>> + * @hcd: the usb_hcd structure to initialize

>>> + * @irqnum: Interrupt line to allocate

>>> + * @irqflags: Interrupt type flags

>>> + * @otg_dev: OTG controller device manging this HCD

>>

>> %s/manging/managing

>>

>>> + *

>>> + * Registers the HCD with OTG core. OTG core will call usb_add_hcd()

>>> + * or usb_remove_hcd() as necessary.

>>> + * If otg_dev is NULL then device tree node is checked for OTG

>>> + * controller device via the otg-controller property.

>>> + */

>>> +int usb_otg_add_hcd(struct usb_hcd *hcd,

>>> +		    unsigned int irqnum, unsigned long irqflags,

>>> +		    struct device *otg_dev)

>>> +{

>>

>> Some users may not want to use default otg_hcd_ops, would you please

>> add one more parameter (eg, hcd_ops) for that? If hcd_ops is NULL, just

>> use the default one.

>>

> 

> I forgot there is .start_host at otg fsm API when reviewing, so it is

> ok to have a unified hcd_ops, the user can do platform things at

> fsm.start_host.

> 

OK, great :).

cheers,
-roger
Roger Quadros April 27, 2016, 11 a.m. UTC | #3
On 27/04/16 13:16, Jun Li wrote:
> Hi

> 

>>

>> +

>> +static struct otg_hcd_ops otg_hcd_intf = {

>> +	.add = usb_add_hcd,

>> +	.remove = usb_remove_hcd,

>> +	.usb_bus_start_enum = usb_bus_start_enum,

> 

> Build break if CONFIG_USB_OTG is not enabled:

> 

> drivers/built-in.o:(.data+0x1db30): undefined reference to `usb_bus_start_enum'

> Makefile:948: recipe for target 'vmlinux' failed

> make: *** [vmlinux] Error 1


Thanks. Will fix it.

cheers,
-roger

>  

>> +	.usb_control_msg = usb_control_msg,

>> +	.usb_hub_find_child = usb_hub_find_child, };

>> +

>
Roger Quadros April 27, 2016, 11:11 a.m. UTC | #4
On 27/04/16 14:00, Roger Quadros wrote:
> On 27/04/16 13:16, Jun Li wrote:

>> Hi

>>

>>>

>>> +

>>> +static struct otg_hcd_ops otg_hcd_intf = {

>>> +	.add = usb_add_hcd,

>>> +	.remove = usb_remove_hcd,

>>> +	.usb_bus_start_enum = usb_bus_start_enum,

>>

>> Build break if CONFIG_USB_OTG is not enabled:

>>

>> drivers/built-in.o:(.data+0x1db30): undefined reference to `usb_bus_start_enum'

>> Makefile:948: recipe for target 'vmlinux' failed

>> make: *** [vmlinux] Error 1


I couldn't get this error. Could you please send me your .config? Thanks.

cheers,
-roger
> 

> Thanks. Will fix it.

> 

> cheers,

> -roger

> 

>>  

>>> +	.usb_control_msg = usb_control_msg,

>>> +	.usb_hub_find_child = usb_hub_find_child, };

>>> +

>>

> --

> To unsubscribe from this list: send the line "unsubscribe linux-usb" in

> the body of a message to majordomo@vger.kernel.org

> More majordomo info at  http://vger.kernel.org/majordomo-info.html

>
diff mbox

Patch

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 6b1930d..6a80193 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -46,6 +46,10 @@ 
 #include <linux/usb.h>
 #include <linux/usb/hcd.h>
 #include <linux/usb/phy.h>
+#include <linux/usb/otg.h>
+
+#include <linux/of.h>
+#include <linux/of_platform.h>
 
 #include "usb.h"
 
@@ -3013,6 +3017,73 @@  void usb_remove_hcd(struct usb_hcd *hcd)
 }
 EXPORT_SYMBOL_GPL(usb_remove_hcd);
 
+
+static struct otg_hcd_ops otg_hcd_intf = {
+	.add = usb_add_hcd,
+	.remove = usb_remove_hcd,
+	.usb_bus_start_enum = usb_bus_start_enum,
+	.usb_control_msg = usb_control_msg,
+	.usb_hub_find_child = usb_hub_find_child,
+};
+
+/**
+ * usb_otg_add_hcd - Register the HCD with OTG core.
+ * @hcd: the usb_hcd structure to initialize
+ * @irqnum: Interrupt line to allocate
+ * @irqflags: Interrupt type flags
+ * @otg_dev: OTG controller device manging this HCD
+ *
+ * Registers the HCD with OTG core. OTG core will call usb_add_hcd()
+ * or usb_remove_hcd() as necessary.
+ * If otg_dev is NULL then device tree node is checked for OTG
+ * controller device via the otg-controller property.
+ */
+int usb_otg_add_hcd(struct usb_hcd *hcd,
+		    unsigned int irqnum, unsigned long irqflags,
+		    struct device *otg_dev)
+{
+	struct device *dev = hcd->self.controller;
+
+	if (!otg_dev) {
+		struct device_node *np;
+		struct platform_device *pdev;
+
+		np = of_parse_phandle(dev->of_node, "otg-controller", 0);
+		if (!np) {
+			dev_err(dev,
+				"otg_dev is NULL and no otg-controller property in DT\n");
+			return -EINVAL;
+		}
+
+		pdev = of_find_device_by_node(np);
+		of_node_put(np);
+		if (!pdev) {
+			dev_err(dev,
+				"couldn't get otg-controller device\n");
+			return -ENODEV;
+		}
+
+		hcd->otg_dev = &pdev->dev;
+	} else {
+		hcd->otg_dev = otg_dev;
+	}
+
+	return usb_otg_register_hcd(hcd, irqnum, irqflags, &otg_hcd_intf);
+}
+EXPORT_SYMBOL_GPL(usb_otg_add_hcd);
+
+/**
+ * usb_otg_remove_hcd - Unregister the HCD with OTG core.
+ * @hcd: the usb_hcd structure to remove
+ *
+ * Unregisters the HCD from the OTG core.
+ */
+void usb_otg_remove_hcd(struct usb_hcd *hcd)
+{
+	usb_otg_unregister_hcd(hcd);
+}
+EXPORT_SYMBOL_GPL(usb_otg_remove_hcd);
+
 void
 usb_hcd_platform_shutdown(struct platform_device *dev)
 {
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index 2017cd4..adcf2e7 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -472,6 +472,10 @@  extern int usb_hcd_is_primary_hcd(struct usb_hcd *hcd);
 extern int usb_add_hcd(struct usb_hcd *hcd,
 		unsigned int irqnum, unsigned long irqflags);
 extern void usb_remove_hcd(struct usb_hcd *hcd);
+extern int usb_otg_add_hcd(struct usb_hcd *hcd,
+			   unsigned int irqnum, unsigned long irqflags,
+			   struct device *otg_dev);
+extern void usb_otg_remove_hcd(struct usb_hcd *hcd);
 extern int usb_hcd_find_raw_port_number(struct usb_hcd *hcd, int port1);
 
 struct platform_device;