diff options
Diffstat (limited to 'target/linux/mpc83xx/patches-2.6.36/020-rb333-support.patch')
-rw-r--r-- | target/linux/mpc83xx/patches-2.6.36/020-rb333-support.patch | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/target/linux/mpc83xx/patches-2.6.36/020-rb333-support.patch b/target/linux/mpc83xx/patches-2.6.36/020-rb333-support.patch new file mode 100644 index 0000000000..c62d78a2a3 --- /dev/null +++ b/target/linux/mpc83xx/patches-2.6.36/020-rb333-support.patch @@ -0,0 +1,207 @@ +--- a/arch/powerpc/platforms/83xx/rbppc.c ++++ b/arch/powerpc/platforms/83xx/rbppc.c +@@ -1,4 +1,5 @@ + /* ++ * Copyright (C) 2010 Alexandros C. Couloumbis <alex@ozo.com> + * Copyright (C) 2008-2009 Noah Fontes <nfontes@transtruct.org> + * Copyright (C) 2009 Michael Guntsche <mike@it-loops.com> + * Copyright (C) Mikrotik 2007 +@@ -167,6 +168,9 @@ static int __init rbppc_probe(void) + if (!model) + return 0; + ++ if (strcmp(model, "RB333") == 0) ++ return 1; ++ + if (strcmp(model, "RB600") == 0) + return 1; + +@@ -227,6 +231,9 @@ static void __init rbppc_beeper_init(str + #define SBIT(x) (0x80000000 >> (x)) + #define DBIT(x, y) ((y) << (32 - (((x % 16) + 1) * 2))) + ++#define GPIO_DIR_RB333(x) ((x) + (0x1408 >> 2)) ++#define GPIO_DATA_RB333(x) ((x) + (0x1404 >> 2)) ++ + #define SICRL_RB600(x) ((x) + (0x114 >> 2)) + #define GPIO_DIR_RB600(x) ((x) + (0xc00 >> 2)) + #define GPIO_DATA_RB600(x) ((x) + (0xc08 >> 2)) +@@ -234,14 +241,38 @@ static void __init rbppc_beeper_init(str + static void rbppc_restart(char *cmd) + { + __be32 __iomem *reg; +- +- reg = ioremap(get_immrbase(), 0x1000); +- local_irq_disable(); +- out_be32(SICRL_RB600(reg), in_be32(SICRL_RB600(reg)) & ~0x00800000); +- out_be32(GPIO_DIR_RB600(reg), in_be32(GPIO_DIR_RB600(reg)) | SBIT(2)); +- out_be32(GPIO_DATA_RB600(reg), in_be32(GPIO_DATA_RB600(reg)) & ~SBIT(2)); +- +- while (1); ++ unsigned rb_model; ++ struct device_node *root; ++ unsigned int size; ++ ++ root = of_find_node_by_path("/"); ++ if (root) { ++ const char *prop = (char *) of_get_property(root, "model", &size); ++ rb_model = prop[sizeof("RB") - 1] - '0'; ++ of_node_put(root); ++ switch (rb_model) { ++ case 3: ++ reg = ioremap(get_immrbase(), 0x2000); ++ local_irq_disable(); ++ out_be32(GPIO_DIR_RB333(reg), ++ (in_be32(GPIO_DIR_RB333(reg)) & ~DBIT(4, 3)) | DBIT(4, 1)); ++ out_be32(GPIO_DATA_RB333(reg), in_be32(GPIO_DATA_RB333(reg)) & ~SBIT(4)); ++ break; ++ case 6: ++ reg = ioremap(get_immrbase(), 0x1000); ++ local_irq_disable(); ++ out_be32(SICRL_RB600(reg), in_be32(SICRL_RB600(reg)) & ~0x00800000); ++ out_be32(GPIO_DIR_RB600(reg), in_be32(GPIO_DIR_RB600(reg)) | SBIT(2)); ++ out_be32(GPIO_DATA_RB600(reg), in_be32(GPIO_DATA_RB600(reg)) & ~SBIT(2)); ++ break; ++ default: ++ mpc83xx_restart(cmd); ++ break; ++ } ++ } ++ else mpc83xx_restart(cmd); ++ ++ for (;;) ; + } + + static void rbppc_halt(void) +@@ -301,10 +332,10 @@ static int __init rbppc_declare_of_platf + + return 0; + } +-device_initcall(rbppc_declare_of_platform_devices); ++machine_device_initcall(rb600, rbppc_declare_of_platform_devices); + + define_machine(rb600) { +- .name = "MikroTik RouterBOARD 600 series", ++ .name = "MikroTik RouterBOARD 333/600 series", + .probe = rbppc_probe, + .setup_arch = rbppc_setup_arch, + .init_IRQ = rbppc_init_IRQ, +@@ -314,3 +345,31 @@ define_machine(rb600) { + .time_init = mpc83xx_time_init, + .calibrate_decr = generic_calibrate_decr, + }; ++ ++static void fixup_pcibridge(struct pci_dev *dev) ++{ ++ if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { ++ /* let the kernel itself set right memory windows */ ++ pci_write_config_word(dev, PCI_MEMORY_BASE, 0); ++ pci_write_config_word(dev, PCI_MEMORY_LIMIT, 0); ++ pci_write_config_word(dev, PCI_PREF_MEMORY_BASE, 0); ++ pci_write_config_word(dev, PCI_PREF_MEMORY_LIMIT, 0); ++ pci_write_config_byte(dev, PCI_IO_BASE, 0); ++ pci_write_config_byte(dev, PCI_IO_LIMIT, 4 << 4); ++ ++ pci_write_config_byte( ++ dev, PCI_COMMAND, ++ PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | PCI_COMMAND_IO); ++ pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 8); ++ } ++} ++ ++ ++static void fixup_rb604(struct pci_dev *dev) ++{ ++ pci_write_config_byte(dev, 0xC0, 0x01); ++} ++ ++DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, fixup_pcibridge) ++DECLARE_PCI_FIXUP_HEADER(0x3388, 0x0021, fixup_rb604) ++ +--- a/drivers/mtd/nand/Kconfig ++++ b/drivers/mtd/nand/Kconfig +@@ -440,11 +440,11 @@ config MTD_NAND_PLATFORM + via platform_data. + + config MTD_NAND_RB_PPC +- tristate "MikroTik RB600 NAND support" ++ tristate "MikroTik RB 333/600 NAND support" + depends on MTD_NAND && MTD_PARTITIONS && RB_PPC + help + This option enables support for the NAND device on MikroTik +- RouterBOARD 600 series boards. ++ RouterBOARD 333/600 series boards. + + config MTD_ALAUDA + tristate "MTD driver for Olympus MAUSB-10 and Fujifilm DPC-R1" +--- a/drivers/mtd/nand/rbppc_nand.c ++++ b/drivers/mtd/nand/rbppc_nand.c +@@ -126,7 +126,7 @@ static int rbppc_nand_probe(struct of_de + void *baddr; + const unsigned *rdy, *nce, *cle, *ale; + +- printk(KERN_INFO "rbppc_nand_probe: MikroTik RouterBOARD 600 series NAND driver, version " DRV_VERSION "\n"); ++ printk(KERN_INFO "rbppc_nand_probe: MikroTik RouterBOARD 333/600 series NAND driver, version " DRV_VERSION "\n"); + + info = kmalloc(sizeof(*info), GFP_KERNEL); + +@@ -244,7 +244,7 @@ static void __exit rbppc_nand_exit(void) + MODULE_AUTHOR("Mikrotikls SIA"); + MODULE_AUTHOR("Noah Fontes"); + MODULE_AUTHOR("Michael Guntsche"); +-MODULE_DESCRIPTION("MikroTik RouterBOARD 600 series NAND driver"); ++MODULE_DESCRIPTION("MikroTik RouterBOARD 333/600 series NAND driver"); + MODULE_LICENSE("GPL"); + MODULE_VERSION(DRV_VERSION); + +--- a/arch/powerpc/platforms/83xx/Kconfig ++++ b/arch/powerpc/platforms/83xx/Kconfig +@@ -39,13 +39,14 @@ config MPC832x_RDB + This option enables support for the MPC8323 RDB board. + + config RB_PPC +- bool "MikroTik RouterBOARD 600 series" ++ bool "MikroTik RouterBOARD 333/600 series" + select DEFAULT_UIMAGE + select QUICC_ENGINE ++ select PPC_MPC832x + select PPC_MPC834x + select RB_IOMAP + help +- This option enables support for MikroTik RouterBOARD 600 series boards. ++ This option enables support for MikroTik RouterBOARD 333/600 series boards. + + config MPC834x_MDS + bool "Freescale MPC834x MDS" +--- a/arch/powerpc/boot/Makefile ++++ b/arch/powerpc/boot/Makefile +@@ -74,7 +74,7 @@ src-plat := of.c cuboot-52xx.c cuboot-82 + cuboot-pq2.c cuboot-sequoia.c treeboot-walnut.c \ + cuboot-bamboo.c cuboot-mpc7448hpc2.c cuboot-taishan.c \ + fixed-head.S ep88xc.c ep405.c cuboot-c2k.c \ +- cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c rb600.c \ ++ cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c rb600.c rb333.c \ + cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c simpleboot.c \ + virtex405-head.S virtex.c redboot-83xx.c cuboot-sam440ep.c \ + cuboot-acadia.c cuboot-amigaone.c cuboot-kilauea.c \ +@@ -235,7 +235,8 @@ image-$(CONFIG_MPC834x_ITX) += cuImage. + image-$(CONFIG_MPC834x_MDS) += cuImage.mpc834x_mds + image-$(CONFIG_MPC836x_MDS) += cuImage.mpc836x_mds + image-$(CONFIG_ASP834x) += dtbImage.asp834x-redboot +-image-$(CONFIG_RB_PPC) += dtbImage.rb600 ++image-$(CONFIG_RB_PPC) += dtbImage.rb600 \ ++ dtbImage.rb333 + + # Board ports in arch/powerpc/platform/85xx/Kconfig + image-$(CONFIG_MPC8540_ADS) += cuImage.mpc8540ads +--- a/arch/powerpc/boot/wrapper ++++ b/arch/powerpc/boot/wrapper +@@ -212,7 +212,7 @@ ps3) + isection=.kernel:initrd + link_address='' + ;; +-ep88xc|ep405|ep8248e|rb600) ++ep88xc|ep405|ep8248e|rb600|rb333) + platformo="$object/fixed-head.o $object/$platform.o" + binary=y + ;; |