Commit 96b29cac authored by Magnus Damm's avatar Magnus Damm Committed by Greg Kroah-Hartman
Browse files

staging: emxx_udc: I/O memory and IRQ resource support



Adjust the emxx_udc driver to make use of the standard
driver model to pass I/O memory and IRQ as resources
instead of hard coding those things in the driver.

Needs more work - the VBUS signal is yet not handled.

Signed-off-by: default avatarMagnus Damm <damm+renesas@opensource.se>
Acked-by: default avatarSimon Horman <horms+renesas@verge.net.au>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 33aa8d45
Loading
Loading
Loading
Loading
+18 −39
Original line number Diff line number Diff line
@@ -3356,37 +3356,38 @@ static int nbu2ss_drv_probe(struct platform_device *pdev)
{
	int	status = -ENODEV;
	struct nbu2ss_udc	*udc;
	struct resource *r;
	int irq;
	void __iomem *mmio_base;

	udc = &udc_controller;
	memset(udc, 0, sizeof(struct nbu2ss_udc));

	platform_set_drvdata(pdev, udc);

	/* IO Memory Region */
	if (!request_mem_region(USB_BASE_ADDRESS, USB_BASE_SIZE
				, driver_name)) {
	/* require I/O memory and IRQ to be provided as resources */
	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	mmio_base = devm_request_and_ioremap(&pdev->dev, r);
	if (IS_ERR(mmio_base)) {
		dev_err(&pdev->dev, "failed to map I/O memory\n");
		return PTR_ERR(mmio_base);
	}

		ERR("request_mem_region failed\n");
		return -EBUSY;
	irq = platform_get_irq(pdev, 0);
	if (irq < 0) {
		dev_err(&pdev->dev, "failed to get IRQ\n");
		return irq;
	}
	status = devm_request_irq(&pdev->dev, irq, _nbu2ss_udc_irq,
				  0, driver_name, udc);

	/* IO Memory */
	udc->p_regs = (PT_FC_REGS)ioremap(USB_BASE_ADDRESS, USB_BASE_SIZE);
	if (!udc->p_regs) {
		ERR("request_io_mem failed\n");
		goto cleanup3;
	}
	udc->p_regs = (PT_FC_REGS)mmio_base;

	/* USB Function Controller Interrupt */
	status = request_irq(USB_UDC_IRQ_1,
				_nbu2ss_udc_irq,
				IRQF_DISABLED,
				driver_name,
				udc);

	if (status != 0) {
		ERR("request_irq(USB_UDC_IRQ_1) failed\n");
		goto cleanup2;
		goto cleanup1;
	}

	/* Driver Initialization */
@@ -3412,18 +3413,6 @@ static int nbu2ss_drv_probe(struct platform_device *pdev)
	return status;

cleanup1:
	/* Interrupt Handler - Release */
	free_irq(USB_UDC_IRQ_1, udc);

cleanup2:
	/* IO Memory - Release */
	if (udc->p_regs)
		iounmap(udc->p_regs);

cleanup3:
	/* IO Memory Region - Release */
	release_mem_region(USB_BASE_ADDRESS, USB_BASE_SIZE);

	return status;
}

@@ -3455,19 +3444,9 @@ static int __exit nbu2ss_drv_remove(struct platform_device *pdev)
				(void *)ep->virt_buf, ep->phys_buf);
	}

	/* Interrupt Handler - Release */
	free_irq(USB_UDC_IRQ_1, udc);

	/* Interrupt Handler - Release */
	free_irq(INT_VBUS, udc);

	/* IO Memory - Release */
	if (udc->p_regs)
		iounmap(udc->p_regs);

	/* IO Memory Region - Release */
	release_mem_region(USB_BASE_ADDRESS, USB_BASE_SIZE);

	return 0;
}

+0 −9
Original line number Diff line number Diff line
@@ -47,20 +47,11 @@


/*------------ Board dependence(Resource) */
#define USB_BASE_ADDRESS	EMXX_USBS1_BASE
#define USB_BASE_SIZE		0x2000

#define USB_UDC_IRQ_0		INT_USBF0
#define USB_UDC_IRQ_1		INT_USBF1
#define	VBUS_VALUE		GPIO_VBUS

/* below hacked up for staging integration */
#define GPIO_VBUS 0 /* GPIO_P153 on KZM9D */
#define INT_VBUS 0 /* IRQ for GPIO_P153 */
#define INT_USBF0 158
#define INT_USBF1 159
#define EMXX_USBS0_BASE 0xe2700000
#define EMXX_USBS1_BASE 0xe2800000

/*------------ Board dependence(Wait) */