Commit 047dc2a2 authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

ARM: pxa: lubbock: pass udc irqs as resource



Lubbock is the only machine that has three IRQs for the UDC.
These are currently hardcoded in the driver based on a
machine header file.

Change this to use platform device resources as we use for
the generic IRQ anyway.

Cc: Felipe Balbi <balbi@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-usb@vger.kernel.org
Acked-by: default avatarRobert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent e6c91e1a
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@

#include "pxa25x.h"
#include <linux/platform_data/asoc-pxa.h>
#include <mach/lubbock.h>
#include "lubbock.h"
#include "udc.h"
#include <linux/platform_data/irda-pxaficp.h>
#include <linux/platform_data/video-pxafb.h>
@@ -131,6 +131,13 @@ static struct pxa2xx_udc_mach_info udc_info __initdata = {
	// no D+ pullup; lubbock can't connect/disconnect in software
};

static struct resource lubbock_udc_resources[] = {
	DEFINE_RES_MEM(0x40600000, 0x10000),
	DEFINE_RES_IRQ(IRQ_USB),
	DEFINE_RES_IRQ(LUBBOCK_USB_IRQ),
	DEFINE_RES_IRQ(LUBBOCK_USB_DISC_IRQ),
};

/* GPIOs for SA1111 PCMCIA */
static struct gpiod_lookup_table sa1111_pcmcia_gpio_table = {
	.dev_id = "1800",
@@ -496,6 +503,9 @@ static void __init lubbock_init(void)
	lubbock_init_pcmcia();

	clk_add_alias("SA1111_CLK", NULL, "GPIO11_CLK", NULL);
	/* lubbock has two extra IRQs */
	pxa25x_device_udc.resource = lubbock_udc_resources;
	pxa25x_device_udc.num_resources = ARRAY_SIZE(lubbock_udc_resources);
	pxa_set_udc_info(&udc_info);
	pxa_set_fb_info(NULL, &sharp_lm8v31);
	pxa_set_mci_info(&lubbock_mci_platform_data);
+0 −2
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 *  arch/arm/mach-pxa/include/mach/lubbock.h
 *
 *  Author:	Nicolas Pitre
 *  Created:	Jun 15, 2001
 *  Copyright:	MontaVista Software Inc.
+19 −18
Original line number Diff line number Diff line
@@ -44,10 +44,6 @@
#include <linux/usb/gadget.h>
#include <linux/usb/otg.h>

#ifdef CONFIG_ARCH_LUBBOCK
#include <mach/lubbock.h>
#endif

#define UDCCR	 0x0000 /* UDC Control Register */
#define UDC_RES1 0x0004 /* UDC Undocumented - Reserved1 */
#define UDC_RES2 0x0008 /* UDC Undocumented - Reserved2 */
@@ -1578,18 +1574,15 @@ lubbock_vbus_irq(int irq, void *_dev)
	int			vbus;

	dev->stats.irqs++;
	switch (irq) {
	case LUBBOCK_USB_IRQ:
	if (irq == dev->usb_irq) {
		vbus = 1;
		disable_irq(LUBBOCK_USB_IRQ);
		enable_irq(LUBBOCK_USB_DISC_IRQ);
		break;
	case LUBBOCK_USB_DISC_IRQ:
		disable_irq(dev->usb_irq);
		enable_irq(dev->usb_disc_irq);
	} else if (irq == dev->usb_disc_irq) {
		vbus = 0;
		disable_irq(LUBBOCK_USB_DISC_IRQ);
		enable_irq(LUBBOCK_USB_IRQ);
		break;
	default:
		disable_irq(dev->usb_disc_irq);
		enable_irq(dev->usb_irq);
	} else {
		return IRQ_NONE;
	}

@@ -2422,20 +2415,28 @@ static int pxa25x_udc_probe(struct platform_device *pdev)

#ifdef CONFIG_ARCH_LUBBOCK
	if (machine_is_lubbock()) {
		retval = devm_request_irq(&pdev->dev, LUBBOCK_USB_DISC_IRQ,
		dev->usb_irq = platform_get_irq(pdev, 1);
		if (dev->usb_irq < 0)
			return dev->usb_irq;

		dev->usb_disc_irq = platform_get_irq(pdev, 2);
		if (dev->usb_disc_irq < 0)
			return dev->usb_disc_irq;

		retval = devm_request_irq(&pdev->dev, dev->usb_disc_irq,
					  lubbock_vbus_irq, 0, driver_name,
					  dev);
		if (retval != 0) {
			pr_err("%s: can't get irq %i, err %d\n",
				driver_name, LUBBOCK_USB_DISC_IRQ, retval);
				driver_name, dev->usb_disc_irq, retval);
			goto err;
		}
		retval = devm_request_irq(&pdev->dev, LUBBOCK_USB_IRQ,
		retval = devm_request_irq(&pdev->dev, dev->usb_irq,
					  lubbock_vbus_irq, 0, driver_name,
					  dev);
		if (retval != 0) {
			pr_err("%s: can't get irq %i, err %d\n",
				driver_name, LUBBOCK_USB_IRQ, retval);
				driver_name, dev->usb_irq, retval);
			goto err;
		}
	} else
+2 −5
Original line number Diff line number Diff line
@@ -117,16 +117,13 @@ struct pxa25x_udc {
	u64					dma_mask;
	struct pxa25x_ep			ep [PXA_UDC_NUM_ENDPOINTS];
	void __iomem				*regs;
	int					usb_irq;
	int					usb_disc_irq;
};
#define to_pxa25x(g)	(container_of((g), struct pxa25x_udc, gadget))

/*-------------------------------------------------------------------------*/

#ifdef CONFIG_ARCH_LUBBOCK
#include <mach/lubbock.h>
/* lubbock can also report usb connect/disconnect irqs */
#endif

static struct pxa25x_udc *the_controller;

/*-------------------------------------------------------------------------*/