static void __init nslu2_init(void) { uint8_t __iomem *f; int i; ixp4xx_sys_init(); nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); nslu2_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; i2c_register_board_info(0, nslu2_i2c_board_info, ARRAY_SIZE(nslu2_i2c_board_info)); /* * This is only useful on a modified machine, but it is valuable * to have it first in order to see debug messages, and so that * it does *not* get removed if platform_add_devices fails! */ (void)platform_device_register(&nslu2_uart); platform_add_devices(nslu2_devices, ARRAY_SIZE(nslu2_devices)); pm_power_off = nslu2_power_off; if (request_irq(gpio_to_irq(NSLU2_RB_GPIO), &nslu2_reset_handler, IRQF_DISABLED | IRQF_TRIGGER_LOW, "NSLU2 reset button", NULL) < 0) { printk(KERN_DEBUG "Reset Button IRQ %d not available\n", gpio_to_irq(NSLU2_RB_GPIO)); } if (request_irq(gpio_to_irq(NSLU2_PB_GPIO), &nslu2_power_handler, IRQF_DISABLED | IRQF_TRIGGER_HIGH, "NSLU2 power button", NULL) < 0) { printk(KERN_DEBUG "Power Button IRQ %d not available\n", gpio_to_irq(NSLU2_PB_GPIO)); } /* * Map in a portion of the flash and read the MAC address. * Since it is stored in BE in the flash itself, we need to * byteswap it if we're in LE mode. */ f = ioremap(IXP4XX_EXP_BUS_BASE(0), 0x40000); if (f) { for (i = 0; i < 6; i++) #ifdef __ARMEB__ nslu2_plat_eth[0].hwaddr[i] = readb(f + 0x3FFB0 + i); #else nslu2_plat_eth[0].hwaddr[i] = readb(f + 0x3FFB0 + (i^3)); #endif iounmap(f); } printk(KERN_INFO "NSLU2: Using MAC address %pM for port 0\n", nslu2_plat_eth[0].hwaddr); }
static void __init ixdp425_init(void) { ixp4xx_sys_init(); ixdp425_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); ixdp425_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; #if defined(CONFIG_MTD_NAND_PLATFORM) || \ defined(CONFIG_MTD_NAND_PLATFORM_MODULE) ixdp425_flash_nand_resource.start = IXP4XX_EXP_BUS_BASE(3), ixdp425_flash_nand_resource.end = IXP4XX_EXP_BUS_BASE(3) + 0x10 - 1; gpio_line_config(IXDP425_NAND_NCE_PIN, IXP4XX_GPIO_OUT); /* Configure expansion bus for NAND Flash */ *IXP4XX_EXP_CS3 = IXP4XX_EXP_BUS_CS_EN | IXP4XX_EXP_BUS_STROBE_T(1) | /* extend by 1 clock */ IXP4XX_EXP_BUS_CYCLES(0) | /* Intel cycles */ IXP4XX_EXP_BUS_SIZE(0) | /* 512bytes addr space*/ IXP4XX_EXP_BUS_WR_EN | IXP4XX_EXP_BUS_BYTE_EN; /* 8 bit data bus */ #endif if (cpu_is_ixp43x()) { ixdp425_uart.num_resources = 1; ixdp425_uart_data[1].flags = 0; } platform_add_devices(ixdp425_devices, ARRAY_SIZE(ixdp425_devices)); }
static void __init nslu2_init(void) { uint8_t __iomem *f; int i; ixp4xx_sys_init(); nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); nslu2_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; i2c_register_board_info(0, nslu2_i2c_board_info, ARRAY_SIZE(nslu2_i2c_board_info)); /* */ (void)platform_device_register(&nslu2_uart); platform_add_devices(nslu2_devices, ARRAY_SIZE(nslu2_devices)); pm_power_off = nslu2_power_off; if (request_irq(gpio_to_irq(NSLU2_RB_GPIO), &nslu2_reset_handler, IRQF_DISABLED | IRQF_TRIGGER_LOW, "NSLU2 reset button", NULL) < 0) { printk(KERN_DEBUG "Reset Button IRQ %d not available\n", gpio_to_irq(NSLU2_RB_GPIO)); } if (request_irq(gpio_to_irq(NSLU2_PB_GPIO), &nslu2_power_handler, IRQF_DISABLED | IRQF_TRIGGER_HIGH, "NSLU2 power button", NULL) < 0) { printk(KERN_DEBUG "Power Button IRQ %d not available\n", gpio_to_irq(NSLU2_PB_GPIO)); } /* */ f = ioremap(IXP4XX_EXP_BUS_BASE(0), 0x40000); if (f) { for (i = 0; i < 6; i++) #ifdef __ARMEB__ nslu2_plat_eth[0].hwaddr[i] = readb(f + 0x3FFB0 + i); #else nslu2_plat_eth[0].hwaddr[i] = readb(f + 0x3FFB0 + (i^3)); #endif iounmap(f); } printk(KERN_INFO "NSLU2: Using MAC address %pM for port 0\n", nslu2_plat_eth[0].hwaddr); }
static void __init nslu2_init(void) { ixp4xx_sys_init(); pm_power_off = n2_power_off; platform_add_devices(nslu2_devices, ARRAY_SIZE(nslu2_devices)); }
static void __init gtwx5715_init(void) { ixp4xx_sys_init(); gtwx5715_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); gtwx5715_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_8M - 1; platform_add_devices(gtwx5715_devices, ARRAY_SIZE(gtwx5715_devices)); }
static void __init avila_init(void) { ixp4xx_sys_init(); avila_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); avila_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; platform_add_devices(avila_devices, ARRAY_SIZE(avila_devices)); }
static void __init gtwx5715_init(void) { ixp4xx_sys_init(); if (!flash_resource) printk(KERN_ERR "Could not allocate flash resource\n"); gtwx5715_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); gtwx5715_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_8M - 1; platform_add_devices(gtwx5715_devices, ARRAY_SIZE(gtwx5715_devices)); }
static void __init gateway7001_init(void) { ixp4xx_sys_init(); gateway7001_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); gateway7001_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_32M - 1; *IXP4XX_EXP_CS0 |= IXP4XX_FLASH_WRITABLE; *IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0; platform_add_devices(gateway7001_devices, ARRAY_SIZE(gateway7001_devices)); }
static void __init nslu2_init(void) { ixp4xx_sys_init(); nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); nslu2_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; pm_power_off = nslu2_power_off; platform_add_devices(nslu2_devices, ARRAY_SIZE(nslu2_devices)); }
static void __init ixdp425_init(void) { ixp4xx_sys_init(); /* * IXP465 has 32MB window */ if (machine_is_ixdp465()) { ixdp425_flash_resource.end += IXDP425_FLASH_SIZE; } platform_add_devices(ixdp425_devices, ARRAY_SIZE(ixdp425_devices)); }
static void __init vulcan_init(void) { ixp4xx_sys_init(); vulcan_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); vulcan_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_32M - 1; *IXP4XX_EXP_CS0 = IXP4XX_EXP_BUS_CS_EN | IXP4XX_EXP_BUS_STROBE_T(3) | IXP4XX_EXP_BUS_SIZE(0xF) | IXP4XX_EXP_BUS_BYTE_RD16 | IXP4XX_EXP_BUS_WR_EN; *IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0; vulcan_sram_resource.start = IXP4XX_EXP_BUS_BASE(2); vulcan_sram_resource.end = IXP4XX_EXP_BUS_BASE(2) + SZ_256K - 1; *IXP4XX_EXP_CS2 = IXP4XX_EXP_BUS_CS_EN | IXP4XX_EXP_BUS_STROBE_T(1) | IXP4XX_EXP_BUS_HOLD_T(2) | IXP4XX_EXP_BUS_SIZE(9) | IXP4XX_EXP_BUS_SPLT_EN | IXP4XX_EXP_BUS_WR_EN | IXP4XX_EXP_BUS_BYTE_EN; vulcan_uart_resources[2].start = IXP4XX_EXP_BUS_BASE(3); vulcan_uart_resources[2].end = IXP4XX_EXP_BUS_BASE(3) + 16 - 1; vulcan_uart_data[2].mapbase = vulcan_uart_resources[2].start; vulcan_uart_data[3].mapbase = vulcan_uart_data[2].mapbase + 8; *IXP4XX_EXP_CS3 = IXP4XX_EXP_BUS_CS_EN | IXP4XX_EXP_BUS_STROBE_T(3) | IXP4XX_EXP_BUS_CYCLES(IXP4XX_EXP_BUS_CYCLES_MOTOROLA)| IXP4XX_EXP_BUS_WR_EN | IXP4XX_EXP_BUS_BYTE_EN; *IXP4XX_EXP_CS4 = IXP4XX_EXP_BUS_CS_EN | IXP4XX_EXP_BUS_WR_EN | IXP4XX_EXP_BUS_BYTE_EN; vulcan_max6369_resource.start = IXP4XX_EXP_BUS_BASE(5); vulcan_max6369_resource.end = IXP4XX_EXP_BUS_BASE(5); *IXP4XX_EXP_CS5 = IXP4XX_EXP_BUS_CS_EN | IXP4XX_EXP_BUS_WR_EN | IXP4XX_EXP_BUS_BYTE_EN; platform_add_devices(vulcan_devices, ARRAY_SIZE(vulcan_devices)); }
static void __init vulcan_init(void) { ixp4xx_sys_init(); /* Flash is spread over both CS0 and CS1 */ vulcan_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); vulcan_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_32M - 1; *IXP4XX_EXP_CS0 = IXP4XX_EXP_BUS_CS_EN | IXP4XX_EXP_BUS_STROBE_T(3) | IXP4XX_EXP_BUS_SIZE(0xF) | IXP4XX_EXP_BUS_BYTE_RD16 | IXP4XX_EXP_BUS_WR_EN; *IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0; /* SRAM on CS2, (256kB, 8bit, writable) */ vulcan_sram_resource.start = IXP4XX_EXP_BUS_BASE(2); vulcan_sram_resource.end = IXP4XX_EXP_BUS_BASE(2) + SZ_256K - 1; *IXP4XX_EXP_CS2 = IXP4XX_EXP_BUS_CS_EN | IXP4XX_EXP_BUS_STROBE_T(1) | IXP4XX_EXP_BUS_HOLD_T(2) | IXP4XX_EXP_BUS_SIZE(9) | IXP4XX_EXP_BUS_SPLT_EN | IXP4XX_EXP_BUS_WR_EN | IXP4XX_EXP_BUS_BYTE_EN; /* XR16L2551 on CS3 (Moto style, 512 bytes, 8bits, writable) */ vulcan_uart_resources[2].start = IXP4XX_EXP_BUS_BASE(3); vulcan_uart_resources[2].end = IXP4XX_EXP_BUS_BASE(3) + 16 - 1; vulcan_uart_data[2].mapbase = vulcan_uart_resources[2].start; vulcan_uart_data[3].mapbase = vulcan_uart_data[2].mapbase + 8; *IXP4XX_EXP_CS3 = IXP4XX_EXP_BUS_CS_EN | IXP4XX_EXP_BUS_STROBE_T(3) | IXP4XX_EXP_BUS_CYCLES(IXP4XX_EXP_BUS_CYCLES_MOTOROLA)| IXP4XX_EXP_BUS_WR_EN | IXP4XX_EXP_BUS_BYTE_EN; /* GPIOS on CS4 (512 bytes, 8bits, writable) */ *IXP4XX_EXP_CS4 = IXP4XX_EXP_BUS_CS_EN | IXP4XX_EXP_BUS_WR_EN | IXP4XX_EXP_BUS_BYTE_EN; /* max6369 on CS5 (512 bytes, 8bits, writable) */ vulcan_max6369_resource.start = IXP4XX_EXP_BUS_BASE(5); vulcan_max6369_resource.end = IXP4XX_EXP_BUS_BASE(5); *IXP4XX_EXP_CS5 = IXP4XX_EXP_BUS_CS_EN | IXP4XX_EXP_BUS_WR_EN | IXP4XX_EXP_BUS_BYTE_EN; platform_add_devices(vulcan_devices, ARRAY_SIZE(vulcan_devices)); }
static void __init ixdp425_init(void) { ixp4xx_sys_init(); ixdp425_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); ixdp425_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; platform_add_devices(ixdp425_devices, ARRAY_SIZE(ixdp425_devices)); #ifdef CONFIG_KGDB_8250 kgdb8250_add_port(0, &ixdp425_serial_ports[0]); kgdb8250_add_port(1, &ixdp425_serial_ports[1]); #endif }
static void __init coyote_init(void) { *IXP4XX_EXP_CS0 |= IXP4XX_FLASH_WRITABLE; *IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0; if (machine_is_ixdpg425()) { coyote_uart_data.membase = (char*)(IXP4XX_UART1_BASE_VIRT + REG_OFFSET); coyote_uart_data.mapbase = IXP4XX_UART1_BASE_PHYS; coyote_uart_data.irq = IRQ_IXP4XX_UART1; } ixp4xx_sys_init(); platform_add_devices(coyote_devices, ARRAY_SIZE(coyote_devices)); }
static void __init dsmg600_init(void) { ixp4xx_sys_init(); /* Make sure that GPIO14 and GPIO15 are not used as clocks */ *IXP4XX_GPIO_GPCLKR = 0; dsmg600_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); dsmg600_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; i2c_register_board_info(0, dsmg600_i2c_board_info, ARRAY_SIZE(dsmg600_i2c_board_info)); /* The UART is required on the DSM-G600 (Redboot cannot use the * NIC) -- do it here so that it does *not* get removed if * platform_add_devices fails! */ (void)platform_device_register(&dsmg600_uart); platform_add_devices(dsmg600_devices, ARRAY_SIZE(dsmg600_devices)); pm_power_off = dsmg600_power_off; if (request_irq(gpio_to_irq(DSMG600_RB_GPIO), &dsmg600_reset_handler, IRQF_DISABLED | IRQF_TRIGGER_LOW, "DSM-G600 reset button", NULL) < 0) { printk(KERN_DEBUG "Reset Button IRQ %d not available\n", gpio_to_irq(DSMG600_RB_GPIO)); } /* The power button on the D-Link DSM-G600 is on GPIO 15, but * it cannot handle interrupts on that GPIO line. So we'll * have to poll it with a kernel timer. */ /* Make sure that the power button GPIO is set up as an input */ gpio_line_config(DSMG600_PB_GPIO, IXP4XX_GPIO_IN); /* Set the initial value for the power button IRQ handler */ power_button_countdown = PBUTTON_HOLDDOWN_COUNT; mod_timer(&dsmg600_power_timer, jiffies + msecs_to_jiffies(500)); }
static void __init ixdp425_init(void) { ixp4xx_sys_init(); /* * IXP465 has 32MB window */ if (machine_is_ixdp465()) { ixdp425_flash_resource.end += IXDP425_FLASH_SIZE; } platform_add_devices(ixdp425_devices, ARRAY_SIZE(ixdp425_devices)); #ifdef CONFIG_KGDB_8250 kgdb8250_add_port(0, &ixdp425_serial_ports[0]); kgdb8250_add_port(1, &ixdp425_serial_ports[1]); #endif }
static void __init nslu2_init(void) { ixp4xx_sys_init(); nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); nslu2_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; pm_power_off = nslu2_power_off; /* * This is only useful on a modified machine, but it is valuable * to have it first in order to see debug messages, and so that * it does *not* get removed if platform_add_devices fails! */ (void)platform_device_register(&nslu2_uart); platform_add_devices(nslu2_devices, ARRAY_SIZE(nslu2_devices)); }
static void __init omixp_init(void) { ixp4xx_sys_init(); /* 16MiB Boot Flash */ omixp_flash_resources[0].start = IXP4XX_EXP_BUS_BASE(0); omixp_flash_resources[0].end = IXP4XX_EXP_BUS_END(0); /* 32 MiB Data Flash */ omixp_flash_resources[1].start = IXP4XX_EXP_BUS_BASE(2); omixp_flash_resources[1].end = IXP4XX_EXP_BUS_END(2); if (machine_is_devixp()) platform_add_devices(devixp_pldev, ARRAY_SIZE(devixp_pldev)); else if (machine_is_miccpt()) platform_add_devices(miccpt_pldev, ARRAY_SIZE(miccpt_pldev)); else if (machine_is_mic256()) platform_add_devices(mic256_pldev, ARRAY_SIZE(mic256_pldev)); }
static void __init coyote_init(void) { ixp4xx_sys_init(); coyote_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); coyote_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_32M - 1; *IXP4XX_EXP_CS0 |= IXP4XX_FLASH_WRITABLE; *IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0; if (machine_is_ixdpg425()) { coyote_uart_data[0].membase = (char*)(IXP4XX_UART1_BASE_VIRT + REG_OFFSET); coyote_uart_data[0].mapbase = IXP4XX_UART1_BASE_PHYS; coyote_uart_data[0].irq = IRQ_IXP4XX_UART1; } platform_add_devices(coyote_devices, ARRAY_SIZE(coyote_devices)); }
static void __init avila_init(void) { ixp4xx_sys_init(); avila_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); avila_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; platform_add_devices(avila_devices, ARRAY_SIZE(avila_devices)); avila_pata_resources[0].start = IXP4XX_EXP_BUS_BASE(1); avila_pata_resources[0].end = IXP4XX_EXP_BUS_END(1); avila_pata_resources[1].start = IXP4XX_EXP_BUS_BASE(2); avila_pata_resources[1].end = IXP4XX_EXP_BUS_END(2); avila_pata_data.cs0_cfg = IXP4XX_EXP_CS1; avila_pata_data.cs1_cfg = IXP4XX_EXP_CS2; platform_device_register(&avila_pata); }
static void __init fsg_init(void) { DECLARE_MAC_BUF(mac_buf); uint8_t __iomem *f; ixp4xx_sys_init(); fsg_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); fsg_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; *IXP4XX_EXP_CS0 |= IXP4XX_FLASH_WRITABLE; *IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0; /* Configure CS2 for operation, 8bit and writable */ *IXP4XX_EXP_CS2 = 0xbfff0002; i2c_register_board_info(0, fsg_i2c_board_info, ARRAY_SIZE(fsg_i2c_board_info)); /* This is only useful on a modified machine, but it is valuable * to have it first in order to see debug messages, and so that * it does *not* get removed if platform_add_devices fails! */ (void)platform_device_register(&fsg_uart); platform_add_devices(fsg_devices, ARRAY_SIZE(fsg_devices)); if (request_irq(gpio_to_irq(FSG_RB_GPIO), &fsg_reset_handler, IRQF_DISABLED | IRQF_TRIGGER_LOW, "FSG reset button", NULL) < 0) { printk(KERN_DEBUG "Reset Button IRQ %d not available\n", gpio_to_irq(FSG_RB_GPIO)); } if (request_irq(gpio_to_irq(FSG_SB_GPIO), &fsg_power_handler, IRQF_DISABLED | IRQF_TRIGGER_LOW, "FSG power button", NULL) < 0) { printk(KERN_DEBUG "Power Button IRQ %d not available\n", gpio_to_irq(FSG_SB_GPIO)); } /* * Map in a portion of the flash and read the MAC addresses. * Since it is stored in BE in the flash itself, we need to * byteswap it if we're in LE mode. */ f = ioremap(IXP4XX_EXP_BUS_BASE(0), 0x400000); if (f) { #ifdef __ARMEB__ int i; for (i = 0; i < 6; i++) { fsg_plat_eth[0].hwaddr[i] = readb(f + 0x3C0422 + i); fsg_plat_eth[1].hwaddr[i] = readb(f + 0x3C043B + i); } #else /* Endian-swapped reads from unaligned addresses are required to extract the two MACs from the big-endian Redboot config area in flash. */ fsg_plat_eth[0].hwaddr[0] = readb(f + 0x3C0421); fsg_plat_eth[0].hwaddr[1] = readb(f + 0x3C0420); fsg_plat_eth[0].hwaddr[2] = readb(f + 0x3C0427); fsg_plat_eth[0].hwaddr[3] = readb(f + 0x3C0426); fsg_plat_eth[0].hwaddr[4] = readb(f + 0x3C0425); fsg_plat_eth[0].hwaddr[5] = readb(f + 0x3C0424); fsg_plat_eth[1].hwaddr[0] = readb(f + 0x3C0439); fsg_plat_eth[1].hwaddr[1] = readb(f + 0x3C043F); fsg_plat_eth[1].hwaddr[2] = readb(f + 0x3C043E); fsg_plat_eth[1].hwaddr[3] = readb(f + 0x3C043D); fsg_plat_eth[1].hwaddr[4] = readb(f + 0x3C043C); fsg_plat_eth[1].hwaddr[5] = readb(f + 0x3C0443); #endif iounmap(f); } printk(KERN_INFO "FSG: Using MAC address %s for port 0\n", print_mac(mac_buf, fsg_plat_eth[0].hwaddr)); printk(KERN_INFO "FSG: Using MAC address %s for port 1\n", print_mac(mac_buf, fsg_plat_eth[1].hwaddr)); }
static void __init sg_init(void) { ixp4xx_sys_init(); platform_add_devices(sg_devices, ARRAY_SIZE(sg_devices)); }
static void __init gmlr_init(void) { u8 __iomem *flash; int i, devices = 1; /* flash */ ixp4xx_sys_init(); if ((flash = ioremap(IXP4XX_EXP_BUS_BASE_PHYS, 0x80)) == NULL) printk(KERN_ERR "goramo-mlr: unable to access system" " configuration data\n"); else { system_rev = __raw_readl(flash + CFG_REV); hw_bits = __raw_readl(flash + CFG_HW_BITS); for (i = 0; i < ETH_ALEN; i++) { eth_plat[0].hwaddr[i] = flash_readb(flash, CFG_ETH0_ADDRESS + i); eth_plat[1].hwaddr[i] = flash_readb(flash, CFG_ETH1_ADDRESS + i); } __raw_writew(FLASH_CMD_READ_ID, flash); system_serial_high = flash_readw(flash, FLASH_SER_OFF); system_serial_high <<= 16; system_serial_high |= flash_readw(flash, FLASH_SER_OFF + 2); system_serial_low = flash_readw(flash, FLASH_SER_OFF + 4); system_serial_low <<= 16; system_serial_low |= flash_readw(flash, FLASH_SER_OFF + 6); __raw_writew(FLASH_CMD_READ_ARRAY, flash); iounmap(flash); } switch (hw_bits & (CFG_HW_HAS_UART0 | CFG_HW_HAS_UART1)) { case CFG_HW_HAS_UART0: memset(&uart_data[1], 0, sizeof(uart_data[1])); device_uarts.num_resources = 1; break; case CFG_HW_HAS_UART1: device_uarts.dev.platform_data = &uart_data[1]; device_uarts.resource = &uart_resources[1]; device_uarts.num_resources = 1; break; } if (hw_bits & (CFG_HW_HAS_UART0 | CFG_HW_HAS_UART1)) device_tab[devices++] = &device_uarts; /* max index 1 */ if (hw_bits & CFG_HW_HAS_ETH0) device_tab[devices++] = &device_eth_tab[0]; /* max index 2 */ if (hw_bits & CFG_HW_HAS_ETH1) device_tab[devices++] = &device_eth_tab[1]; /* max index 3 */ if (hw_bits & CFG_HW_HAS_HSS0) device_tab[devices++] = &device_hss_tab[0]; /* max index 4 */ if (hw_bits & CFG_HW_HAS_HSS1) device_tab[devices++] = &device_hss_tab[1]; /* max index 5 */ if (hw_bits & CFG_HW_HAS_EEPROM) device_tab[devices++] = &device_i2c; /* max index 6 */ gpio_line_config(GPIO_SCL, IXP4XX_GPIO_OUT); gpio_line_config(GPIO_SDA, IXP4XX_GPIO_OUT); gpio_line_config(GPIO_STR, IXP4XX_GPIO_OUT); gpio_line_config(GPIO_HSS0_RTS_N, IXP4XX_GPIO_OUT); gpio_line_config(GPIO_HSS1_RTS_N, IXP4XX_GPIO_OUT); gpio_line_config(GPIO_HSS0_DCD_N, IXP4XX_GPIO_IN); gpio_line_config(GPIO_HSS1_DCD_N, IXP4XX_GPIO_IN); set_irq_type(gpio_irq(GPIO_HSS0_DCD_N), IRQ_TYPE_EDGE_BOTH); set_irq_type(gpio_irq(GPIO_HSS1_DCD_N), IRQ_TYPE_EDGE_BOTH); set_control(CONTROL_HSS0_DTR_N, 1); set_control(CONTROL_HSS1_DTR_N, 1); set_control(CONTROL_EEPROM_WC_N, 1); set_control(CONTROL_PCI_RESET_N, 1); output_control(); msleep(1); /* Wait for PCI devices to initialize */ flash_resource.start = IXP4XX_EXP_BUS_BASE(0); flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; platform_add_devices(device_tab, devices); }
static void __init nas100d_init(void) { uint8_t __iomem *f; int i; ixp4xx_sys_init(); /* gpio 14 and 15 are _not_ clocks */ *IXP4XX_GPIO_GPCLKR = 0; nas100d_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); nas100d_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; i2c_register_board_info(0, nas100d_i2c_board_info, ARRAY_SIZE(nas100d_i2c_board_info)); /* * This is only useful on a modified machine, but it is valuable * to have it first in order to see debug messages, and so that * it does *not* get removed if platform_add_devices fails! */ (void)platform_device_register(&nas100d_uart); platform_add_devices(nas100d_devices, ARRAY_SIZE(nas100d_devices)); pm_power_off = nas100d_power_off; if (request_irq(gpio_to_irq(NAS100D_RB_GPIO), &nas100d_reset_handler, IRQF_DISABLED | IRQF_TRIGGER_LOW, "NAS100D reset button", NULL) < 0) { printk(KERN_DEBUG "Reset Button IRQ %d not available\n", gpio_to_irq(NAS100D_RB_GPIO)); } /* The power button on the Iomega NAS100d is on GPIO 14, but * it cannot handle interrupts on that GPIO line. So we'll * have to poll it with a kernel timer. */ /* Make sure that the power button GPIO is set up as an input */ gpio_line_config(NAS100D_PB_GPIO, IXP4XX_GPIO_IN); /* Set the initial value for the power button IRQ handler */ power_button_countdown = PBUTTON_HOLDDOWN_COUNT; mod_timer(&nas100d_power_timer, jiffies + msecs_to_jiffies(500)); /* * Map in a portion of the flash and read the MAC address. * Since it is stored in BE in the flash itself, we need to * byteswap it if we're in LE mode. */ f = ioremap(IXP4XX_EXP_BUS_BASE(0), 0x1000000); if (f) { for (i = 0; i < 6; i++) #ifdef __ARMEB__ nas100d_plat_eth[0].hwaddr[i] = readb(f + 0xFC0FD8 + i); #else nas100d_plat_eth[0].hwaddr[i] = readb(f + 0xFC0FD8 + (i^3)); #endif iounmap(f); } printk(KERN_INFO "NAS100D: Using MAC address %pM for port 0\n", nas100d_plat_eth[0].hwaddr); }