Changeset 8045


Ignore:
Timestamp:
2007-07-18T19:16:36+02:00 (11 years ago)
Author:
florian
Message:

Convert the nand driver to a platform_device, should only allow routerboards to use it

Location:
trunk/target/linux/adm5120-2.6/files
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/adm5120-2.6/files/arch/mips/adm5120/boards/mikrotik.c

    r7916 r8045  
    4848static struct platform_device *rb1xx_devices[] __initdata = { 
    4949        &adm5120_flash0_device, 
     50        &adm5120_nand_device, 
    5051}; 
    5152 
  • trunk/target/linux/adm5120-2.6/files/arch/mips/adm5120/platform.c

    r7916 r8045  
    110110        .dev.platform_data = &adm5120_flash1_data, 
    111111}; 
     112 
     113/* NAND flash */ 
     114struct resource adm5120_nand_resource[] = { 
     115        [0] = { 
     116                .start  = ADM5120_SRAM1_BASE, 
     117                .end    = ADM5120_SRAM1_BASE+0x1000-1, 
     118                .flags  = IORESOURCE_MEM, 
     119        }, 
     120}; 
     121 
     122struct adm5120_nand_platform_data adm5120_nand_data; 
     123 
     124struct platform_device adm5120_nand_device = { 
     125        .name           = "adm5120-nand", 
     126        .id             = -1, 
     127        .dev.platform_data = &adm5120_nand_data, 
     128        .num_resources  = ARRAY_SIZE(adm5120_nand_resource), 
     129        .resource       = adm5120_nand_resource, 
     130}; 
  • trunk/target/linux/adm5120-2.6/files/drivers/mtd/nand/rbmipsnand.c

    r8032 r8045  
    99/*==============================================================================*/ 
    1010 
    11 #include <linux/init.h> 
     11#include <linux/io.h> 
     12#include <linux/module.h> 
     13#include <linux/platform_device.h> 
    1214#include <linux/mtd/nand.h> 
    1315#include <linux/mtd/mtd.h> 
     
    3739 
    3840#define MEM32(x) *((volatile unsigned *) (x)) 
    39 static void __iomem *p_nand; 
    40  
    41 static int rb100_dev_ready(struct mtd_info *mtd) { 
    42     return SMEM1(NAND_STS_REG) & 0x80; 
    43 } 
    44  
    45 static void rbmips_hwcontrol100(struct mtd_info *mtd, int cmd, unsigned int ctrl) { 
    46     struct nand_chip *chip = mtd->priv; 
    47     if (ctrl & NAND_CTRL_CHANGE) { 
    48         SMEM1((( ctrl & NAND_CLE) ? NAND_SET_CLE : NAND_CLR_CLE)) = 0x01; 
    49         SMEM1((( ctrl & NAND_ALE) ? NAND_SET_ALE : NAND_CLR_ALE)) = 0x01; 
    50         SMEM1((( ctrl & NAND_NCE) ? NAND_SET_CEn : NAND_CLR_CEn)) = 0x01; 
    51         } 
    52     if( cmd != NAND_CMD_NONE) 
    53         writeb( cmd, chip->IO_ADDR_W); 
    54 } 
    5541 
    5642static struct mtd_partition partition_info[] = { 
     
    5844        name: "RouterBoard NAND Boot", 
    5945        offset: 0, 
    60         size: 4 * 1024 * 1024 
     46        size: 4 * 1024 * 1024 
    6147    }, 
    6248    { 
    6349        name: "rootfs", 
    64         offset: MTDPART_OFS_NXTBLK, 
    65         size: MTDPART_SIZ_FULL 
     50        offset: MTDPART_OFS_NXTBLK, 
     51        size: MTDPART_SIZ_FULL 
    6652    } 
    6753}; 
    6854 
    69 static struct mtd_info rmtd; 
    70 static struct nand_chip rnand; 
     55static struct nand_ecclayout rb_ecclayout = { 
     56        .eccbytes = 6, 
     57        .eccpos = { 8, 9, 10, 13, 14, 15 }, 
     58        .oobavail = 9, 
     59        .oobfree = { { 0, 4 }, { 6, 2 }, { 11, 2 }, { 4, 1} } 
     60}; 
     61 
     62struct adm5120_nand_info { 
     63        struct nand_chip chip; 
     64        struct mtd_info mtd; 
     65        void __iomem *io_base; 
     66#ifdef CONFIG_MTD_PARTITIONS 
     67        int     nr_parts; 
     68        struct mtd_partition *parts; 
     69#endif 
     70}; 
     71 
     72static int rb100_dev_ready(struct mtd_info *mtd) 
     73{ 
     74        return SMEM1(NAND_STS_REG) & 0x80; 
     75} 
     76 
     77static void rbmips_hwcontrol100(struct mtd_info *mtd, int cmd, unsigned int ctrl) 
     78{ 
     79        struct nand_chip *chip = mtd->priv; 
     80        if (ctrl & NAND_CTRL_CHANGE) 
     81        { 
     82                SMEM1((( ctrl & NAND_CLE) ? NAND_SET_CLE : NAND_CLR_CLE)) = 0x01; 
     83                SMEM1((( ctrl & NAND_ALE) ? NAND_SET_ALE : NAND_CLR_ALE)) = 0x01; 
     84                SMEM1((( ctrl & NAND_NCE) ? NAND_SET_CEn : NAND_CLR_CEn)) = 0x01; 
     85        } 
     86        if (cmd != NAND_CMD_NONE) 
     87                writeb( cmd, chip->IO_ADDR_W); 
     88} 
     89 
    7190/*========================================================================*/ 
    7291/* We need to use the OLD Yaffs-1 OOB layout, otherwise the RB bootloader */ 
     
    7493/* when creating the partitions.                                          */  
    7594/*========================================================================*/ 
    76 static struct nand_ecclayout rb_ecclayout = { 
    77         .eccbytes = 6, 
    78         .eccpos = { 8, 9, 10, 13, 14, 15 }, 
    79         .oobavail = 9, 
    80         .oobfree = { { 0, 4 }, { 6, 2 }, { 11, 2 }, { 4, 1} } 
    81 }; 
     95 
    8296static unsigned init_ok = 0; 
    8397 
    84 unsigned get_rbnand_block_size(void) { 
    85         return init_ok ? rmtd.writesize : 0; 
     98unsigned get_rbnand_block_size(struct adm5120_nand_info *data) 
     99{ 
     100        return init_ok ? data->mtd.writesize : 0; 
    86101} 
    87102 
    88103EXPORT_SYMBOL(get_rbnand_block_size); 
    89104 
    90 int __init rbmips_init(void) { 
    91  
    92         if (!adm5120_nand_boot) 
    93                 return -ENODEV; 
    94  
    95         memset(&rmtd, 0, sizeof(rmtd)); 
    96         memset(&rnand, 0, sizeof(rnand)); 
    97         printk(KERN_INFO "RB1xx nand\n"); 
     105static int rbmips_probe(struct platform_device *pdev) 
     106{ 
     107        struct adm5120_nand_info *data; 
     108        int res = 0; 
     109 
     110        /* Allocate memory for the nand_chip structure */ 
     111        data = kzalloc(sizeof(*data), GFP_KERNEL); 
     112        if (!data) { 
     113                dev_err(&pdev->dev, "Failed to allocate device structure\n"); 
     114                return -ENOMEM; 
     115 
     116        } 
     117         
     118        data->io_base = ioremap(pdev->resource[0].start, 0x1000); 
     119 
     120        if (data->io_base == NULL) { 
     121                dev_err(&pdev->dev, "ioremap failed\n"); 
     122                kfree(data); 
     123                return -EIO; 
     124        } 
     125 
    98126        MEM32(0xB2000064) = 0x100; 
    99127        MEM32(0xB2000008) = 0x1; 
    100128        SMEM1(NAND_SET_SPn) = 0x01; 
    101129        SMEM1(NAND_CLR_WPn) = 0x01; 
    102         rnand.IO_ADDR_R = (unsigned char *)KSEG1ADDR(ADM5120_SRAM1_BASE); 
    103         rnand.IO_ADDR_W = rnand.IO_ADDR_R; 
    104         rnand.cmd_ctrl = rbmips_hwcontrol100; 
    105         rnand.dev_ready = rb100_dev_ready; 
    106         p_nand = (void __iomem *)ioremap(( unsigned long)ADM5120_SRAM1_BASE, 0x1000); 
    107         if (!p_nand) { 
    108                 printk(KERN_WARNING "RB1xx nand Unable ioremap buffer\n"); 
    109                 return -ENXIO; 
     130 
     131        data->chip.priv = &data; 
     132        data->mtd.priv = &data->chip; 
     133        data->mtd.owner = THIS_MODULE; 
     134 
     135        data->chip.IO_ADDR_R = (unsigned char *)KSEG1ADDR(ADM5120_SRAM1_BASE); 
     136        data->chip.IO_ADDR_W = data->chip.IO_ADDR_R; 
     137        data->chip.cmd_ctrl = rbmips_hwcontrol100; 
     138        data->chip.dev_ready = rb100_dev_ready; 
     139        data->chip.ecc.mode = NAND_ECC_SOFT; 
     140        data->chip.ecc.layout = &rb_ecclayout; 
     141        data->chip.chip_delay = 25; 
     142        data->chip.options |= NAND_NO_AUTOINCR; 
     143 
     144        platform_set_drvdata(pdev, data); 
     145 
     146        /* Why do we need to scan 4 times ? */ 
     147        if (nand_scan(&data->mtd, 1) && nand_scan(&data->mtd, 1) && nand_scan(&data->mtd, 1)  && nand_scan(&data->mtd, 1)) { 
     148                printk(KERN_INFO "RB1xxx nand device not found\n"); 
     149                res = -ENXIO; 
     150                goto out; 
    110151        } 
    111         rnand.ecc.mode = NAND_ECC_SOFT; 
    112         rnand.ecc.layout = &rb_ecclayout; 
    113         rnand.chip_delay = 25; 
    114         rnand.options |= NAND_NO_AUTOINCR; 
    115         rmtd.priv = &rnand; 
    116         if (nand_scan(&rmtd, 1) && nand_scan(&rmtd, 1) 
    117             && nand_scan(&rmtd, 1)  && nand_scan(&rmtd, 1)) { 
    118                 printk(KERN_INFO "RB1xxx nand device not found\n"); 
    119                 iounmap ((void *)p_nand); 
    120                 return -ENXIO; 
    121         } 
    122         add_mtd_partitions(&rmtd, partition_info, 2); 
     152 
     153        add_mtd_partitions(&data->mtd, partition_info, 2); 
    123154        init_ok = 1; 
     155 
     156        res = add_mtd_device(&data->mtd); 
     157        if (!res) 
     158                return res; 
     159 
     160        nand_release(&data->mtd); 
     161out: 
     162        platform_set_drvdata(pdev, NULL); 
     163        iounmap(data->io_base); 
     164        kfree(data); 
     165        return res; 
     166} 
     167 
     168static int __devexit rbmips_remove(struct platform_device *pdev) 
     169{ 
     170        struct adm5120_nand_info *data = platform_get_drvdata(pdev); 
     171         
     172        nand_release(&data->mtd); 
     173        iounmap(data->io_base); 
     174        kfree(data); 
     175         
    124176        return 0; 
    125177} 
    126178 
    127 module_init(rbmips_init); 
    128  
     179static struct platform_driver adm5120_nand_driver = { 
     180        .probe          = rbmips_probe, 
     181        .remove         = rbmips_remove, 
     182        .driver         = { 
     183                .name   = "adm5120-nand", 
     184                .owner  = THIS_MODULE, 
     185        }, 
     186}; 
     187 
     188static int __init adm5120_nand_init(void) 
     189{ 
     190        int err; 
     191        err = platform_driver_register(&adm5120_nand_driver); 
     192        return err; 
     193} 
     194 
     195static void __exit adm5120_nand_exit(void) 
     196{ 
     197        platform_driver_unregister(&adm5120_nand_driver); 
     198} 
     199 
     200module_init(adm5120_nand_init); 
     201module_exit(adm5120_nand_exit); 
     202 
     203MODULE_LICENSE("GPL"); 
     204MODULE_AUTHOR("David Goodenough, Florian Fainelli"); 
     205MODULE_DESCRIPTION("RouterBOARD 100 NAND driver"); 
     206 
  • trunk/target/linux/adm5120-2.6/files/include/asm-mips/mach-adm5120/adm5120_platform.h

    r7916 r8045  
    3333        void                    (*set_vpp)(struct map_info *, int); 
    3434        void                    (*switch_bank)(unsigned); 
     35#ifdef CONFIG_MTD_PARTITIONS 
    3536        unsigned int            nr_parts; 
    3637        struct mtd_partition    *parts; 
     38#endif 
     39}; 
     40 
     41struct adm5120_nand_platform_data { 
     42        /* TODO : not yet implemented */ 
    3743}; 
    3844 
     
    5561extern struct adm5120_flash_platform_data adm5120_flash0_data; 
    5662extern struct adm5120_flash_platform_data adm5120_flash1_data; 
     63extern struct adm5120_nand_platform_data adm5120_nand_data; 
    5764extern struct adm5120_pci_platform_data adm5120_pci_data; 
    5865extern struct adm5120_switch_platform_data adm5120_switch_data; 
     
    6067extern struct platform_device adm5120_flash0_device; 
    6168extern struct platform_device adm5120_flash1_device; 
     69extern struct platform_device adm5120_nand_device; 
    6270extern struct platform_device adm5120_usbc_device; 
    6371extern struct platform_device adm5120_pci_device; 
Note: See TracChangeset for help on using the changeset viewer.