source: trunk/target/linux/brcm47xx/patches-2.6.28/400-arch-bcm47xx.patch @ 15255

Last change on this file since 15255 was 15255, checked in by florian, 8 years ago

[brcm47xx] correctly set mapbase while registering the UART (#4622)

File size: 10.7 KB
  • arch/mips/Kconfig

    old new config BCM47XX 
    5353        select SSB_DRIVER_MIPS 
    5454        select SSB_DRIVER_EXTIF 
    5555        select SSB_EMBEDDED 
     56        select SSB_B43_PCI_BRIDGE if PCI 
    5657        select SSB_PCICORE_HOSTMODE if PCI 
    5758        select GENERIC_GPIO 
    5859        select SYS_HAS_EARLY_PRINTK 
  • arch/mips/bcm47xx/Makefile

    old new  
    33# under Linux. 
    44# 
    55 
    6 obj-y := gpio.o irq.o prom.o serial.o setup.o time.o wgt634u.o 
     6obj-y := cfe_env.o gpio.o irq.o nvram.o prom.o serial.o setup.o time.o wgt634u.o 
  • arch/mips/bcm47xx/irq.c

    old new  
    11/* 
    22 *  Copyright (C) 2004 Florian Schirmer <jolt@tuxbox.org> 
     3 *  Copyright (C) 2008 Michael Buesch <mb@bu3sch.de> 
    34 * 
    45 *  This program is free software; you can redistribute  it and/or modify it 
    56 *  under  the terms of  the GNU General  Public License as published by the 
     
    2324 */ 
    2425 
    2526#include <linux/types.h> 
     27#include <linux/errno.h> 
     28#include <linux/init.h> 
    2629#include <linux/interrupt.h> 
    2730#include <linux/irq.h> 
     31#include <linux/pci.h> 
     32#include <linux/ssb/ssb.h> 
     33 
    2834#include <asm/irq_cpu.h> 
    2935 
     36 
     37extern struct ssb_bus ssb_bcm47xx; 
     38 
     39 
    3040void plat_irq_dispatch(void) 
    3141{ 
    3242        u32 cause; 
  • arch/mips/bcm47xx/nvram.c

    old new  
    2424#include <asm/io.h> 
    2525#include <asm/uaccess.h> 
    2626 
    27 #include <nvram.h> 
     27#include "include/nvram.h" 
    2828 
    2929#define MB * 1048576 
    30 extern struct ssb_bus ssb; 
     30extern struct ssb_bus ssb_bcm47xx; 
    3131 
    3232static char nvram_buf[NVRAM_SPACE]; 
    3333static int cfe_env; 
    extern char *cfe_env_get(char *nv_buf, c 
    3636/* Probe for NVRAM header */ 
    3737static void __init early_nvram_init(void) 
    3838{ 
    39         struct ssb_mipscore *mcore = &ssb.mipscore; 
     39        struct ssb_mipscore *mcore = &ssb_bcm47xx.mipscore; 
    4040        struct nvram_header *header; 
    4141        int i; 
    4242        u32 base, lim, off; 
  • arch/mips/bcm47xx/setup.c

    old new  
    22 *  Copyright (C) 2004 Florian Schirmer <jolt@tuxbox.org> 
    33 *  Copyright (C) 2005 Waldemar Brodkorb <wbx@openwrt.org> 
    44 *  Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> 
    5  *  Copyright (C) 2006 Michael Buesch <mb@bu3sch.de> 
     5 *  Copyright (C) 2006-2008 Michael Buesch <mb@bu3sch.de> 
    66 * 
    77 *  This program is free software; you can redistribute  it and/or modify it 
    88 *  under  the terms of  the GNU General  Public License as published by the 
     
    2525 *  675 Mass Ave, Cambridge, MA 02139, USA. 
    2626 */ 
    2727 
     28#include <linux/init.h> 
    2829#include <linux/types.h> 
    2930#include <linux/ssb/ssb.h> 
    3031#include <linux/ssb/ssb_embedded.h> 
     32#include <linux/tty.h> 
     33#include <linux/serial.h> 
     34#include <linux/serial_core.h> 
     35#include <linux/serial_reg.h> 
     36#include <linux/serial_8250.h> 
    3137#include <asm/bootinfo.h> 
    3238#include <asm/reboot.h> 
    3339#include <asm/time.h> 
    34 #include <bcm47xx.h> 
    3540#include <asm/fw/cfe/cfe_api.h> 
     41#include <linux/pm.h> 
     42 
     43#include "include/nvram.h" 
    3644 
    3745struct ssb_bus ssb_bcm47xx; 
    3846EXPORT_SYMBOL(ssb_bcm47xx); 
    3947 
     48extern void bcm47xx_pci_init(void); 
     49 
    4050static void bcm47xx_machine_restart(char *command) 
    4151{ 
    4252        printk(KERN_ALERT "Please stand by while rebooting the system...\n"); 
    static void bcm47xx_machine_halt(void) 
    5666                cpu_relax(); 
    5767} 
    5868 
    59 static void str2eaddr(char *str, char *dest) 
     69static void e_aton(char *str, char *dest) 
    6070{ 
    6171        int i = 0; 
    6272 
    static void str2eaddr(char *str, char *d 
    7383        } 
    7484} 
    7585 
    76 static int bcm47xx_get_invariants(struct ssb_bus *bus, 
    77                                    struct ssb_init_invariants *iv) 
     86static void bcm47xx_fill_sprom(struct ssb_sprom *sprom) 
    7887{ 
    79         char buf[100]; 
     88        char *s; 
    8089 
    81         /* Fill boardinfo structure */ 
    82         memset(&(iv->boardinfo), 0 , sizeof(struct ssb_boardinfo)); 
     90        memset(sprom, 0xFF, sizeof(struct ssb_sprom)); 
    8391 
    84         if (cfe_getenv("boardvendor", buf, sizeof(buf)) >= 0) 
    85                 iv->boardinfo.type = (u16)simple_strtoul(buf, NULL, 0); 
    86         if (cfe_getenv("boardtype", buf, sizeof(buf)) >= 0) 
    87                 iv->boardinfo.type = (u16)simple_strtoul(buf, NULL, 0); 
    88         if (cfe_getenv("boardrev", buf, sizeof(buf)) >= 0) 
    89                 iv->boardinfo.rev = (u16)simple_strtoul(buf, NULL, 0); 
    90  
    91         /* Fill sprom structure */ 
    92         memset(&(iv->sprom), 0, sizeof(struct ssb_sprom)); 
    93         iv->sprom.revision = 3; 
    94  
    95         if (cfe_getenv("et0macaddr", buf, sizeof(buf)) >= 0) 
    96                 str2eaddr(buf, iv->sprom.et0mac); 
    97         if (cfe_getenv("et1macaddr", buf, sizeof(buf)) >= 0) 
    98                 str2eaddr(buf, iv->sprom.et1mac); 
    99         if (cfe_getenv("et0phyaddr", buf, sizeof(buf)) >= 0) 
    100                 iv->sprom.et0phyaddr = simple_strtoul(buf, NULL, 10); 
    101         if (cfe_getenv("et1phyaddr", buf, sizeof(buf)) >= 0) 
    102                 iv->sprom.et1phyaddr = simple_strtoul(buf, NULL, 10); 
    103         if (cfe_getenv("et0mdcport", buf, sizeof(buf)) >= 0) 
    104                 iv->sprom.et0mdcport = simple_strtoul(buf, NULL, 10); 
    105         if (cfe_getenv("et1mdcport", buf, sizeof(buf)) >= 0) 
    106                 iv->sprom.et1mdcport = simple_strtoul(buf, NULL, 10); 
     92        sprom->revision = 1; 
     93        if ((s = nvram_get("il0macaddr"))) 
     94                e_aton(s, sprom->il0mac); 
     95        if ((s = nvram_get("et0macaddr"))) 
     96                e_aton(s, sprom->et0mac); 
     97        if ((s = nvram_get("et1macaddr"))) 
     98                e_aton(s, sprom->et1mac); 
     99        if ((s = nvram_get("et0phyaddr"))) 
     100                sprom->et0phyaddr = simple_strtoul(s, NULL, 0); 
     101        if ((s = nvram_get("et1phyaddr"))) 
     102                sprom->et1phyaddr = simple_strtoul(s, NULL, 0); 
     103        if ((s = nvram_get("et0mdcport"))) 
     104                sprom->et0mdcport = !!simple_strtoul(s, NULL, 10); 
     105        if ((s = nvram_get("et1mdcport"))) 
     106                sprom->et1mdcport = !!simple_strtoul(s, NULL, 10); 
     107        if ((s = nvram_get("pa0b0"))) 
     108                sprom->pa0b0 = simple_strtoul(s, NULL, 0); 
     109        if ((s = nvram_get("pa0b1"))) 
     110                sprom->pa0b1 = simple_strtoul(s, NULL, 0); 
     111        if ((s = nvram_get("pa0b2"))) 
     112                sprom->pa0b2 = simple_strtoul(s, NULL, 0); 
     113        if ((s = nvram_get("pa1b0"))) 
     114                sprom->pa1b0 = simple_strtoul(s, NULL, 0); 
     115        if ((s = nvram_get("pa1b1"))) 
     116                sprom->pa1b1 = simple_strtoul(s, NULL, 0); 
     117        if ((s = nvram_get("pa1b2"))) 
     118                sprom->pa1b2 = simple_strtoul(s, NULL, 0); 
     119        if ((s = nvram_get("wl0gpio0"))) 
     120                sprom->gpio0 = simple_strtoul(s, NULL, 0); 
     121        if ((s = nvram_get("wl0gpio1"))) 
     122                sprom->gpio1 = simple_strtoul(s, NULL, 0); 
     123        if ((s = nvram_get("wl0gpio2"))) 
     124                sprom->gpio2 = simple_strtoul(s, NULL, 0); 
     125        if ((s = nvram_get("wl0gpio3"))) 
     126                sprom->gpio3 = simple_strtoul(s, NULL, 0); 
     127        if ((s = nvram_get("pa0maxpwr"))) 
     128                sprom->maxpwr_bg = simple_strtoul(s, NULL, 0); 
     129        if ((s = nvram_get("pa1maxpwr"))) 
     130                sprom->maxpwr_a = simple_strtoul(s, NULL, 0); 
     131        if ((s = nvram_get("pa0itssit"))) 
     132                sprom->itssi_bg = simple_strtoul(s, NULL, 0); 
     133        if ((s = nvram_get("pa1itssit"))) 
     134                sprom->itssi_a = simple_strtoul(s, NULL, 0); 
     135        sprom->boardflags_lo = 0; 
     136        if ((s = nvram_get("boardflags"))) 
     137                sprom->boardflags_lo = simple_strtoul(s, NULL, 0); 
     138        sprom->boardflags_hi = 0; 
     139        if ((s = nvram_get("boardflags2"))) 
     140                sprom->boardflags_hi = simple_strtoul(s, NULL, 0); 
     141} 
     142 
     143static int bcm47xx_get_invariants(struct ssb_bus *bus, struct ssb_init_invariants *iv) 
     144{ 
     145        char *s; 
     146 
     147        iv->boardinfo.vendor = SSB_BOARDVENDOR_BCM; 
     148        if ((s = nvram_get("boardtype"))) 
     149                iv->boardinfo.type = (u16)simple_strtoul(s, NULL, 0); 
     150        if ((s = nvram_get("boardrev"))) 
     151                iv->boardinfo.rev = (u16)simple_strtoul(s, NULL, 0); 
     152 
     153        bcm47xx_fill_sprom(&iv->sprom); 
     154 
     155        if ((s = nvram_get("cardbus"))) 
     156                iv->has_cardbus_slot = !!simple_strtoul(s, NULL, 10); 
    107157 
    108158        return 0; 
    109159} 
    110160 
    111161void __init plat_mem_setup(void) 
    112162{ 
    113         int err; 
     163        int i, err; 
     164        char *s; 
     165        struct ssb_mipscore *mcore; 
     166 
     167        err = ssb_bus_ssbbus_register(&ssb_bcm47xx, SSB_ENUM_BASE, bcm47xx_get_invariants); 
     168        if (err) { 
     169                const char *msg = "Failed to initialize SSB bus (err %d)\n"; 
     170                printk(msg, err); /* Make sure the message gets out of the box. */ 
     171                panic(msg, err); 
     172        } 
     173        mcore = &ssb_bcm47xx.mipscore; 
    114174 
    115         err = ssb_bus_ssbbus_register(&ssb_bcm47xx, SSB_ENUM_BASE, 
    116                                       bcm47xx_get_invariants); 
    117         if (err) 
    118                 panic("Failed to initialize SSB bus (err %d)\n", err); 
     175        s = nvram_get("kernel_args"); 
     176        if (s && !strncmp(s, "console=ttyS1", 13)) { 
     177                struct ssb_serial_port port; 
     178 
     179                printk("Swapping serial ports!\n"); 
     180                /* swap serial ports */ 
     181                memcpy(&port, &mcore->serial_ports[0], sizeof(port)); 
     182                memcpy(&mcore->serial_ports[0], &mcore->serial_ports[1], sizeof(port)); 
     183                memcpy(&mcore->serial_ports[1], &port, sizeof(port)); 
     184        } 
     185 
     186        for (i = 0; i < mcore->nr_serial_ports; i++) { 
     187                struct ssb_serial_port *port = &(mcore->serial_ports[i]); 
     188                struct uart_port s; 
     189 
     190                memset(&s, 0, sizeof(s)); 
     191                s.line = i; 
     192                s.mapbase = (unsigned int) port->regs; 
     193                s.membase = port->regs; 
     194                s.irq = port->irq + 2; 
     195                s.uartclk = port->baud_base; 
     196                s.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; 
     197                s.iotype = SERIAL_IO_MEM; 
     198                s.regshift = port->reg_shift; 
     199 
     200                early_serial_setup(&s); 
     201        } 
     202        printk("Serial init done.\n"); 
    119203 
    120204        _machine_restart = bcm47xx_machine_restart; 
    121205        _machine_halt = bcm47xx_machine_halt; 
    122206        pm_power_off = bcm47xx_machine_halt; 
    123207} 
    124208 
     209static int __init bcm47xx_register_gpiodev(void) 
     210{ 
     211        static struct resource res = { 
     212                .start = 0xFFFFFFFF, 
     213        }; 
     214        struct platform_device *pdev; 
     215 
     216        pdev = platform_device_register_simple("GPIODEV", 0, &res, 1); 
     217        if (!pdev) { 
     218                printk(KERN_ERR "bcm47xx: GPIODEV init failed\n"); 
     219                return -ENODEV; 
     220        } 
     221 
     222        return 0; 
     223} 
     224device_initcall(bcm47xx_register_gpiodev); 
  • arch/mips/bcm47xx/time.c

    old new  
    2222 *  675 Mass Ave, Cambridge, MA 02139, USA. 
    2323 */ 
    2424 
    25  
    2625#include <linux/init.h> 
     26#include <linux/kernel.h> 
     27#include <linux/sched.h> 
     28#include <linux/serial_reg.h> 
     29#include <linux/interrupt.h> 
    2730#include <linux/ssb/ssb.h> 
     31#include <asm/addrspace.h> 
     32#include <asm/io.h> 
    2833#include <asm/time.h> 
    29 #include <bcm47xx.h> 
     34 
     35extern struct ssb_bus ssb_bcm47xx; 
    3036 
    3137void __init plat_time_init(void) 
    3238{ 
Note: See TracBrowser for help on using the repository browser.