source: trunk/target/linux/ixp4xx/patches-2.6.34/300-avila_fetch_mac.patch @ 22373

Last change on this file since 22373 was 22373, checked in by acoul, 6 years ago

ixp4xx: add kernel 2.6.34 preliminary support

File size: 5.7 KB
  • arch/arm/mach-ixp4xx/avila-setup.c

    a b  
    1414#include <linux/kernel.h> 
    1515#include <linux/init.h> 
    1616#include <linux/device.h> 
     17#include <linux/if_ether.h> 
     18#include <linux/socket.h> 
     19#include <linux/netdevice.h> 
    1720#include <linux/serial.h> 
    1821#include <linux/tty.h> 
    1922#include <linux/serial_8250.h> 
     23#include <linux/i2c.h> 
     24#include <linux/i2c/at24.h> 
    2025#include <linux/i2c-gpio.h> 
    2126#include <asm/types.h> 
    2227#include <asm/setup.h> 
     
    3035#define AVILA_SDA_PIN   7 
    3136#define AVILA_SCL_PIN   6 
    3237 
     38struct avila_board_info { 
     39        unsigned char   *model; 
     40        void            (*setup)(void); 
     41}; 
     42 
     43static struct avila_board_info *avila_info __initdata; 
     44 
    3345static struct flash_platform_data avila_flash_data = { 
    3446        .map_name       = "cfi_probe", 
    3547        .width          = 2, 
    static struct platform_device avila_pata 
    133145        .resource               = avila_pata_resources, 
    134146}; 
    135147 
     148/* Built-in 10/100 Ethernet MAC interfaces */ 
     149static struct eth_plat_info avila_npeb_data = { 
     150        .phy            = 0, 
     151        .rxq            = 3, 
     152        .txreadyq       = 20, 
     153}; 
     154 
     155static struct eth_plat_info avila_npec_data = { 
     156        .phy            = 1, 
     157        .rxq            = 4, 
     158        .txreadyq       = 21, 
     159}; 
     160 
     161static struct platform_device avila_npeb_device = { 
     162        .name                   = "ixp4xx_eth", 
     163        .id                     = IXP4XX_ETH_NPEB, 
     164        .dev.platform_data      = &avila_npeb_data, 
     165}; 
     166 
     167static struct platform_device avila_npec_device = { 
     168        .name                   = "ixp4xx_eth", 
     169        .id                     = IXP4XX_ETH_NPEC, 
     170        .dev.platform_data      = &avila_npec_data, 
     171}; 
     172 
    136173static struct platform_device *avila_devices[] __initdata = { 
    137174        &avila_i2c_gpio, 
    138175        &avila_flash, 
    139176        &avila_uart 
    140177}; 
    141178 
     179static void __init avila_gw23xx_setup(void) 
     180{ 
     181        platform_device_register(&avila_npeb_device); 
     182        platform_device_register(&avila_npec_device); 
     183} 
     184 
     185static void __init avila_gw2342_setup(void) 
     186{ 
     187        platform_device_register(&avila_npeb_device); 
     188        platform_device_register(&avila_npec_device); 
     189} 
     190 
     191static void __init avila_gw2345_setup(void) 
     192{ 
     193        avila_npeb_data.phy = IXP4XX_ETH_PHY_MAX_ADDR; 
     194        avila_npeb_data.phy_mask = 0x1e; /* ports 1-4 of the KS8995 switch */ 
     195        platform_device_register(&avila_npeb_device); 
     196 
     197        avila_npec_data.phy = 5; /* port 5 of the KS8995 switch */ 
     198        platform_device_register(&avila_npec_device); 
     199} 
     200 
     201static void __init avila_gw2347_setup(void) 
     202{ 
     203        platform_device_register(&avila_npeb_device); 
     204} 
     205 
     206static void __init avila_gw2348_setup(void) 
     207{ 
     208        platform_device_register(&avila_npeb_device); 
     209        platform_device_register(&avila_npec_device); 
     210} 
     211 
     212static void __init avila_gw2353_setup(void) 
     213{ 
     214        platform_device_register(&avila_npeb_device); 
     215} 
     216 
     217static void __init avila_gw2355_setup(void) 
     218{ 
     219        avila_npeb_data.phy = IXP4XX_ETH_PHY_MAX_ADDR; 
     220        avila_npeb_data.phy_mask = 0x1e; /* ports 1-4 of the KS8995 switch */ 
     221        platform_device_register(&avila_npeb_device); 
     222 
     223        avila_npec_data.phy = 16; 
     224        platform_device_register(&avila_npec_device); 
     225} 
     226 
     227static void __init avila_gw2357_setup(void) 
     228{ 
     229        platform_device_register(&avila_npeb_device); 
     230} 
     231 
     232static struct avila_board_info avila_boards[] __initdata = { 
     233        { 
     234                .model          = "GW2342", 
     235                .setup          = avila_gw2342_setup, 
     236        }, { 
     237                .model          = "GW2345", 
     238                .setup          = avila_gw2345_setup, 
     239        }, { 
     240                .model          = "GW2347", 
     241                .setup          = avila_gw2347_setup, 
     242        }, { 
     243                .model          = "GW2348", 
     244                .setup          = avila_gw2348_setup, 
     245        }, { 
     246                .model          = "GW2353", 
     247                .setup          = avila_gw2353_setup, 
     248        }, { 
     249                .model          = "GW2355", 
     250                .setup          = avila_gw2355_setup, 
     251        }, { 
     252                .model          = "GW2357", 
     253                .setup          = avila_gw2357_setup, 
     254        } 
     255}; 
     256 
     257static struct avila_board_info * __init avila_find_board_info(char *model) 
     258{ 
     259        int i; 
     260        model[6] = '\0'; 
     261 
     262        for (i = 0; i < ARRAY_SIZE(avila_boards); i++) { 
     263                struct avila_board_info *info = &avila_boards[i]; 
     264                if (strcmp(info->model, model) == 0) 
     265                        return info; 
     266        } 
     267 
     268        return NULL; 
     269} 
     270 
     271static struct memory_accessor *at24_mem_acc; 
     272 
     273static void at24_setup(struct memory_accessor *mem_acc, void *context) 
     274{ 
     275        char mac_addr[ETH_ALEN]; 
     276        char model[7]; 
     277 
     278        at24_mem_acc = mem_acc; 
     279 
     280        /* Read MAC addresses */ 
     281        if (at24_mem_acc->read(at24_mem_acc, mac_addr, 0x0, 6) == 6) { 
     282                memcpy(&avila_npeb_data.hwaddr, mac_addr, ETH_ALEN); 
     283        } 
     284        if (at24_mem_acc->read(at24_mem_acc, mac_addr, 0x6, 6) == 6) { 
     285                memcpy(&avila_npec_data.hwaddr, mac_addr, ETH_ALEN); 
     286        } 
     287 
     288        /* Read the first 6 bytes of the model number */ 
     289        if (at24_mem_acc->read(at24_mem_acc, model, 0x20, 6) == 6) { 
     290                avila_info = avila_find_board_info(model); 
     291        } 
     292 
     293} 
     294 
     295static struct at24_platform_data avila_eeprom_info = { 
     296        .byte_len       = 1024, 
     297        .page_size      = 16, 
     298        .flags          = AT24_FLAG_READONLY, 
     299        .setup          = at24_setup, 
     300}; 
     301 
     302static struct i2c_board_info __initdata avila_i2c_board_info[] = { 
     303        { 
     304                I2C_BOARD_INFO("ds1672", 0x68), 
     305        }, 
     306        { 
     307                I2C_BOARD_INFO("ad7418", 0x28), 
     308        }, 
     309        { 
     310                I2C_BOARD_INFO("24c08", 0x51), 
     311                .platform_data  = &avila_eeprom_info 
     312        }, 
     313}; 
     314 
    142315static void __init avila_init(void) 
    143316{ 
    144317        ixp4xx_sys_init(); 
    145318 
     319        /* 
     320         * These devices are present on all Avila models and don't need any 
     321         * model specific setup. 
     322         */ 
    146323        avila_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); 
    147324        avila_flash_resource.end = 
    148325                IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; 
    static void __init avila_init(void) 
    160337 
    161338        platform_device_register(&avila_pata); 
    162339 
     340                i2c_register_board_info(0, avila_i2c_board_info, 
     341                                ARRAY_SIZE(avila_i2c_board_info)); 
     342} 
     343 
     344static int __init avila_model_setup(void) 
     345{ 
     346        if (!machine_is_avila()) 
     347                return 0; 
     348 
     349        if (avila_info) { 
     350                printk(KERN_DEBUG "Running on Gateworks Avila %s\n", 
     351                                                        avila_info->model); 
     352                avila_info->setup(); 
     353        } else { 
     354                printk(KERN_INFO "Unknown/missing Avila model number" 
     355                                                " -- defaults will be used\n"); 
     356                avila_gw23xx_setup(); 
     357        } 
     358 
     359        return 0; 
    163360} 
     361late_initcall(avila_model_setup); 
    164362 
    165363MACHINE_START(AVILA, "Gateworks Avila Network Platform") 
    166364        /* Maintainer: Deepak Saxena <dsaxena@plexity.net> */ 
Note: See TracBrowser for help on using the repository browser.