Path: blob/master/arch/arm/mach-orion5x/mv2120-setup.c
10817 views
/*1* Copyright (C) 2007 Herbert Valerio Riedel <[email protected]>2* Copyright (C) 2008 Martin Michlmayr <[email protected]>3*4* This program is free software; you can redistribute it and/or modify5* it under the terms of the GNU Lesser General Public License as6* published by the Free Software Foundation; either version 2 of the7* License, or (at your option) any later version.8*/910#include <linux/kernel.h>11#include <linux/init.h>12#include <linux/platform_device.h>13#include <linux/irq.h>14#include <linux/mtd/physmap.h>15#include <linux/mv643xx_eth.h>16#include <linux/leds.h>17#include <linux/gpio_keys.h>18#include <linux/input.h>19#include <linux/i2c.h>20#include <linux/ata_platform.h>21#include <asm/mach-types.h>22#include <asm/gpio.h>23#include <asm/mach/arch.h>24#include <mach/orion5x.h>25#include "common.h"26#include "mpp.h"2728#define MV2120_NOR_BOOT_BASE 0xf400000029#define MV2120_NOR_BOOT_SIZE SZ_512K3031#define MV2120_GPIO_RTC_IRQ 332#define MV2120_GPIO_KEY_RESET 1733#define MV2120_GPIO_KEY_POWER 1834#define MV2120_GPIO_POWER_OFF 19353637/*****************************************************************************38* Ethernet39****************************************************************************/40static struct mv643xx_eth_platform_data mv2120_eth_data = {41.phy_addr = MV643XX_ETH_PHY_ADDR(8),42};4344static struct mv_sata_platform_data mv2120_sata_data = {45.n_ports = 2,46};4748static struct mtd_partition mv2120_partitions[] = {49{50.name = "firmware",51.size = 0x00080000,52.offset = 0,53},54};5556static struct physmap_flash_data mv2120_nor_flash_data = {57.width = 1,58.parts = mv2120_partitions,59.nr_parts = ARRAY_SIZE(mv2120_partitions)60};6162static struct resource mv2120_nor_flash_resource = {63.flags = IORESOURCE_MEM,64.start = MV2120_NOR_BOOT_BASE,65.end = MV2120_NOR_BOOT_BASE + MV2120_NOR_BOOT_SIZE - 1,66};6768static struct platform_device mv2120_nor_flash = {69.name = "physmap-flash",70.id = 0,71.dev = {72.platform_data = &mv2120_nor_flash_data,73},74.resource = &mv2120_nor_flash_resource,75.num_resources = 1,76};7778static struct gpio_keys_button mv2120_buttons[] = {79{80.code = KEY_RESTART,81.gpio = MV2120_GPIO_KEY_RESET,82.desc = "reset",83.active_low = 1,84}, {85.code = KEY_POWER,86.gpio = MV2120_GPIO_KEY_POWER,87.desc = "power",88.active_low = 1,89},90};9192static struct gpio_keys_platform_data mv2120_button_data = {93.buttons = mv2120_buttons,94.nbuttons = ARRAY_SIZE(mv2120_buttons),95};9697static struct platform_device mv2120_button_device = {98.name = "gpio-keys",99.id = -1,100.num_resources = 0,101.dev = {102.platform_data = &mv2120_button_data,103},104};105106107/****************************************************************************108* General Setup109****************************************************************************/110static unsigned int mv2120_mpp_modes[] __initdata = {111MPP0_GPIO, /* Sys status LED */112MPP1_GPIO, /* Sys error LED */113MPP2_GPIO, /* OverTemp interrupt */114MPP3_GPIO, /* RTC interrupt */115MPP4_GPIO, /* V_LED 5V */116MPP5_GPIO, /* V_LED 3.3V */117MPP6_UNUSED,118MPP7_UNUSED,119MPP8_GPIO, /* SATA 0 fail LED */120MPP9_GPIO, /* SATA 1 fail LED */121MPP10_UNUSED,122MPP11_UNUSED,123MPP12_SATA_LED, /* SATA 0 presence */124MPP13_SATA_LED, /* SATA 1 presence */125MPP14_SATA_LED, /* SATA 0 active */126MPP15_SATA_LED, /* SATA 1 active */127MPP16_UNUSED,128MPP17_GPIO, /* Reset button */129MPP18_GPIO, /* Power button */130MPP19_GPIO, /* Power off */1310,132};133134static struct i2c_board_info __initdata mv2120_i2c_rtc = {135I2C_BOARD_INFO("pcf8563", 0x51),136.irq = 0,137};138139static struct gpio_led mv2120_led_pins[] = {140{141.name = "mv2120:blue:health",142.gpio = 0,143},144{145.name = "mv2120:red:health",146.gpio = 1,147},148{149.name = "mv2120:led:bright",150.gpio = 4,151.default_trigger = "default-on",152},153{154.name = "mv2120:led:dimmed",155.gpio = 5,156},157{158.name = "mv2120:red:sata0",159.gpio = 8,160.active_low = 1,161},162{163.name = "mv2120:red:sata1",164.gpio = 9,165.active_low = 1,166},167168};169170static struct gpio_led_platform_data mv2120_led_data = {171.leds = mv2120_led_pins,172.num_leds = ARRAY_SIZE(mv2120_led_pins),173};174175static struct platform_device mv2120_leds = {176.name = "leds-gpio",177.id = -1,178.dev = {179.platform_data = &mv2120_led_data,180}181};182183static void mv2120_power_off(void)184{185pr_info("%s: triggering power-off...\n", __func__);186gpio_set_value(MV2120_GPIO_POWER_OFF, 0);187}188189static void __init mv2120_init(void)190{191/* Setup basic Orion functions. Need to be called early. */192orion5x_init();193194orion5x_mpp_conf(mv2120_mpp_modes);195196/*197* Configure peripherals.198*/199orion5x_ehci0_init();200orion5x_ehci1_init();201orion5x_eth_init(&mv2120_eth_data);202orion5x_i2c_init();203orion5x_sata_init(&mv2120_sata_data);204orion5x_uart0_init();205orion5x_xor_init();206207orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE);208platform_device_register(&mv2120_nor_flash);209210platform_device_register(&mv2120_button_device);211212if (gpio_request(MV2120_GPIO_RTC_IRQ, "rtc") == 0) {213if (gpio_direction_input(MV2120_GPIO_RTC_IRQ) == 0)214mv2120_i2c_rtc.irq = gpio_to_irq(MV2120_GPIO_RTC_IRQ);215else216gpio_free(MV2120_GPIO_RTC_IRQ);217}218i2c_register_board_info(0, &mv2120_i2c_rtc, 1);219platform_device_register(&mv2120_leds);220221/* register mv2120 specific power-off method */222if (gpio_request(MV2120_GPIO_POWER_OFF, "POWEROFF") != 0 ||223gpio_direction_output(MV2120_GPIO_POWER_OFF, 1) != 0)224pr_err("mv2120: failed to setup power-off GPIO\n");225pm_power_off = mv2120_power_off;226}227228/* Warning: HP uses a wrong mach-type (=526) in their bootloader */229MACHINE_START(MV2120, "HP Media Vault mv2120")230/* Maintainer: Martin Michlmayr <[email protected]> */231.boot_params = 0x00000100,232.init_machine = mv2120_init,233.map_io = orion5x_map_io,234.init_early = orion5x_init_early,235.init_irq = orion5x_init_irq,236.timer = &orion5x_timer,237.fixup = tag_fixup_mem32238MACHINE_END239240241