source: trunk/target/linux/ixp4xx/patches-3.3/185-mi424wr_support.patch @ 31275

Last change on this file since 31275 was 31275, checked in by nbd, 5 years ago

ixp4xx: add support for linux 3.3.1

File size: 12.1 KB
  • new file arch/arm/mach-ixp4xx/mi424wr-pci.c

    - +  
     1/* 
     2 * arch/arm/mach-ixp4xx/mi424wr-pci.c 
     3 * 
     4 * Actiontec MI424WR board-level PCI initialization 
     5 * 
     6 * Copyright (C) 2008 Jose Vasconcellos 
     7 * 
     8 * Maintainer: Jose Vasconcellos <jvasco@verizon.net> 
     9 * 
     10 * This program is free software; you can redistribute it and/or modify 
     11 * it under the terms of the GNU General Public License version 2 as 
     12 * published by the Free Software Foundation. 
     13 * 
     14 */ 
     15 
     16#include <linux/kernel.h> 
     17#include <linux/pci.h> 
     18#include <linux/init.h> 
     19#include <linux/irq.h> 
     20 
     21#include <asm/mach-types.h> 
     22#include <asm/mach/pci.h> 
     23 
     24/* PCI controller GPIO to IRQ pin mappings 
     25 * This information was obtained from Actiontec's GPL release. 
     26 * 
     27 *              INTA            INTB 
     28 * SLOT 13      8               6 
     29 * SLOT 14      7               8 
     30 * SLOT 15      6               7 
     31 */ 
     32 
     33void __init mi424wr_pci_preinit(void) 
     34{ 
     35        irq_set_irq_type(IRQ_IXP4XX_GPIO6, IRQ_TYPE_LEVEL_LOW); 
     36        irq_set_irq_type(IRQ_IXP4XX_GPIO7, IRQ_TYPE_LEVEL_LOW); 
     37        irq_set_irq_type(IRQ_IXP4XX_GPIO8, IRQ_TYPE_LEVEL_LOW); 
     38 
     39        ixp4xx_pci_preinit(); 
     40} 
     41 
     42static int __init mi424wr_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) 
     43{ 
     44        if (slot == 13) 
     45                return IRQ_IXP4XX_GPIO8; 
     46        if (slot == 14) 
     47                return IRQ_IXP4XX_GPIO7; 
     48        if (slot == 15) 
     49                return IRQ_IXP4XX_GPIO6; 
     50 
     51        return -1; 
     52} 
     53 
     54struct hw_pci mi424wr_pci __initdata = { 
     55        .nr_controllers = 1, 
     56        .preinit        = mi424wr_pci_preinit, 
     57        .swizzle        = pci_std_swizzle, 
     58        .setup          = ixp4xx_setup, 
     59        .scan           = ixp4xx_scan_bus, 
     60        .map_irq        = mi424wr_map_irq, 
     61}; 
     62 
     63int __init mi424wr_pci_init(void) 
     64{ 
     65        if (machine_is_mi424wr()) 
     66                pci_common_init(&mi424wr_pci); 
     67        return 0; 
     68} 
     69 
     70subsys_initcall(mi424wr_pci_init); 
     71 
  • new file arch/arm/mach-ixp4xx/mi424wr-setup.c

    - +  
     1/* 
     2 * arch/arm/mach-ixp4xx/mi424wr-setup.c 
     3 * 
     4 * Actiontec MI424-WR board setup 
     5 * Copyright (c) 2008 Jose Vasconcellos 
     6 * 
     7 * Based on Gemtek GTWX5715 by 
     8 * Copyright (C) 2004 George T. Joseph 
     9 * Derived from Coyote 
     10 * 
     11 * This program is free software; you can redistribute it and/or 
     12 * modify it under the terms of the GNU General Public License 
     13 * as published by the Free Software Foundation; either version 2 
     14 * of the License, or (at your option) any later version. 
     15 * 
     16 * This program is distributed in the hope that it will be useful, 
     17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
     18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
     19 * GNU General Public License for more details. 
     20 * 
     21 * You should have received a copy of the GNU General Public License 
     22 * along with this program; if not, write to the Free Software 
     23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
     24 * 
     25 */ 
     26 
     27#include <linux/init.h> 
     28#include <linux/device.h> 
     29#include <linux/serial.h> 
     30#include <linux/serial_8250.h> 
     31#include <linux/types.h> 
     32#include <linux/memory.h> 
     33#include <linux/leds.h> 
     34#include <linux/spi/spi_gpio_old.h> 
     35 
     36#include <asm/setup.h> 
     37#include <asm/irq.h> 
     38#include <asm/io.h> 
     39#include <asm/mach-types.h> 
     40#include <asm/mach/arch.h> 
     41#include <asm/mach/flash.h> 
     42 
     43/* 
     44 * GPIO 2,3,4 and 9 are hard wired to the Micrel/Kendin KS8995M Switch 
     45 * and operate as an SPI type interface.  The details of the interface 
     46 * are available on Kendin/Micrel's web site. 
     47 */ 
     48 
     49#define MI424WR_KSSPI_SELECT            9 
     50#define MI424WR_KSSPI_TXD               4 
     51#define MI424WR_KSSPI_CLOCK             2 
     52#define MI424WR_KSSPI_RXD               3 
     53 
     54/* 
     55 * The "reset" button is wired to GPIO 10. 
     56 * The GPIO is brought "low" when the button is pushed. 
     57 */ 
     58 
     59#define MI424WR_BUTTON_GPIO     10 
     60#define MI424WR_BUTTON_IRQ      IRQ_IXP4XX_GPIO10 
     61 
     62#define MI424WR_MOCA_WAN_LED    11 
     63 
     64/* Latch on CS1 - taken from Actiontec's 2.4 source code 
     65 *  
     66 * default latch value 
     67 * 0  - power alarm led (red)           0 (off) 
     68 * 1  - power led (green)               0 (off) 
     69 * 2  - wireless led    (green)         1 (off) 
     70 * 3  - no internet led (red)           0 (off) 
     71 * 4  - internet ok led (green)         0 (off) 
     72 * 5  - moca LAN                        0 (off) 
     73 * 6  - WAN alarm led (red)             0 (off) 
     74 * 7  - PCI reset                       1 (not reset) 
     75 * 8  - IP phone 1 led (green)          1 (off) 
     76 * 9  - IP phone 2 led (green)          1 (off) 
     77 * 10 - VOIP ready led (green)          1 (off) 
     78 * 11 - PSTN relay 1 control            0 (PSTN) 
     79 * 12 - PSTN relay 1 control            0 (PSTN) 
     80 * 13 - N/A 
     81 * 14 - N/A 
     82 * 15 - N/A 
     83 */ 
     84 
     85#define MI424WR_LATCH_MASK              0x04 
     86#define MI424WR_LATCH_DEFAULT           0x1f86 
     87 
     88#define MI424WR_LATCH_ALARM_LED         0x00 
     89#define MI424WR_LATCH_POWER_LED         0x01 
     90#define MI424WR_LATCH_WIRELESS_LED      0x02 
     91#define MI424WR_LATCH_INET_DOWN_LED     0x03 
     92#define MI424WR_LATCH_INET_OK_LED       0x04 
     93#define MI424WR_LATCH_MOCA_LAN_LED      0x05 
     94#define MI424WR_LATCH_WAN_ALARM_LED     0x06 
     95#define MI424WR_LATCH_PCI_RESET         0x07 
     96#define MI424WR_LATCH_PHONE1_LED        0x08 
     97#define MI424WR_LATCH_PHONE2_LED        0x09 
     98#define MI424WR_LATCH_VOIP_LED          0x10 
     99#define MI424WR_LATCH_PSTN_RELAY1       0x11 
     100#define MI424WR_LATCH_PSTN_RELAY2       0x12 
     101 
     102/* initialize CS1 to default timings, Intel style, 16-bit bus */ 
     103#define MI424WR_CS1_CONFIG      0x80000002 
     104 
     105/* Define both UARTs but they are not easily accessible. 
     106 */ 
     107 
     108static struct resource mi424wr_uart_resources[] = { 
     109        { 
     110                .start  = IXP4XX_UART1_BASE_PHYS, 
     111                .end    = IXP4XX_UART1_BASE_PHYS + 0x0fff, 
     112                .flags  = IORESOURCE_MEM, 
     113        }, 
     114        { 
     115                .start  = IXP4XX_UART2_BASE_PHYS, 
     116                .end    = IXP4XX_UART2_BASE_PHYS + 0x0fff, 
     117                .flags  = IORESOURCE_MEM, 
     118        } 
     119}; 
     120 
     121 
     122static struct plat_serial8250_port mi424wr_uart_platform_data[] = { 
     123        { 
     124                .mapbase        = IXP4XX_UART1_BASE_PHYS, 
     125                .membase        = (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET, 
     126                .irq            = IRQ_IXP4XX_UART1, 
     127                .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, 
     128                .iotype         = UPIO_MEM, 
     129                .regshift       = 2, 
     130                .uartclk        = IXP4XX_UART_XTAL, 
     131        }, 
     132        { 
     133                .mapbase        = IXP4XX_UART2_BASE_PHYS, 
     134                .membase        = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET, 
     135                .irq            = IRQ_IXP4XX_UART2, 
     136                .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, 
     137                .iotype         = UPIO_MEM, 
     138                .regshift       = 2, 
     139                .uartclk        = IXP4XX_UART_XTAL, 
     140        }, 
     141        { }, 
     142}; 
     143 
     144static struct platform_device mi424wr_uart_device = { 
     145        .name           = "serial8250", 
     146        .id             = PLAT8250_DEV_PLATFORM, 
     147        .dev.platform_data      = mi424wr_uart_platform_data, 
     148        .num_resources  = ARRAY_SIZE(mi424wr_uart_resources), 
     149        .resource       = mi424wr_uart_resources, 
     150}; 
     151 
     152static struct flash_platform_data mi424wr_flash_data = { 
     153        .map_name       = "cfi_probe", 
     154        .width          = 2, 
     155}; 
     156 
     157static struct resource mi424wr_flash_resource = { 
     158        .flags          = IORESOURCE_MEM, 
     159}; 
     160 
     161static struct platform_device mi424wr_flash = { 
     162        .name           = "IXP4XX-Flash", 
     163        .id             = 0, 
     164        .dev.platform_data = &mi424wr_flash_data, 
     165        .num_resources  = 1, 
     166        .resource       = &mi424wr_flash_resource, 
     167}; 
     168 
     169static int mi424wr_spi_boardinfo_setup(struct spi_board_info *bi, 
     170                struct spi_master *master, void *data) 
     171{ 
     172 
     173        strlcpy(bi->modalias, "spi-ks8995", sizeof(bi->modalias)); 
     174 
     175        bi->max_speed_hz = 5000000 /* Hz */; 
     176        bi->bus_num = master->bus_num; 
     177        bi->mode = SPI_MODE_0; 
     178 
     179        return 0; 
     180} 
     181 
     182static struct spi_gpio_platform_data mi424wr_spi_bus_data = { 
     183        .pin_cs                 = MI424WR_KSSPI_SELECT, 
     184        .pin_clk                = MI424WR_KSSPI_CLOCK, 
     185        .pin_miso               = MI424WR_KSSPI_RXD, 
     186        .pin_mosi               = MI424WR_KSSPI_TXD, 
     187        .cs_activelow           = 1, 
     188        .no_spi_delay           = 1, 
     189        .boardinfo_setup        = mi424wr_spi_boardinfo_setup, 
     190}; 
     191 
     192static struct gpio_led mi424wr_gpio_led[] = { 
     193        { 
     194                .name           = "moca-wan",   /* green led */ 
     195                .gpio           = MI424WR_MOCA_WAN_LED, 
     196                .active_low     = 0, 
     197        } 
     198}; 
     199 
     200static struct gpio_led_platform_data mi424wr_gpio_leds_data = { 
     201        .num_leds       = 1, 
     202        .leds           = mi424wr_gpio_led, 
     203}; 
     204 
     205static struct platform_device mi424wr_gpio_leds = { 
     206        .name           = "leds-gpio", 
     207        .id             = -1, 
     208        .dev.platform_data = &mi424wr_gpio_leds_data, 
     209}; 
     210 
     211static uint16_t latch_value = MI424WR_LATCH_DEFAULT; 
     212static uint16_t __iomem *iobase; 
     213 
     214static void mi424wr_latch_set_led(u8 bit, enum led_brightness value) 
     215{ 
     216 
     217        if (((MI424WR_LATCH_MASK >> bit) & 1) ^ (value == LED_OFF)) 
     218                latch_value &= ~(0x1 << bit); 
     219        else 
     220                latch_value |= (0x1 << bit); 
     221 
     222        __raw_writew(latch_value, iobase); 
     223 
     224} 
     225 
     226static struct latch_led mi424wr_latch_led[] = { 
     227        { 
     228                .name   = "power-alarm", 
     229                .bit    = MI424WR_LATCH_ALARM_LED, 
     230        }, 
     231        { 
     232                .name   = "power-ok", 
     233                .bit    = MI424WR_LATCH_POWER_LED, 
     234        }, 
     235        { 
     236                .name   = "wireless",   /* green led */ 
     237                .bit    = MI424WR_LATCH_WIRELESS_LED, 
     238        }, 
     239        { 
     240                .name   = "inet-down",  /* red led */ 
     241                .bit    = MI424WR_LATCH_INET_DOWN_LED, 
     242        }, 
     243        { 
     244                .name   = "inet-up",    /* green led */ 
     245                .bit    = MI424WR_LATCH_INET_OK_LED, 
     246        }, 
     247        { 
     248                .name   = "moca-lan",   /* green led */ 
     249                .bit    = MI424WR_LATCH_MOCA_LAN_LED, 
     250        }, 
     251        { 
     252                .name   = "wan-alarm",  /* red led */ 
     253                .bit    = MI424WR_LATCH_WAN_ALARM_LED, 
     254        } 
     255}; 
     256 
     257static struct latch_led_platform_data mi424wr_latch_leds_data = { 
     258        .num_leds       = ARRAY_SIZE(mi424wr_latch_led), 
     259        .mem            = 0x51000000, 
     260        .leds           = mi424wr_latch_led, 
     261        .set_led        = mi424wr_latch_set_led, 
     262}; 
     263 
     264static struct platform_device mi424wr_latch_leds = { 
     265        .name           = "leds-latch", 
     266        .id             = -1, 
     267        .dev.platform_data = &mi424wr_latch_leds_data, 
     268}; 
     269 
     270static struct platform_device mi424wr_spi_bus = { 
     271        .name           = "spi-gpio", 
     272        .id             = 0, 
     273        .dev.platform_data = &mi424wr_spi_bus_data, 
     274}; 
     275 
     276static struct eth_plat_info mi424wr_npeb_data = { 
     277        .phy            = 17,   /* KS8721 */ 
     278        .rxq            = 3, 
     279        .txreadyq       = 20, 
     280}; 
     281 
     282static struct eth_plat_info mi424wr_npec_data = { 
     283        .phy            = IXP4XX_ETH_PHY_MAX_ADDR, 
     284        .phy_mask       = 0x1e, /* ports 1-4 of the KS8995 switch */ 
     285        .rxq            = 4, 
     286        .txreadyq       = 21, 
     287}; 
     288 
     289static struct platform_device mi424wr_npe_devices[] = { 
     290        { 
     291                .name                   = "ixp4xx_eth", 
     292                .id                     = IXP4XX_ETH_NPEC, 
     293                .dev.platform_data      = &mi424wr_npec_data, 
     294        }, { 
     295                .name                   = "ixp4xx_eth", 
     296                .id                     = IXP4XX_ETH_NPEB, 
     297                .dev.platform_data      = &mi424wr_npeb_data, 
     298        } 
     299}; 
     300 
     301static struct platform_device *mi424wr_devices[] __initdata = { 
     302        &mi424wr_uart_device, 
     303        &mi424wr_flash, 
     304        &mi424wr_gpio_leds, 
     305        &mi424wr_latch_leds, 
     306        &mi424wr_spi_bus, 
     307        &mi424wr_npe_devices[0], 
     308        &mi424wr_npe_devices[1], 
     309}; 
     310 
     311static void __init mi424wr_init(void) 
     312{ 
     313        ixp4xx_sys_init(); 
     314 
     315        mi424wr_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); 
     316        mi424wr_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_8M - 1; 
     317 
     318        *IXP4XX_EXP_CS0 |= IXP4XX_FLASH_WRITABLE; 
     319        *IXP4XX_EXP_CS1 = MI424WR_CS1_CONFIG; 
     320 
     321        /* configure button as input 
     322         */ 
     323        gpio_line_config(MI424WR_BUTTON_GPIO, IXP4XX_GPIO_IN); 
     324 
     325        /* Initialize LEDs and enables PCI bus. 
     326         */ 
     327        iobase = ioremap_nocache(IXP4XX_EXP_BUS_BASE(1), 0x1000); 
     328        __raw_writew(latch_value, iobase); 
     329 
     330        platform_add_devices(mi424wr_devices, ARRAY_SIZE(mi424wr_devices)); 
     331} 
     332 
     333 
     334MACHINE_START(MI424WR, "Actiontec MI424WR") 
     335        /* Maintainer: Jose Vasconcellos */ 
     336        .map_io         = ixp4xx_map_io, 
     337        .init_irq       = ixp4xx_init_irq, 
     338        .timer          = &ixp4xx_timer, 
     339        .atag_offset    = 0x0100, 
     340        .init_machine   = mi424wr_init, 
     341#if defined(CONFIG_PCI) 
     342        .dma_zone_size  = SZ_64M, 
     343#endif 
     344MACHINE_END 
     345 
  • arch/arm/mach-ixp4xx/Makefile

    a b obj-pci-$(CONFIG_MACH_COMPEX) += ixdp42 
    2525obj-pci-$(CONFIG_MACH_WRT300NV2)                += wrt300nv2-pci.o 
    2626obj-pci-$(CONFIG_MACH_AP1000)           += ixdp425-pci.o 
    2727obj-pci-$(CONFIG_MACH_TW5334)           += tw5334-pci.o 
     28obj-pci-$(CONFIG_MACH_MI424WR)          += mi424wr-pci.o 
    2829 
    2930obj-y   += common.o 
    3031 
    obj-$(CONFIG_MACH_COMPEX) += compex-setu 
    5152obj-$(CONFIG_MACH_WRT300NV2)    += wrt300nv2-setup.o 
    5253obj-$(CONFIG_MACH_AP1000)       += ap1000-setup.o 
    5354obj-$(CONFIG_MACH_TW5334)       += tw5334-setup.o 
     55obj-$(CONFIG_MACH_MI424WR)      += mi424wr-setup.o 
    5456 
    5557obj-$(CONFIG_PCI)               += $(obj-pci-$(CONFIG_PCI)) common-pci.o 
    5658obj-$(CONFIG_IXP4XX_QMGR)       += ixp4xx_qmgr.o 
  • arch/arm/mach-ixp4xx/Kconfig

    a b config MACH_MIC256 
    262262          Say 'Y' here if you want your kernel to support the MIC256 
    263263          board from OMICRON electronics GmbH. 
    264264 
     265config MACH_MI424WR 
     266        bool "Actiontec MI424WR" 
     267        depends on ARCH_IXP4XX 
     268        select PCI 
     269        help 
     270                Add support for the Actiontec MI424-WR. 
     271 
    265272comment "IXP4xx Options" 
    266273 
    267274config IXP4XX_INDIRECT_PCI 
  • arch/arm/configs/ixp4xx_defconfig

    a b CONFIG_MACH_NAS100D=y 
    2626CONFIG_MACH_DSMG600=y 
    2727CONFIG_MACH_FSG=y 
    2828CONFIG_MACH_GTWX5715=y 
     29CONFIG_MACH_MI424WR=y 
    2930CONFIG_IXP4XX_QMGR=y 
    3031CONFIG_IXP4XX_NPE=y 
    3132# CONFIG_ARM_THUMB is not set 
Note: See TracBrowser for help on using the repository browser.