Changeset 9049


Ignore:
Timestamp:
2007-09-27T17:02:41+02:00 (9 years ago)
Author:
florian
Message:

Use the generic NAND driver

Location:
trunk/target/linux/rb532
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/rb532/config-2.6.22

    r8848 r9049  
    116116# CONFIG_MTD_NAND_MUSEUM_IDS is not set 
    117117# CONFIG_MTD_NAND_NANDSIM is not set 
    118 # CONFIG_MTD_NAND_PLATFORM is not set 
    119 CONFIG_MTD_NAND_RB500=y 
     118CONFIG_MTD_NAND_PLATFORM=y 
     119# CONFIG_MTD_NAND_RB500 is not set 
    120120CONFIG_MTD_NAND_VERIFY_WRITE=y 
    121121# CONFIG_MTD_ONENAND is not set 
  • trunk/target/linux/rb532/files/arch/mips/rb500/devices.c

    r8058 r9049  
    33 * 
    44 *  Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> 
     5 *  Copyright (C) 2007 Florian Fainelli <florian@openwrt.org> 
    56 * 
    67 *  This program is free software; you can redistribute it and/or modify 
     
    1314 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
    1415 *  GNU General Public License for more details. 
    15  * 
    16  *  $Id$ 
    1716 */ 
    1817#include <linux/kernel.h> 
    1918#include <linux/init.h> 
    20 #include <linux/module.h> 
    2119#include <linux/ctype.h> 
    2220#include <linux/string.h> 
    2321#include <linux/platform_device.h> 
    24 #include <asm/unaligned.h> 
    25 #include <asm/io.h> 
     22#include <linux/mtd/nand.h> 
     23#include <linux/mtd/mtd.h> 
     24#include <linux/mtd/partitions.h> 
    2625 
    2726#include <asm/rc32434/rc32434.h> 
     
    3231 
    3332#define ETH0_DMA_RX_IRQ         GROUP1_IRQ_BASE + 0 
    34 #define ETH0_DMA_TX_IRQ         GROUP1_IRQ_BASE + 1  
     33#define ETH0_DMA_TX_IRQ         GROUP1_IRQ_BASE + 1 
    3534#define ETH0_RX_OVR_IRQ         GROUP3_IRQ_BASE + 9 
    3635#define ETH0_TX_UND_IRQ         GROUP3_IRQ_BASE + 10 
     
    3938#define ETH0_TX_DMA_ADDR  (DMA0_PhysicalAddress + 1*DMA_CHAN_OFFSET) 
    4039 
     40/* NAND definitions */ 
     41#define MEM32(x) *((volatile unsigned *) (x)) 
     42 
     43#define GPIO_RDY (1 << 0x08) 
     44#define GPIO_WPX (1 << 0x09) 
     45#define GPIO_ALE (1 << 0x0a) 
     46#define GPIO_CLE (1 << 0x0b) 
     47 
     48extern char* board_type; 
     49 
    4150static struct resource korina_dev0_res[] = { 
    4251        { 
    43                 .name  = "korina_regs", 
     52                .name = "korina_regs", 
    4453                .start = ETH0_PhysicalAddress, 
    45                 .end   = ETH0_PhysicalAddress + sizeof(ETH_t), 
     54                .end = ETH0_PhysicalAddress + sizeof(ETH_t), 
    4655                .flags = IORESOURCE_MEM, 
    47         }, 
    48         { 
    49                 .name  = "korina_rx", 
     56         }, { 
     57                .name = "korina_rx", 
    5058                .start = ETH0_DMA_RX_IRQ, 
    51                 .end   = ETH0_DMA_RX_IRQ, 
    52                 .flags = IORESOURCE_IRQ 
    53         }, 
    54         { 
    55                 .name  = "korina_tx", 
     59                .end = ETH0_DMA_RX_IRQ, 
     60                .flags = IORESOURCE_IRQ 
     61        }, { 
     62                .name = "korina_tx", 
    5663                .start = ETH0_DMA_TX_IRQ, 
    57                 .end   = ETH0_DMA_TX_IRQ, 
    58                 .flags = IORESOURCE_IRQ 
    59         }, 
    60         { 
    61                 .name  = "korina_ovr", 
     64                .end = ETH0_DMA_TX_IRQ, 
     65                .flags = IORESOURCE_IRQ 
     66        }, { 
     67                .name = "korina_ovr", 
    6268                .start = ETH0_RX_OVR_IRQ, 
    63                 .end   = ETH0_RX_OVR_IRQ, 
    64                 .flags = IORESOURCE_IRQ 
    65         }, 
    66         { 
    67                 .name  = "korina_und", 
     69                .end = ETH0_RX_OVR_IRQ, 
     70                .flags = IORESOURCE_IRQ 
     71        }, { 
     72                .name = "korina_und", 
    6873                .start = ETH0_TX_UND_IRQ, 
    69                 .end   = ETH0_TX_UND_IRQ, 
    70                 .flags = IORESOURCE_IRQ 
    71         }, 
    72         { 
    73                 .name  = "korina_dma_rx", 
     74                .end = ETH0_TX_UND_IRQ, 
     75                .flags = IORESOURCE_IRQ 
     76        }, { 
     77                .name = "korina_dma_rx", 
    7478                .start = ETH0_RX_DMA_ADDR, 
    75                 .end   = ETH0_RX_DMA_ADDR + DMA_CHAN_OFFSET - 1, 
     79                .end = ETH0_RX_DMA_ADDR + DMA_CHAN_OFFSET - 1, 
    7680                .flags = IORESOURCE_MEM, 
    77         }, 
    78         { 
    79                 .name  = "korina_dma_tx", 
     81         }, { 
     82                .name = "korina_dma_tx", 
    8083                .start = ETH0_TX_DMA_ADDR, 
    81                 .end   = ETH0_TX_DMA_ADDR + DMA_CHAN_OFFSET - 1, 
     84                .end = ETH0_TX_DMA_ADDR + DMA_CHAN_OFFSET - 1, 
    8285                .flags = IORESOURCE_MEM, 
    83         } 
     86         } 
    8487}; 
    8588 
    8689static struct korina_device korina_dev0_data = { 
    8790        .name = "korina0", 
    88         .mac = { 0xde, 0xca, 0xff, 0xc0, 0xff, 0xee } 
     91        .mac = {0xde, 0xca, 0xff, 0xc0, 0xff, 0xee} 
    8992}; 
    9093 
     
    97100}; 
    98101 
    99  
    100102#define CF_GPIO_NUM 13 
    101103 
    102104static struct resource cf_slot0_res[] = { 
    103105        { 
    104                 .name  = "cf_membase", 
     106                .name = "cf_membase", 
    105107                .flags = IORESOURCE_MEM 
    106         }, 
    107         { 
    108                 .name  = "cf_irq", 
    109                 .start = (8 + 4 * 32 + CF_GPIO_NUM),  /* 149 */ 
    110                 .end   = (8 + 4 * 32 + CF_GPIO_NUM), 
     108        }, { 
     109                .name = "cf_irq", 
     110                .start = (8 + 4 * 32 + CF_GPIO_NUM),    /* 149 */ 
     111                .end = (8 + 4 * 32 + CF_GPIO_NUM), 
    111112                .flags = IORESOURCE_IRQ 
    112113        } 
     
    126127 
    127128/* Resources and device for NAND.  There is no data needed and no irqs, so just define the memory used. */ 
     129int rb500_dev_ready(struct mtd_info *mtd) 
     130{ 
     131        return MEM32(IDT434_REG_BASE + GPIOD) & GPIO_RDY; 
     132} 
     133 
     134void rb500_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) 
     135{ 
     136        struct nand_chip *chip = mtd->priv; 
     137        unsigned char orbits, nandbits; 
     138 
     139        if (ctrl & NAND_CTRL_CHANGE) { 
     140 
     141                orbits = (ctrl & NAND_CLE) << 1; 
     142                orbits |= (ctrl & NAND_ALE) >> 1; 
     143 
     144                nandbits = (~ctrl & NAND_CLE) << 1; 
     145                nandbits |= (~ctrl & NAND_ALE) >> 1; 
     146 
     147                changeLatchU5(orbits, nandbits); 
     148        } 
     149        if (cmd != NAND_CMD_NONE) 
     150                writeb(cmd, chip->IO_ADDR_W); 
     151} 
     152 
    128153static struct resource nand_slot0_res[] = { 
    129154        { 
    130155                .name = "nand_membase", 
    131                 .start = 0x18a20000, 
    132                 .end = (0x18a20000+0x1000)-1, 
    133                 .flags = IORESOURCE_MEM  
    134         } 
    135 }; 
    136   
     156                .flags = IORESOURCE_MEM 
     157        } 
     158}; 
     159 
     160struct platform_nand_data rb500_nand_data = { 
     161        .ctrl.dev_ready = rb500_dev_ready, 
     162        .ctrl.cmd_ctrl  = rb500_cmd_ctrl, 
     163}; 
     164 
    137165static struct platform_device nand_slot0 = { 
    138166        .id = 0, 
    139         .name = "rb500-nand", 
     167        .name = "gen_nand", 
    140168        .resource = nand_slot0_res, 
    141169        .num_resources = ARRAY_SIZE(nand_slot0_res), 
    142 }; 
    143  
    144 static struct platform_device rb500led = { 
    145         .name = "rb500-led", 
    146         .id = 0, 
     170        .dev.platform_data = &rb500_nand_data, 
     171}; 
     172 
     173static struct mtd_partition rb500_partition_info[] = { 
     174        { 
     175                .name = "Routerboard NAND boot", 
     176                .offset = 0, 
     177                .size = 4 * 1024 * 1024, 
     178        }, { 
     179                .name = "rootfs", 
     180                .offset = MTDPART_OFS_NXTBLK, 
     181                .size = MTDPART_SIZ_FULL, 
     182        } 
    147183}; 
    148184 
     
    151187        &korina_dev0, 
    152188        &nand_slot0, 
    153         &cf_slot0, 
    154         &rb500led 
    155 }; 
    156  
    157 static void __init parse_mac_addr(char* macstr) 
     189        &cf_slot0 
     190}; 
     191 
     192static void __init parse_mac_addr(char *macstr) 
    158193{ 
    159194        int i, j; 
    160195        unsigned char result, value; 
    161          
    162         for (i=0; i<6; i++) { 
     196 
     197        for (i = 0; i < 6; i++) { 
    163198                result = 0; 
    164                 if (i != 5 && *(macstr+2) != ':') { 
     199 
     200                if (i != 5 && *(macstr + 2) != ':') 
    165201                        return; 
    166                 }                                
    167                 for (j=0; j<2; j++) { 
    168                         if (isxdigit(*macstr) && (value = isdigit(*macstr) ? *macstr-'0' :  
    169                                                   toupper(*macstr)-'A'+10) < 16) { 
    170                                 result = result*16 + value; 
     202 
     203                for (j = 0; j < 2; j++) { 
     204                        if (isxdigit(*macstr) 
     205                            && (value = 
     206                                isdigit(*macstr) ? *macstr - 
     207                                '0' : toupper(*macstr) - 'A' + 10) < 16) { 
     208                                result = result * 16 + value; 
    171209                                macstr++; 
    172                         }  
    173                         else return; 
     210                        } else 
     211                                return; 
    174212                } 
    175                  
    176                 macstr++;  
     213 
     214                macstr++; 
    177215                korina_dev0_data.mac[i] = result; 
    178216        } 
     
    188226#define CFG_DC_DEVTC      0xC 
    189227 
     228/* NAND definitions */ 
     229#define NAND_CHIP_DELAY 25 
     230 
     231static void __init rb500_nand_setup(void) 
     232{ 
     233        if (!strcmp(board_type, "500r5")) 
     234                changeLatchU5(LO_FOFF | LO_CEX, LO_ULED | LO_ALE | LO_CLE | LO_WPX); 
     235        else 
     236                changeLatchU5(LO_WPX | LO_FOFF | LO_CEX, LO_ULED | LO_ALE | LO_CLE); 
     237} 
     238 
    190239 
    191240static int __init plat_setup_devices(void) 
     
    195244                rb500_devs[1] = NULL; 
    196245        else { 
    197                 cf_slot0_res[0].start = readl(CFG_DC_DEV1 + CFG_DC_DEVBASE); 
     246                cf_slot0_res[0].start = 
     247                    readl(CFG_DC_DEV1 + CFG_DC_DEVBASE); 
    198248                cf_slot0_res[0].end = cf_slot0_res[0].start + 0x1000; 
    199249        } 
    200          
    201         /* There is always a NAND device */ 
    202         nand_slot0_res[0].start = readl( CFG_DC_DEV2 + CFG_DC_DEVBASE); 
     250 
     251        /* Initialise the NAND device */ 
     252        rb500_nand_setup(); 
     253 
     254        /* Read the NAND resources from the device controller */ 
     255        nand_slot0_res[0].start = readl(CFG_DC_DEV2 + CFG_DC_DEVBASE); 
    203256        nand_slot0_res[0].end = nand_slot0_res[0].start + 0x1000; 
    204                  
     257 
     258        /* Setup NAND specific settings */ 
     259        rb500_nand_data.chip.nr_chips = 1; 
     260        rb500_nand_data.chip.nr_partitions = ARRAY_SIZE(rb500_partition_info); 
     261        rb500_nand_data.chip.partitions = rb500_partition_info; 
     262        rb500_nand_data.chip.chip_delay = NAND_CHIP_DELAY; 
     263        rb500_nand_data.chip.options = NAND_NO_AUTOINCR; 
     264 
    205265        return platform_add_devices(rb500_devs, ARRAY_SIZE(rb500_devs)); 
    206266} 
     
    208268static int __init setup_kmac(char *s) 
    209269{ 
    210     printk("korina mac = %s\n",s); 
     270        printk("korina mac = %s\n", s); 
    211271        parse_mac_addr(s); 
    212     return 0; 
     272        return 0; 
    213273} 
    214274 
    215275__setup("kmac=", setup_kmac); 
     276 
    216277arch_initcall(plat_setup_devices); 
    217  
    218  
Note: See TracChangeset for help on using the changeset viewer.