* [PATCH/RFC] powerpc: Add of_platform support for OHCI/Bigendian HC
@ 2006-11-01 20:31 Nicolas DET
2006-11-01 22:23 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 9+ messages in thread
From: Nicolas DET @ 2006-11-01 20:31 UTC (permalink / raw)
To: linuxppc-dev, benh, sl, linuxppc-embedded
[-- Attachment #1: Type: text/plain, Size: 193 bytes --]
This patch use of_platform device to probe and install OHCI big endian HC.
PS: I did not success to properly inline the file using thrunderbird.
Signed-off-by: Nicolas DET <nd@bplan-gmbh.de>
[-- Attachment #2: archpowerpc_ohciof.patch --]
[-- Type: text/plain, Size: 7160 bytes --]
--- a/drivers/usb/host/ohci-ppc-of.c 1970-01-01 01:00:00.000000000 +0100
+++ b/drivers/usb/host/ohci-ppc-of.c 2006-11-01 21:16:06.000000000 +0100
@@ -0,0 +1,251 @@
+/*
+ * OHCI HCD (Host Controller Driver) for USB.
+ *
+ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
+ * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>
+ * (C) Copyright 2002 Hewlett-Packard Company
+ * (C) Copyright 2003-2005 MontaVista Software Inc.
+ *
+ * Probe and init OHCI Big endian HC from OpenFirmware device tree
+ * Tested on Efika 5k2
+ *
+ * Modified by Dale Farnsworth <dale@farnsworth.org> from ohci-sa1111.c
+ *
+ * This file is licenced under the GPL.
+ */
+
+#include <linux/signal.h>
+
+#include <asm/of_device.h>
+#include <asm/prom.h>
+
+/* configure so an HC device and id are always provided */
+/* always called with process context; sleeping is OK */
+
+/**
+ * usb_hcd_ppc_of_probe - initialize On-Chip HCDs
+ * Context: !in_interrupt()
+ *
+ * Allocates basic resources for this USB host controller.
+ *
+ * Store this function in the HCD's struct pci_driver as probe().
+ */
+static int usb_hcd_ppc_of_probe(const struct hc_driver *driver,
+ struct of_device *dev)
+{
+ int retval;
+ struct usb_hcd *hcd;
+ struct ohci_hcd *ohci;
+ struct resource res;
+ int irq;
+ int ret;
+
+ pr_debug("initializing PPC-OF USB Controller\n");
+
+ if ((ret = of_address_to_resource(dev->node, 0, &res)) != 0)
+ return ret;
+
+ hcd = usb_create_hcd(driver, &dev->dev, "PPC-OF USB");
+ if (!hcd)
+ return -ENOMEM;
+ hcd->rsrc_start = res.start;
+ hcd->rsrc_len = res.end - res.start + 1;
+
+ if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
+ pr_debug(__FILE__ ": request_mem_region failed\n");
+ retval = -EBUSY;
+ goto err1;
+ }
+
+ irq = irq_of_parse_and_map(dev->node, 0);
+ if (irq == NO_IRQ) {
+ retval = -EBUSY;
+ goto err2;
+ }
+
+ hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
+ if (!hcd->regs) {
+ pr_debug(__FILE__ ": ioremap failed\n");
+ retval = -ENOMEM;
+ goto err2;
+ }
+
+ ohci = hcd_to_ohci(hcd);
+ ohci->flags |= OHCI_BIG_ENDIAN;
+ ohci_hcd_init(ohci);
+
+ retval = usb_add_hcd(hcd, irq, IRQF_DISABLED);
+ if (retval == 0)
+ return retval;
+
+ pr_debug("Removing PPC-OF USB Controller\n");
+
+ iounmap(hcd->regs);
+ err2:
+ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
+ err1:
+ usb_put_hcd(hcd);
+ return retval;
+}
+
+
+/* may be called without controller electrically present */
+/* may be called with controller, bus, and devices active */
+
+/**
+ * usb_hcd_ppc_of_remove - shutdown processing for On-Chip HCDs
+ * @pdev: USB Host Controller being removed
+ * Context: !in_interrupt()
+ *
+ * Reverses the effect of usb_hcd_ppc_of_probe().
+ * It is always called from a thread
+ * context, normally "rmmod", "apmd", or something similar.
+ *
+ */
+static void usb_hcd_ppc_of_remove(struct usb_hcd *hcd,
+ struct of_device *op)
+{
+ usb_remove_hcd(hcd);
+
+ pr_debug("stopping PPC-OF USB Controller\n");
+
+ iounmap(hcd->regs);
+ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
+ usb_put_hcd(hcd);
+}
+
+static int __devinit
+ohci_ppc_of_start(struct usb_hcd *hcd)
+{
+ struct ohci_hcd *ohci = hcd_to_ohci(hcd);
+ int ret;
+
+ if ((ret = ohci_init(ohci)) < 0)
+ return ret;
+
+ if ((ret = ohci_run(ohci)) < 0) {
+ err("can't start %s", ohci_to_hcd(ohci)->self.bus_name);
+ ohci_stop(hcd);
+ return ret;
+ }
+
+ return 0;
+}
+
+static const struct hc_driver ohci_ppc_of_hc_driver = {
+ .description = hcd_name,
+ .hcd_priv_size = sizeof(struct ohci_hcd),
+
+ /*
+ * generic hardware linkage
+ */
+ .irq = ohci_irq,
+ .flags = HCD_USB11 | HCD_MEMORY,
+
+ /*
+ * basic lifecycle operations
+ */
+ .start = ohci_ppc_of_start,
+ .stop = ohci_stop,
+ .shutdown = ohci_shutdown,
+
+ /*
+ * managing i/o requests and associated device resources
+ */
+ .urb_enqueue = ohci_urb_enqueue,
+ .urb_dequeue = ohci_urb_dequeue,
+ .endpoint_disable = ohci_endpoint_disable,
+
+ /*
+ * scheduling support
+ */
+ .get_frame_number = ohci_get_frame,
+
+ /*
+ * root hub support
+ */
+ .hub_status_data = ohci_hub_status_data,
+ .hub_control = ohci_hub_control,
+ .hub_irq_enable = ohci_rhsc_enable,
+#ifdef CONFIG_PM
+ .bus_suspend = ohci_bus_suspend,
+ .bus_resume = ohci_bus_resume,
+#endif
+ .start_port_reset = ohci_start_port_reset,
+};
+
+static int __devinit
+ohci_hcd_ppc_of_drv_probe(struct of_device *op, const struct of_device_id *match)
+{
+ int ret;
+
+ if (usb_disabled())
+ return -ENODEV;
+
+ ret = usb_hcd_ppc_of_probe(&ohci_ppc_of_hc_driver, op);
+ return ret;
+}
+
+static int ohci_hcd_ppc_of_drv_remove(struct of_device *op)
+{
+ struct usb_hcd *hcd = dev_get_drvdata(&op->dev);
+ dev_set_drvdata(&op->dev, NULL);
+
+ usb_hcd_ppc_of_remove(hcd, op);
+ return 0;
+}
+
+static int ohci_hcd_ppc_of_drv_shutdown(struct of_device *op)
+{
+ struct usb_hcd *hcd = dev_get_drvdata(&op->dev);
+
+ if (hcd->driver->shutdown)
+ hcd->driver->shutdown(hcd);
+
+ return 0;
+}
+
+static struct of_device_id ohci_hcd_ppc_of_match[] = {
+ {
+ .name = "usb",
+ .compatible = "ohci-bigendian",
+ },
+ {
+ .name = "usb",
+ .compatible = "ohci-be",
+ },
+ {},
+};
+
+
+static struct of_platform_driver ohci_hcd_ppc_of_driver = {
+ .name = "ppc-of-ohci",
+ .match_table = ohci_hcd_ppc_of_match,
+ .probe = ohci_hcd_ppc_of_drv_probe,
+ .remove = ohci_hcd_ppc_of_drv_remove,
+ .shutdown = ohci_hcd_ppc_of_drv_shutdown,
+#ifdef CONFIG_PM
+ /*.suspend = ohci_hcd_ppc_soc_drv_suspend,*/
+ /*.resume = ohci_hcd_ppc_soc_drv_resume,*/
+#endif
+ .driver = {
+ .name = "ppc-of-ohci",
+ .owner = THIS_MODULE,
+ },
+};
+
+static int __init ohci_hcd_ppc_of_init(void)
+{
+ pr_debug(DRIVER_INFO " (PPC OF)\n");
+ pr_debug("block sizes: ed %d td %d\n", sizeof(struct ed),
+ sizeof(struct td));
+ return of_register_driver(&ohci_hcd_ppc_of_driver);
+}
+
+static void __exit ohci_hcd_ppc_of_cleanup(void)
+{
+ of_unregister_driver(&ohci_hcd_ppc_of_driver);
+}
+
+module_init(ohci_hcd_ppc_of_init);
+module_exit(ohci_hcd_ppc_of_cleanup);
--- a/drivers/usb/host/Kconfig 2006-11-01 09:18:56.000000000 +0100
+++ b/drivers/usb/host/Kconfig 2006-11-01 21:16:06.000000000 +0100
@@ -106,6 +106,14 @@ config USB_OHCI_HCD_PPC_SOC
Enables support for the USB controller on the MPC52xx or
STB03xxx processor chip. If unsure, say Y.
+config USB_OHCI_HCD_PPC_OF
+ bool "OHCI support for PPC USB controller for OpenFirmware platform"
+ depends on USB_OHCI_HCD && PPC_OF
+ default y
+ select USB_OHCI_BIG_ENDIAN
+ ---help---
+ Enables support for the USB controller PowerPC OpenFirmware platform
+
config USB_OHCI_HCD_PCI
bool "OHCI support for PCI-bus USB controllers"
depends on USB_OHCI_HCD && PCI && (STB03xxx || PPC_MPC52xx)
--- a/drivers/usb/host/ohci-hcd.c 2006-11-01 09:18:56.000000000 +0100
+++ b/drivers/usb/host/ohci-hcd.c 2006-11-01 21:16:06.000000000 +0100
@@ -930,6 +930,12 @@ MODULE_LICENSE ("GPL");
#include "ohci-ppc-soc.c"
#endif
+#ifdef CONFIG_USB_OHCI_HCD_PPC_OF
+#include "ohci-ppc-of.c"
+#endif
+
+
+
#if defined(CONFIG_ARCH_AT91RM9200) || defined(CONFIG_ARCH_AT91SAM9261)
#include "ohci-at91.c"
#endif
[-- Attachment #3: nd.vcf --]
[-- Type: text/x-vcard, Size: 249 bytes --]
begin:vcard
fn:Nicolas DET ( bplan GmbH )
n:DET;Nicolas
org:bplan GmbH
adr:;;;;;;Germany
email;internet:nd@bplan-gmbh.de
title:Software Entwicklung
tel;work:+49 6171 9187 - 31
x-mozilla-html:FALSE
url:http://www.bplan-gmbh.de
version:2.1
end:vcard
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH/RFC] powerpc: Add of_platform support for OHCI/Bigendian HC
2006-11-01 20:31 [PATCH/RFC] powerpc: Add of_platform support for OHCI/Bigendian HC Nicolas DET
@ 2006-11-01 22:23 ` Benjamin Herrenschmidt
2006-11-01 23:27 ` Benjamin Herrenschmidt
2006-11-01 23:49 ` Linas Vepstas
0 siblings, 2 replies; 9+ messages in thread
From: Benjamin Herrenschmidt @ 2006-11-01 22:23 UTC (permalink / raw)
To: Nicolas DET; +Cc: linuxppc-dev, sl, linuxppc-embedded
On Wed, 2006-11-01 at 21:31 +0100, Nicolas DET wrote:
> +/**+ ohci = hcd_to_ohci(hcd);
> + ohci->flags |= OHCI_BIG_ENDIAN;
> + ohci_hcd_init(ohci);
Bon, c'est pas mal. Le seul truc ici, c'est que je prefererais que
big-endian ne soit pas hard-code comme ca mais depende du device-tree.
Ce code doit pouvoir etre re-utilise pour des implementations
little-endian.
> + retval = usb_add_hcd(hcd, irq, IRQF_DISABLED);
> + if (retval == 0)
> + return retval;
Pourquoi IRQF_DISABLED ?
> +module_init(ohci_hcd_ppc_of_init);
> +module_exit(ohci_hcd_ppc_of_cleanup);
> --- a/drivers/usb/host/Kconfig 2006-11-01 09:18:56.000000000 +0100
> +++ b/drivers/usb/host/Kconfig 2006-11-01 21:16:06.000000000 +0100
> @@ -106,6 +106,14 @@ config USB_OHCI_HCD_PPC_SOC
> Enables support for the USB controller on the MPC52xx or
> STB03xxx processor chip. If unsure, say Y.
>
> +config USB_OHCI_HCD_PPC_OF
> + bool "OHCI support for PPC USB controller for OpenFirmware platform"
> + depends on USB_OHCI_HCD && PPC_OF
> + default y
> + select USB_OHCI_BIG_ENDIAN
> + ---help---
> + Enables support for the USB controller PowerPC OpenFirmware platform
> +
Je prefererais que USB_OHCI_BIG_ENDIAN soit une option a choisir.
Ben.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH/RFC] powerpc: Add of_platform support for OHCI/Bigendian HC
2006-11-01 22:23 ` Benjamin Herrenschmidt
@ 2006-11-01 23:27 ` Benjamin Herrenschmidt
2006-11-02 20:49 ` Nicolas DET
2006-11-01 23:49 ` Linas Vepstas
1 sibling, 1 reply; 9+ messages in thread
From: Benjamin Herrenschmidt @ 2006-11-01 23:27 UTC (permalink / raw)
To: Nicolas DET; +Cc: linuxppc-dev, sl, linuxppc-embedded
On Thu, 2006-11-02 at 09:23 +1100, Benjamin Herrenschmidt wrote:
And in english here too....
> On Wed, 2006-11-01 at 21:31 +0100, Nicolas DET wrote:
>
> > +/**+ ohci = hcd_to_ohci(hcd);
> > + ohci->flags |= OHCI_BIG_ENDIAN;
> > + ohci_hcd_init(ohci);
>
> Bon, c'est pas mal. Le seul truc ici, c'est que je prefererais que
> big-endian ne soit pas hard-code comme ca mais depende du device-tree.
> Ce code doit pouvoir etre re-utilise pour des implementations
> little-endian.
Ok, so it looks good. The only thing here is that I would prefer if the
big-endian setting wasn't hard-coded, but set based on the device-tree,
so that this code can be re-used for little-endian implementations.
> > + retval = usb_add_hcd(hcd, irq, IRQF_DISABLED);
> > + if (retval == 0)
> > + return retval;
>
> Pourquoi IRQF_DISABLED ?
Why IRQF_DISABLED ?
> > +module_init(ohci_hcd_ppc_of_init);
> > +module_exit(ohci_hcd_ppc_of_cleanup);
> > --- a/drivers/usb/host/Kconfig 2006-11-01 09:18:56.000000000 +0100
> > +++ b/drivers/usb/host/Kconfig 2006-11-01 21:16:06.000000000 +0100
> > @@ -106,6 +106,14 @@ config USB_OHCI_HCD_PPC_SOC
> > Enables support for the USB controller on the MPC52xx or
> > STB03xxx processor chip. If unsure, say Y.
> >
> > +config USB_OHCI_HCD_PPC_OF
> > + bool "OHCI support for PPC USB controller for OpenFirmware platform"
> > + depends on USB_OHCI_HCD && PPC_OF
> > + default y
> > + select USB_OHCI_BIG_ENDIAN
> > + ---help---
> > + Enables support for the USB controller PowerPC OpenFirmware platform
> > +
>
> Je prefererais que USB_OHCI_BIG_ENDIAN soit une option a choisir.
I'd prefer if USB_OHCI_BIG_ENDIAN was a user selectable option
Ben.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH/RFC] powerpc: Add of_platform support for OHCI/Bigendian HC
2006-11-01 22:23 ` Benjamin Herrenschmidt
2006-11-01 23:27 ` Benjamin Herrenschmidt
@ 2006-11-01 23:49 ` Linas Vepstas
2006-11-02 0:07 ` Benjamin Herrenschmidt
1 sibling, 1 reply; 9+ messages in thread
From: Linas Vepstas @ 2006-11-01 23:49 UTC (permalink / raw)
To: Benjamin Herrenschmidt; +Cc: linuxppc-dev, linuxppc-embedded, sl
On Thu, Nov 02, 2006 at 09:23:18AM +1100, Benjamin Herrenschmidt wrote:
> On Wed, 2006-11-01 at 21:31 +0100, Nicolas DET wrote:
>
> > +/**+ ohci = hcd_to_ohci(hcd);
^^^
???
Qu'est que c'est?
--linas
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH/RFC] powerpc: Add of_platform support for OHCI/Bigendian HC
2006-11-01 23:49 ` Linas Vepstas
@ 2006-11-02 0:07 ` Benjamin Herrenschmidt
0 siblings, 0 replies; 9+ messages in thread
From: Benjamin Herrenschmidt @ 2006-11-02 0:07 UTC (permalink / raw)
To: Linas Vepstas; +Cc: linuxppc-dev, linuxppc-embedded, sl
On Wed, 2006-11-01 at 17:49 -0600, Linas Vepstas wrote:
> On Thu, Nov 02, 2006 at 09:23:18AM +1100, Benjamin Herrenschmidt wrote:
> > On Wed, 2006-11-01 at 21:31 +0100, Nicolas DET wrote:
> >
> > > +/**+ ohci = hcd_to_ohci(hcd);
> ^^^
> ???
>
> Qu'est que c'est?
Probably just me not properly cutting the previous lines :)
Ben.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH/RFC] powerpc: Add of_platform support for OHCI/Bigendian HC
2006-11-01 23:27 ` Benjamin Herrenschmidt
@ 2006-11-02 20:49 ` Nicolas DET
2006-11-04 22:04 ` Sylvain Munaut
2006-11-04 23:37 ` Benjamin Herrenschmidt
0 siblings, 2 replies; 9+ messages in thread
From: Nicolas DET @ 2006-11-02 20:49 UTC (permalink / raw)
To: Benjamin Herrenschmidt; +Cc: linuxppc-dev, sl, linuxppc-embedded
[-- Attachment #1: Type: text/plain, Size: 1029 bytes --]
Benjamin Herrenschmidt wrote:
> On Thu, 2006-11-02 at 09:23 +1100, Benjamin Herrenschmidt wrote:
>
> And in english here too....
>
>> On Wed, 2006-11-01 at 21:31 +0100, Nicolas DET wrote:
>>
>>> +/**+ ohci = hcd_to_ohci(hcd);
>>> + ohci->flags |= OHCI_BIG_ENDIAN;
>>> + ohci_hcd_init(ohci);
>> Bon, c'est pas mal. Le seul truc ici, c'est que je prefererais que
>> big-endian ne soit pas hard-code comme ca mais depende du device-tree.
>> Ce code doit pouvoir etre re-utilise pour des implementations
>> little-endian.
>
> Ok, so it looks good. The only thing here is that I would prefer if the
> big-endian setting wasn't hard-coded, but set based on the device-tree,
> so that this code can be re-used for little-endian implementations.
>
>>> + retval = usb_add_hcd(hcd, irq, IRQF_DISABLED);
>>> + if (retval == 0)
>>> + return retval;
>> Pourquoi IRQF_DISABLED ?
>
> Why IRQF_DISABLED ?
>
It's like this in ofsoc-ppc. As I am not sure what it does exactly I
left it like this. This module performs well here so far.
[-- Attachment #2: archpowerpc_ohciof.patch --]
[-- Type: text/plain, Size: 8655 bytes --]
--- a/drivers/usb/host/ohci-ppc-of.c 1970-01-01 01:00:00.000000000 +0100
+++ b/drivers/usb/host/ohci-ppc-of.c 2006-11-02 18:06:02.000000000 +0100
@@ -0,0 +1,322 @@
+/*
+ * OHCI HCD (Host Controller Driver) for USB.
+ *
+ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
+ * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>
+ * (C) Copyright 2002 Hewlett-Packard Company
+ * (C) Copyright 2003-2005 MontaVista Software Inc.
+ *
+ * Probe and init OHCI Big endian HC from OpenFirmware device tree
+ * Tested on Efika 5k2
+ *
+ * Modified by Dale Farnsworth <dale@farnsworth.org> from ohci-sa1111.c
+ *
+ * This file is licenced under the GPL.
+ */
+
+#include <linux/signal.h>
+
+#include <asm/of_device.h>
+#include <asm/prom.h>
+
+/* configure so an HC device and id are always provided */
+/* always called with process context; sleeping is OK */
+
+/*
+ * usb_hcd_ppc_of_probe - initialize On-Chip HCDs
+ * Context: !in_interrupt()
+ *
+ * Allocates basic resources for this USB host controller.
+ *
+ * Store this function in the HCD's struct pci_driver as probe().
+ */
+static int usb_hcd_ppc_of_probe(const struct hc_driver *driver,
+ struct of_device *dev, int is_bigendian)
+{
+ int retval;
+ struct usb_hcd *hcd;
+ struct ohci_hcd *ohci;
+ struct resource res;
+ int irq;
+ int ret;
+
+ pr_debug("initializing PPC-OF USB Controller\n");
+
+ if ((ret = of_address_to_resource(dev->node, 0, &res)) != 0)
+ return ret;
+
+ hcd = usb_create_hcd(driver, &dev->dev, "PPC-OF USB");
+ if (!hcd)
+ return -ENOMEM;
+ hcd->rsrc_start = res.start;
+ hcd->rsrc_len = res.end - res.start + 1;
+
+ if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
+ pr_debug(__FILE__ ": request_mem_region failed\n");
+ retval = -EBUSY;
+ goto err1;
+ }
+
+ irq = irq_of_parse_and_map(dev->node, 0);
+ if (irq == NO_IRQ) {
+ retval = -EBUSY;
+ goto err2;
+ }
+
+ hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
+ if (!hcd->regs) {
+ pr_debug(__FILE__ ": ioremap failed\n");
+ retval = -ENOMEM;
+ goto err2;
+ }
+
+ ohci = hcd_to_ohci(hcd);
+ if (is_bigendian)
+ ohci->flags |= OHCI_BIG_ENDIAN;
+ ohci_hcd_init(ohci);
+
+ retval = usb_add_hcd(hcd, irq, IRQF_DISABLED);
+ if (retval == 0)
+ return retval;
+
+ pr_debug("Removing PPC-OF USB Controller\n");
+
+ iounmap(hcd->regs);
+ err2:
+ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
+ err1:
+ usb_put_hcd(hcd);
+ return retval;
+}
+
+
+/* may be called without controller electrically present */
+/* may be called with controller, bus, and devices active */
+
+/*
+ * usb_hcd_ppc_of_remove - shutdown processing for On-Chip HCDs
+ * @pdev: USB Host Controller being removed
+ * Context: !in_interrupt()
+ *
+ * Reverses the effect of usb_hcd_ppc_of_probe().
+ * It is always called from a thread
+ * context, normally "rmmod", "apmd", or something similar.
+ *
+ */
+static void usb_hcd_ppc_of_remove(struct usb_hcd *hcd,
+ struct of_device *op)
+{
+ usb_remove_hcd(hcd);
+
+ pr_debug("stopping PPC-OF USB Controller\n");
+
+ iounmap(hcd->regs);
+ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
+ usb_put_hcd(hcd);
+}
+
+static int __devinit
+ohci_ppc_of_start(struct usb_hcd *hcd)
+{
+ struct ohci_hcd *ohci = hcd_to_ohci(hcd);
+ int ret;
+
+ if ((ret = ohci_init(ohci)) < 0)
+ return ret;
+
+ if ((ret = ohci_run(ohci)) < 0) {
+ err("can't start %s", ohci_to_hcd(ohci)->self.bus_name);
+ ohci_stop(hcd);
+ return ret;
+ }
+
+ return 0;
+}
+
+static const struct hc_driver ohci_ppc_of_hc_driver = {
+ .description = hcd_name,
+ .hcd_priv_size = sizeof(struct ohci_hcd),
+
+ /*
+ * generic hardware linkage
+ */
+ .irq = ohci_irq,
+ .flags = HCD_USB11 | HCD_MEMORY,
+
+ /*
+ * basic lifecycle operations
+ */
+ .start = ohci_ppc_of_start,
+ .stop = ohci_stop,
+ .shutdown = ohci_shutdown,
+
+ /*
+ * managing i/o requests and associated device resources
+ */
+ .urb_enqueue = ohci_urb_enqueue,
+ .urb_dequeue = ohci_urb_dequeue,
+ .endpoint_disable = ohci_endpoint_disable,
+
+ /*
+ * scheduling support
+ */
+ .get_frame_number = ohci_get_frame,
+
+ /*
+ * root hub support
+ */
+ .hub_status_data = ohci_hub_status_data,
+ .hub_control = ohci_hub_control,
+ .hub_irq_enable = ohci_rhsc_enable,
+#ifdef CONFIG_PM
+ .bus_suspend = ohci_bus_suspend,
+ .bus_resume = ohci_bus_resume,
+#endif
+ .start_port_reset = ohci_start_port_reset,
+};
+
+
+
+static int ohci_hcd_ppc_of_drv_remove(struct of_device *op)
+{
+ struct usb_hcd *hcd = dev_get_drvdata(&op->dev);
+ dev_set_drvdata(&op->dev, NULL);
+
+ usb_hcd_ppc_of_remove(hcd, op);
+ return 0;
+}
+
+static int ohci_hcd_ppc_of_drv_shutdown(struct of_device *op)
+{
+ struct usb_hcd *hcd = dev_get_drvdata(&op->dev);
+
+ if (hcd->driver->shutdown)
+ hcd->driver->shutdown(hcd);
+
+ return 0;
+}
+
+/*
+ *
+*/
+
+static struct of_device_id ohci_hcd_ppc_of_match_be[] = {
+ {
+ .name = "usb",
+ .compatible = "ohci-bigendian",
+ },
+ {
+ .name = "usb",
+ .compatible = "ohci-be",
+ },
+ {},
+};
+
+static int __devinit
+ohci_hcd_ppc_of_drv_probe_be(struct of_device *op, const struct of_device_id *match)
+{
+ int ret;
+
+ if (usb_disabled())
+ return -ENODEV;
+
+ ret = usb_hcd_ppc_of_probe(&ohci_ppc_of_hc_driver, op, 1);
+ return ret;
+}
+
+static struct of_platform_driver ohci_hcd_ppc_of_driver_be = {
+ .name = "ppc-of-ohci-be",
+ .match_table = ohci_hcd_ppc_of_match_be,
+ .probe = ohci_hcd_ppc_of_drv_probe_be,
+ .remove = ohci_hcd_ppc_of_drv_remove,
+ .shutdown = ohci_hcd_ppc_of_drv_shutdown,
+#ifdef CONFIG_PM
+ /*.suspend = ohci_hcd_ppc_soc_drv_suspend,*/
+ /*.resume = ohci_hcd_ppc_soc_drv_resume,*/
+#endif
+ .driver = {
+ .name = "ppc-of-ohci-be",
+ .owner = THIS_MODULE,
+ },
+};
+
+static int __init ohci_hcd_ppc_of_init_be(void)
+{
+ pr_debug(DRIVER_INFO " (PPC OF)\n");
+ pr_debug("block sizes: ed %d td %d\n", sizeof(struct ed),
+ sizeof(struct td));
+
+ return of_register_driver(&ohci_hcd_ppc_of_driver_be);
+}
+
+static void __exit ohci_hcd_ppc_of_cleanup_be(void)
+{
+ of_unregister_driver(&ohci_hcd_ppc_of_driver_be);
+}
+
+module_init(ohci_hcd_ppc_of_init_be);
+module_exit(ohci_hcd_ppc_of_cleanup_be);
+
+/*
+ *
+*/
+
+static struct of_device_id ohci_hcd_ppc_of_match_le[] = {
+ {
+ .name = "usb",
+ .compatible = "ohci-littledian",
+ },
+ {
+ .name = "usb",
+ .compatible = "ohci-le",
+ },
+ {},
+};
+
+static int __devinit
+ohci_hcd_ppc_of_drv_probe_le(struct of_device *op, const struct of_device_id *match)
+{
+ int ret;
+
+ if (usb_disabled())
+ return -ENODEV;
+
+ ret = usb_hcd_ppc_of_probe(&ohci_ppc_of_hc_driver, op, 0);
+ return ret;
+}
+
+
+static struct of_platform_driver ohci_hcd_ppc_of_driver_le = {
+ .name = "ppc-of-ohci-le",
+ .match_table = ohci_hcd_ppc_of_match_le,
+ .probe = ohci_hcd_ppc_of_drv_probe_le,
+ .remove = ohci_hcd_ppc_of_drv_remove,
+ .shutdown = ohci_hcd_ppc_of_drv_shutdown,
+#ifdef CONFIG_PM
+ /*.suspend = ohci_hcd_ppc_soc_drv_suspend,*/
+ /*.resume = ohci_hcd_ppc_soc_drv_resume,*/
+#endif
+ .driver = {
+ .name = "ppc-of-ohci-le",
+ .owner = THIS_MODULE,
+ },
+};
+
+static int __init ohci_hcd_ppc_of_init_le(void)
+{
+ pr_debug(DRIVER_INFO " (PPC OF)\n");
+ pr_debug("block sizes: ed %d td %d\n", sizeof(struct ed),
+ sizeof(struct td));
+
+ return of_register_driver(&ohci_hcd_ppc_of_driver_le);
+}
+
+static void __exit ohci_hcd_ppc_of_cleanup_le(void)
+{
+ of_unregister_driver(&ohci_hcd_ppc_of_driver_le);
+}
+
+
+module_init(ohci_hcd_ppc_of_init_le);
+module_exit(ohci_hcd_ppc_of_cleanup_le);
+
--- a/drivers/usb/host/Kconfig 2006-11-01 09:18:56.000000000 +0100
+++ b/drivers/usb/host/Kconfig 2006-11-02 17:54:37.000000000 +0100
@@ -106,6 +106,15 @@ config USB_OHCI_HCD_PPC_SOC
Enables support for the USB controller on the MPC52xx or
STB03xxx processor chip. If unsure, say Y.
+config USB_OHCI_HCD_PPC_OF
+ bool "OHCI support for PPC USB controller for OpenFirmware platform"
+ depends on USB_OHCI_HCD && PPC_OF
+ default y
+ select USB_OHCI_BIG_ENDIAN
+ select USB_OHCI_LITTLE_ENDIAN
+ ---help---
+ Enables support for the USB controller PowerPC OpenFirmware platform
+
config USB_OHCI_HCD_PCI
bool "OHCI support for PCI-bus USB controllers"
depends on USB_OHCI_HCD && PCI && (STB03xxx || PPC_MPC52xx)
--- a/drivers/usb/host/ohci-hcd.c 2006-11-01 09:18:56.000000000 +0100
+++ b/drivers/usb/host/ohci-hcd.c 2006-11-02 18:06:02.000000000 +0100
@@ -930,6 +930,12 @@ MODULE_LICENSE ("GPL");
#include "ohci-ppc-soc.c"
#endif
+#ifdef CONFIG_USB_OHCI_HCD_PPC_OF
+#include "ohci-ppc-of.c"
+#endif
+
+
+
#if defined(CONFIG_ARCH_AT91RM9200) || defined(CONFIG_ARCH_AT91SAM9261)
#include "ohci-at91.c"
#endif
[-- Attachment #3: nd.vcf --]
[-- Type: text/x-vcard, Size: 249 bytes --]
begin:vcard
fn:Nicolas DET ( bplan GmbH )
n:DET;Nicolas
org:bplan GmbH
adr:;;;;;;Germany
email;internet:nd@bplan-gmbh.de
title:Software Entwicklung
tel;work:+49 6171 9187 - 31
x-mozilla-html:FALSE
url:http://www.bplan-gmbh.de
version:2.1
end:vcard
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH/RFC] powerpc: Add of_platform support for OHCI/Bigendian HC
2006-11-02 20:49 ` Nicolas DET
@ 2006-11-04 22:04 ` Sylvain Munaut
2006-11-04 22:15 ` Benjamin Herrenschmidt
2006-11-04 23:37 ` Benjamin Herrenschmidt
1 sibling, 1 reply; 9+ messages in thread
From: Sylvain Munaut @ 2006-11-04 22:04 UTC (permalink / raw)
To: Nicolas DET; +Cc: linuxppc-embedded, sl, linuxppc-dev
>
> ------------------------------------------------------------------------
> +
> +static struct of_device_id ohci_hcd_ppc_of_match_be[] = {
> + {
> + .name = "usb",
> + .compatible = "ohci-bigendian",
> + },
> + {
> + .name = "usb",
> + .compatible = "ohci-be",
> + },
> + {},
> +};
>
> +
> +static struct of_device_id ohci_hcd_ppc_of_match_le[] = {
> + {
> + .name = "usb",
> + .compatible = "ohci-littledian",
> + },
> + {
> + .name = "usb",
> + .compatible = "ohci-le",
> + },
> + {},
> +};
>
Isn't it possible to specify "options" in the device tree rather than
different names ?
(just a though ...)
It's just duplicating all that code doesn't look nice.
> +config USB_OHCI_HCD_PPC_OF
> + bool "OHCI support for PPC USB controller for OpenFirmware platform"
> + depends on USB_OHCI_HCD && PPC_OF
> + default y
> + select USB_OHCI_BIG_ENDIAN
> + select USB_OHCI_LITTLE_ENDIAN
> + ---help---
> + Enables support for the USB controller PowerPC OpenFirmware platform
> +
>
I know what benh said but do we really want to select both all the
times. That adds
quite an overhead to the accesses ...
> --- a/drivers/usb/host/ohci-hcd.c 2006-11-01 09:18:56.000000000 +0100
> +++ b/drivers/usb/host/ohci-hcd.c 2006-11-02 18:06:02.000000000 +0100
> @@ -930,6 +930,12 @@ MODULE_LICENSE ("GPL");
> #include "ohci-ppc-soc.c"
> #endif
>
> +#ifdef CONFIG_USB_OHCI_HCD_PPC_OF
> +#include "ohci-ppc-of.c"
> +#endif
> +
> +
> +
> #if defined(CONFIG_ARCH_AT91RM9200) || defined(CONFIG_ARCH_AT91SAM9261)
> #include "ohci-at91.c"
> #endif
>
Don't add space for nothing. All the #if #endif are space by one empty
line, keep it that way.
You also missed the last #if #end
#if !(defined(CONFIG_PCI) \
|| defined(CONFIG_SA1111) \
|| defined(CONFIG_ARCH_S3C2410) \
|| defined(CONFIG_ARCH_OMAP) \
|| defined (CONFIG_ARCH_LH7A404) \
|| defined (CONFIG_PXA27x) \
|| defined (CONFIG_ARCH_EP93XX) \
|| defined (CONFIG_SOC_AU1X00) \
|| defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \
|| defined (CONFIG_ARCH_AT91RM9200) \
|| defined (CONFIG_ARCH_AT91SAM9261) \
|| defined (CONFIG_ARCH_PNX4008) \
)
#error "missing bus glue for ohci-hcd"
#endif
You need to add a || defined(...) clause there.
Sylvain
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH/RFC] powerpc: Add of_platform support for OHCI/Bigendian HC
2006-11-04 22:04 ` Sylvain Munaut
@ 2006-11-04 22:15 ` Benjamin Herrenschmidt
0 siblings, 0 replies; 9+ messages in thread
From: Benjamin Herrenschmidt @ 2006-11-04 22:15 UTC (permalink / raw)
To: Sylvain Munaut; +Cc: linuxppc-dev, linuxppc-embedded, sl
On Sat, 2006-11-04 at 23:04 +0100, Sylvain Munaut wrote:
> Isn't it possible to specify "options" in the device tree rather than
> different names ?
> (just a though ...)
> It's just duplicating all that code doesn't look nice.
Well, he certainly doesn't need to different match lists.
He can just have both LE and BE in a single list and have probe()
routine go look at the property instead.
Ben.
> > +config USB_OHCI_HCD_PPC_OF
> > + bool "OHCI support for PPC USB controller for OpenFirmware platform"
> > + depends on USB_OHCI_HCD && PPC_OF
> > + default y
> > + select USB_OHCI_BIG_ENDIAN
> > + select USB_OHCI_LITTLE_ENDIAN
> > + ---help---
> > + Enables support for the USB controller PowerPC OpenFirmware platform
> > +
> >
> I know what benh said but do we really want to select both all the
> times. That adds
> quite an overhead to the accesses ...
What I said ws that I wanted them to be user-selectable options.
Ben.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH/RFC] powerpc: Add of_platform support for OHCI/Bigendian HC
2006-11-02 20:49 ` Nicolas DET
2006-11-04 22:04 ` Sylvain Munaut
@ 2006-11-04 23:37 ` Benjamin Herrenschmidt
1 sibling, 0 replies; 9+ messages in thread
From: Benjamin Herrenschmidt @ 2006-11-04 23:37 UTC (permalink / raw)
To: Nicolas DET; +Cc: linuxppc-dev, sl, linuxppc-embedded
On Thu, 2006-11-02 at 21:49 +0100, Nicolas DET wrote:
> fsoc-ppc. As I am not sure what it does exactly I
> left it like this. This module performs well here so far.
Well, it cause the kernel to keep other interrupts disabled on that CPU
while you are handling yours. Should not be necessary and might cause
undue latencies.
Regarding the rest of the patch, I don't understand why you are creating
duplicate match lists and probe/remove functions.
Just do a single of_platform_driver() that matches both and have it's
probe() function check the properties (device_is_compatible() would do
the trick, though a common thing in OF is to just have an empty property
"big-endian" in the node).
Ben.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2006-11-04 23:37 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-11-01 20:31 [PATCH/RFC] powerpc: Add of_platform support for OHCI/Bigendian HC Nicolas DET
2006-11-01 22:23 ` Benjamin Herrenschmidt
2006-11-01 23:27 ` Benjamin Herrenschmidt
2006-11-02 20:49 ` Nicolas DET
2006-11-04 22:04 ` Sylvain Munaut
2006-11-04 22:15 ` Benjamin Herrenschmidt
2006-11-04 23:37 ` Benjamin Herrenschmidt
2006-11-01 23:49 ` Linas Vepstas
2006-11-02 0:07 ` Benjamin Herrenschmidt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).