Changeset 31022


Ignore:
Timestamp:
2012-03-19T16:56:59+01:00 (6 years ago)
Author:
juhosg
Message:

ar71xx: add platform data for the RB750 NAND driver

Location:
trunk/target/linux/ar71xx/files
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ar71xx/files/arch/mips/ath79/mach-rb750.c

    r30405 r31022  
    11/* 
    2  *  MikroTik RouterBOARD 750 support 
     2 *  MikroTik RouterBOARD 750/750GL support 
    33 * 
    44 *  Copyright (C) 2010-2012 Gabor Juhos <juhosg@openwrt.org> 
     
    6060}; 
    6161 
     62static struct rb7xx_nand_platform_data rb750_nand_data; 
    6263static struct platform_device rb750_nand_device = { 
    6364        .name   = "rb750-nand", 
    6465        .id     = -1, 
     66        .dev    = { 
     67                .platform_data = &rb750_nand_data, 
     68        } 
    6569}; 
    6670 
     
    114118EXPORT_SYMBOL_GPL(rb750_latch_change); 
    115119 
    116 void rb750_nand_pins_enable(void) 
     120static void rb750_nand_enable_pins(void) 
    117121{ 
     122        rb750_latch_change(RB750_LVC573_LE, 0); 
    118123        ath79_gpio_function_setup(AR724X_GPIO_FUNC_JTAG_DISABLE, 
    119124                                  AR724X_GPIO_FUNC_SPI_EN); 
    120125} 
    121 EXPORT_SYMBOL_GPL(rb750_nand_pins_enable); 
    122126 
    123 void rb750_nand_pins_disable(void) 
     127static void rb750_nand_disable_pins(void) 
    124128{ 
    125129        ath79_gpio_function_setup(AR724X_GPIO_FUNC_SPI_EN, 
    126130                                  AR724X_GPIO_FUNC_JTAG_DISABLE); 
     131        rb750_latch_change(0, RB750_LVC573_LE); 
    127132} 
    128 EXPORT_SYMBOL_GPL(rb750_nand_pins_disable); 
     133 
     134static void rb750_nand_latch_change(u32 clear, u32 set) 
     135{ 
     136        rb750_latch_change(clear, set); 
     137} 
    129138 
    130139static void __init rb750_setup(void) 
     
    148157 
    149158        platform_device_register(&rb750_leds_device); 
     159 
     160        rb750_nand_data.nce_line = RB750_NAND_NCE; 
     161        rb750_nand_data.enable_pins = rb750_nand_enable_pins; 
     162        rb750_nand_data.disable_pins = rb750_nand_disable_pins; 
     163        rb750_nand_data.latch_change = rb750_nand_latch_change; 
    150164        platform_device_register(&rb750_nand_device); 
    151165} 
  • trunk/target/linux/ar71xx/files/arch/mips/include/asm/mach-ath79/mach-rb750.h

    r30405 r31022  
    4444#define RB750_LED_PORT4         BIT(RB750_GPIO_LED_PORT4) 
    4545#define RB750_LED_PORT5         BIT(RB750_GPIO_LED_PORT5) 
     46#define RB750_NAND_NCE          BIT(RB750_GPIO_NAND_NCE) 
    4647 
    4748#define RB750_LVC573_LE         BIT(RB750_GPIO_LVC573_LE) 
     
    6263}; 
    6364 
     65struct rb7xx_nand_platform_data { 
     66        u32 nce_line; 
     67 
     68        void (*enable_pins)(void); 
     69        void (*disable_pins)(void); 
     70        void (*latch_change)(u32, u32); 
     71}; 
     72 
    6473int rb750_latch_change(u32 mask_clr, u32 mask_set); 
    65 void rb750_nand_pins_enable(void); 
    66 void rb750_nand_pins_disable(void); 
    6774 
    6875#endif /* _MACH_RB750_H */ 
  • trunk/target/linux/ar71xx/files/drivers/mtd/nand/rb750_nand.c

    r30406 r31022  
    3232#define RB750_NAND_NWE          BIT(RB750_GPIO_NAND_NWE) 
    3333#define RB750_NAND_RDY          BIT(RB750_GPIO_NAND_RDY) 
    34 #define RB750_NAND_NCE          BIT(RB750_GPIO_NAND_NCE) 
    3534 
    3635#define RB750_NAND_DATA_SHIFT   1 
     
    3837#define RB750_NAND_INPUT_BITS   (RB750_NAND_DATA_BITS | RB750_NAND_RDY) 
    3938#define RB750_NAND_OUTPUT_BITS  (RB750_NAND_ALE | RB750_NAND_CLE | \ 
    40                                  RB750_NAND_NRE | RB750_NAND_NWE | \ 
    41                                  RB750_NAND_NCE) 
     39                                 RB750_NAND_NRE | RB750_NAND_NWE) 
    4240 
    4341struct rb750_nand_info { 
    4442        struct nand_chip        chip; 
    4543        struct mtd_info         mtd; 
     44        struct rb7xx_nand_platform_data *pdata; 
    4645}; 
     46 
     47static inline struct rb750_nand_info *mtd_to_rbinfo(struct mtd_info *mtd) 
     48{ 
     49        return container_of(mtd, struct rb750_nand_info, mtd); 
     50} 
    4751 
    4852/* 
     
    139143static void rb750_nand_select_chip(struct mtd_info *mtd, int chip) 
    140144{ 
    141         void __iomem *base = ath79_gpio_base; 
    142         u32 func; 
     145        struct rb750_nand_info *rbinfo = mtd_to_rbinfo(mtd); 
     146        void __iomem *base = ath79_gpio_base; 
    143147        u32 t; 
    144148 
    145         func = __raw_readl(base + AR71XX_GPIO_REG_FUNC); 
    146149        if (chip >= 0) { 
    147                 /* disable latch */ 
    148                 rb750_latch_change(RB750_LVC573_LE, 0); 
    149  
    150                 rb750_nand_pins_enable(); 
     150                rbinfo->pdata->enable_pins(); 
    151151 
    152152                /* set input mode for data lines */ 
     
    162162 
    163163                /* activate CE line */ 
    164                 __raw_writel(RB750_NAND_NCE, base + AR71XX_GPIO_REG_CLEAR); 
     164                __raw_writel(rbinfo->pdata->nce_line, 
     165                             base + AR71XX_GPIO_REG_CLEAR); 
    165166        } else { 
    166167                /* deactivate CE line */ 
    167                 __raw_writel(RB750_NAND_NCE, base + AR71XX_GPIO_REG_SET); 
     168                __raw_writel(rbinfo->pdata->nce_line, 
     169                             base + AR71XX_GPIO_REG_SET); 
    168170                /* flush write */ 
    169171                (void) __raw_readl(base + AR71XX_GPIO_REG_SET); 
     
    173175                             base + AR71XX_GPIO_REG_OE); 
    174176 
    175                 rb750_nand_pins_disable(); 
    176  
    177                 /* enable latch */ 
    178                 rb750_latch_change(0, RB750_LVC573_LE); 
     177                rbinfo->pdata->disable_pins(); 
    179178        } 
    180179} 
     
    233232} 
    234233 
    235 static void __init rb750_nand_gpio_init(void) 
     234static void __init rb750_nand_gpio_init(struct rb750_nand_info *info) 
    236235{ 
    237236        void __iomem *base = ath79_gpio_base; 
     
    254253        /* setup output lines */ 
    255254        t = __raw_readl(base + AR71XX_GPIO_REG_OE); 
    256         __raw_writel(t | RB750_NAND_OUTPUT_BITS, base + AR71XX_GPIO_REG_OE); 
    257  
    258         rb750_latch_change(~out & RB750_NAND_IO0, out & RB750_NAND_IO0); 
     255        t |= RB750_NAND_OUTPUT_BITS; 
     256        t |= info->pdata->nce_line; 
     257        __raw_writel(t, base + AR71XX_GPIO_REG_OE); 
     258 
     259        info->pdata->latch_change(~out & RB750_NAND_IO0, out & RB750_NAND_IO0); 
    259260} 
    260261 
     
    262263{ 
    263264        struct rb750_nand_info  *info; 
     265        struct rb7xx_nand_platform_data *pdata; 
    264266        int ret; 
    265267 
    266268        printk(KERN_INFO DRV_DESC " version " DRV_VERSION "\n"); 
    267269 
    268         rb750_nand_gpio_init(); 
     270        pdata = pdev->dev.platform_data; 
     271        if (!pdata) 
     272                return -EINVAL; 
    269273 
    270274        info = kzalloc(sizeof(*info), GFP_KERNEL); 
     
    288292        info->chip.options      |= NAND_NO_AUTOINCR; 
    289293 
     294        info->pdata = pdata; 
     295 
    290296        platform_set_drvdata(pdev, info); 
     297 
     298        rb750_nand_gpio_init(info); 
    291299 
    292300        ret = nand_scan_ident(&info->mtd, 1, NULL); 
Note: See TracChangeset for help on using the changeset viewer.