Re: [PATCH v4 4/9] usb: dwc3: core: Adapt to named interrupts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

On 02/09/15 17:34, Felipe Balbi wrote:
> On Wed, Sep 02, 2015 at 05:24:19PM +0300, Roger Quadros wrote:
>> From: Felipe Balbi <balbi@xxxxxx>
>>
>> Add support to use interrupt names,
>>
>> Following are the interrupt names
>>
>> Peripheral Interrupt - peripheral
>> HOST Interrupt - host
>> OTG Interrupt - otg
>>
>> [Roger Q]
>> - If any of these are missing we use the
>> first available IRQ resource so that we don't
>> break with older DTBs.
> 
> this is what original commit did:
> 
> commit ecd5f71cfd663bcd4efd2f29824acd8b2ba9715d
> Author: Felipe Balbi <balbi@xxxxxx>
> Date:   Fri Jan 3 13:49:38 2014 -0600
> 
>     usb: dwc3: cleanup IRQ resources
>     
>     In order to make it easier for the driver to
>     figure out which modes of operation it has,
>     and because some dwc3 integrations have rather
>     fuzzy IRQ routing, we now require three different
>     IRQ numbers (peripheral, host, otg).
>     
>     In order to do that and maintain backwards compatibility,
>     we still maintain support for the old IRQ resource name,
>     but if you *really* want to have proper peripheral/host/otg
>     support, you should make sure your resources are correct.
>     
>     Signed-off-by: Felipe Balbi <balbi@xxxxxx>

This is better since we request the resource only if needed and bail out
if it is not present.

> 
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 60580a01cdd2..1f01031873b7 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -556,10 +556,22 @@ static int dwc3_core_get_phy(struct dwc3 *dwc)
>  static int dwc3_core_init_mode(struct dwc3 *dwc)
>  {
>  	struct device *dev = dwc->dev;
> +	struct platform_device *pdev = to_platform_device(dev);
>  	int ret;
>  
>  	switch (dwc->dr_mode) {
>  	case USB_DR_MODE_PERIPHERAL:
> +		dwc->gadget_irq = platform_get_irq_byname(pdev, "dwc3_peripheral");

Shall we just name it just "peripheral"?

> +		if (dwc->gadget_irq < 0) {
> +			dwc->gadget_irq = platform_get_irq_byname(pdev, "dwc_usb3");

How will this work? Currently we don't have a name for the IRQ in the DT.

> +			if (dwc->gadget_irq < 0) {
> +				dev_err(dev, "missing IRQ\n");
> +				return dwc->gadget_irq;
> +			} else {
> +				dev_warn(dev, "dwc_usb3 resource is deprecated\n");

Do we want to warn about legacy nodes?

> +			}
> +		}
> +
>  		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE);
>  		ret = dwc3_gadget_init(dwc);
>  		if (ret) {
> @@ -568,6 +580,22 @@ static int dwc3_core_init_mode(struct dwc3 *dwc)
>  		}
>  		break;
>  	case USB_DR_MODE_HOST:
> +		dwc->xhci_irq = platform_get_irq_byname(pdev, "dwc3_host");
> +		if (dwc->xhci_irq < 0) {
> +			dwc->xhci_irq = platform_get_irq_byname(pdev, "dwc_usb3");
> +			if (dwc->xhci_irq < 0) {
> +				dev_err(dev, "missing Host IRQ\n");
> +				return dwc->xhci_irq;
> +			} else {
> +				dev_warn(dev, "dwc_usb3 resource is deprecated\n");
> +			}
> +
> +			dwc->xhci_resources[1].start = dwc->xhci_irq;
> +			dwc->xhci_resources[1].end = dwc->xhci_irq;
> +			dwc->xhci_resources[1].flags = IORESOURCE_IRQ;
> +			dwc->xhci_resources[1].name = "xhci";
> +		}
> +
>  		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_HOST);
>  		ret = dwc3_host_init(dwc);
>  		if (ret) {
> @@ -576,6 +604,28 @@ static int dwc3_core_init_mode(struct dwc3 *dwc)
>  		}
>  		break;
>  	case USB_DR_MODE_OTG:
> +		dwc->gadget_irq = platform_get_irq_byname(pdev, "dwc3_peripheral");
> +		if (dwc->gadget_irq < 0) {
> +			dwc->gadget_irq = platform_get_irq_byname(pdev, "dwc_usb3");
> +			if (dwc->gadget_irq < 0) {
> +				dev_err(dev, "missing IRQ\n");
> +				return dwc->gadget_irq;
> +			} else {
> +				dev_warn(dev, "dwc_usb3 resource is deprecated\n");
> +			}
> +
> +			dwc->xhci_irq = dwc->gadget_irq;
> +			dwc->otg_irq = dwc->gadget_irq;
> +		} else {
> +			dwc->xhci_irq = platform_get_irq_byname(pdev, "dwc3_host");
> +			if (dwc->xhci_irq < 0) {
> +				dev_err(dev, "missing Host IRQ\n");
> +				return dwc->xhci_irq;
> +			}
> +
> +			dwc->otg_irq = platform_get_irq_byname(pdev, "dwc3_otg");

need to check if error?

> +		}

Need to setup xhci_resource[1]?

> +
>  		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
>  		ret = dwc3_otg_init(dwc);
>  		if (ret) {
> @@ -647,18 +697,6 @@ static int dwc3_probe(struct platform_device *pdev)
>  	dwc->mem = mem;
>  	dwc->dev = dev;
>  
> -	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
> -	if (!res) {
> -		dev_err(dev, "missing IRQ\n");
> -		return -ENODEV;
> -	}
> -	dwc->xhci_resources[1].start = res->start;
> -	dwc->xhci_resources[1].end = res->end;
> -	dwc->xhci_resources[1].flags = res->flags;
> -	dwc->xhci_resources[1].name = res->name;
> -
> -	dwc->otg_irq = platform_get_irq_byname(pdev, "dwc3_otg");
> -
>  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>  	if (!res) {
>  		dev_err(dev, "missing memory resource\n");
> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
> index 8e2e579b4b1e..0b02186fad6f 100644
> --- a/drivers/usb/dwc3/core.h
> +++ b/drivers/usb/dwc3/core.h
> @@ -671,6 +671,8 @@ struct dwc3_scratchpad_array {
>   * @maximum_speed: maximum speed requested (mainly for testing purposes)
>   * @revision: revision register contents
>   * @dr_mode: requested mode of operation
> + * @gadget_irq: IRQ number for Peripheral IRQs
> + * @xhci_irq: IRQ number for Host IRQs
>   * @otg_irq: IRQ number for OTG IRQs
>   * @usb2_phy: pointer to USB2 PHY
>   * @usb3_phy: pointer to USB3 PHY
> @@ -747,6 +749,8 @@ struct dwc3 {
>  
>  	enum usb_dr_mode	dr_mode;
>  
> +	int			gadget_irq;
> +	int			xhci_irq;
>  	int			otg_irq;
>  
>  	/* used for suspend/resume */
> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
> index a8cf87b3de01..2a6e5155fc89 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -1567,15 +1567,13 @@ static int dwc3_gadget_start(struct usb_gadget *g,
>  	struct dwc3_ep		*dep;
>  	unsigned long		flags;
>  	int			ret = 0;
> -	int			irq;
>  	u32			reg;
>  
> -	irq = platform_get_irq(to_platform_device(dwc->dev), 0);
> -	ret = request_threaded_irq(irq, dwc3_interrupt, dwc3_thread_interrupt,
> -			IRQF_SHARED, "dwc3", dwc);
> +	ret = request_threaded_irq(dwc->gadget_irq, dwc3_interrupt,
> +			dwc3_thread_interrupt, IRQF_SHARED, "dwc3", dwc);
>  	if (ret) {
>  		dev_err(dwc->dev, "failed to request irq #%d --> %d\n",
> -				irq, ret);
> +				dwc->gadget_irq, ret);
>  		goto err0;
>  	}
>  
> @@ -1668,7 +1666,7 @@ err2:
>  err1:
>  	spin_unlock_irqrestore(&dwc->lock, flags);
>  
> -	free_irq(irq, dwc);
> +	free_irq(dwc->gadget_irq, dwc);
>  
>  err0:
>  	return ret;
> @@ -1679,7 +1677,6 @@ static int dwc3_gadget_stop(struct usb_gadget *g,
>  {
>  	struct dwc3		*dwc = gadget_to_dwc(g);
>  	unsigned long		flags;
> -	int			irq;
>  
>  	spin_lock_irqsave(&dwc->lock, flags);
>  
> @@ -1691,8 +1688,7 @@ static int dwc3_gadget_stop(struct usb_gadget *g,
>  
>  	spin_unlock_irqrestore(&dwc->lock, flags);
>  
> -	irq = platform_get_irq(to_platform_device(dwc->dev), 0);
> -	free_irq(irq, dwc);
> +	free_irq(dwc->gadget_irq, dwc);
>  
>  	return 0;
>  }
> 

- --
cheers,
- -roger
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQIcBAEBCAAGBQJV6EEzAAoJENJaa9O+djCT2CYQALOJ+zhWZ1fw8z1FEHnouTT7
6riR0KkGkptuGiRCfUTZYNA+YSMLK2vaZbgH6YWqOrrgK2T45kEAsvoO66byN/2W
XistUWUDRR3X5vhxS4Jsc6euHU7+zKVioTog+qmfFgu/NUJrSUg2w4Q8IR/YGq29
7En5WjGSagd9EoSrS6q9GxYY5m/WOR2Nt/pqOvdtd+izJiRkKrYNfCBzv47majv7
Pdyh6VMBLGjLpQDzKJ+dC8pRzBKI5MpGPNsCFuCNGhjrS5KIv+nMnrtezNRHrU9m
BRzcaYjPj90+zF52BeYPsk+e+r4DqZrnsCw8JWAf/Z+dSiHDcllnNHFjmjyxEWVE
QSVKX6rzq2ADGlCjklEUiy/iFlVV4tF+BzdS+ykEHAT4H7F6h3uAnLCZIE31DEZ/
SL7AfBxzO9xp4hweiQfz8VfpjrI7GWv6kR2A8zWV2pPD5TPo0pSNghI+r0eK1mJ8
rt1IlQnaxqFxNJjYtdVpvppV/ATihqXX+6e3Zgr3rvr8nA/rMEQZ5ePid0tPh4yM
r4r5JAfrP0ROIkvHkQ/otEey2yK5YBMiQ0kqKWZAOztAZTsEeEP0zrJWKIJXtKt5
7P3kOTuZNko4INO7i+F3bb2zBL1ies/mKhdsuvu65QJi7KMDYvLfLdtHTudSwkfX
mtsHh+60Nc0pqqIqH12t
=M0TG
-----END PGP SIGNATURE-----
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux