summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/linux/linux-efika-2.6.20/.mtn2git_empty0
-rw-r--r--packages/linux/linux-efika-2.6.20/0001-powerpc-serial-Dispose-irq-mapping-when-done-in-mpc52xx_serial.c.txt27
-rw-r--r--packages/linux/linux-efika-2.6.20/0003-powerpc-Add-device-tree-fixups-for-the-EFIKA.txt110
-rw-r--r--packages/linux/linux-efika-2.6.20/0004-powerpc-Use-common-52xx-of_platform-probe-code-for-EFIKA.txt106
-rw-r--r--packages/linux/linux-efika-2.6.20/0005-powerpc-Restore-proper-link-order-in-platform.txt33
-rw-r--r--packages/linux/linux-efika-2.6.20/0006-Rework-the-OHCI-quirk-mecanism-as-suggested-by-David.txt236
-rw-r--r--packages/linux/linux-efika-2.6.20/0007-Implement-support-for-split-endian-OHCI.txt367
-rw-r--r--packages/linux/linux-efika-2.6.20/0008-ohci-Rework-bus-glue-integration-to-allow-several-at-once.txt470
-rw-r--r--packages/linux/linux-efika-2.6.20/0009-ohci-Add-support-for-OHCI-controller-on-the-of_platform-bus.txt349
-rw-r--r--packages/linux/linux-efika-2.6.20/0010-libata-Add-support-for-the-MPC52xx-ATA-controller.txt620
-rw-r--r--packages/linux/linux-efika-2.6.20/0011-ohci-Whitespace-and-typo-fix-in-ohci-ppc-of.c.txt38
-rw-r--r--packages/linux/linux-efika-2.6.20/0012-ata-Fix-pata_mpc52xx.c-compatible-list.txt31
-rw-r--r--packages/linux/linux-efika-2.6.20/0013-powerpc-serial-Fix-mpc52xx_uart.c-compatible-list.txt28
-rw-r--r--packages/linux/linux-efika-2.6.20/0014-powerpc-Small-cleanup-of-EFIKA-platform.txt144
-rw-r--r--packages/linux/linux-efika-2.6.20/0015-powerpc-Add-a-unified-uevent-handler-for-bus-based-on-of_device.txt116
-rw-r--r--packages/linux/linux-efika-2.6.20/0016-macintosh-Use-the-new-of_device-common-uevent-handler.txt130
-rw-r--r--packages/linux/linux-efika-2.6.20/0017-powerpc-Add-uevent-handler-for-of_platform_bus.txt29
-rw-r--r--packages/linux/linux-efika-2.6.20/0018-powerpc-Add-uevent-handler-for-ibmebus.txt50
-rw-r--r--packages/linux/linux-efika-2.6.20/0019-MPC5200-Bestcomm-platform-driver.txt1439
-rw-r--r--packages/linux/linux-efika-2.6.20/0020-Fec-MPC5200-eth-driver.txt1783
-rw-r--r--packages/linux/linux-efika-2.6.20/0021-POWERPC-Copy-bestcomm-support-files-into-arch-powerpc.txt1335
-rw-r--r--packages/linux/linux-efika-2.6.20/0022-MPC52xx-PCI-now-working-on-lite5200.-ugly-but-working.txt464
-rw-r--r--packages/linux/linux-efika-2.6.20/0023-POWERPC-Make-FEC-work-on-the-lite5200.txt700
-rw-r--r--packages/linux/linux-efika-2.6.20/0024-Add-missing-function-prototype.txt26
-rw-r--r--packages/linux/linux-efika-2.6.20/0025-POWERPC-Misc-EFIKA-fixups-for-rtas-chrp.txt133
-rw-r--r--packages/linux/linux-efika-2.6.20/0026-POWERPC-Cleanup-mpc52xx-PCI-support.txt911
-rw-r--r--packages/linux/linux-efika-2.6.20/0027-POWERPC-Change-name-of-mpc52xx-pci-support-file-in-Makefile.txt28
-rw-r--r--packages/linux/linux-efika-2.6.20/0028-POWERPC-Change-link-order-so-mpc52xx-fec-always-shows-up-as-eth0.txt47
-rw-r--r--packages/linux/linux-efika-2.6.20/0029-POWERPC-Fixup-pr_print-format-for-mpc52xx-pci-support.txt28
-rw-r--r--packages/linux/linux-efika-2.6.20/0030-POWERPC-Add-mpc52xx-lite5200-PCI-support.txt871
-rw-r--r--packages/linux/linux-efika-2.6.20/0031-sound-Add-support-for-the-MPC52xx-PSC-AC97-Link.txt828
-rw-r--r--packages/linux/linux-efika-2.6.20/0032-POWERPC-EFIKA-Adds-missing-interrupts-from-bestcomm-node.txt36
-rw-r--r--packages/linux/linux-efika-2.6.20/defconfig1621
-rw-r--r--packages/linux/linux-efika-2.6.20/v4l.diff28
-rw-r--r--packages/linux/linux-efika_2.6.20.bb68
35 files changed, 13230 insertions, 0 deletions
diff --git a/packages/linux/linux-efika-2.6.20/.mtn2git_empty b/packages/linux/linux-efika-2.6.20/.mtn2git_empty
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/packages/linux/linux-efika-2.6.20/.mtn2git_empty
diff --git a/packages/linux/linux-efika-2.6.20/0001-powerpc-serial-Dispose-irq-mapping-when-done-in-mpc52xx_serial.c.txt b/packages/linux/linux-efika-2.6.20/0001-powerpc-serial-Dispose-irq-mapping-when-done-in-mpc52xx_serial.c.txt
new file mode 100644
index 0000000000..ef3c42dc30
--- /dev/null
+++ b/packages/linux/linux-efika-2.6.20/0001-powerpc-serial-Dispose-irq-mapping-when-done-in-mpc52xx_serial.c.txt
@@ -0,0 +1,27 @@
+From 733239db928c98f4d110fc33f0cf1278cf5385ef Mon Sep 17 00:00:00 2001
+From: Sylvain Munaut <tnt@246tNt.com>
+Date: Mon, 18 Dec 2006 22:48:02 +0100
+Subject: [PATCH] [PATCH] powerpc/serial: Dispose irq mapping when done in mpc52xx_serial.c
+
+Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
+---
+ drivers/serial/mpc52xx_uart.c | 3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c
+index 9d11a75..eef3b02 100644
+--- a/drivers/serial/mpc52xx_uart.c
++++ b/drivers/serial/mpc52xx_uart.c
+@@ -997,6 +997,9 @@ mpc52xx_uart_of_remove(struct of_device *op)
+ if (port)
+ uart_remove_one_port(&mpc52xx_uart_driver, port);
+
++ if (port->irq != NO_IRQ)
++ irq_dispose_mapping(port->irq);
++
+ return 0;
+ }
+
+--
+1.4.4.2
+
diff --git a/packages/linux/linux-efika-2.6.20/0003-powerpc-Add-device-tree-fixups-for-the-EFIKA.txt b/packages/linux/linux-efika-2.6.20/0003-powerpc-Add-device-tree-fixups-for-the-EFIKA.txt
new file mode 100644
index 0000000000..eddebfe2e7
--- /dev/null
+++ b/packages/linux/linux-efika-2.6.20/0003-powerpc-Add-device-tree-fixups-for-the-EFIKA.txt
@@ -0,0 +1,110 @@
+From 7fa32df37b889fd0520b28870153b711c65192d2 Mon Sep 17 00:00:00 2001
+From: Sylvain Munaut <tnt@246tNt.com>
+Date: Sat, 23 Dec 2006 20:25:18 +0100
+Subject: [PATCH] [PATCH] powerpc: Add device tree fixups for the EFIKA
+
+We make the efika device tree compliant with the defined bindings
+(at least compliant enough). This is mostly done by mangling
+the device_type and compatible properties, but also adding
+some missing bits.
+
+Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
+---
+ arch/powerpc/kernel/prom_init.c | 76 +++++++++++++++++++++++++++++++++++++++
+ 1 files changed, 76 insertions(+), 0 deletions(-)
+
+diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
+index 520ef42..5291d62 100644
+--- a/arch/powerpc/kernel/prom_init.c
++++ b/arch/powerpc/kernel/prom_init.c
+@@ -2117,11 +2117,87 @@ static void __init fixup_device_tree_pmac(void)
+ #define fixup_device_tree_pmac()
+ #endif
+
++#ifdef CONFIG_PPC_EFIKA
++/* The current fw of the Efika has a device tree needs quite a few
++ * fixups to be compliant with the mpc52xx bindings. It's currently
++ * unknown if it will ever be compliant (come on bPlan ...) so we do fixups.
++ * NOTE that we (barely) tolerate it because the EFIKA was out before
++ * the bindings were finished, for any new boards -> RTFM ! */
++
++struct subst_entry {
++ char *path;
++ char *property;
++ void *value;
++ int value_len;
++};
++
++static void __init fixup_device_tree_efika(void)
++{
++ /* Substitution table */
++ #define prop_cstr(x) x, sizeof(x)
++ int prop_sound_irq[3] = { 2, 2, 0 };
++ struct subst_entry efika_subst_table[] = {
++ { "/", "device_type", prop_cstr("efika") },
++ { "/builtin", "compatible", prop_cstr("soc") },
++ { "/builtin/ata", "compatible", prop_cstr("mpc5200b-ata\0mpc52xx-ata"), },
++ { "/builtin/bestcomm", "compatible", prop_cstr("mpc5200b-bestcomm\0mpc52xx-bestcomm") },
++ { "/builtin/ethernet", "compatible", prop_cstr("mpc5200b-fec\0mpc52xx-fec") },
++ { "/builtin/pic", "compatible", prop_cstr("mpc5200b-pic\0mpc52xx-pic") },
++ { "/builtin/serial", "compatible", prop_cstr("mpc5200b-psc-uart\0mpc52xx-psc-uart") },
++ { "/builtin/sound", "compatible", prop_cstr("mpc5200b-psc-ac97\0mpc52xx-psc-ac97") },
++ { "/builtin/sound", "interrupts", prop_sound_irq, sizeof(prop_sound_irq) },
++ { "/builtin/sram", "compatible", prop_cstr("mpc5200b-sram\0mpc52xx-sram") },
++ { "/builtin/sram", "device_type", prop_cstr("sram") },
++ {}
++ };
++ #undef prop_cstr
++
++ /* Vars */
++ u32 node;
++ char prop[64];
++ int rv, i;
++
++ /* Check if we're really running on a EFIKA */
++ node = call_prom("finddevice", 1, 1, ADDR("/"));
++ if (!PHANDLE_VALID(node))
++ return;
++
++ rv = prom_getprop(node, "model", prop, sizeof(prop));
++ if (rv == PROM_ERROR)
++ return;
++ if (strcmp(prop, "EFIKA5K2"))
++ return;
++
++ prom_printf("Applying EFIKA device tree fixups\n");
++
++ /* Process substitution table */
++ for (i=0; efika_subst_table[i].path; i++) {
++ struct subst_entry *se = &efika_subst_table[i];
++
++ node = call_prom("finddevice", 1, 1, ADDR(se->path));
++ if (!PHANDLE_VALID(node)) {
++ prom_printf("fixup_device_tree_efika: ",
++ "skipped entry %x - not found\n", i);
++ continue;
++ }
++
++ rv = prom_setprop(node, se->path, se->property,
++ se->value, se->value_len );
++ if (rv == PROM_ERROR)
++ prom_printf("fixup_device_tree_efika: ",
++ "skipped entry %x - setprop error\n", i);
++ }
++}
++#else
++#define fixup_device_tree_efika()
++#endif
++
+ static void __init fixup_device_tree(void)
+ {
+ fixup_device_tree_maple();
+ fixup_device_tree_chrp();
+ fixup_device_tree_pmac();
++ fixup_device_tree_efika();
+ }
+
+ static void __init prom_find_boot_cpu(void)
+--
+1.4.4.2
+
diff --git a/packages/linux/linux-efika-2.6.20/0004-powerpc-Use-common-52xx-of_platform-probe-code-for-EFIKA.txt b/packages/linux/linux-efika-2.6.20/0004-powerpc-Use-common-52xx-of_platform-probe-code-for-EFIKA.txt
new file mode 100644
index 0000000000..763d53208f
--- /dev/null
+++ b/packages/linux/linux-efika-2.6.20/0004-powerpc-Use-common-52xx-of_platform-probe-code-for-EFIKA.txt
@@ -0,0 +1,106 @@
+From ae911446f91481cf26e6dc5edef034a50a6c410c Mon Sep 17 00:00:00 2001
+From: Sylvain Munaut <tnt@246tNt.com>
+Date: Sat, 23 Dec 2006 20:33:30 +0100
+Subject: [PATCH] [PATCH] powerpc: Use common 52xx of_platform probe code for EFIKA
+
+Now that the device tree has the good properties, we can
+remove all the efika_init code by a single call to common code.
+
+While we're modifying that file, a few whitespaces/alignement/typo
+fixes are made (nothing significant).
+
+Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
+---
+ arch/powerpc/platforms/52xx/efika-setup.c | 64 ++++++++---------------------
+ 1 files changed, 18 insertions(+), 46 deletions(-)
+
+diff --git a/arch/powerpc/platforms/52xx/efika-setup.c b/arch/powerpc/platforms/52xx/efika-setup.c
+index 110c980..d61ce84 100644
+--- a/arch/powerpc/platforms/52xx/efika-setup.c
++++ b/arch/powerpc/platforms/52xx/efika-setup.c
+@@ -2,7 +2,7 @@
+ *
+ * Efika 5K2 platform setup
+ * Some code really inspired from the lite5200b platform.
+- *
++ *
+ * Copyright (C) 2006 bplan GmbH
+ *
+ * This file is licensed under the terms of the GNU General Public License
+@@ -81,35 +81,7 @@ static void __init efika_setup_arch(void)
+ efika_pcisetup();
+
+ if (ppc_md.progress)
+- ppc_md.progress("Linux/PPC " UTS_RELEASE " runnung on Efika ;-)\n", 0x0);
+-}
+-
+-static void __init efika_init(void)
+-{
+- struct device_node *np;
+- struct device_node *cnp = NULL;
+- const u32 *base;
+-
+- /* Find every child of the SOC node and add it to of_platform */
+- np = of_find_node_by_name(NULL, "builtin");
+- if (np) {
+- char name[BUS_ID_SIZE];
+- while ((cnp = of_get_next_child(np, cnp))) {
+- strcpy(name, cnp->name);
+-
+- base = get_property(cnp, "reg", NULL);
+- if (base == NULL)
+- continue;
+-
+- snprintf(name+strlen(name), BUS_ID_SIZE, "@%x", *base);
+- of_platform_device_create(cnp, name, NULL);
+-
+- printk(KERN_INFO EFIKA_PLATFORM_NAME" : Added %s (type '%s' at '%s') to the known devices\n", name, cnp->type, cnp->full_name);
+- }
+- }
+-
+- if (ppc_md.progress)
+- ppc_md.progress(" Have fun with your Efika! ", 0x7777);
++ ppc_md.progress("Linux/PPC " UTS_RELEASE " running on Efika ;-)\n", 0x0);
+ }
+
+ static int __init efika_probe(void)
+@@ -131,20 +103,20 @@ static int __init efika_probe(void)
+
+ define_machine(efika)
+ {
+- .name = EFIKA_PLATFORM_NAME,
+- .probe = efika_probe,
+- .setup_arch = efika_setup_arch,
+- .init = efika_init,
+- .show_cpuinfo = efika_show_cpuinfo,
+- .init_IRQ = mpc52xx_init_irq,
+- .get_irq = mpc52xx_get_irq,
+- .restart = rtas_restart,
+- .power_off = rtas_power_off,
+- .halt = rtas_halt,
+- .set_rtc_time = rtas_set_rtc_time,
+- .get_rtc_time = rtas_get_rtc_time,
+- .progress = rtas_progress,
+- .get_boot_time = rtas_get_boot_time,
+- .calibrate_decr = generic_calibrate_decr,
+- .phys_mem_access_prot = pci_phys_mem_access_prot,
++ .name = EFIKA_PLATFORM_NAME,
++ .probe = efika_probe,
++ .setup_arch = efika_setup_arch,
++ .init = mpc52xx_declare_of_platform_devices,
++ .show_cpuinfo = efika_show_cpuinfo,
++ .init_IRQ = mpc52xx_init_irq,
++ .get_irq = mpc52xx_get_irq,
++ .restart = rtas_restart,
++ .power_off = rtas_power_off,
++ .halt = rtas_halt,
++ .set_rtc_time = rtas_set_rtc_time,
++ .get_rtc_time = rtas_get_rtc_time,
++ .progress = rtas_progress,
++ .get_boot_time = rtas_get_boot_time,
++ .calibrate_decr = generic_calibrate_decr,
++ .phys_mem_access_prot = pci_phys_mem_access_prot,
+ };
+--
+1.4.4.2
+
diff --git a/packages/linux/linux-efika-2.6.20/0005-powerpc-Restore-proper-link-order-in-platform.txt b/packages/linux/linux-efika-2.6.20/0005-powerpc-Restore-proper-link-order-in-platform.txt
new file mode 100644
index 0000000000..0b4bbe3376
--- /dev/null
+++ b/packages/linux/linux-efika-2.6.20/0005-powerpc-Restore-proper-link-order-in-platform.txt
@@ -0,0 +1,33 @@
+From 720e2caeeff0d9585d5627d29ffd660a5a9d9f88 Mon Sep 17 00:00:00 2001
+From: Sylvain Munaut <tnt@246tNt.com>
+Date: Sat, 23 Dec 2006 20:43:39 +0100
+Subject: [PATCH] [PATCH] powerpc: Restore 'proper' link order in platform
+
+The 52xx was put before CHRP to allow EFIKA to be recognized
+properly. Now the efika tree is fixed up in prom_init so
+no need for this ugly hack. So we restore the 'normal'
+order.
+
+Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
+---
+ arch/powerpc/platforms/Makefile | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile
+index 507d1b9..44d95ea 100644
+--- a/arch/powerpc/platforms/Makefile
++++ b/arch/powerpc/platforms/Makefile
+@@ -5,9 +5,9 @@ ifeq ($(CONFIG_PPC64),y)
+ obj-$(CONFIG_PPC_PMAC) += powermac/
+ endif
+ endif
+-obj-$(CONFIG_PPC_MPC52xx) += 52xx/
+ obj-$(CONFIG_PPC_CHRP) += chrp/
+ obj-$(CONFIG_4xx) += 4xx/
++obj-$(CONFIG_PPC_MPC52xx) += 52xx/
+ obj-$(CONFIG_PPC_83xx) += 83xx/
+ obj-$(CONFIG_PPC_85xx) += 85xx/
+ obj-$(CONFIG_PPC_86xx) += 86xx/
+--
+1.4.4.2
+
diff --git a/packages/linux/linux-efika-2.6.20/0006-Rework-the-OHCI-quirk-mecanism-as-suggested-by-David.txt b/packages/linux/linux-efika-2.6.20/0006-Rework-the-OHCI-quirk-mecanism-as-suggested-by-David.txt
new file mode 100644
index 0000000000..39f6fef607
--- /dev/null
+++ b/packages/linux/linux-efika-2.6.20/0006-Rework-the-OHCI-quirk-mecanism-as-suggested-by-David.txt
@@ -0,0 +1,236 @@
+From 9282a04f14cef512736ac4a895fb48456e6a8989 Mon Sep 17 00:00:00 2001
+From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Date: Thu, 14 Dec 2006 14:13:26 +1100
+Subject: [PATCH] [PATCH] Rework the OHCI quirk mecanism as suggested by David
+
+This patch applies David Brownell's suggestion for reworking the
+OHCI quirk mechanism via a table of PCI IDs. It adapts the existing
+quirks to use that mechanism.
+
+This also moves the quirks to reset() as suggested by the comment
+in there. This is necessary as we need to have the endian properly
+set before we try to init the controller.
+
+Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Acked-by: David Brownell <dbrownell@users.sourceforge.net>
+
+ drivers/usb/host/ohci-pci.c | 173 +++++++++++++++++++++++++++-----------------
+ 1 file changed, 110 insertions(+), 63 deletions(-)
+---
+ drivers/usb/host/ohci-pci.c | 173 +++++++++++++++++++++++++++----------------
+ 1 files changed, 110 insertions(+), 63 deletions(-)
+
+diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c
+index 596e0b4..82fbec3 100644
+--- a/drivers/usb/host/ohci-pci.c
++++ b/drivers/usb/host/ohci-pci.c
+@@ -20,79 +20,128 @@
+
+ /*-------------------------------------------------------------------------*/
+
+-static int
+-ohci_pci_reset (struct usb_hcd *hcd)
++/* AMD 756, for most chips (early revs), corrupts register
++ * values on read ... so enable the vendor workaround.
++ */
++static int __devinit ohci_quirk_amd756(struct usb_hcd *hcd)
+ {
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);
+
+- ohci_hcd_init (ohci);
+- return ohci_init (ohci);
++ ohci->flags = OHCI_QUIRK_AMD756;
++ ohci_dbg (ohci, "AMD756 erratum 4 workaround\n");
++
++ /* also erratum 10 (suspend/resume issues) */
++ device_init_wakeup(&hcd->self.root_hub->dev, 0);
++
++ return 0;
+ }
+
+-static int __devinit
+-ohci_pci_start (struct usb_hcd *hcd)
++/* Apple's OHCI driver has a lot of bizarre workarounds
++ * for this chip. Evidently control and bulk lists
++ * can get confused. (B&W G3 models, and ...)
++ */
++static int __devinit ohci_quirk_opti(struct usb_hcd *hcd)
+ {
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);
+- int ret;
+
+- /* REVISIT this whole block should move to reset(), which handles
+- * all the other one-time init.
++ ohci_dbg (ohci, "WARNING: OPTi workarounds unavailable\n");
++
++ return 0;
++}
++
++/* Check for NSC87560. We have to look at the bridge (fn1) to
++ * identify the USB (fn2). This quirk might apply to more or
++ * even all NSC stuff.
++ */
++static int __devinit ohci_quirk_ns(struct usb_hcd *hcd)
++{
++ struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
++ struct pci_dev *b;
++
++ b = pci_get_slot (pdev->bus, PCI_DEVFN (PCI_SLOT (pdev->devfn), 1));
++ if (b && b->device == PCI_DEVICE_ID_NS_87560_LIO
++ && b->vendor == PCI_VENDOR_ID_NS) {
++ struct ohci_hcd *ohci = hcd_to_ohci (hcd);
++
++ ohci->flags |= OHCI_QUIRK_SUPERIO;
++ ohci_dbg (ohci, "Using NSC SuperIO setup\n");
++ }
++ pci_dev_put(b);
++
++ return 0;
++}
++
++/* Check for Compaq's ZFMicro chipset, which needs short
++ * delays before control or bulk queues get re-activated
++ * in finish_unlinks()
++ */
++static int __devinit ohci_quirk_zfmicro(struct usb_hcd *hcd)
++{
++ struct ohci_hcd *ohci = hcd_to_ohci (hcd);
++
++ ohci->flags |= OHCI_QUIRK_ZFMICRO;
++ ohci_dbg (ohci, "enabled Compaq ZFMicro chipset quirk\n");
++
++ return 0;
++}
++
++
++/* List of quirks for OHCI */
++static const struct pci_device_id ohci_pci_quirks[] = {
++ {
++ PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x740c),
++ .driver_data = (unsigned long)ohci_quirk_amd756,
++ },
++ {
++ PCI_DEVICE(PCI_VENDOR_ID_OPTI, 0xc861),
++ .driver_data = (unsigned long)ohci_quirk_opti,
++ },
++ {
++ PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_ANY_ID),
++ .driver_data = (unsigned long)ohci_quirk_ns,
++ },
++ {
++ PCI_DEVICE(PCI_VENDOR_ID_COMPAQ, 0xa0f8),
++ .driver_data = (unsigned long)ohci_quirk_zfmicro,
++ },
++ /* FIXME for some of the early AMD 760 southbridges, OHCI
++ * won't work at all. blacklist them.
+ */
++ {},
++};
++
++static int ohci_pci_reset (struct usb_hcd *hcd)
++{
++ struct ohci_hcd *ohci = hcd_to_ohci (hcd);
++ int ret = 0;
++
+ if (hcd->self.controller) {
+ struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
++ const struct pci_device_id *quirk_id;
+
+- /* AMD 756, for most chips (early revs), corrupts register
+- * values on read ... so enable the vendor workaround.
+- */
+- if (pdev->vendor == PCI_VENDOR_ID_AMD
+- && pdev->device == 0x740c) {
+- ohci->flags = OHCI_QUIRK_AMD756;
+- ohci_dbg (ohci, "AMD756 erratum 4 workaround\n");
+- /* also erratum 10 (suspend/resume issues) */
+- device_init_wakeup(&hcd->self.root_hub->dev, 0);
++ quirk_id = pci_match_id(ohci_pci_quirks, pdev);
++ if (quirk_id != NULL) {
++ int (*quirk)(struct usb_hcd *ohci);
++ quirk = (void *)quirk_id->driver_data;
++ ret = quirk(hcd);
+ }
++ }
++ if (ret == 0) {
++ ohci_hcd_init (ohci);
++ return ohci_init (ohci);
++ }
++ return ret;
++}
+
+- /* FIXME for some of the early AMD 760 southbridges, OHCI
+- * won't work at all. blacklist them.
+- */
+-
+- /* Apple's OHCI driver has a lot of bizarre workarounds
+- * for this chip. Evidently control and bulk lists
+- * can get confused. (B&W G3 models, and ...)
+- */
+- else if (pdev->vendor == PCI_VENDOR_ID_OPTI
+- && pdev->device == 0xc861) {
+- ohci_dbg (ohci,
+- "WARNING: OPTi workarounds unavailable\n");
+- }
+
+- /* Check for NSC87560. We have to look at the bridge (fn1) to
+- * identify the USB (fn2). This quirk might apply to more or
+- * even all NSC stuff.
+- */
+- else if (pdev->vendor == PCI_VENDOR_ID_NS) {
+- struct pci_dev *b;
+-
+- b = pci_get_slot (pdev->bus,
+- PCI_DEVFN (PCI_SLOT (pdev->devfn), 1));
+- if (b && b->device == PCI_DEVICE_ID_NS_87560_LIO
+- && b->vendor == PCI_VENDOR_ID_NS) {
+- ohci->flags |= OHCI_QUIRK_SUPERIO;
+- ohci_dbg (ohci, "Using NSC SuperIO setup\n");
+- }
+- pci_dev_put(b);
+- }
++static int __devinit ohci_pci_start (struct usb_hcd *hcd)
++{
++ struct ohci_hcd *ohci = hcd_to_ohci (hcd);
++ int ret;
+
+- /* Check for Compaq's ZFMicro chipset, which needs short
+- * delays before control or bulk queues get re-activated
+- * in finish_unlinks()
+- */
+- else if (pdev->vendor == PCI_VENDOR_ID_COMPAQ
+- && pdev->device == 0xa0f8) {
+- ohci->flags |= OHCI_QUIRK_ZFMICRO;
+- ohci_dbg (ohci,
+- "enabled Compaq ZFMicro chipset quirk\n");
+- }
++#ifdef CONFIG_PM /* avoid warnings about unused pdev */
++ if (hcd->self.controller) {
++ struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
+
+ /* RWC may not be set for add-in PCI cards, since boot
+ * firmware probably ignored them. This transfers PCI
+@@ -101,16 +150,14 @@ ohci_pci_start (struct usb_hcd *hcd)
+ if (device_may_wakeup(&pdev->dev))
+ ohci->hc_control |= OHCI_CTRL_RWC;
+ }
++#endif /* CONFIG_PM */
+
+- /* NOTE: there may have already been a first reset, to
+- * keep bios/smm irqs from making trouble
+- */
+- if ((ret = ohci_run (ohci)) < 0) {
++ ret = ohci_run (ohci);
++ if (ret < 0) {
+ ohci_err (ohci, "can't start\n");
+ ohci_stop (hcd);
+- return ret;
+ }
+- return 0;
++ return ret;
+ }
+
+ #ifdef CONFIG_PM
+--
+1.4.4.2
+
diff --git a/packages/linux/linux-efika-2.6.20/0007-Implement-support-for-split-endian-OHCI.txt b/packages/linux/linux-efika-2.6.20/0007-Implement-support-for-split-endian-OHCI.txt
new file mode 100644
index 0000000000..f49e0cfa7d
--- /dev/null
+++ b/packages/linux/linux-efika-2.6.20/0007-Implement-support-for-split-endian-OHCI.txt
@@ -0,0 +1,367 @@
+From a87f8738eb3651b7eea1feae793def3a48dc36c6 Mon Sep 17 00:00:00 2001
+From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Date: Thu, 14 Dec 2006 14:13:28 +1100
+Subject: [PATCH] [PATCH] Implement support for "split" endian OHCI
+
+This patch separates support for big endian MMIO register access
+and big endian descriptors in order to support the Toshiba SCC
+implementation which has big endian registers but little endian
+in-memory descriptors.
+
+It simplifies the access functions a bit in ohci.h while at it.
+
+Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Acked-by: David Brownell <dbrownell@users.sourceforge.net>
+
+ drivers/usb/host/Kconfig | 10 ++
+ drivers/usb/host/ohci-pci.c | 26 +++++++
+ drivers/usb/host/ohci-ppc-soc.c | 2
+ drivers/usb/host/ohci.h | 147 +++++++++++++++++++++++++---------------
+ 4 files changed, 130 insertions(+), 55 deletions(-)
+---
+ drivers/usb/host/Kconfig | 10 ++-
+ drivers/usb/host/ohci-pci.c | 26 +++++++
+ drivers/usb/host/ohci-ppc-soc.c | 2 +-
+ drivers/usb/host/ohci.h | 147 +++++++++++++++++++++++++--------------
+ 4 files changed, 130 insertions(+), 55 deletions(-)
+
+diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
+index cc60759..faabce8 100644
+--- a/drivers/usb/host/Kconfig
++++ b/drivers/usb/host/Kconfig
+@@ -101,7 +101,8 @@ config USB_OHCI_HCD_PPC_SOC
+ bool "OHCI support for on-chip PPC USB controller"
+ depends on USB_OHCI_HCD && (STB03xxx || PPC_MPC52xx)
+ default y
+- select USB_OHCI_BIG_ENDIAN
++ select USB_OHCI_BIG_ENDIAN_DESC
++ select USB_OHCI_BIG_ENDIAN_MMIO
+ ---help---
+ Enables support for the USB controller on the MPC52xx or
+ STB03xxx processor chip. If unsure, say Y.
+@@ -115,7 +116,12 @@ config USB_OHCI_HCD_PCI
+ Enables support for PCI-bus plug-in USB controller cards.
+ If unsure, say Y.
+
+-config USB_OHCI_BIG_ENDIAN
++config USB_OHCI_BIG_ENDIAN_DESC
++ bool
++ depends on USB_OHCI_HCD
++ default n
++
++config USB_OHCI_BIG_ENDIAN_MMIO
+ bool
+ depends on USB_OHCI_HCD
+ default n
+diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c
+index 82fbec3..292daf0 100644
+--- a/drivers/usb/host/ohci-pci.c
++++ b/drivers/usb/host/ohci-pci.c
+@@ -85,6 +85,27 @@ static int __devinit ohci_quirk_zfmicro(struct usb_hcd *hcd)
+ return 0;
+ }
+
++/* Check for Toshiba SCC OHCI which has big endian registers
++ * and little endian in memory data structures
++ */
++static int __devinit ohci_quirk_toshiba_scc(struct usb_hcd *hcd)
++{
++ struct ohci_hcd *ohci = hcd_to_ohci (hcd);
++
++ /* That chip is only present in the southbridge of some
++ * cell based platforms which are supposed to select
++ * CONFIG_USB_OHCI_BIG_ENDIAN_MMIO. We verify here if
++ * that was the case though.
++ */
++#ifdef CONFIG_USB_OHCI_BIG_ENDIAN_MMIO
++ ohci->flags |= OHCI_QUIRK_BE_MMIO;
++ ohci_dbg (ohci, "enabled big endian Toshiba quirk\n");
++ return 0;
++#else
++ ohci_err (ohci, "unsupported big endian Toshiba quirk\n");
++ return -ENXIO;
++#endif
++}
+
+ /* List of quirks for OHCI */
+ static const struct pci_device_id ohci_pci_quirks[] = {
+@@ -104,9 +125,14 @@ static const struct pci_device_id ohci_pci_quirks[] = {
+ PCI_DEVICE(PCI_VENDOR_ID_COMPAQ, 0xa0f8),
+ .driver_data = (unsigned long)ohci_quirk_zfmicro,
+ },
++ {
++ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA_2, 0x01b6),
++ .driver_data = (unsigned long)ohci_quirk_toshiba_scc,
++ },
+ /* FIXME for some of the early AMD 760 southbridges, OHCI
+ * won't work at all. blacklist them.
+ */
++
+ {},
+ };
+
+diff --git a/drivers/usb/host/ohci-ppc-soc.c b/drivers/usb/host/ohci-ppc-soc.c
+index e1a7eb8..c7ce8e6 100644
+--- a/drivers/usb/host/ohci-ppc-soc.c
++++ b/drivers/usb/host/ohci-ppc-soc.c
+@@ -72,7 +72,7 @@ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver,
+ }
+
+ ohci = hcd_to_ohci(hcd);
+- ohci->flags |= OHCI_BIG_ENDIAN;
++ ohci->flags |= OHCI_QUIRK_BE_MMIO | OHCI_QUIRK_BE_DESC;
+ ohci_hcd_init(ohci);
+
+ retval = usb_add_hcd(hcd, irq, IRQF_DISABLED);
+diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h
+index 405257f..fc7c161 100644
+--- a/drivers/usb/host/ohci.h
++++ b/drivers/usb/host/ohci.h
+@@ -394,8 +394,9 @@ struct ohci_hcd {
+ #define OHCI_QUIRK_AMD756 0x01 /* erratum #4 */
+ #define OHCI_QUIRK_SUPERIO 0x02 /* natsemi */
+ #define OHCI_QUIRK_INITRESET 0x04 /* SiS, OPTi, ... */
+-#define OHCI_BIG_ENDIAN 0x08 /* big endian HC */
+-#define OHCI_QUIRK_ZFMICRO 0x10 /* Compaq ZFMicro chipset*/
++#define OHCI_QUIRK_BE_DESC 0x08 /* BE descriptors */
++#define OHCI_QUIRK_BE_MMIO 0x10 /* BE registers */
++#define OHCI_QUIRK_ZFMICRO 0x20 /* Compaq ZFMicro chipset*/
+ // there are also chip quirks/bugs in init logic
+
+ };
+@@ -439,117 +440,156 @@ static inline struct usb_hcd *ohci_to_hcd (const struct ohci_hcd *ohci)
+ * a minority (notably the IBM STB04XXX and the Motorola MPC5200
+ * processors) implement them in big endian format.
+ *
++ * In addition some more exotic implementations like the Toshiba
++ * Spider (aka SCC) cell southbridge are "mixed" endian, that is,
++ * they have a different endianness for registers vs. in-memory
++ * descriptors.
++ *
+ * This attempts to support either format at compile time withou