All of lore.kernel.org
 help / color / mirror / Atom feed
From: Roger Quadros <rogerq@ti.com>
To: Li Jun <b47624@freescale.com>
Cc: stern@rowland.harvard.edu, balbi@ti.com,
	gregkh@linuxfoundation.org, peter.chen@freescale.com,
	dan.j.williams@intel.com, jun.li@freescale.com,
	mathias.nyman@linux.intel.com, tony@atomide.com,
	Joao.Pinto@synopsys.com, linux-usb@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-omap@vger.kernel.org
Subject: Re: [PATCH v3 10/11] usb: otg: Add dual-role device (DRD) support
Date: Fri, 17 Jul 2015 13:41:31 +0300	[thread overview]
Message-ID: <55A8DBDB.5080304@ti.com> (raw)
In-Reply-To: <20150717081427.GB4515@shlinux2>

On 17/07/15 11:14, Li Jun wrote:
> Hi,
> 
> On Wed, Jul 08, 2015 at 01:19:36PM +0300, Roger Quadros wrote:
>> DRD mode is a reduced functionality OTG mode. In this mode
>> we don't support SRP, HNP and dynamic role-swap.
>>
>> In DRD operation, the controller mode (Host or Peripheral)
>> is decided based on the ID pin status. Once a cable plug (Type-A
>> or Type-B) is attached the controller selects the state
>> and doesn't change till the cable in unplugged and a different
>> cable type is inserted.
>>
>> As we don't need most of the complex OTG states and OTG timers
>> we implement a lean DRD state machine in usb-otg.c.
>> The DRD state machine is only interested in 2 hardware inputs
>> 'id' and 'vbus; that are still passed via the origintal struct otg_fsm.
>>
>> Most of the usb-otg.c functionality remains the same except
>> adding a new parameter to usb_otg_register() to indicate that
>> the OTG controller needs to operate in DRD mode.
>>
>> Signed-off-by: Roger Quadros <rogerq@ti.com>
>> ---
>>  drivers/usb/common/usb-otg.c | 179 ++++++++++++++++++++++++++++++++++++++++---
>>  include/linux/usb/otg-fsm.h  |   8 +-
>>  include/linux/usb/otg.h      |   5 +-
>>  3 files changed, 180 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/usb/common/usb-otg.c b/drivers/usb/common/usb-otg.c
>> index 1f19001..9b89f4b 100644
>> --- a/drivers/usb/common/usb-otg.c
>> +++ b/drivers/usb/common/usb-otg.c
>> @@ -44,6 +44,7 @@ struct otg_hcd {
>>  struct otg_data {
>>  	struct device *dev;	/* HCD & GCD's parent device */
>>  
>> +	bool drd_only;		/* Dual-role only, no OTG features */
> 
> After we introduce otg caps, we can use hnp_support to judge it it's
> drd or OTG.

Yes. I will rebase this series on top of your otg_caps patches
and incorporate it.

> 
>>  	struct otg_fsm fsm;
>>  	/* HCD, GCD and usb_otg_state are present in otg_fsm->otg
>>  	 * HCD is bus_to_hcd(fsm->otg->host)
>> @@ -272,20 +273,172 @@ static int usb_otg_start_gadget(struct otg_fsm *fsm, int on)
>>  	return 0;
>>  }
>>  
>> +/* Change USB protocol when there is a protocol change */
>> +static int drd_set_protocol(struct otg_fsm *fsm, int protocol)
>> +{
>> +	struct otg_data *otgd = container_of(fsm, struct otg_data, fsm);
>> +	int ret = 0;
>> +
>> +	if (fsm->protocol != protocol) {
>> +		dev_dbg(otgd->dev, "otg: changing role fsm->protocol= %d; new protocol= %d\n",
>> +			fsm->protocol, protocol);
>> +		/* stop old protocol */
>> +		if (fsm->protocol == PROTO_HOST)
>> +			ret = otg_start_host(fsm, 0);
>> +		else if (fsm->protocol == PROTO_GADGET)
>> +			ret = otg_start_gadget(fsm, 0);
>> +		if (ret)
>> +			return ret;
>> +
>> +		/* start new protocol */
>> +		if (protocol == PROTO_HOST)
>> +			ret = otg_start_host(fsm, 1);
>> +		else if (protocol == PROTO_GADGET)
>> +			ret = otg_start_gadget(fsm, 1);
>> +		if (ret)
>> +			return ret;
>> +
>> +		fsm->protocol = protocol;
>> +		return 0;
>> +	}
>> +
>> +	return 0;
>> +}
>> +
>> +/* Called when entering a DRD state */
>> +static void drd_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state)
>> +{
>> +	struct otg_data *otgd = container_of(fsm, struct otg_data, fsm);
>> +
>> +	if (fsm->otg->state == new_state)
>> +		return;
>> +
>> +	fsm->state_changed = 1;
>> +	dev_dbg(otgd->dev, "otg: set state: %s\n",
>> +		usb_otg_state_string(new_state));
>> +	switch (new_state) {
>> +	case OTG_STATE_B_IDLE:
> 
> otg_drv_vbus(fsm, 0);
> 
>> +		drd_set_protocol(fsm, PROTO_UNDEF);
>> +		break;
>> +	case OTG_STATE_B_PERIPHERAL:
> 
> otg_drv_vbus(fsm, 0);
> 
>> +		drd_set_protocol(fsm, PROTO_GADGET);
>> +		break;
>> +	case OTG_STATE_A_HOST:
> 
> otg_drv_vbus(fsm, 1);

OK.

> 
>> +		drd_set_protocol(fsm, PROTO_HOST);
>> +		break;
>> +	case OTG_STATE_UNDEFINED:
>> +	case OTG_STATE_B_SRP_INIT:
>> +	case OTG_STATE_B_WAIT_ACON:
>> +	case OTG_STATE_B_HOST:
>> +	case OTG_STATE_A_IDLE:
>> +	case OTG_STATE_A_WAIT_VRISE:
>> +	case OTG_STATE_A_WAIT_BCON:
>> +	case OTG_STATE_A_SUSPEND:
>> +	case OTG_STATE_A_PERIPHERAL:
>> +	case OTG_STATE_A_WAIT_VFALL:
>> +	case OTG_STATE_A_VBUS_ERR:
>> +	default:
>> +		dev_warn(otgd->dev, "%s: otg: invalid state: %s\n",
>> +			 __func__, usb_otg_state_string(new_state));
>> +		break;
>> +	}
>> +
>> +	fsm->otg->state = new_state;
>> +}
>> +

cheers,
-roger

WARNING: multiple messages have this Message-ID (diff)
From: Roger Quadros <rogerq@ti.com>
To: Li Jun <b47624@freescale.com>
Cc: <stern@rowland.harvard.edu>, <balbi@ti.com>,
	<gregkh@linuxfoundation.org>, <peter.chen@freescale.com>,
	<dan.j.williams@intel.com>, <jun.li@freescale.com>,
	<mathias.nyman@linux.intel.com>, <tony@atomide.com>,
	<Joao.Pinto@synopsys.com>, <linux-usb@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>, <linux-omap@vger.kernel.org>
Subject: Re: [PATCH v3 10/11] usb: otg: Add dual-role device (DRD) support
Date: Fri, 17 Jul 2015 13:41:31 +0300	[thread overview]
Message-ID: <55A8DBDB.5080304@ti.com> (raw)
In-Reply-To: <20150717081427.GB4515@shlinux2>

On 17/07/15 11:14, Li Jun wrote:
> Hi,
> 
> On Wed, Jul 08, 2015 at 01:19:36PM +0300, Roger Quadros wrote:
>> DRD mode is a reduced functionality OTG mode. In this mode
>> we don't support SRP, HNP and dynamic role-swap.
>>
>> In DRD operation, the controller mode (Host or Peripheral)
>> is decided based on the ID pin status. Once a cable plug (Type-A
>> or Type-B) is attached the controller selects the state
>> and doesn't change till the cable in unplugged and a different
>> cable type is inserted.
>>
>> As we don't need most of the complex OTG states and OTG timers
>> we implement a lean DRD state machine in usb-otg.c.
>> The DRD state machine is only interested in 2 hardware inputs
>> 'id' and 'vbus; that are still passed via the origintal struct otg_fsm.
>>
>> Most of the usb-otg.c functionality remains the same except
>> adding a new parameter to usb_otg_register() to indicate that
>> the OTG controller needs to operate in DRD mode.
>>
>> Signed-off-by: Roger Quadros <rogerq@ti.com>
>> ---
>>  drivers/usb/common/usb-otg.c | 179 ++++++++++++++++++++++++++++++++++++++++---
>>  include/linux/usb/otg-fsm.h  |   8 +-
>>  include/linux/usb/otg.h      |   5 +-
>>  3 files changed, 180 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/usb/common/usb-otg.c b/drivers/usb/common/usb-otg.c
>> index 1f19001..9b89f4b 100644
>> --- a/drivers/usb/common/usb-otg.c
>> +++ b/drivers/usb/common/usb-otg.c
>> @@ -44,6 +44,7 @@ struct otg_hcd {
>>  struct otg_data {
>>  	struct device *dev;	/* HCD & GCD's parent device */
>>  
>> +	bool drd_only;		/* Dual-role only, no OTG features */
> 
> After we introduce otg caps, we can use hnp_support to judge it it's
> drd or OTG.

Yes. I will rebase this series on top of your otg_caps patches
and incorporate it.

> 
>>  	struct otg_fsm fsm;
>>  	/* HCD, GCD and usb_otg_state are present in otg_fsm->otg
>>  	 * HCD is bus_to_hcd(fsm->otg->host)
>> @@ -272,20 +273,172 @@ static int usb_otg_start_gadget(struct otg_fsm *fsm, int on)
>>  	return 0;
>>  }
>>  
>> +/* Change USB protocol when there is a protocol change */
>> +static int drd_set_protocol(struct otg_fsm *fsm, int protocol)
>> +{
>> +	struct otg_data *otgd = container_of(fsm, struct otg_data, fsm);
>> +	int ret = 0;
>> +
>> +	if (fsm->protocol != protocol) {
>> +		dev_dbg(otgd->dev, "otg: changing role fsm->protocol= %d; new protocol= %d\n",
>> +			fsm->protocol, protocol);
>> +		/* stop old protocol */
>> +		if (fsm->protocol == PROTO_HOST)
>> +			ret = otg_start_host(fsm, 0);
>> +		else if (fsm->protocol == PROTO_GADGET)
>> +			ret = otg_start_gadget(fsm, 0);
>> +		if (ret)
>> +			return ret;
>> +
>> +		/* start new protocol */
>> +		if (protocol == PROTO_HOST)
>> +			ret = otg_start_host(fsm, 1);
>> +		else if (protocol == PROTO_GADGET)
>> +			ret = otg_start_gadget(fsm, 1);
>> +		if (ret)
>> +			return ret;
>> +
>> +		fsm->protocol = protocol;
>> +		return 0;
>> +	}
>> +
>> +	return 0;
>> +}
>> +
>> +/* Called when entering a DRD state */
>> +static void drd_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state)
>> +{
>> +	struct otg_data *otgd = container_of(fsm, struct otg_data, fsm);
>> +
>> +	if (fsm->otg->state == new_state)
>> +		return;
>> +
>> +	fsm->state_changed = 1;
>> +	dev_dbg(otgd->dev, "otg: set state: %s\n",
>> +		usb_otg_state_string(new_state));
>> +	switch (new_state) {
>> +	case OTG_STATE_B_IDLE:
> 
> otg_drv_vbus(fsm, 0);
> 
>> +		drd_set_protocol(fsm, PROTO_UNDEF);
>> +		break;
>> +	case OTG_STATE_B_PERIPHERAL:
> 
> otg_drv_vbus(fsm, 0);
> 
>> +		drd_set_protocol(fsm, PROTO_GADGET);
>> +		break;
>> +	case OTG_STATE_A_HOST:
> 
> otg_drv_vbus(fsm, 1);

OK.

> 
>> +		drd_set_protocol(fsm, PROTO_HOST);
>> +		break;
>> +	case OTG_STATE_UNDEFINED:
>> +	case OTG_STATE_B_SRP_INIT:
>> +	case OTG_STATE_B_WAIT_ACON:
>> +	case OTG_STATE_B_HOST:
>> +	case OTG_STATE_A_IDLE:
>> +	case OTG_STATE_A_WAIT_VRISE:
>> +	case OTG_STATE_A_WAIT_BCON:
>> +	case OTG_STATE_A_SUSPEND:
>> +	case OTG_STATE_A_PERIPHERAL:
>> +	case OTG_STATE_A_WAIT_VFALL:
>> +	case OTG_STATE_A_VBUS_ERR:
>> +	default:
>> +		dev_warn(otgd->dev, "%s: otg: invalid state: %s\n",
>> +			 __func__, usb_otg_state_string(new_state));
>> +		break;
>> +	}
>> +
>> +	fsm->otg->state = new_state;
>> +}
>> +

cheers,
-roger

  reply	other threads:[~2015-07-17 10:41 UTC|newest]

Thread overview: 109+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-08 10:19 [PATCH v3 00/11] USB: OTG/DRD Core functionality Roger Quadros
2015-07-08 10:19 ` Roger Quadros
2015-07-08 10:19 ` [PATCH v3 01/11] usb: otg-fsm: Add documentation for struct otg_fsm Roger Quadros
2015-07-08 10:19   ` Roger Quadros
2015-07-13  1:21   ` Peter Chen
2015-07-13  1:21     ` Peter Chen
2015-07-13 10:06     ` Roger Quadros
2015-07-13 10:06       ` Roger Quadros
2015-07-08 10:19 ` [PATCH v3 02/11] usb: otg-fsm: support multiple instances Roger Quadros
2015-07-08 10:19   ` Roger Quadros
     [not found]   ` <1436350777-28056-3-git-send-email-rogerq-l0cyMroinI0@public.gmane.org>
2015-07-10  8:06     ` Li Jun
2015-07-10  8:06       ` Li Jun
2015-07-13  1:39       ` Peter Chen
2015-07-13  1:39         ` Peter Chen
2015-07-17 11:17         ` Roger Quadros
2015-07-17 11:17           ` Roger Quadros
2015-07-08 10:19 ` [PATCH v3 03/11] usb: otg-fsm: Prevent build warning "VDBG" redefined Roger Quadros
2015-07-08 10:19   ` Roger Quadros
     [not found]   ` <1436350777-28056-4-git-send-email-rogerq-l0cyMroinI0@public.gmane.org>
2015-07-13  1:52     ` Peter Chen
2015-07-13  1:52       ` Peter Chen
2015-07-08 10:19 ` [PATCH v3 04/11] otg-fsm: move usb_bus_start_enum into otg-fsm->ops Roger Quadros
2015-07-08 10:19   ` Roger Quadros
     [not found]   ` <1436350777-28056-5-git-send-email-rogerq-l0cyMroinI0@public.gmane.org>
2015-07-13  1:58     ` Peter Chen
2015-07-13  1:58       ` Peter Chen
2015-07-13 10:13       ` Roger Quadros
2015-07-13 10:13         ` Roger Quadros
2015-07-14  0:34         ` Peter Chen
2015-07-14  0:34           ` Peter Chen
2015-07-15 13:30           ` Roger Quadros
2015-07-15 13:30             ` Roger Quadros
2015-07-16  0:54             ` Peter Chen
2015-07-16  0:54               ` Peter Chen
2015-07-16 10:40               ` Roger Quadros
2015-07-16 10:40                 ` Roger Quadros
2015-07-17  0:28   ` Peter Chen
2015-07-17  0:28     ` Peter Chen
2015-07-08 10:19 ` [PATCH v3 05/11] usb: hcd.h: Add OTG to HCD interface Roger Quadros
2015-07-08 10:19   ` Roger Quadros
     [not found]   ` <1436350777-28056-6-git-send-email-rogerq-l0cyMroinI0@public.gmane.org>
2015-07-13  2:00     ` Peter Chen
2015-07-13  2:00       ` Peter Chen
2015-07-17  0:30     ` Peter Chen
2015-07-17  0:30       ` Peter Chen
2015-07-08 10:19 ` [PATCH v3 07/11] usb: otg: add OTG core Roger Quadros
2015-07-08 10:19   ` Roger Quadros
2015-07-13  2:14   ` Peter Chen
2015-07-13  2:14     ` Peter Chen
2015-07-13 10:20     ` Roger Quadros
2015-07-13 10:20       ` Roger Quadros
2015-08-14  9:42       ` Roger Quadros
2015-08-14  9:42         ` Roger Quadros
     [not found]         ` <55CDB80E.2030403-l0cyMroinI0@public.gmane.org>
2015-08-14  8:43           ` Peter Chen
2015-08-14  8:43             ` Peter Chen
2015-07-17  7:48   ` Li Jun
2015-07-17  7:48     ` Li Jun
2015-07-17 12:06     ` Roger Quadros
2015-07-17 12:06       ` Roger Quadros
2015-07-20  1:45       ` Peter Chen
2015-07-20  1:45         ` Peter Chen
2015-07-21 10:52       ` Li Jun
2015-07-21 10:52         ` Li Jun
2015-07-27 10:03         ` Roger Quadros
2015-07-27 10:03           ` Roger Quadros
2015-07-08 10:19 ` [PATCH v3 08/11] usb: hcd: Adapt to " Roger Quadros
2015-07-08 10:19   ` Roger Quadros
2015-07-08 10:19 ` [PATCH v3 10/11] usb: otg: Add dual-role device (DRD) support Roger Quadros
2015-07-08 10:19   ` Roger Quadros
2015-07-17  8:14   ` Li Jun
2015-07-17  8:14     ` Li Jun
2015-07-17 10:41     ` Roger Quadros [this message]
2015-07-17 10:41       ` Roger Quadros
2015-07-17  9:02   ` Li Jun
2015-07-17  9:02     ` Li Jun
2015-07-17 10:47     ` Roger Quadros
2015-07-17 10:47       ` Roger Quadros
     [not found]       ` <55A8DD30.5030407-l0cyMroinI0@public.gmane.org>
2015-07-20  1:23         ` Peter Chen
2015-07-20  1:23           ` Peter Chen
2015-07-27  9:31           ` Roger Quadros
2015-07-27  9:31             ` Roger Quadros
2015-07-08 10:19 ` [PATCH v3 11/11] usb: otg: hub: Notify OTG fsm when A device sets b_hnp_enable Roger Quadros
2015-07-08 10:19   ` Roger Quadros
2015-07-08 10:23 ` [PATCH v3 12/12] usb: chipidea: move from CONFIG_USB_OTG_FSM to CONFIG_USB_OTG Roger Quadros
2015-07-08 10:23   ` Roger Quadros
     [not found] ` <1436350777-28056-1-git-send-email-rogerq-l0cyMroinI0@public.gmane.org>
2015-07-08 10:19   ` [PATCH v3 06/11] usb: gadget.h: Add OTG to gadget interface Roger Quadros
2015-07-08 10:19     ` Roger Quadros
     [not found]     ` <1436350777-28056-7-git-send-email-rogerq-l0cyMroinI0@public.gmane.org>
2015-07-17  0:31       ` Peter Chen
2015-07-17  0:31         ` Peter Chen
2015-07-08 10:19   ` [PATCH v3 09/11] usb: gadget: udc: adapt to OTG core Roger Quadros
2015-07-08 10:19     ` Roger Quadros
2015-07-10  7:58   ` [PATCH v3 00/11] USB: OTG/DRD Core functionality Li Jun
2015-07-10  7:58     ` Li Jun
2015-07-13 10:24     ` Roger Quadros
2015-07-13 10:24       ` Roger Quadros
     [not found]       ` <55A391C5.4010701-l0cyMroinI0@public.gmane.org>
2015-07-13 13:04         ` Li Jun
2015-07-13 13:04           ` Li Jun
2015-07-15 13:07           ` Roger Quadros
2015-07-15 13:07             ` Roger Quadros
2015-07-13 19:14   ` Andrew Bresticker
2015-07-13 19:14     ` Andrew Bresticker
2015-07-14  0:59     ` Peter Chen
2015-07-14  0:59       ` Peter Chen
2015-07-14 18:18       ` Andrew Bresticker
2015-07-15  2:13         ` Peter Chen
2015-07-15  2:13           ` Peter Chen
2015-07-15 13:26     ` Roger Quadros
2015-07-15 13:26       ` Roger Quadros
     [not found]       ` <55A65F98.203-l0cyMroinI0@public.gmane.org>
2015-07-16 18:29         ` Andrew Bresticker
2015-07-16 18:29           ` Andrew Bresticker
2015-07-17 10:34           ` Roger Quadros
2015-07-17 10:34             ` Roger Quadros

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55A8DBDB.5080304@ti.com \
    --to=rogerq@ti.com \
    --cc=Joao.Pinto@synopsys.com \
    --cc=b47624@freescale.com \
    --cc=balbi@ti.com \
    --cc=dan.j.williams@intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jun.li@freescale.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=mathias.nyman@linux.intel.com \
    --cc=peter.chen@freescale.com \
    --cc=stern@rowland.harvard.edu \
    --cc=tony@atomide.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.