Changeset 27165


Ignore:
Timestamp:
2011-06-13T10:12:38+02:00 (7 years ago)
Author:
juhosg
Message:

ar71xx: update early_printk code

Location:
trunk/target/linux/ar71xx/files/arch/mips
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ar71xx/files/arch/mips/ar71xx/early_printk.c

    r27055 r27165  
    1616 
    1717#include <asm/mach-ar71xx/ar71xx.h> 
     18#include <asm/mach-ar71xx/ar933x_uart.h> 
    1819 
    19 static void __iomem *prom_uart_base; 
    20 static void (*_putchar)(unsigned char); 
     20static void (*_prom_putchar) (unsigned char); 
    2121 
    22 #define UART_READ(r) \ 
    23         __raw_readl(prom_uart_base + 4 * (r)) 
     22static inline void prom_putchar_wait(void __iomem *reg, u32 mask, u32 val) 
     23{ 
     24        u32 t; 
    2425 
    25 #define UART_WRITE(r, v) \ 
    26         __raw_writel((v), prom_uart_base + 4 * (r)) 
     26        do { 
     27                t = __raw_readl(reg); 
     28                if ((t & mask) == val) 
     29                        break; 
     30        } while (1); 
     31} 
    2732 
    2833static void prom_putchar_ar71xx(unsigned char ch) 
    2934{ 
    30         while (((UART_READ(UART_LSR)) & UART_LSR_THRE) == 0) 
    31                 ; 
    32         UART_WRITE(UART_TX, ch); 
    33         while (((UART_READ(UART_LSR)) & UART_LSR_THRE) == 0) 
    34                 ; 
     35        void __iomem *base = (void __iomem *)(KSEG1ADDR(AR71XX_UART_BASE)); 
     36 
     37        prom_putchar_wait(base + UART_LSR * 4, UART_LSR_THRE, UART_LSR_THRE); 
     38        __raw_writel(ch, base + UART_TX * 4); 
     39        prom_putchar_wait(base + UART_LSR * 4, UART_LSR_THRE, UART_LSR_THRE); 
    3540} 
    3641 
    3742static void prom_putchar_ar933x(unsigned char ch) 
    3843{ 
    39         while (((UART_READ(0)) & 0x200) == 0) 
    40                 ; 
    41         UART_WRITE(0, 0x200 | ch); 
    42         while (((UART_READ(0)) & 0x200) == 0) 
    43                 ; 
     44        void __iomem *base = (void __iomem *)(KSEG1ADDR(AR933X_UART_BASE)); 
     45 
     46        prom_putchar_wait(base + AR933X_UART_DATA_REG, AR933X_UART_DATA_TX_CSR, 
     47                          AR933X_UART_DATA_TX_CSR); 
     48        __raw_writel(AR933X_UART_DATA_TX_CSR | ch, base + AR933X_UART_DATA_REG); 
     49        prom_putchar_wait(base + AR933X_UART_DATA_REG, AR933X_UART_DATA_TX_CSR, 
     50                          AR933X_UART_DATA_TX_CSR); 
    4451} 
    4552 
    46 static int prom_putchar_init(void) 
     53static void prom_putchar_dummy(unsigned char ch) 
    4754{ 
    48         if (_putchar) 
    49                 return 0; 
     55        /* nothing to do */ 
     56} 
    5057 
    51         switch(ar71xx_soc) { 
    52         case AR71XX_SOC_AR7130: 
    53         case AR71XX_SOC_AR7141: 
    54         case AR71XX_SOC_AR7161: 
    55         case AR71XX_SOC_AR7240: 
    56         case AR71XX_SOC_AR7241: 
    57         case AR71XX_SOC_AR7242: 
    58         case AR71XX_SOC_AR9130: 
    59         case AR71XX_SOC_AR9132: 
    60         case AR71XX_SOC_AR9341: 
    61         case AR71XX_SOC_AR9342: 
    62         case AR71XX_SOC_AR9344: 
    63                 prom_uart_base = (void __iomem *) KSEG1ADDR(AR71XX_UART_BASE); 
    64                 _putchar = prom_putchar_ar71xx; 
     58static void prom_putchar_init(void) 
     59{ 
     60        void __iomem *base; 
     61        u32 id; 
     62 
     63        base = (void __iomem *)(KSEG1ADDR(AR71XX_RESET_BASE)); 
     64        id = __raw_readl(base + AR71XX_RESET_REG_REV_ID); 
     65        id &= REV_ID_MAJOR_MASK; 
     66 
     67        switch (id) { 
     68        case REV_ID_MAJOR_AR71XX: 
     69        case REV_ID_MAJOR_AR7240: 
     70        case REV_ID_MAJOR_AR7241: 
     71        case REV_ID_MAJOR_AR7242: 
     72        case REV_ID_MAJOR_AR913X: 
     73        case REV_ID_MAJOR_AR9341: 
     74        case REV_ID_MAJOR_AR9342: 
     75        case REV_ID_MAJOR_AR9344: 
     76                _prom_putchar = prom_putchar_ar71xx; 
    6577                break; 
    6678 
    67         case AR71XX_SOC_AR9330: 
    68         case AR71XX_SOC_AR9331: 
    69                 prom_uart_base = (void __iomem *) KSEG1ADDR(AR933X_UART_BASE); 
    70                 _putchar = prom_putchar_ar933x; 
     79        case REV_ID_MAJOR_AR9330: 
     80        case REV_ID_MAJOR_AR9331: 
     81                _prom_putchar = prom_putchar_ar933x; 
    7182                break; 
    7283 
    7384        default: 
    74                 return -ENODEV; 
     85                _prom_putchar = prom_putchar_dummy; 
     86                break; 
    7587        } 
    76  
    77         return 0; 
    7888} 
    7989 
    8090void prom_putchar(unsigned char ch) 
    8191{ 
    82         if (prom_putchar_init()) 
    83                 return; 
     92        if (!_prom_putchar) 
     93                prom_putchar_init(); 
    8494 
    85         _putchar(ch); 
     95        _prom_putchar(ch); 
    8696} 
Note: See TracChangeset for help on using the changeset viewer.