All of lore.kernel.org
 help / color / mirror / Atom feed
From: Roger Quadros <rogerq@ti.com>
To: Pawel Laszczak <pawell@cadence.com>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>
Cc: "gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Alan Douglas <adouglas@cadence.com>,
	"jbergsagel@ti.com" <jbergsagel@ti.com>,
	"nsekhar@ti.com" <nsekhar@ti.com>, "nm@ti.com" <nm@ti.com>,
	Suresh Punnoose <sureshp@cadence.com>,
	"peter.chen@nxp.com" <peter.chen@nxp.com>,
	Pawel Jez <pjez@cadence.com>, Rahul Kumar <kurahul@cadence.com>
Subject: [RFC,v2,05/15] usb:cdns3: Added DRD support
Date: Mon, 26 Nov 2018 10:07:24 +0200	[thread overview]
Message-ID: <5BFBA9BC.20306@ti.com> (raw)

Pawel,

On 26/11/18 09:23, Pawel Laszczak wrote:
> Hi Roger,
> 
>> On 18/11/18 12:09, Pawel Laszczak wrote:
>>> Patch adds supports for detecting Host/Device mode.
>>> Controller has additional OTG register that allow
>>> implement even whole OTG functionality.
>>> At this moment patch adds support only for detecting
>>> the appropriate mode based on strap pins and ID pin.
>>>
>>> Signed-off-by: Pawel Laszczak <pawell@cadence.com>
>>> ---
>>>  drivers/usb/cdns3/Makefile |   2 +-
>>>  drivers/usb/cdns3/core.c   |  27 +++--
>>>  drivers/usb/cdns3/drd.c    | 229 +++++++++++++++++++++++++++++++++++++
>>>  drivers/usb/cdns3/drd.h    | 122 ++++++++++++++++++++
>>>  4 files changed, 372 insertions(+), 8 deletions(-)
>>>  create mode 100644 drivers/usb/cdns3/drd.c
>>>  create mode 100644 drivers/usb/cdns3/drd.h
>>>
>>> diff --git a/drivers/usb/cdns3/Makefile b/drivers/usb/cdns3/Makefile
>>> index 02d25b23c5d3..e779b2a2f8eb 100644
>>> --- a/drivers/usb/cdns3/Makefile
>>> +++ b/drivers/usb/cdns3/Makefile
>>> @@ -1,5 +1,5 @@
>>>  obj-$(CONFIG_USB_CDNS3)			+= cdns3.o
>>>  obj-$(CONFIG_USB_CDNS3_PCI_WRAP)	+= cdns3-pci.o
>>>
>>> -cdns3-y					:= core.o
>>> +cdns3-y					:= core.o drd.o
>>>  cdns3-pci-y		 		:= cdns3-pci-wrap.o
>>> diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c
>>> index f9055d4da67f..dbee4325da7f 100644
>>> --- a/drivers/usb/cdns3/core.c
>>> +++ b/drivers/usb/cdns3/core.c
>>> @@ -17,6 +17,7 @@
>>>
>>>  #include "gadget.h"
>>>  #include "core.h"
>>> +#include "drd.h"
>>>
>>>  static inline struct cdns3_role_driver *cdns3_get_current_role_driver(struct cdns3 *cdns)
>>>  {
>>> @@ -57,8 +58,10 @@ static inline void cdns3_role_stop(struct cdns3 *cdns)
>>>  static enum cdns3_roles cdns3_get_role(struct cdns3 *cdns)
>>>  {
>>>  	if (cdns->roles[CDNS3_ROLE_HOST] && cdns->roles[CDNS3_ROLE_GADGET]) {
>>> -		//TODO: implements selecting device/host mode
>>> -		return CDNS3_ROLE_HOST;
>>> +		if (cdns3_is_host(cdns))
>>> +			return CDNS3_ROLE_HOST;
>>> +		if (cdns3_is_device(cdns))
>>> +			return CDNS3_ROLE_GADGET;
>>>  	}
>>>  	return cdns->roles[CDNS3_ROLE_HOST]
>>>  		? CDNS3_ROLE_HOST
>>> @@ -124,6 +127,12 @@ static irqreturn_t cdns3_irq(int irq, void *data)
>>>  	struct cdns3 *cdns = data;
>>>  	irqreturn_t ret = IRQ_NONE;
>>>
>>> +	if (cdns->dr_mode == USB_DR_MODE_OTG) {
>>> +		ret = cdns3_drd_irq(cdns);
>>> +		if (ret == IRQ_HANDLED)
>>> +			return ret;
>>> +	}
>>
>> The kernel's shared IRQ model takes care of sharing the same interrupt
>> between different devices and their drivers. You don't need to manually
>> handle it here. Just let all 3 drivers do a request_irq() and have
>> handlers check if the IRQ was theirs or not and return IRQ_HANDLED or
>> IRQ_NONE accordingly.
>>
>> Looks like you can do away with irq member of the role driver struct.
> 
> Ok, I will split it into 3 separate part, but in this case, I additionally have to check the current 
> role in ISR function. Driver can't read host side registers when controller works in device role 
> and vice versa. One part of controller is kept in reset. Only DRD registers are common and are all accessible.
> 

In which ISR do you need to check current role?

I'm not sure if we are on the same page.
Core (drd) driver shouldn't read host/device side registers. All 3 drivers,
i.e. DRD(core), Host (xhci) and device (cdns3) should do a request_irq()
and process their respective IRQ events.

>>> +
>>>  	/* Handle device/host interrupt */
>>>  	if (cdns->role != CDNS3_ROLE_END)
>>>  		ret = cdns3_get_current_role_driver(cdns)->irq(cdns);
>>> @@ -176,11 +185,8 @@ static void cdns3_role_switch(struct work_struct *work)
>>>
>>>  	cdns = container_of(work, struct cdns3, role_switch_wq);
>>>
>>> -	//TODO: implements this functions.
>>> -	//host = cdns3_is_host(cdns);
>>> -	//device = cdns3_is_device(cdns);
>>> -	host = 1;
>>> -	device = 0;
>>> +	host = cdns3_is_host(cdns);
>>> +	device = cdns3_is_device(cdns);
>>
>> What if there is a ID transition between the 2 functions so that
>> and both host and device become true?
>> Since you are checking the ID level separately in both the functions.
>>
>> How about instead having cdns3_get_id() and using
>> it to start/stop relevant roles if we are in OTG mode.
>>
>> Is this going to be used for a role switch even if we're not in OTG mode?
>> If not then it is a BUG if we get here.
>>
> Good point.
> User can change current mode by debugfs and then this function will also invoked.
> Probably I use  cdns3_get_id as you suggest. 
> 
>>>
>>>  	if (host)
>>>  		role = CDNS3_ROLE_HOST;
>>> @@ -194,6 +200,12 @@ static void cdns3_role_switch(struct work_struct *work)
>>>  	pm_runtime_get_sync(cdns->dev);
>>>  	cdns3_role_stop(cdns);
>>>
>>> +	if (cdns->desired_dr_mode != cdns->current_dr_mode) {
>>
>> This is about roles, why are we checking dr_mode here?
> 
> Because after changing dr_mode by means of debugfs we need to update mode. 
> Driver should do this after stopping the previous role.  I will move this condition 
> to cdns3_drd_update_mode and add comment in this place. 
> 
>>
>>> +		cdns3_drd_update_mode(cdns);
>>> +		host = cdns3_is_host(cdns);
>>> +		device = cdns3_is_device(cdns);
>>> +	}
>>> +
>>>  	if (host) {
>>>  		if (cdns->roles[CDNS3_ROLE_HOST])
>>>  			cdns3_do_role_switch(cdns, CDNS3_ROLE_HOST);
>>> @@ -287,6 +299,7 @@ static int cdns3_probe(struct platform_device *pdev)
>>>  	if (ret)
>>>  		goto err2;
>>>
>>> +	ret = cdns3_drd_init(cdns);
>>>  	if (ret)
>>>  		goto err2;
>>>
>>> diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c
>>> new file mode 100644
>>> index 000000000000..ac741c80e776
>>> --- /dev/null
>>> +++ b/drivers/usb/cdns3/drd.c
>>> @@ -0,0 +1,229 @@
>>> +// SPDX-License-Identifier: GPL-2.0
>>> +/*
>>> + * Cadence USBSS DRD Driver.
>>> + *
>>> + * Copyright (C) 2018 Cadence.
>>> + *
>>> + * Author: Pawel Laszczak <pawell@cadence.com
>>> + *
>>> + */
>>> +#include <linux/kernel.h>
>>> +#include <linux/interrupt.h>
>>> +#include <linux/delay.h>
>>> +#include <linux/usb/otg.h>
>>> +
>>> +#include "gadget.h"
>>> +#include "drd.h"
>>> +
>>> +/**
>>> + * cdns3_set_mode - change mode of OTG Core
>>> + * @cdns: pointer to context structure
>>> + * @mode: selected mode from cdns_role
>>> + */
>>> +void cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode mode)
>>> +{
>>> +	u32 reg;
>>> +
>>> +	cdns->current_dr_mode = mode;
>>> +	switch (mode) {
>>> +	case USB_DR_MODE_PERIPHERAL:
>>> +		dev_info(cdns->dev, "Set controller to Gadget mode\n");
>>> +		writel(OTGCMD_DEV_BUS_REQ | OTGCMD_OTG_DIS,
>>> +		       &cdns->otg_regs->cmd);
>>> +		break;
>>> +	case USB_DR_MODE_HOST:
>>> +		dev_info(cdns->dev, "Set controller to Host mode\n");
>>> +		writel(OTGCMD_HOST_BUS_REQ | OTGCMD_OTG_DIS,
>>> +		       &cdns->otg_regs->cmd);
>>> +		break;
>>> +	case USB_DR_MODE_OTG:
>>> +		dev_info(cdns->dev, "Set controller to OTG mode\n");
>>> +		reg = readl(&cdns->otg_regs->ctrl1);
>>> +		reg |= OTGCTRL1_IDPULLUP;
>>> +		writel(reg, &cdns->otg_regs->ctrl1);
>>> +
>>> +		/* wait until valid ID (ID_VALUE) can be sampled (50ms). */
>>> +		mdelay(50);
>>> +		break;
>>> +	default:
>>> +		cdns->current_dr_mode = USB_DR_MODE_UNKNOWN;
>>> +		dev_err(cdns->dev, "Unsupported mode of operation %d\n", mode);
>>> +		return;
>>> +	}
>>> +}
>>> +
>>> +static int cdns3_otg_get_id(struct cdns3 *cdns)
>>> +{
>>> +	int id;
>>> +
>>> +	id = readl(&cdns->otg_regs->sts) & OTGSTS_ID_VALUE;
>>> +	dev_dbg(cdns->dev, "OTG ID: %d", id);
>>> +	return id;
>>> +}
>>> +
>>> +int cdns3_is_host(struct cdns3 *cdns)
>>> +{
>>> +	if (cdns->current_dr_mode == USB_DR_MODE_HOST)
>>> +		return 1;
>>
>> Why do you need this?
> 
> I assumed that some SoC could have cut DRD /OTG and Device or Host part. 
> In such case the driver cannot be based on ID pin. 
> For only HOST it's not a problem because 
> the standard XHCI driver will be used.  Probably I will remove this fragment.
>>
>>> +	else if (cdns->current_dr_mode == USB_DR_MODE_OTG)
>>> +		if (!cdns3_otg_get_id(cdns))
>>> +			return 1;
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +int cdns3_is_device(struct cdns3 *cdns)
>>> +{
>>> +	if (cdns->current_dr_mode == USB_DR_MODE_PERIPHERAL)
>>> +		return 1;
>>> +	else if (cdns->current_dr_mode == USB_DR_MODE_OTG)
>>> +		if (cdns3_otg_get_id(cdns))
>>> +			return 1;
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +/**
>>> + * cdns3_otg_disable_irq - Disable all OTG interrupts
>>> + * @cdns: Pointer to controller context structure
>>> + */
>>> +static void cdns3_otg_disable_irq(struct cdns3 *cdns)
>>> +{
>>> +	writel(0, &cdns->otg_regs->ien);
>>> +}
>>> +
>>> +/**
>>> + * cdns3_otg_enable_irq - enable id and sess_valid interrupts
>>> + * @cdns: Pointer to controller context structure
>>> + */
>>> +static void cdns3_otg_enable_irq(struct cdns3 *cdns)
>>> +{
>>> +	writel(OTGIEN_ID_CHANGE_INT | OTGIEN_VBUSVALID_RISE_INT |
>>> +	       OTGIEN_VBUSVALID_FALL_INT, &cdns->otg_regs->ien);
>>> +}
>>> +
>>> +/**
>>> + * cdns3_init_otg_mode - initialize drd controller
>>> + * @cdns: Pointer to controller context structure
>>> + *
>>> + * Returns 0 on success otherwise negative errno
>>> + */
>>> +static void cdns3_init_otg_mode(struct cdns3 *cdns)
>>> +{
>>> +	cdns3_otg_disable_irq(cdns);
>>> +	/* clear all interrupts */
>>> +	writel(~0, &cdns->otg_regs->ivect);
>>> +
>>> +	cdns3_set_mode(cdns, USB_DR_MODE_OTG);
>>> +
>>> +	cdns3_otg_enable_irq(cdns);
>>> +}
>>> +
>>> +/**
>>> + * cdns3_drd_update_mode - initialize mode of operation
>>
>> Looks like this will be called only once. How about calling it
>>
>> cdns3_drd_init_mode()?
> 
> It will be also called after changing dr_mode from debugfs.
> 
>>> + * @cdns: Pointer to controller context structure
>>> + *
>>> + * Returns 0 on success otherwise negative errno
>>> + */
>>> +int cdns3_drd_update_mode(struct cdns3 *cdns)
>>> +{
>>> +	int ret = 0;
>>> +
>>> +	switch (cdns->desired_dr_mode) {
>>
>> I think we can get rid of desired_dr_mode member in struct cdns.
>> Just pass the mode as an argument to cdns3_drd_init_mode()
> 
> This will be used also in patch that introduce debugfs. This filed is also used 
> during changing dr_mode from user space.
> 
> My intention was:
> dr_mode - indicated what driver can support, this filed based on dr_mode from device tree, 
> 	     straps bits from otg register and kernel configuration. 
> desired_ dr_mode - the next mode desired by user, changed by debugfs 
> current_dr_mode  - actually selected mode 
> 

OK, makes sense. But let's keep this patch simple. Add only the members you need right now.
Introduce the new one (desired_dr_mode) in the debugfs patch.

>>
>> And we already have cdns->dr_mode.
>>
>>> +	case USB_DR_MODE_PERIPHERAL:
>>> +		cdns3_set_mode(cdns, USB_DR_MODE_PERIPHERAL);
>>> +		break;
>>> +	case USB_DR_MODE_HOST:
>>> +		cdns3_set_mode(cdns, USB_DR_MODE_HOST);
>>> +		break;
>>> +	case USB_DR_MODE_OTG:
>>> +		cdns3_init_otg_mode(cdns);
>>> +		break;
>>> +	default:
>>> +		dev_err(cdns->dev, "Unsupported mode of operation %d\n",
>>> +			cdns->dr_mode);
>>> +		return -EINVAL;
>>> +	}
>>> +
>>> +	return ret;
>>> +}

<snip>

cheers,
-roger

WARNING: multiple messages have this Message-ID (diff)
From: Roger Quadros <rogerq@ti.com>
To: Pawel Laszczak <pawell@cadence.com>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>
Cc: "gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Alan Douglas <adouglas@cadence.com>,
	"jbergsagel@ti.com" <jbergsagel@ti.com>,
	"nsekhar@ti.com" <nsekhar@ti.com>, "nm@ti.com" <nm@ti.com>,
	Suresh Punnoose <sureshp@cadence.com>,
	"peter.chen@nxp.com" <peter.chen@nxp.com>,
	Pawel Jez <pjez@cadence.com>, Rahul Kumar <kurahul@cadence.com>
Subject: Re: [RFC PATCH v2 05/15] usb:cdns3: Added DRD support
Date: Mon, 26 Nov 2018 10:07:24 +0200	[thread overview]
Message-ID: <5BFBA9BC.20306@ti.com> (raw)
In-Reply-To: <BYAPR07MB470991EB0AE200B6481AEE35DDD70@BYAPR07MB4709.namprd07.prod.outlook.com>

Pawel,

On 26/11/18 09:23, Pawel Laszczak wrote:
> Hi Roger,
> 
>> On 18/11/18 12:09, Pawel Laszczak wrote:
>>> Patch adds supports for detecting Host/Device mode.
>>> Controller has additional OTG register that allow
>>> implement even whole OTG functionality.
>>> At this moment patch adds support only for detecting
>>> the appropriate mode based on strap pins and ID pin.
>>>
>>> Signed-off-by: Pawel Laszczak <pawell@cadence.com>
>>> ---
>>>  drivers/usb/cdns3/Makefile |   2 +-
>>>  drivers/usb/cdns3/core.c   |  27 +++--
>>>  drivers/usb/cdns3/drd.c    | 229 +++++++++++++++++++++++++++++++++++++
>>>  drivers/usb/cdns3/drd.h    | 122 ++++++++++++++++++++
>>>  4 files changed, 372 insertions(+), 8 deletions(-)
>>>  create mode 100644 drivers/usb/cdns3/drd.c
>>>  create mode 100644 drivers/usb/cdns3/drd.h
>>>
>>> diff --git a/drivers/usb/cdns3/Makefile b/drivers/usb/cdns3/Makefile
>>> index 02d25b23c5d3..e779b2a2f8eb 100644
>>> --- a/drivers/usb/cdns3/Makefile
>>> +++ b/drivers/usb/cdns3/Makefile
>>> @@ -1,5 +1,5 @@
>>>  obj-$(CONFIG_USB_CDNS3)			+= cdns3.o
>>>  obj-$(CONFIG_USB_CDNS3_PCI_WRAP)	+= cdns3-pci.o
>>>
>>> -cdns3-y					:= core.o
>>> +cdns3-y					:= core.o drd.o
>>>  cdns3-pci-y		 		:= cdns3-pci-wrap.o
>>> diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c
>>> index f9055d4da67f..dbee4325da7f 100644
>>> --- a/drivers/usb/cdns3/core.c
>>> +++ b/drivers/usb/cdns3/core.c
>>> @@ -17,6 +17,7 @@
>>>
>>>  #include "gadget.h"
>>>  #include "core.h"
>>> +#include "drd.h"
>>>
>>>  static inline struct cdns3_role_driver *cdns3_get_current_role_driver(struct cdns3 *cdns)
>>>  {
>>> @@ -57,8 +58,10 @@ static inline void cdns3_role_stop(struct cdns3 *cdns)
>>>  static enum cdns3_roles cdns3_get_role(struct cdns3 *cdns)
>>>  {
>>>  	if (cdns->roles[CDNS3_ROLE_HOST] && cdns->roles[CDNS3_ROLE_GADGET]) {
>>> -		//TODO: implements selecting device/host mode
>>> -		return CDNS3_ROLE_HOST;
>>> +		if (cdns3_is_host(cdns))
>>> +			return CDNS3_ROLE_HOST;
>>> +		if (cdns3_is_device(cdns))
>>> +			return CDNS3_ROLE_GADGET;
>>>  	}
>>>  	return cdns->roles[CDNS3_ROLE_HOST]
>>>  		? CDNS3_ROLE_HOST
>>> @@ -124,6 +127,12 @@ static irqreturn_t cdns3_irq(int irq, void *data)
>>>  	struct cdns3 *cdns = data;
>>>  	irqreturn_t ret = IRQ_NONE;
>>>
>>> +	if (cdns->dr_mode == USB_DR_MODE_OTG) {
>>> +		ret = cdns3_drd_irq(cdns);
>>> +		if (ret == IRQ_HANDLED)
>>> +			return ret;
>>> +	}
>>
>> The kernel's shared IRQ model takes care of sharing the same interrupt
>> between different devices and their drivers. You don't need to manually
>> handle it here. Just let all 3 drivers do a request_irq() and have
>> handlers check if the IRQ was theirs or not and return IRQ_HANDLED or
>> IRQ_NONE accordingly.
>>
>> Looks like you can do away with irq member of the role driver struct.
> 
> Ok, I will split it into 3 separate part, but in this case, I additionally have to check the current 
> role in ISR function. Driver can't read host side registers when controller works in device role 
> and vice versa. One part of controller is kept in reset. Only DRD registers are common and are all accessible.
> 

In which ISR do you need to check current role?

I'm not sure if we are on the same page.
Core (drd) driver shouldn't read host/device side registers. All 3 drivers,
i.e. DRD(core), Host (xhci) and device (cdns3) should do a request_irq()
and process their respective IRQ events.

>>> +
>>>  	/* Handle device/host interrupt */
>>>  	if (cdns->role != CDNS3_ROLE_END)
>>>  		ret = cdns3_get_current_role_driver(cdns)->irq(cdns);
>>> @@ -176,11 +185,8 @@ static void cdns3_role_switch(struct work_struct *work)
>>>
>>>  	cdns = container_of(work, struct cdns3, role_switch_wq);
>>>
>>> -	//TODO: implements this functions.
>>> -	//host = cdns3_is_host(cdns);
>>> -	//device = cdns3_is_device(cdns);
>>> -	host = 1;
>>> -	device = 0;
>>> +	host = cdns3_is_host(cdns);
>>> +	device = cdns3_is_device(cdns);
>>
>> What if there is a ID transition between the 2 functions so that
>> and both host and device become true?
>> Since you are checking the ID level separately in both the functions.
>>
>> How about instead having cdns3_get_id() and using
>> it to start/stop relevant roles if we are in OTG mode.
>>
>> Is this going to be used for a role switch even if we're not in OTG mode?
>> If not then it is a BUG if we get here.
>>
> Good point.
> User can change current mode by debugfs and then this function will also invoked.
> Probably I use  cdns3_get_id as you suggest. 
> 
>>>
>>>  	if (host)
>>>  		role = CDNS3_ROLE_HOST;
>>> @@ -194,6 +200,12 @@ static void cdns3_role_switch(struct work_struct *work)
>>>  	pm_runtime_get_sync(cdns->dev);
>>>  	cdns3_role_stop(cdns);
>>>
>>> +	if (cdns->desired_dr_mode != cdns->current_dr_mode) {
>>
>> This is about roles, why are we checking dr_mode here?
> 
> Because after changing dr_mode by means of debugfs we need to update mode. 
> Driver should do this after stopping the previous role.  I will move this condition 
> to cdns3_drd_update_mode and add comment in this place. 
> 
>>
>>> +		cdns3_drd_update_mode(cdns);
>>> +		host = cdns3_is_host(cdns);
>>> +		device = cdns3_is_device(cdns);
>>> +	}
>>> +
>>>  	if (host) {
>>>  		if (cdns->roles[CDNS3_ROLE_HOST])
>>>  			cdns3_do_role_switch(cdns, CDNS3_ROLE_HOST);
>>> @@ -287,6 +299,7 @@ static int cdns3_probe(struct platform_device *pdev)
>>>  	if (ret)
>>>  		goto err2;
>>>
>>> +	ret = cdns3_drd_init(cdns);
>>>  	if (ret)
>>>  		goto err2;
>>>
>>> diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c
>>> new file mode 100644
>>> index 000000000000..ac741c80e776
>>> --- /dev/null
>>> +++ b/drivers/usb/cdns3/drd.c
>>> @@ -0,0 +1,229 @@
>>> +// SPDX-License-Identifier: GPL-2.0
>>> +/*
>>> + * Cadence USBSS DRD Driver.
>>> + *
>>> + * Copyright (C) 2018 Cadence.
>>> + *
>>> + * Author: Pawel Laszczak <pawell@cadence.com
>>> + *
>>> + */
>>> +#include <linux/kernel.h>
>>> +#include <linux/interrupt.h>
>>> +#include <linux/delay.h>
>>> +#include <linux/usb/otg.h>
>>> +
>>> +#include "gadget.h"
>>> +#include "drd.h"
>>> +
>>> +/**
>>> + * cdns3_set_mode - change mode of OTG Core
>>> + * @cdns: pointer to context structure
>>> + * @mode: selected mode from cdns_role
>>> + */
>>> +void cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode mode)
>>> +{
>>> +	u32 reg;
>>> +
>>> +	cdns->current_dr_mode = mode;
>>> +	switch (mode) {
>>> +	case USB_DR_MODE_PERIPHERAL:
>>> +		dev_info(cdns->dev, "Set controller to Gadget mode\n");
>>> +		writel(OTGCMD_DEV_BUS_REQ | OTGCMD_OTG_DIS,
>>> +		       &cdns->otg_regs->cmd);
>>> +		break;
>>> +	case USB_DR_MODE_HOST:
>>> +		dev_info(cdns->dev, "Set controller to Host mode\n");
>>> +		writel(OTGCMD_HOST_BUS_REQ | OTGCMD_OTG_DIS,
>>> +		       &cdns->otg_regs->cmd);
>>> +		break;
>>> +	case USB_DR_MODE_OTG:
>>> +		dev_info(cdns->dev, "Set controller to OTG mode\n");
>>> +		reg = readl(&cdns->otg_regs->ctrl1);
>>> +		reg |= OTGCTRL1_IDPULLUP;
>>> +		writel(reg, &cdns->otg_regs->ctrl1);
>>> +
>>> +		/* wait until valid ID (ID_VALUE) can be sampled (50ms). */
>>> +		mdelay(50);
>>> +		break;
>>> +	default:
>>> +		cdns->current_dr_mode = USB_DR_MODE_UNKNOWN;
>>> +		dev_err(cdns->dev, "Unsupported mode of operation %d\n", mode);
>>> +		return;
>>> +	}
>>> +}
>>> +
>>> +static int cdns3_otg_get_id(struct cdns3 *cdns)
>>> +{
>>> +	int id;
>>> +
>>> +	id = readl(&cdns->otg_regs->sts) & OTGSTS_ID_VALUE;
>>> +	dev_dbg(cdns->dev, "OTG ID: %d", id);
>>> +	return id;
>>> +}
>>> +
>>> +int cdns3_is_host(struct cdns3 *cdns)
>>> +{
>>> +	if (cdns->current_dr_mode == USB_DR_MODE_HOST)
>>> +		return 1;
>>
>> Why do you need this?
> 
> I assumed that some SoC could have cut DRD /OTG and Device or Host part. 
> In such case the driver cannot be based on ID pin. 
> For only HOST it's not a problem because 
> the standard XHCI driver will be used.  Probably I will remove this fragment.
>>
>>> +	else if (cdns->current_dr_mode == USB_DR_MODE_OTG)
>>> +		if (!cdns3_otg_get_id(cdns))
>>> +			return 1;
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +int cdns3_is_device(struct cdns3 *cdns)
>>> +{
>>> +	if (cdns->current_dr_mode == USB_DR_MODE_PERIPHERAL)
>>> +		return 1;
>>> +	else if (cdns->current_dr_mode == USB_DR_MODE_OTG)
>>> +		if (cdns3_otg_get_id(cdns))
>>> +			return 1;
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +/**
>>> + * cdns3_otg_disable_irq - Disable all OTG interrupts
>>> + * @cdns: Pointer to controller context structure
>>> + */
>>> +static void cdns3_otg_disable_irq(struct cdns3 *cdns)
>>> +{
>>> +	writel(0, &cdns->otg_regs->ien);
>>> +}
>>> +
>>> +/**
>>> + * cdns3_otg_enable_irq - enable id and sess_valid interrupts
>>> + * @cdns: Pointer to controller context structure
>>> + */
>>> +static void cdns3_otg_enable_irq(struct cdns3 *cdns)
>>> +{
>>> +	writel(OTGIEN_ID_CHANGE_INT | OTGIEN_VBUSVALID_RISE_INT |
>>> +	       OTGIEN_VBUSVALID_FALL_INT, &cdns->otg_regs->ien);
>>> +}
>>> +
>>> +/**
>>> + * cdns3_init_otg_mode - initialize drd controller
>>> + * @cdns: Pointer to controller context structure
>>> + *
>>> + * Returns 0 on success otherwise negative errno
>>> + */
>>> +static void cdns3_init_otg_mode(struct cdns3 *cdns)
>>> +{
>>> +	cdns3_otg_disable_irq(cdns);
>>> +	/* clear all interrupts */
>>> +	writel(~0, &cdns->otg_regs->ivect);
>>> +
>>> +	cdns3_set_mode(cdns, USB_DR_MODE_OTG);
>>> +
>>> +	cdns3_otg_enable_irq(cdns);
>>> +}
>>> +
>>> +/**
>>> + * cdns3_drd_update_mode - initialize mode of operation
>>
>> Looks like this will be called only once. How about calling it
>>
>> cdns3_drd_init_mode()?
> 
> It will be also called after changing dr_mode from debugfs.
> 
>>> + * @cdns: Pointer to controller context structure
>>> + *
>>> + * Returns 0 on success otherwise negative errno
>>> + */
>>> +int cdns3_drd_update_mode(struct cdns3 *cdns)
>>> +{
>>> +	int ret = 0;
>>> +
>>> +	switch (cdns->desired_dr_mode) {
>>
>> I think we can get rid of desired_dr_mode member in struct cdns.
>> Just pass the mode as an argument to cdns3_drd_init_mode()
> 
> This will be used also in patch that introduce debugfs. This filed is also used 
> during changing dr_mode from user space.
> 
> My intention was:
> dr_mode - indicated what driver can support, this filed based on dr_mode from device tree, 
> 	     straps bits from otg register and kernel configuration. 
> desired_ dr_mode - the next mode desired by user, changed by debugfs 
> current_dr_mode  - actually selected mode 
> 

OK, makes sense. But let's keep this patch simple. Add only the members you need right now.
Introduce the new one (desired_dr_mode) in the debugfs patch.

>>
>> And we already have cdns->dr_mode.
>>
>>> +	case USB_DR_MODE_PERIPHERAL:
>>> +		cdns3_set_mode(cdns, USB_DR_MODE_PERIPHERAL);
>>> +		break;
>>> +	case USB_DR_MODE_HOST:
>>> +		cdns3_set_mode(cdns, USB_DR_MODE_HOST);
>>> +		break;
>>> +	case USB_DR_MODE_OTG:
>>> +		cdns3_init_otg_mode(cdns);
>>> +		break;
>>> +	default:
>>> +		dev_err(cdns->dev, "Unsupported mode of operation %d\n",
>>> +			cdns->dr_mode);
>>> +		return -EINVAL;
>>> +	}
>>> +
>>> +	return ret;
>>> +}

<snip>

cheers,
-roger

-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

             reply	other threads:[~2018-11-26  8:07 UTC|newest]

Thread overview: 202+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-26  8:07 Roger Quadros [this message]
2018-11-26  8:07 ` [RFC PATCH v2 05/15] usb:cdns3: Added DRD support Roger Quadros
  -- strict thread matches above, loose matches on Subject: below --
2018-12-16 13:31 [RFC,v2,08/15] usb:cdns3: Implements device operations part of the API Pawel Laszczak
2018-12-16 13:31 ` [RFC PATCH v2 08/15] " Pawel Laszczak
2018-12-14 12:30 [RFC,v2,08/15] " Felipe Balbi
2018-12-14 12:30 ` [RFC PATCH v2 08/15] " Felipe Balbi
2018-12-14 12:20 [RFC,v2,08/15] " Sekhar Nori
2018-12-14 12:20 ` [RFC PATCH v2 08/15] " Sekhar Nori
2018-12-14 12:20 ` Sekhar Nori
2018-12-14 11:26 [RFC,v2,08/15] " Felipe Balbi
2018-12-14 11:26 ` [RFC PATCH v2 08/15] " Felipe Balbi
2018-12-14 11:13 [RFC,v2,08/15] " Sekhar Nori
2018-12-14 11:13 ` [RFC PATCH v2 08/15] " Sekhar Nori
2018-12-14 11:13 ` Sekhar Nori
2018-12-14 10:47 [RFC,v2,08/15] " Felipe Balbi
2018-12-14 10:47 ` [RFC PATCH v2 08/15] " Felipe Balbi
2018-12-14 10:39 [RFC,v2,08/15] " Sekhar Nori
2018-12-14 10:39 ` [RFC PATCH v2 08/15] " Sekhar Nori
2018-12-14 10:39 ` Sekhar Nori
2018-12-14  6:49 [RFC,v2,08/15] " Pawel Laszczak
2018-12-14  6:49 ` [RFC PATCH v2 08/15] " Pawel Laszczak
2018-12-14  1:34 [RFC,v2,08/15] " Peter Chen
2018-12-14  1:34 ` [RFC PATCH v2 08/15] " Peter Chen
2018-12-11 19:49 [RFC,v2,08/15] " Pawel Laszczak
2018-12-11 19:49 ` [RFC PATCH v2 08/15] " Pawel Laszczak
2018-12-11 11:26 [RFC,v2,08/15] " Sekhar Nori
2018-12-11 11:26 ` [RFC PATCH v2 08/15] " Sekhar Nori
2018-12-11 11:26 ` Sekhar Nori
2018-12-10  2:12 [RFC,v2,08/15] " Peter Chen
2018-12-10  2:12 ` [RFC PATCH v2 08/15] " Peter Chen
2018-12-06 10:26 [RFC,v2,03/15] dt-bindings: add binding for USBSS-DRD controller Pawel Laszczak
2018-12-06 10:26 ` [RFC PATCH v2 03/15] " Pawel Laszczak
2018-12-06 10:02 [RFC,v2,04/15] usb:cdns3: Driver initialization code Pawel Laszczak
2018-12-06 10:02 ` [RFC PATCH v2 04/15] " Pawel Laszczak
2018-12-06  9:31 [RFC,v2,04/15] " Pawel Laszczak
2018-12-06  9:31 ` [RFC PATCH v2 04/15] " Pawel Laszczak
2018-12-06  7:25 [RFC,v2,05/15] usb:cdns3: Added DRD support Pawel Laszczak
2018-12-06  7:25 ` [RFC PATCH v2 05/15] " Pawel Laszczak
2018-12-06  7:00 [RFC,v2,04/15] usb:cdns3: Driver initialization code Pawel Laszczak
2018-12-06  7:00 ` [RFC PATCH v2 04/15] " Pawel Laszczak
2018-12-05 19:42 [RFC,v2,04/15] " Pawel Laszczak
2018-12-05 19:42 ` [RFC PATCH v2 04/15] " Pawel Laszczak
2018-12-05 19:24 [RFC,v2,04/15] " Pawel Laszczak
2018-12-05 19:24 ` [RFC PATCH v2 04/15] " Pawel Laszczak
2018-12-05  9:07 [RFC,v2,04/15] " Peter Chen
2018-12-05  9:07 ` [RFC PATCH v2 04/15] " Peter Chen
2018-12-05  8:57 [RFC,v2,04/15] " Peter Chen
2018-12-05  8:57 ` [RFC PATCH v2 04/15] " Peter Chen
2018-12-05  8:55 [RFC,v2,04/15] " Alan Douglas
2018-12-05  8:55 ` [RFC PATCH v2 04/15] " Alan Douglas
2018-12-05  8:41 [RFC,v2,06/15] usb:cdns3: Adds Host support Peter Chen
2018-12-05  8:41 ` [RFC PATCH v2 06/15] " Peter Chen
2018-12-05  7:19 [RFC,v2,04/15] usb:cdns3: Driver initialization code Pawel Laszczak
2018-12-05  7:19 ` [RFC PATCH v2 04/15] " Pawel Laszczak
2018-12-04 22:41 [RFC,v2,03/15] dt-bindings: add binding for USBSS-DRD controller Rob Herring
2018-12-04 22:41 ` [RFC PATCH v2 03/15] " Rob Herring
2018-12-04 10:46 [RFC,v2,04/15] usb:cdns3: Driver initialization code Roger Quadros
2018-12-04 10:46 ` [RFC PATCH v2 04/15] " Roger Quadros
2018-12-04 10:46 ` Roger Quadros
2018-12-04  9:18 [RFC,v2,05/15] usb:cdns3: Added DRD support Peter Chen
2018-12-04  9:18 ` [RFC PATCH v2 05/15] " Peter Chen
2018-12-04  9:09 [RFC,v2,04/15] usb:cdns3: Driver initialization code Peter Chen
2018-12-04  9:09 ` [RFC PATCH v2 04/15] " Peter Chen
2018-12-04  8:50 [RFC,v2,04/15] " Peter Chen
2018-12-04  8:50 ` [RFC PATCH v2 04/15] " Peter Chen
2018-12-04  7:11 [RFC,v2,04/15] " Peter Chen
2018-12-04  7:11 ` [RFC PATCH v2 04/15] " Peter Chen
2018-12-03 10:19 [RFC,v2,08/15] usb:cdns3: Implements device operations part of the API Pawel Laszczak
2018-12-03 10:19 ` [RFC PATCH v2 08/15] " Pawel Laszczak
2018-12-02 20:34 [RFC,v2,04/15] usb:cdns3: Driver initialization code Pawel Laszczak
2018-12-02 20:34 ` [RFC PATCH v2 04/15] " Pawel Laszczak
2018-12-02 19:27 [RFC,v2,02/15] usb:cdns3: Device side header file Pawel Laszczak
2018-12-02 19:27 ` [RFC PATCH v2 02/15] " Pawel Laszczak
2018-12-02 16:39 [RFC,v2,12/15] usb:cdns3: Adds enumeration related function Pawel Laszczak
2018-12-02 16:39 ` [RFC PATCH v2 12/15] " Pawel Laszczak
2018-12-02 12:52 [RFC,v2,11/15] usb:cdns3: Implements ISR functionality Pawel Laszczak
2018-12-02 12:52 ` [RFC PATCH v2 11/15] " Pawel Laszczak
2018-12-02 11:49 [RFC,v2,11/15] " Pawel Laszczak
2018-12-02 11:49 ` [RFC PATCH v2 11/15] " Pawel Laszczak
2018-12-02 10:34 [RFC,v2,10/15] usb:cdns3: Ep0 operations part of the API Pawel Laszczak
2018-12-02 10:34 ` [RFC PATCH v2 10/15] " Pawel Laszczak
2018-12-02 10:34 ` Pawel Laszczak
2018-12-01 13:30 [RFC,v2,09/15] usb:cdns3: EpX " Pawel Laszczak
2018-12-01 13:30 ` [RFC PATCH v2 09/15] " Pawel Laszczak
2018-12-01 11:11 [RFC,v2,08/15] usb:cdns3: Implements device " Pawel Laszczak
2018-12-01 11:11 ` [RFC PATCH v2 08/15] " Pawel Laszczak
2018-11-30 14:36 [RFC,v2,07/15] usb:cdns3: Adds Device mode support - initialization Pawel Laszczak
2018-11-30 14:36 ` [RFC PATCH v2 07/15] " Pawel Laszczak
2018-11-30  7:32 [RFC,v2,04/15] usb:cdns3: Driver initialization code Peter Chen
2018-11-30  7:32 ` [RFC PATCH v2 04/15] " Peter Chen
2018-11-30  6:48 [RFC,v2,02/15] usb:cdns3: Device side header file Peter Chen
2018-11-30  6:48 ` [RFC PATCH v2 02/15] " PETER CHEN
2018-11-30  6:29 [RFC,v2,07/15] usb:cdns3: Adds Device mode support - initialization Pawel Laszczak
2018-11-30  6:29 ` [RFC PATCH v2 07/15] " Pawel Laszczak
2018-11-30  4:20 [RFC,v2,07/15] " Peter Chen
2018-11-30  4:20 ` [RFC PATCH v2 07/15] " PETER CHEN
2018-11-28 15:50 [RFC,v2,12/15] usb:cdns3: Adds enumeration related function Roger Quadros
2018-11-28 15:50 ` [RFC PATCH v2 12/15] " Roger Quadros
2018-11-28 15:50 ` Roger Quadros
2018-11-28 14:54 [RFC,v2,11/15] usb:cdns3: Implements ISR functionality Roger Quadros
2018-11-28 14:54 ` [RFC PATCH v2 11/15] " Roger Quadros
2018-11-28 14:54 ` Roger Quadros
2018-11-28 14:31 [RFC,v2,10/15] usb:cdns3: Ep0 operations part of the API Roger Quadros
2018-11-28 14:31 ` [RFC PATCH v2 10/15] " Roger Quadros
2018-11-28 14:31 ` Roger Quadros
2018-11-28 12:46 [RFC,v2,09/15] usb:cdns3: EpX " Roger Quadros
2018-11-28 12:46 ` [RFC PATCH v2 09/15] " Roger Quadros
2018-11-28 12:46 ` Roger Quadros
2018-11-28 12:22 [RFC,v2,08/15] usb:cdns3: Implements device " Roger Quadros
2018-11-28 12:22 ` [RFC PATCH v2 08/15] " Roger Quadros
2018-11-28 12:22 ` Roger Quadros
2018-11-28 11:40 [RFC,v2,07/15] usb:cdns3: Adds Device mode support - initialization Felipe Balbi
2018-11-28 11:40 ` [RFC PATCH v2 07/15] " Felipe Balbi
2018-11-28 11:34 [RFC,v2,07/15] " Roger Quadros
2018-11-28 11:34 ` [RFC PATCH v2 07/15] " Roger Quadros
2018-11-28 11:34 ` Roger Quadros
2018-11-27 12:10 [RFC,v2,05/15] usb:cdns3: Added DRD support Roger Quadros
2018-11-27 12:10 ` [RFC PATCH v2 05/15] " Roger Quadros
2018-11-27 11:29 [RFC,v2,05/15] " Pawel Laszczak
2018-11-27 11:29 ` [RFC PATCH v2 05/15] " Pawel Laszczak
2018-11-26 10:17 [RFC,v2,06/15] usb:cdns3: Adds Host support Pawel Laszczak
2018-11-26 10:17 ` [RFC PATCH v2 06/15] " Pawel Laszczak
2018-11-26 10:15 [RFC,v2,05/15] usb:cdns3: Added DRD support Roger Quadros
2018-11-26 10:15 ` [RFC PATCH v2 05/15] " Roger Quadros
2018-11-26 10:09 [RFC,v2,05/15] " Pawel Laszczak
2018-11-26 10:09 ` [RFC PATCH v2 05/15] " Pawel Laszczak
2018-11-26  9:50 [RFC,v2,06/15] usb:cdns3: Adds Host support Roger Quadros
2018-11-26  9:50 ` [RFC PATCH v2 06/15] " Roger Quadros
2018-11-26  9:39 [RFC,v2,05/15] usb:cdns3: Added DRD support Roger Quadros
2018-11-26  9:39 ` [RFC PATCH v2 05/15] " Roger Quadros
2018-11-26  8:39 [RFC,v2,05/15] " Pawel Laszczak
2018-11-26  8:39 ` [RFC PATCH v2 05/15] " Pawel Laszczak
2018-11-26  8:24 [RFC,v2,06/15] usb:cdns3: Adds Host support Pawel Laszczak
2018-11-26  8:24 ` [RFC PATCH v2 06/15] " Pawel Laszczak
2018-11-26  7:23 [RFC,v2,05/15] usb:cdns3: Added DRD support Pawel Laszczak
2018-11-26  7:23 ` [RFC PATCH v2 05/15] " Pawel Laszczak
2018-11-25 12:35 [RFC,v2,04/15] usb:cdns3: Driver initialization code Pawel Laszczak
2018-11-25 12:35 ` [RFC PATCH v2 04/15] " Pawel Laszczak
2018-11-25  7:33 [RFC,v2,03/15] dt-bindings: add binding for USBSS-DRD controller Pawel Laszczak
2018-11-25  7:33 ` [RFC PATCH v2 03/15] " Pawel Laszczak
2018-11-23 14:51 [RFC,v2,05/15] usb:cdns3: Added DRD support Roger Quadros
2018-11-23 14:51 ` [RFC PATCH v2 05/15] " Roger Quadros
2018-11-23 14:51 ` Roger Quadros
2018-11-23 14:23 [RFC,v2,06/15] usb:cdns3: Adds Host support Roger Quadros
2018-11-23 14:23 ` [RFC PATCH v2 06/15] " Roger Quadros
2018-11-23 14:23 ` Roger Quadros
2018-11-23 11:35 [RFC,v2,04/15] usb:cdns3: Driver initialization code Roger Quadros
2018-11-23 11:35 ` [RFC PATCH v2 04/15] " Roger Quadros
2018-11-23 11:35 ` Roger Quadros
2018-11-23 10:53 [RFC,v2,03/15] dt-bindings: add binding for USBSS-DRD controller Roger Quadros
2018-11-23 10:53 ` [RFC PATCH v2 03/15] " Roger Quadros
2018-11-23 10:53 ` Roger Quadros
2018-11-23 10:44 [RFC,v2,01/15] usb:cdns3: add pci to platform driver wrapper Roger Quadros
2018-11-23 10:44 ` [RFC PATCH v2 01/15] " Roger Quadros
2018-11-23 10:44 ` Roger Quadros
2018-11-18 10:09 [RFC,v2,15/15] usb:cdns3: Feature for changing role Pawel Laszczak
2018-11-18 10:09 ` [RFC PATCH v2 15/15] " Pawel Laszczak
2018-11-18 10:09 ` Pawel Laszczak
2018-11-18 10:09 [RFC,v2,14/15] usb:cdns3: Adds debugging function Pawel Laszczak
2018-11-18 10:09 ` [RFC PATCH v2 14/15] " Pawel Laszczak
2018-11-18 10:09 ` Pawel Laszczak
2018-11-18 10:09 [RFC,v2,13/15] usb:cdns3: Adds transfer related function Pawel Laszczak
2018-11-18 10:09 ` [RFC PATCH v2 13/15] " Pawel Laszczak
2018-11-18 10:09 ` Pawel Laszczak
2018-11-18 10:09 [RFC,v2,12/15] usb:cdns3: Adds enumeration " Pawel Laszczak
2018-11-18 10:09 ` [RFC PATCH v2 12/15] " Pawel Laszczak
2018-11-18 10:09 ` Pawel Laszczak
2018-11-18 10:09 [RFC,v2,11/15] usb:cdns3: Implements ISR functionality Pawel Laszczak
2018-11-18 10:09 ` [RFC PATCH v2 11/15] " Pawel Laszczak
2018-11-18 10:09 ` Pawel Laszczak
2018-11-18 10:09 [RFC,v2,10/15] usb:cdns3: Ep0 operations part of the API Pawel Laszczak
2018-11-18 10:09 ` [RFC PATCH v2 10/15] " Pawel Laszczak
2018-11-18 10:09 ` Pawel Laszczak
2018-11-18 10:09 [RFC,v2,09/15] usb:cdns3: EpX " Pawel Laszczak
2018-11-18 10:09 ` [RFC PATCH v2 09/15] " Pawel Laszczak
2018-11-18 10:09 ` Pawel Laszczak
2018-11-18 10:09 [RFC,v2,08/15] usb:cdns3: Implements device " Pawel Laszczak
2018-11-18 10:09 ` [RFC PATCH v2 08/15] " Pawel Laszczak
2018-11-18 10:09 ` Pawel Laszczak
2018-11-18 10:09 [RFC,v2,07/15] usb:cdns3: Adds Device mode support - initialization Pawel Laszczak
2018-11-18 10:09 ` [RFC PATCH v2 07/15] " Pawel Laszczak
2018-11-18 10:09 ` Pawel Laszczak
2018-11-18 10:09 [RFC,v2,06/15] usb:cdns3: Adds Host support Pawel Laszczak
2018-11-18 10:09 ` [RFC PATCH v2 06/15] " Pawel Laszczak
2018-11-18 10:09 ` Pawel Laszczak
2018-11-18 10:09 [RFC,v2,05/15] usb:cdns3: Added DRD support Pawel Laszczak
2018-11-18 10:09 ` [RFC PATCH v2 05/15] " Pawel Laszczak
2018-11-18 10:09 ` Pawel Laszczak
2018-11-18 10:09 [RFC,v2,04/15] usb:cdns3: Driver initialization code Pawel Laszczak
2018-11-18 10:09 ` [RFC PATCH v2 04/15] " Pawel Laszczak
2018-11-18 10:09 ` Pawel Laszczak
2018-11-18 10:08 [RFC,v2,03/15] dt-bindings: add binding for USBSS-DRD controller Pawel Laszczak
2018-11-18 10:08 ` [RFC PATCH v2 03/15] " Pawel Laszczak
2018-11-18 10:08 ` Pawel Laszczak
2018-11-18 10:08 [RFC,v2,02/15] usb:cdns3: Device side header file Pawel Laszczak
2018-11-18 10:08 ` [RFC PATCH v2 02/15] " Pawel Laszczak
2018-11-18 10:08 ` Pawel Laszczak
2018-11-18 10:08 [RFC,v2,01/15] usb:cdns3: add pci to platform driver wrapper Pawel Laszczak
2018-11-18 10:08 ` [RFC PATCH v2 01/15] " Pawel Laszczak
2018-11-18 10:08 ` Pawel Laszczak
2018-11-18 10:08 [RFC PATCH v2 00/15] Introduced new Cadence USBSS DRD Driver Pawel Laszczak
2018-11-18 10:08 ` Pawel Laszczak

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=5BFBA9BC.20306@ti.com \
    --to=rogerq@ti.com \
    --cc=adouglas@cadence.com \
    --cc=devicetree@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jbergsagel@ti.com \
    --cc=kurahul@cadence.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=nm@ti.com \
    --cc=nsekhar@ti.com \
    --cc=pawell@cadence.com \
    --cc=peter.chen@nxp.com \
    --cc=pjez@cadence.com \
    --cc=sureshp@cadence.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.