Re: [RFC][PATCH v2 05/13] usb: otg: add OTG core
On Tue, Apr 14, 2015 at 01:41:52PM +0300, Roger Quadros wrote: The OTG core instantiates the OTG Finite State Machine per OTG controller and manages starting/stopping the host and gadget controllers based on the bus state. It provides APIs for the following tasks - Registering an OTG capable controller - Registering Host and Gadget controllers to OTG core - Providing inputs to and kicking the OTG state machine TODO: - sysfs interface to allow application inputs to OTG state machine - otg class? Signed-off-by: Roger Quadros rog...@ti.com --- drivers/usb/Makefile | 1 + drivers/usb/common/Makefile | 1 + drivers/usb/common/usb-otg.c | 743 +++ drivers/usb/common/usb-otg.h | 71 + drivers/usb/core/Kconfig | 8 + include/linux/usb/usb-otg.h | 94 ++ There is otg.h at include/linux/usb/, why create another usb-otg.h, it may confuse the user in future If I understand correct, in your plan, both DRD and OTG FSM devices will run OTG state machine code, right? Peter 6 files changed, 918 insertions(+) create mode 100644 drivers/usb/common/usb-otg.c create mode 100644 drivers/usb/common/usb-otg.h create mode 100644 include/linux/usb/usb-otg.h diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index 2f1e2aa..07f59a5 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile @@ -60,5 +60,6 @@ obj-$(CONFIG_USB_RENESAS_USBHS) += renesas_usbhs/ obj-$(CONFIG_USB_GADGET) += gadget/ obj-$(CONFIG_USB_COMMON) += common/ +obj-$(CONFIG_USB_OTG_CORE) += common/ obj-$(CONFIG_USBIP_CORE) += usbip/ diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile index ca2f8bd..573fc75 100644 --- a/drivers/usb/common/Makefile +++ b/drivers/usb/common/Makefile @@ -7,3 +7,4 @@ usb-common-y+= common.o usb-common-$(CONFIG_USB_LED_TRIG) += led.o obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o +obj-$(CONFIG_USB_OTG_CORE) += usb-otg.o diff --git a/drivers/usb/common/usb-otg.c b/drivers/usb/common/usb-otg.c new file mode 100644 index 000..e848e08 --- /dev/null +++ b/drivers/usb/common/usb-otg.c @@ -0,0 +1,743 @@ +/** + * drivers/usb/common/usb-otg.c - USB OTG core + * + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com + * Author: Roger Quadros rog...@ti.com + * + * 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 + * published by the Free Software Foundation. + * + * 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/kernel.h +#include linux/ktime.h +#include linux/hrtimer.h +#include linux/list.h +#include linux/usb/otg.h +#include linux/usb/phy.h /* enum usb_otg_state */ +#include linux/usb/gadget.h +#include linux/usb/usb-otg.h +#include linux/workqueue.h + +#include usb-otg.h + +/* to link timer with callback data */ +struct otg_timer { + struct hrtimer timer; + ktime_t timeout; + /* callback data */ + int *timeout_bit; + struct otg_data *otgd; +}; + +struct otg_hcd { + struct usb_hcd *hcd; + unsigned int irqnum; + unsigned long irqflags; +}; + +struct otg_data { + struct device *dev; /* HCD GCD's parent device */ + + struct otg_fsm fsm; + /* HCD, GCD and usb_otg_state are present in otg_fsm-otg + * HCD is bus_to_hcd(fsm-otg-host) + * GCD is fsm-otg-gadget + */ + struct otg_fsm_ops fsm_ops; /* private copy for override */ + struct usb_otg otg; /* allocator for fsm-otg */ + + struct otg_hcd primary_hcd; + struct otg_hcd shared_hcd; + + /* saved hooks to OTG device */ + int (*start_host)(struct otg_fsm *fsm, int on); + int (*start_gadget)(struct otg_fsm *fsm, int on); + + struct list_head list; + + struct work_struct work;/* OTG FSM work */ + struct workqueue_struct *wq; + + struct otg_timer timers[NUM_OTG_FSM_TIMERS]; + + bool fsm_running; + /* use otg-fsm.lock for serializing access */ +}; + +/* OTG device list */ +LIST_HEAD(otg_list); +static DEFINE_MUTEX(otg_list_mutex); + +/** + * check if device is in our OTG list and return + * otg_data, else NULL. + * + * otg_list_mutex must be held. + */ +static struct otg_data *usb_otg_device_get_otgd(struct device *parent_dev) +{ + struct otg_data *otgd; + + list_for_each_entry(otgd, otg_list, list) { + if (otgd-dev == parent_dev) + return otgd; + } + + return NULL; +} + +/** + * timer callback to set timeout bit and kick FSM + */ +static enum hrtimer_restart set_tmout(struct hrtimer *data)
Re: [RFC][PATCH v2 05/13] usb: otg: add OTG core
On 16/04/15 15:02, Peter Chen wrote: On Tue, Apr 14, 2015 at 01:41:52PM +0300, Roger Quadros wrote: The OTG core instantiates the OTG Finite State Machine per OTG controller and manages starting/stopping the host and gadget controllers based on the bus state. It provides APIs for the following tasks - Registering an OTG capable controller - Registering Host and Gadget controllers to OTG core - Providing inputs to and kicking the OTG state machine TODO: - sysfs interface to allow application inputs to OTG state machine - otg class? Signed-off-by: Roger Quadros rog...@ti.com --- drivers/usb/Makefile | 1 + drivers/usb/common/Makefile | 1 + drivers/usb/common/usb-otg.c | 743 +++ drivers/usb/common/usb-otg.h | 71 + drivers/usb/core/Kconfig | 8 + include/linux/usb/usb-otg.h | 94 ++ There is otg.h at include/linux/usb/, why create another usb-otg.h, it may confuse the user in future I can reuse that file. If I understand correct, in your plan, both DRD and OTG FSM devices will run OTG state machine code, right? That was my original plan but then I thought it unnecessary to initialize all those OTG timers if only DRD operation is needed so I've implemented a very simple DRD state machine. see patch 7. cheers, -roger Peter 6 files changed, 918 insertions(+) create mode 100644 drivers/usb/common/usb-otg.c create mode 100644 drivers/usb/common/usb-otg.h create mode 100644 include/linux/usb/usb-otg.h diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index 2f1e2aa..07f59a5 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile @@ -60,5 +60,6 @@ obj-$(CONFIG_USB_RENESAS_USBHS)+= renesas_usbhs/ obj-$(CONFIG_USB_GADGET)+= gadget/ obj-$(CONFIG_USB_COMMON)+= common/ +obj-$(CONFIG_USB_OTG_CORE) += common/ obj-$(CONFIG_USBIP_CORE)+= usbip/ diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile index ca2f8bd..573fc75 100644 --- a/drivers/usb/common/Makefile +++ b/drivers/usb/common/Makefile @@ -7,3 +7,4 @@ usb-common-y += common.o usb-common-$(CONFIG_USB_LED_TRIG) += led.o obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o +obj-$(CONFIG_USB_OTG_CORE) += usb-otg.o diff --git a/drivers/usb/common/usb-otg.c b/drivers/usb/common/usb-otg.c new file mode 100644 index 000..e848e08 --- /dev/null +++ b/drivers/usb/common/usb-otg.c @@ -0,0 +1,743 @@ +/** + * drivers/usb/common/usb-otg.c - USB OTG core + * + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com + * Author: Roger Quadros rog...@ti.com + * + * 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 + * published by the Free Software Foundation. + * + * 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/kernel.h +#include linux/ktime.h +#include linux/hrtimer.h +#include linux/list.h +#include linux/usb/otg.h +#include linux/usb/phy.h /* enum usb_otg_state */ +#include linux/usb/gadget.h +#include linux/usb/usb-otg.h +#include linux/workqueue.h + +#include usb-otg.h + +/* to link timer with callback data */ +struct otg_timer { +struct hrtimer timer; +ktime_t timeout; +/* callback data */ +int *timeout_bit; +struct otg_data *otgd; +}; + +struct otg_hcd { +struct usb_hcd *hcd; +unsigned int irqnum; +unsigned long irqflags; +}; + +struct otg_data { +struct device *dev; /* HCD GCD's parent device */ + +struct otg_fsm fsm; +/* HCD, GCD and usb_otg_state are present in otg_fsm-otg + * HCD is bus_to_hcd(fsm-otg-host) + * GCD is fsm-otg-gadget + */ +struct otg_fsm_ops fsm_ops; /* private copy for override */ +struct usb_otg otg; /* allocator for fsm-otg */ + +struct otg_hcd primary_hcd; +struct otg_hcd shared_hcd; + +/* saved hooks to OTG device */ +int (*start_host)(struct otg_fsm *fsm, int on); +int (*start_gadget)(struct otg_fsm *fsm, int on); + +struct list_head list; + +struct work_struct work;/* OTG FSM work */ +struct workqueue_struct *wq; + +struct otg_timer timers[NUM_OTG_FSM_TIMERS]; + +bool fsm_running; +/* use otg-fsm.lock for serializing access */ +}; + +/* OTG device list */ +LIST_HEAD(otg_list); +static DEFINE_MUTEX(otg_list_mutex); + +/** + * check if device is in our OTG list and return + * otg_data, else NULL. + * + * otg_list_mutex must be held. + */ +static struct otg_data *usb_otg_device_get_otgd(struct device *parent_dev) +{ +struct otg_data *otgd; + +list_for_each_entry(otgd, otg_list, list) { +
Re: [RFC][PATCH v2 05/13] usb: otg: add OTG core
On 15/04/15 12:29, Paul Bolle wrote: (This will go into a minor detail. That's probably not what you want when posting an RFC. But this patch got caught by an email filter I use and a future, non-RFC, version will get caught too. So I decided to bother you with this now.) On Tue, 2015-04-14 at 13:41 +0300, Roger Quadros wrote: --- a/drivers/usb/common/Makefile +++ b/drivers/usb/common/Makefile +obj-$(CONFIG_USB_OTG_CORE) += usb-otg.o This creates a module usb-otg.ko if CONFIG_USB_OTG_CORE is 'm', built from just usb-otg.c. --- /dev/null +++ b/drivers/usb/common/usb-otg.c + * 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 + * published by the Free Software Foundation. + * + * 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. +EXPORT_SYMBOL_GPL(usb_otg_register); +EXPORT_SYMBOL_GPL(usb_otg_unregister); +EXPORT_SYMBOL_GPL(usb_otg_sync_inputs); +EXPORT_SYMBOL_GPL(usb_otg_kick_fsm); +EXPORT_SYMBOL_GPL(usb_otg_register_hcd); +EXPORT_SYMBOL_GPL(usb_otg_unregister_hcd); +EXPORT_SYMBOL_GPL(usb_otg_register_gadget); +EXPORT_SYMBOL_GPL(usb_otg_unregister_gadget); +EXPORT_SYMBOL_GPL(usb_otg_fsm_to_dev); This code adds no MODULE_LICENSE() macro in this patch and usb-otg.ko will carry no license field. So I think the loading of that module (triggered by loading another module that uses one of the exported symbols, I suppose) taints the kernel. Am I correct? Right. I will fix this. Thanks. cheers, -roger -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [RFC][PATCH v2 05/13] usb: otg: add OTG core
(This will go into a minor detail. That's probably not what you want when posting an RFC. But this patch got caught by an email filter I use and a future, non-RFC, version will get caught too. So I decided to bother you with this now.) On Tue, 2015-04-14 at 13:41 +0300, Roger Quadros wrote: --- a/drivers/usb/common/Makefile +++ b/drivers/usb/common/Makefile +obj-$(CONFIG_USB_OTG_CORE) += usb-otg.o This creates a module usb-otg.ko if CONFIG_USB_OTG_CORE is 'm', built from just usb-otg.c. --- /dev/null +++ b/drivers/usb/common/usb-otg.c + * 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 + * published by the Free Software Foundation. + * + * 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. +EXPORT_SYMBOL_GPL(usb_otg_register); +EXPORT_SYMBOL_GPL(usb_otg_unregister); +EXPORT_SYMBOL_GPL(usb_otg_sync_inputs); +EXPORT_SYMBOL_GPL(usb_otg_kick_fsm); +EXPORT_SYMBOL_GPL(usb_otg_register_hcd); +EXPORT_SYMBOL_GPL(usb_otg_unregister_hcd); +EXPORT_SYMBOL_GPL(usb_otg_register_gadget); +EXPORT_SYMBOL_GPL(usb_otg_unregister_gadget); +EXPORT_SYMBOL_GPL(usb_otg_fsm_to_dev); This code adds no MODULE_LICENSE() macro in this patch and usb-otg.ko will carry no license field. So I think the loading of that module (triggered by loading another module that uses one of the exported symbols, I suppose) taints the kernel. Am I correct? Paul Bolle -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html