source: trunk/target/linux/brcm47xx/patches-3.0/0006-bcma-add-serial-console-support.patch @ 27301

Last change on this file since 27301 was 27301, checked in by hauke, 5 years ago

brcm47xx: add initial support for devices with bcma bus.

Ethernet and wifi are not working and this is highly experimental.

File size: 4.3 KB
  • drivers/bcma/bcma_private.h

    From b7c100827012ba588089807475affe0c69a3f817 Mon Sep 17 00:00:00 2001
    From: Hauke Mehrtens <hauke@hauke-m.de>
    Date: Mon, 6 Jun 2011 00:07:33 +0200
    Subject: [PATCH 06/14] bcma: add serial console support
    
    This adds support for serial console to bcma, when operating on an
    embedded device.
    
    Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
    ---
     drivers/bcma/bcma_private.h           |    6 +++
     drivers/bcma/driver_chipcommon.c      |   64 +++++++++++++++++++++++++++++++++
     drivers/bcma/driver_mips.c            |    9 +++++
     include/linux/bcma/bcma_driver_mips.h |   11 ++++++
     4 files changed, 90 insertions(+), 0 deletions(-)
    
    a b void bcma_init_bus(struct bcma_bus *bus) 
    2929/* sprom.c */ 
    3030int bcma_sprom_get(struct bcma_bus *bus); 
    3131 
     32/* driver_chipcommon.c */ 
     33#ifdef CONFIG_BCMA_DRIVER_MIPS 
     34extern int bcma_chipco_serial_init(struct bcma_drv_cc *cc, 
     35                                   struct bcma_drv_mips_serial_port *ports); 
     36#endif /* CONFIG_BCMA_DRIVER_MIPS */ 
     37 
    3238#ifdef CONFIG_BCMA_HOST_PCI 
    3339/* host_pci.c */ 
    3440extern int __init bcma_host_pci_init(void); 
  • drivers/bcma/driver_chipcommon.c

    a b u32 bcma_chipco_gpio_polarity(struct bcm 
    9292{ 
    9393        return bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value); 
    9494} 
     95 
     96#ifdef CONFIG_BCMA_DRIVER_MIPS 
     97int bcma_chipco_serial_init(struct bcma_drv_cc *cc, 
     98                            struct bcma_drv_mips_serial_port *ports) 
     99{ 
     100        int nr_ports = 0; 
     101        u32 plltype; 
     102        unsigned int irq; 
     103        u32 baud_base, div; 
     104        u32 i, n; 
     105        unsigned int ccrev = cc->core->id.rev; 
     106 
     107        plltype = (cc->capabilities & BCMA_CC_CAP_PLLT); 
     108        irq = bcma_core_mips_irq(cc->core); 
     109 
     110        if ((ccrev >= 11) && (ccrev != 15) && (ccrev != 20)) { 
     111                /* Fixed ALP clock */ 
     112                baud_base = 20000000; 
     113                if (cc->capabilities & BCMA_CC_CAP_PMU) { 
     114                        /* FIXME: baud_base is different for devices with a PMU */ 
     115                        WARN_ON(1); 
     116                } 
     117                div = 1; 
     118                if (ccrev >= 21) { 
     119                        /* Turn off UART clock before switching clocksource. */ 
     120                        bcma_cc_write32(cc, BCMA_CC_CORECTL, 
     121                                       bcma_cc_read32(cc, BCMA_CC_CORECTL) 
     122                                       & ~BCMA_CC_CORECTL_UARTCLKEN); 
     123                } 
     124                /* Set the override bit so we don't divide it */ 
     125                bcma_cc_write32(cc, BCMA_CC_CORECTL, 
     126                               bcma_cc_read32(cc, BCMA_CC_CORECTL) 
     127                               | BCMA_CC_CORECTL_UARTCLK0); 
     128                if (ccrev >= 21) { 
     129                        /* Re-enable the UART clock. */ 
     130                        bcma_cc_write32(cc, BCMA_CC_CORECTL, 
     131                                       bcma_cc_read32(cc, BCMA_CC_CORECTL) 
     132                                       | BCMA_CC_CORECTL_UARTCLKEN); 
     133                } 
     134        } else 
     135                pr_err("serial not supported on this device ccrev: 0x%x\n", 
     136                       ccrev); 
     137 
     138        /* Determine the registers of the UARTs */ 
     139        n = (cc->capabilities & BCMA_CC_CAP_NRUART); 
     140        for (i = 0; i < n; i++) { 
     141                void __iomem *cc_mmio; 
     142                void __iomem *uart_regs; 
     143 
     144                cc_mmio = cc->core->bus->mmio + 
     145                          (cc->core->core_index * BCMA_CORE_SIZE); 
     146                uart_regs = cc_mmio + BCMA_CC_UART0_DATA; 
     147                uart_regs += (i * 256); 
     148 
     149                nr_ports++; 
     150                ports[i].regs = uart_regs; 
     151                ports[i].irq = irq; 
     152                ports[i].baud_base = baud_base; 
     153                ports[i].reg_shift = 0; 
     154        } 
     155 
     156        return nr_ports; 
     157} 
     158#endif /* CONFIG_BCMA_DRIVER_MIPS */ 
  • drivers/bcma/driver_mips.c

    a b static void bcma_core_mips_dump_irq(stru 
    157157        } 
    158158} 
    159159 
     160static void bcma_core_mips_serial_init(struct bcma_drv_mips *mcore) 
     161{ 
     162        struct bcma_bus *bus = mcore->core->bus; 
     163 
     164        mcore->nr_serial_ports = bcma_chipco_serial_init(&bus->drv_cc, 
     165                                                         mcore->serial_ports); 
     166} 
     167 
    160168static void bcma_core_mips_flash_detect(struct bcma_drv_mips *mcore) 
    161169{ 
    162170        struct bcma_bus *bus = mcore->core->bus; 
    void bcma_core_mips_init(struct bcma_drv 
    229237        if (mcore->setup_done) 
    230238                return; 
    231239 
     240        bcma_core_mips_serial_init(mcore); 
    232241        bcma_core_mips_flash_detect(mcore); 
    233242        mcore->setup_done = true; 
    234243} 
  • include/linux/bcma/bcma_driver_mips.h

    a b  
    3232 
    3333struct bcma_device; 
    3434 
     35struct bcma_drv_mips_serial_port { 
     36        void *regs; 
     37        unsigned long clockspeed; 
     38        unsigned int irq; 
     39        unsigned int baud_base; 
     40        unsigned int reg_shift; 
     41}; 
     42 
    3543struct bcma_drv_mips { 
    3644        struct bcma_device *core; 
    3745        u8 setup_done:1; 
    3846        unsigned int assigned_irqs; 
    3947 
     48        int nr_serial_ports; 
     49        struct bcma_drv_mips_serial_port serial_ports[4]; 
     50 
    4051        u8 flash_buswidth; 
    4152        u32 flash_window; 
    4253        u32 flash_window_size; 
Note: See TracBrowser for help on using the repository browser.