Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f7e7aa58 authored by Catalin Marinas's avatar Catalin Marinas Committed by Greg Kroah-Hartman
Browse files

USB: Add platform device support for the ISP1760 USB chip



Currently, the driver only supports PCI and PPC_OF but there are
boards like ARM RealView where this is a platform device. The patch adds
the necessary functions and registration to the isp1760-if.c file and
modifies the corresponding Makefile and Kconfig to be able to use this
driver even if PCI and PPC_OF are not enabled.

Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Cc: Sebastian Siewior <bigeasy@linutronix.de>
Cc: Russell King <rmk@arm.linux.org.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent f9031f2c
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ obj-$(CONFIG_USB_SL811_HCD) += host/
obj-$(CONFIG_USB_U132_HCD)	+= host/
obj-$(CONFIG_USB_U132_HCD)	+= host/
obj-$(CONFIG_USB_R8A66597_HCD)	+= host/
obj-$(CONFIG_USB_R8A66597_HCD)	+= host/
obj-$(CONFIG_USB_HWA_HCD)	+= host/
obj-$(CONFIG_USB_HWA_HCD)	+= host/
obj-$(CONFIG_USB_ISP1760_HCD)	+= host/


obj-$(CONFIG_USB_C67X00_HCD)	+= c67x00/
obj-$(CONFIG_USB_C67X00_HCD)	+= c67x00/


+1 −1
Original line number Original line Diff line number Diff line
@@ -120,7 +120,7 @@ config USB_ISP116X_HCD


config USB_ISP1760_HCD
config USB_ISP1760_HCD
	tristate "ISP 1760 HCD support"
	tristate "ISP 1760 HCD support"
	depends on USB && EXPERIMENTAL && (PCI || PPC_OF)
	depends on USB && EXPERIMENTAL
	---help---
	---help---
	  The ISP1760 chip is a USB 2.0 host controller.
	  The ISP1760 chip is a USB 2.0 host controller.


+79 −16
Original line number Original line Diff line number Diff line
@@ -10,6 +10,7 @@


#include <linux/usb.h>
#include <linux/usb.h>
#include <linux/io.h>
#include <linux/io.h>
#include <linux/platform_device.h>


#include "../core/hcd.h"
#include "../core/hcd.h"
#include "isp1760-hcd.h"
#include "isp1760-hcd.h"
@@ -300,39 +301,101 @@ static struct pci_driver isp1761_pci_driver = {
};
};
#endif
#endif


static int __devinit isp1760_plat_probe(struct platform_device *pdev)
{
	int ret = 0;
	struct usb_hcd *hcd;
	struct resource *mem_res;
	struct resource *irq_res;
	resource_size_t mem_size;
	unsigned long irqflags = IRQF_SHARED | IRQF_DISABLED;

	mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!mem_res) {
		pr_warning("isp1760: Memory resource not available\n");
		ret = -ENODEV;
		goto out;
	}
	mem_size = resource_size(mem_res);
	if (!request_mem_region(mem_res->start, mem_size, "isp1760")) {
		pr_warning("isp1760: Cannot reserve the memory resource\n");
		ret = -EBUSY;
		goto out;
	}

	irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
	if (!irq_res) {
		pr_warning("isp1760: IRQ resource not available\n");
		return -ENODEV;
	}
	irqflags |= irq_res->flags & IRQF_TRIGGER_MASK;

	hcd = isp1760_register(mem_res->start, mem_size, irq_res->start,
			       irqflags, &pdev->dev, dev_name(&pdev->dev), 0);
	if (IS_ERR(hcd)) {
		pr_warning("isp1760: Failed to register the HCD device\n");
		ret = -ENODEV;
		goto cleanup;
	}

	pr_info("ISP1760 USB device initialised\n");
	return ret;

cleanup:
	release_mem_region(mem_res->start, mem_size);
out:
	return ret;
}

static int __devexit isp1760_plat_remove(struct platform_device *pdev)
{
	struct resource *mem_res;
	resource_size_t mem_size;

	mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	mem_size = resource_size(mem_res);
	release_mem_region(mem_res->start, mem_size);

	return 0;
}

static struct platform_driver isp1760_plat_driver = {
	.probe	= isp1760_plat_probe,
	.remove	= isp1760_plat_remove,
	.driver	= {
		.name	= "isp1760",
	},
};

static int __init isp1760_init(void)
static int __init isp1760_init(void)
{
{
	int ret;
	int ret, any_ret = -ENODEV;


	init_kmem_once();
	init_kmem_once();


	ret = platform_driver_register(&isp1760_plat_driver);
	if (!ret)
		any_ret = 0;
#ifdef CONFIG_PPC_OF
#ifdef CONFIG_PPC_OF
	ret = of_register_platform_driver(&isp1760_of_driver);
	ret = of_register_platform_driver(&isp1760_of_driver);
	if (ret) {
	if (!ret)
		deinit_kmem_cache();
		any_ret = 0;
		return ret;
	}
#endif
#endif
#ifdef CONFIG_PCI
#ifdef CONFIG_PCI
	ret = pci_register_driver(&isp1761_pci_driver);
	ret = pci_register_driver(&isp1761_pci_driver);
	if (ret)
	if (!ret)
		goto unreg_of;
		any_ret = 0;
#endif
#endif
	return ret;


#ifdef CONFIG_PCI
	if (any_ret)
unreg_of:
#endif
#ifdef CONFIG_PPC_OF
	of_unregister_platform_driver(&isp1760_of_driver);
#endif
		deinit_kmem_cache();
		deinit_kmem_cache();
	return ret;
	return any_ret;
}
}
module_init(isp1760_init);
module_init(isp1760_init);


static void __exit isp1760_exit(void)
static void __exit isp1760_exit(void)
{
{
	platform_driver_unregister(&isp1760_plat_driver);
#ifdef CONFIG_PPC_OF
#ifdef CONFIG_PPC_OF
	of_unregister_platform_driver(&isp1760_of_driver);
	of_unregister_platform_driver(&isp1760_of_driver);
#endif
#endif