Changeset 19022


Ignore:
Timestamp:
2010-01-03T21:19:32+01:00 (7 years ago)
Author:
florian
Message:

[ar7] add support for titan variant (WRTP54G) (#6185)

Location:
trunk/target/linux/ar7
Files:
3 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ar7/files/arch/mips/ar7/gpio.c

    r15245 r19022  
    2222#include <asm/ar7/gpio.h> 
    2323 
    24 static const char *ar7_gpio_list[AR7_GPIO_MAX]; 
     24static const char *ar7_gpio_list[TITAN_GPIO_MAX]; 
    2525 
    2626int gpio_request(unsigned gpio, const char *label) 
    2727{ 
    28         if (gpio >= AR7_GPIO_MAX) 
     28        if (gpio >= (ar7_is_titan() ? TITAN_GPIO_MAX : AR7_GPIO_MAX)) 
    2929                return -EINVAL; 
    3030 
  • trunk/target/linux/ar7/files/arch/mips/ar7/setup.c

    r16240 r19022  
    2424#include <asm/time.h> 
    2525#include <asm/ar7/ar7.h> 
     26#include <asm/ar7/gpio.h> 
    2627#include <asm/ar7/prom.h> 
    2728 
     29static int titan_variant;  /*hold the results of the gpio_init_titan_variant() so that it is only called once*/ 
    2830static void ar7_machine_restart(char *command); 
    2931static void ar7_machine_halt(void); 
     
    6062        case AR7_CHIP_7200: 
    6163                return "TI AR7 (TNETD7200)"; 
     64        case AR7_CHIP_TITAN: 
     65                titan_variant = ar7_init_titan_variant(); 
     66                switch (titan_variant /*(gpio_get_value_titan(1) >> 12) & 0xf*/) { 
     67                case TITAN_CHIP_1050: 
     68                        return "TI AR7 (TNETV1050)"; 
     69                case TITAN_CHIP_1055: 
     70                        return "TI AR7 (TNETV1055)"; 
     71                case TITAN_CHIP_1056: 
     72                        return "TI AR7 (TNETV1056)"; 
     73                case TITAN_CHIP_1060: 
     74                        return "TI AR7 (TNETV1060)"; 
     75                } 
    6276        default: 
    6377                return "TI AR7 (Unknown)"; 
  • trunk/target/linux/ar7/files/drivers/char/ar7_gpio.c

    r15245 r19022  
    9999        int m = iminor(inode); 
    100100 
    101         if (m >= AR7_GPIO_MAX) 
     101        if (m >= (ar7_is_titan() ? TITAN_GPIO_MAX : AR7_GPIO_MAX)) 
    102102                return -EINVAL; 
    103103 
  • trunk/target/linux/ar7/files/include/asm-mips/ar7/ar7.h

    r15245 r19022  
    4545#define UR8_REGS_UART1  (AR7_REGS_BASE + 0x0f00) 
    4646 
     47#define TITAN_REGS_MAC0         (0x08640000) 
     48#define TITAN_REGS_MAC1         (TITAN_REGS_MAC0 + 0x0800) 
     49#define TITAN_REGS_VLYNQ0       (AR7_REGS_BASE + 0x1c00) 
     50#define TITAN_REGS_VLYNQ1       (AR7_REGS_BASE + 0x1300) 
     51 
    4752#define AR7_RESET_PEREPHERIAL   0x0 
    4853#define AR7_RESET_SOFTWARE      0x4 
     
    5459#define AR7_RESET_BIT_EPHY      26 
    5560 
     61#define TITAN_RESET_BIT_EPHY1   28 
     62 
    5663/* GPIO control registers */ 
    5764#define AR7_GPIO_INPUT  0x0 
     
    5966#define AR7_GPIO_DIR    0x8 
    6067#define AR7_GPIO_ENABLE 0xc 
     68#define TITAN_GPIO_INPUT_0      0x0 
     69#define TITAN_GPIO_INPUT_1      0x4 
     70#define TITAN_GPIO_OUTPUT_0     0x8 
     71#define TITAN_GPIO_OUTPUT_1     0xc 
     72#define TITAN_GPIO_DIR_0        0x10 
     73#define TITAN_GPIO_DIR_1        0x14 
     74#define TITAN_GPIO_ENBL_0       0x18 
     75#define TITAN_GPIO_ENBL_1       0x1c 
    6176 
    6277#define AR7_CHIP_7100   0x18 
    6378#define AR7_CHIP_7200   0x2b 
    6479#define AR7_CHIP_7300   0x05 
     80#define AR7_CHIP_TITAN  0x07 
     81#define TITAN_CHIP_1050 0x0f 
     82#define TITAN_CHIP_1055 0x0e 
     83#define TITAN_CHIP_1056 0x0d 
     84#define TITAN_CHIP_1060 0x07 
    6585 
    6686/* Interrupts */ 
     
    87107extern int ar7_cpu_clock, ar7_bus_clock, ar7_dsp_clock; 
    88108 
     109static inline int ar7_is_titan(void) 
     110{ 
     111        return (readl((void *)KSEG1ADDR(AR7_REGS_GPIO + 0x24)) & 0xffff) == 
     112                AR7_CHIP_TITAN; 
     113} 
     114 
    89115static inline u16 ar7_chip_id(void) 
    90116{ 
    91         return readl((void *)KSEG1ADDR(AR7_REGS_GPIO + 0x14)) & 0xffff; 
     117        return ar7_is_titan() ? AR7_CHIP_TITAN : (readl((void *) 
     118                KSEG1ADDR(AR7_REGS_GPIO + 0x14)) & 0xffff); 
    92119} 
    93120 
    94121static inline u8 ar7_chip_rev(void) 
    95122{ 
    96         return (readl((void *)KSEG1ADDR(AR7_REGS_GPIO + 0x14)) >> 16) & 0xff; 
     123        return (readl((void *)KSEG1ADDR(AR7_REGS_GPIO + (ar7_is_titan() ? 0x24 : 
     124                0x14))) >> 16) & 0xff; 
    97125} 
    98126 
  • trunk/target/linux/ar7/files/include/asm-mips/ar7/gpio.h

    r10708 r19022  
    2020#define __AR7_GPIO_H__ 
    2121#include <asm/ar7/ar7.h> 
     22#ifndef __AR7_TITAN_H__ 
     23#include <asm/ar7/titan.h> 
     24#endif 
    2225 
    2326#define AR7_GPIO_MAX 32 
     27#define TITAN_GPIO_MAX 51 
    2428 
    2529extern int gpio_request(unsigned gpio, const char *label); 
     
    2731 
    2832/* Common GPIO layer */ 
    29 static inline int gpio_get_value(unsigned gpio) 
     33static inline int gpio_get_value_ar7(unsigned gpio) 
    3034{ 
    3135        void __iomem *gpio_in = 
     
    3539} 
    3640 
    37 static inline void gpio_set_value(unsigned gpio, int value) 
     41static inline int gpio_get_value_titan(unsigned gpio) 
     42{ 
     43        void __iomem *gpio_in0 = 
     44                (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + TITAN_GPIO_INPUT_0); 
     45        void __iomem *gpio_in1 = 
     46                (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + TITAN_GPIO_INPUT_1); 
     47 
     48        return readl(gpio >> 5 ? gpio_in1 : gpio_in0) & (1 << (gpio & 0x1f)); 
     49} 
     50 
     51static inline int gpio_get_value(unsigned gpio) 
     52{ 
     53        return ar7_is_titan() ? gpio_get_value_titan(gpio) : 
     54                gpio_get_value_ar7(gpio); 
     55} 
     56 
     57static inline void gpio_set_value_ar7(unsigned gpio, int value) 
    3858{ 
    3959        void __iomem *gpio_out = 
     
    4767} 
    4868 
    49 static inline int gpio_direction_input(unsigned gpio) 
     69static inline void gpio_set_value_titan(unsigned gpio, int value) 
     70{ 
     71        void __iomem *gpio_out0 = 
     72                (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + TITAN_GPIO_OUTPUT_0); 
     73        void __iomem *gpio_out1 = 
     74                (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + TITAN_GPIO_OUTPUT_1); 
     75        unsigned tmp; 
     76 
     77        tmp = readl(gpio >> 5 ? gpio_out1 : gpio_out0) & ~(1 << (gpio & 0x1f)); 
     78        if (value) 
     79                tmp |= 1 << (gpio & 0x1f); 
     80        writel(tmp, gpio >> 5 ? gpio_out1 : gpio_out0); 
     81} 
     82 
     83static inline void gpio_set_value(unsigned gpio, int value) 
     84{ 
     85        if (ar7_is_titan()) 
     86                gpio_set_value_titan(gpio, value); 
     87        else 
     88                gpio_set_value_ar7(gpio, value); 
     89} 
     90 
     91static inline int gpio_direction_input_ar7(unsigned gpio) 
    5092{ 
    5193        void __iomem *gpio_dir = 
     
    60102} 
    61103 
    62 static inline int gpio_direction_output(unsigned gpio, int value) 
     104static inline int gpio_direction_input_titan(unsigned gpio) 
     105{ 
     106        void __iomem *gpio_dir0 = 
     107                (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + TITAN_GPIO_DIR_0); 
     108        void __iomem *gpio_dir1 = 
     109                (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + TITAN_GPIO_DIR_1); 
     110 
     111        if (gpio >= TITAN_GPIO_MAX) 
     112                return -EINVAL; 
     113 
     114        writel(readl(gpio >> 5 ? gpio_dir1 : gpio_dir0) | (1 << (gpio & 0x1f)), 
     115                gpio >> 5 ? gpio_dir1 : gpio_dir0); 
     116 
     117        return 0; 
     118} 
     119 
     120static inline int gpio_direction_input(unsigned gpio) 
     121{ 
     122        return ar7_is_titan() ?  gpio_direction_input_titan(gpio) : 
     123                gpio_direction_input_ar7(gpio); 
     124} 
     125 
     126static inline int gpio_direction_output_ar7(unsigned gpio, int value) 
    63127{ 
    64128        void __iomem *gpio_dir = 
     
    74138} 
    75139 
     140static inline int gpio_direction_output_titan(unsigned gpio, int value) 
     141{ 
     142        void __iomem *gpio_dir0 = 
     143                (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + TITAN_GPIO_DIR_0); 
     144        void __iomem *gpio_dir1 = 
     145                (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + TITAN_GPIO_DIR_1); 
     146 
     147        if (gpio >= TITAN_GPIO_MAX) 
     148                return -EINVAL; 
     149 
     150        gpio_set_value_titan(gpio, value); 
     151        writel(readl(gpio >> 5 ? gpio_dir1 : gpio_dir0) & ~(1 << 
     152                (gpio & 0x1f)), gpio >> 5 ? gpio_dir1 : gpio_dir0); 
     153 
     154        return 0; 
     155} 
     156 
     157static inline int gpio_direction_output(unsigned gpio, int value) 
     158{ 
     159        return ar7_is_titan() ?  gpio_direction_output_titan(gpio, value) : 
     160                gpio_direction_output_ar7(gpio, value); 
     161} 
     162 
    76163static inline int gpio_to_irq(unsigned gpio) 
    77164{ 
     
    85172 
    86173/* Board specific GPIO functions */ 
    87 static inline int ar7_gpio_enable(unsigned gpio) 
     174static inline int ar7_gpio_enable_ar7(unsigned gpio) 
    88175{ 
    89176        void __iomem *gpio_en = 
     
    95182} 
    96183 
    97 static inline int ar7_gpio_disable(unsigned gpio) 
     184static inline int ar7_gpio_enable_titan(unsigned gpio) 
     185{ 
     186        void __iomem *gpio_en0 = 
     187                (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + TITAN_GPIO_ENBL_0); 
     188        void __iomem *gpio_en1 = 
     189                (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + TITAN_GPIO_ENBL_1); 
     190 
     191        writel(readl(gpio >> 5 ? gpio_en1 : gpio_en0) | (1 << (gpio & 0x1f)), 
     192                gpio >> 5 ? gpio_en1 : gpio_en0); 
     193 
     194        return 0; 
     195} 
     196 
     197static inline int ar7_gpio_enable(unsigned gpio) 
     198{ 
     199        return ar7_is_titan() ? ar7_gpio_enable_titan(gpio) : 
     200                ar7_gpio_enable_ar7(gpio); 
     201} 
     202 
     203static inline int ar7_gpio_disable_ar7(unsigned gpio) 
    98204{ 
    99205        void __iomem *gpio_en = 
     
    105211} 
    106212 
     213static inline int ar7_gpio_disable_titan(unsigned gpio) 
     214{ 
     215        void __iomem *gpio_en0 = 
     216                (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + TITAN_GPIO_ENBL_0); 
     217        void __iomem *gpio_en1 = 
     218                (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + TITAN_GPIO_ENBL_1); 
     219 
     220        writel(readl(gpio >> 5 ? gpio_en1 : gpio_en0) & ~(1 << (gpio & 0x1f)), 
     221                gpio >> 5 ? gpio_en1 : gpio_en0); 
     222 
     223        return 0; 
     224} 
     225 
     226static inline int ar7_gpio_disable(unsigned gpio) 
     227{ 
     228        return ar7_is_titan() ? ar7_gpio_disable_titan(gpio) : 
     229                ar7_gpio_disable_ar7(gpio); 
     230} 
     231 
     232static inline int ar7_init_titan_variant( void ) 
     233{ 
     234        /*UINT32 new_val;*/ 
     235        unsigned new_val; 
     236 
     237        /* set GPIO 44 - 47 as input */ 
     238        /*PAL_sysGpioCtrl(const int, GPIO_PIN, GPIO_INPUT_PIN); */ 
     239        /*define titan_gpio_ctrl in titan.h*/ 
     240        titan_gpio_ctrl(44, GPIO_PIN, GPIO_INPUT_PIN); 
     241        titan_gpio_ctrl(45, GPIO_PIN, GPIO_INPUT_PIN); 
     242        titan_gpio_ctrl(46, GPIO_PIN, GPIO_INPUT_PIN); 
     243        titan_gpio_ctrl(47, GPIO_PIN, GPIO_INPUT_PIN); 
     244     
     245        /* read GPIO to get Titan variant type */ 
     246        /*fix this*/ 
     247        titan_sysGpioInValue( &new_val, 1 ); 
     248 
     249        new_val >>= 12; 
     250        new_val &= 0x0f; 
     251 
     252        switch ( new_val ) 
     253        { 
     254        case TITAN_CHIP_1050: 
     255        case TITAN_CHIP_1055: 
     256        case TITAN_CHIP_1056: 
     257        case TITAN_CHIP_1060: 
     258                return new_val; 
     259  
     260        default: 
     261                break; 
     262        } 
     263        /* In case we get an invalid value, return the default Titan chip */ 
     264        return TITAN_CHIP_1050; 
     265} 
     266 
    107267#include <asm-generic/gpio.h> 
    108268 
Note: See TracChangeset for help on using the changeset viewer.