1/* 2 * 3 * HP t5325 Thin Client setup 4 * 5 * Copyright (C) 2010 Martin Michlmayr <tbm@cyrius.com> 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 10 * 2 of the License, or (at your option) any later version. 11 */ 12 13#include <linux/kernel.h> 14#include <linux/init.h> 15#include <linux/platform_device.h> 16#include <linux/mtd/physmap.h> 17#include <linux/spi/flash.h> 18#include <linux/spi/spi.h> 19#include <linux/spi/orion_spi.h> 20#include <linux/i2c.h> 21#include <linux/mv643xx_eth.h> 22#include <linux/ata_platform.h> 23#include <linux/gpio.h> 24#include <linux/gpio_keys.h> 25#include <linux/input.h> 26#include <asm/mach-types.h> 27#include <asm/mach/arch.h> 28#include <mach/kirkwood.h> 29#include "common.h" 30#include "mpp.h" 31 32struct mtd_partition hp_t5325_partitions[] = { 33 { 34 .name = "u-boot env", 35 .size = SZ_64K, 36 .offset = SZ_512K + SZ_256K, 37 }, 38 { 39 .name = "permanent u-boot env", 40 .size = SZ_64K, 41 .offset = MTDPART_OFS_APPEND, 42 .mask_flags = MTD_WRITEABLE, 43 }, 44 { 45 .name = "HP env", 46 .size = SZ_64K, 47 .offset = MTDPART_OFS_APPEND, 48 }, 49 { 50 .name = "u-boot", 51 .size = SZ_512K, 52 .offset = 0, 53 .mask_flags = MTD_WRITEABLE, 54 }, 55 { 56 .name = "SSD firmware", 57 .size = SZ_256K, 58 .offset = SZ_512K, 59 }, 60}; 61 62const struct flash_platform_data hp_t5325_flash = { 63 .type = "mx25l8005", 64 .name = "spi_flash", 65 .parts = hp_t5325_partitions, 66 .nr_parts = ARRAY_SIZE(hp_t5325_partitions), 67}; 68 69struct spi_board_info __initdata hp_t5325_spi_slave_info[] = { 70 { 71 .modalias = "m25p80", 72 .platform_data = &hp_t5325_flash, 73 .irq = -1, 74 }, 75}; 76 77static struct mv643xx_eth_platform_data hp_t5325_ge00_data = { 78 .phy_addr = MV643XX_ETH_PHY_ADDR(8), 79}; 80 81static struct mv_sata_platform_data hp_t5325_sata_data = { 82 .n_ports = 2, 83}; 84 85static struct gpio_keys_button hp_t5325_buttons[] = { 86 { 87 .code = KEY_POWER, 88 .gpio = 45, 89 .desc = "Power", 90 .active_low = 1, 91 }, 92}; 93 94static struct gpio_keys_platform_data hp_t5325_button_data = { 95 .buttons = hp_t5325_buttons, 96 .nbuttons = ARRAY_SIZE(hp_t5325_buttons), 97}; 98 99static struct platform_device hp_t5325_button_device = { 100 .name = "gpio-keys", 101 .id = -1, 102 .num_resources = 0, 103 .dev = { 104 .platform_data = &hp_t5325_button_data, 105 } 106}; 107 108static unsigned int hp_t5325_mpp_config[] __initdata = { 109 MPP0_NF_IO2, 110 MPP1_SPI_MOSI, 111 MPP2_SPI_SCK, 112 MPP3_SPI_MISO, 113 MPP4_NF_IO6, 114 MPP5_NF_IO7, 115 MPP6_SYSRST_OUTn, 116 MPP7_SPI_SCn, 117 MPP8_TW0_SDA, 118 MPP9_TW0_SCK, 119 MPP10_UART0_TXD, 120 MPP11_UART0_RXD, 121 MPP12_SD_CLK, 122 MPP13_GPIO, 123 MPP14_GPIO, 124 MPP15_GPIO, 125 MPP16_GPIO, 126 MPP17_GPIO, 127 MPP18_NF_IO0, 128 MPP19_NF_IO1, 129 MPP20_GPIO, 130 MPP21_GPIO, 131 MPP22_GPIO, 132 MPP23_GPIO, 133 MPP32_GPIO, 134 MPP33_GE1_TXCTL, 135 MPP39_AU_I2SBCLK, 136 MPP40_AU_I2SDO, 137 MPP41_AU_I2SLRCLK, 138 MPP42_AU_I2SMCLK, 139 MPP45_GPIO, /* Power button */ 140 MPP48_GPIO, /* Board power off */ 141 0 142}; 143 144#define HP_T5325_GPIO_POWER_OFF 48 145 146static void hp_t5325_power_off(void) 147{ 148 gpio_set_value(HP_T5325_GPIO_POWER_OFF, 1); 149} 150 151static void __init hp_t5325_init(void) 152{ 153 /* 154 * Basic setup. Needs to be called early. 155 */ 156 kirkwood_init(); 157 kirkwood_mpp_conf(hp_t5325_mpp_config); 158 159 kirkwood_uart0_init(); 160 spi_register_board_info(hp_t5325_spi_slave_info, 161 ARRAY_SIZE(hp_t5325_spi_slave_info)); 162 kirkwood_spi_init(); 163 kirkwood_i2c_init(); 164 kirkwood_ge00_init(&hp_t5325_ge00_data); 165 kirkwood_sata_init(&hp_t5325_sata_data); 166 kirkwood_ehci_init(); 167 platform_device_register(&hp_t5325_button_device); 168 169 if (gpio_request(HP_T5325_GPIO_POWER_OFF, "power-off") == 0 && 170 gpio_direction_output(HP_T5325_GPIO_POWER_OFF, 0) == 0) 171 pm_power_off = hp_t5325_power_off; 172 else 173 pr_err("t5325: failed to configure power-off GPIO\n"); 174} 175 176static int __init hp_t5325_pci_init(void) 177{ 178 if (machine_is_t5325()) 179 kirkwood_pcie_init(KW_PCIE0); 180 181 return 0; 182} 183subsys_initcall(hp_t5325_pci_init); 184 185MACHINE_START(T5325, "HP t5325 Thin Client") 186 /* Maintainer: Martin Michlmayr <tbm@cyrius.com> */ 187 .phys_io = KIRKWOOD_REGS_PHYS_BASE, 188 .io_pg_offst = ((KIRKWOOD_REGS_VIRT_BASE) >> 18) & 0xfffc, 189 .boot_params = 0x00000100, 190 .init_machine = hp_t5325_init, 191 .map_io = kirkwood_map_io, 192 .init_irq = kirkwood_init_irq, 193 .timer = &kirkwood_timer, 194MACHINE_END 195