Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/arm/mach-orion5x/mv2120-setup.c
10817 views
1
/*
2
* Copyright (C) 2007 Herbert Valerio Riedel <[email protected]>
3
* Copyright (C) 2008 Martin Michlmayr <[email protected]>
4
*
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU Lesser General Public License as
7
* published by the Free Software Foundation; either version 2 of the
8
* License, or (at your option) any later version.
9
*/
10
11
#include <linux/kernel.h>
12
#include <linux/init.h>
13
#include <linux/platform_device.h>
14
#include <linux/irq.h>
15
#include <linux/mtd/physmap.h>
16
#include <linux/mv643xx_eth.h>
17
#include <linux/leds.h>
18
#include <linux/gpio_keys.h>
19
#include <linux/input.h>
20
#include <linux/i2c.h>
21
#include <linux/ata_platform.h>
22
#include <asm/mach-types.h>
23
#include <asm/gpio.h>
24
#include <asm/mach/arch.h>
25
#include <mach/orion5x.h>
26
#include "common.h"
27
#include "mpp.h"
28
29
#define MV2120_NOR_BOOT_BASE 0xf4000000
30
#define MV2120_NOR_BOOT_SIZE SZ_512K
31
32
#define MV2120_GPIO_RTC_IRQ 3
33
#define MV2120_GPIO_KEY_RESET 17
34
#define MV2120_GPIO_KEY_POWER 18
35
#define MV2120_GPIO_POWER_OFF 19
36
37
38
/*****************************************************************************
39
* Ethernet
40
****************************************************************************/
41
static struct mv643xx_eth_platform_data mv2120_eth_data = {
42
.phy_addr = MV643XX_ETH_PHY_ADDR(8),
43
};
44
45
static struct mv_sata_platform_data mv2120_sata_data = {
46
.n_ports = 2,
47
};
48
49
static struct mtd_partition mv2120_partitions[] = {
50
{
51
.name = "firmware",
52
.size = 0x00080000,
53
.offset = 0,
54
},
55
};
56
57
static struct physmap_flash_data mv2120_nor_flash_data = {
58
.width = 1,
59
.parts = mv2120_partitions,
60
.nr_parts = ARRAY_SIZE(mv2120_partitions)
61
};
62
63
static struct resource mv2120_nor_flash_resource = {
64
.flags = IORESOURCE_MEM,
65
.start = MV2120_NOR_BOOT_BASE,
66
.end = MV2120_NOR_BOOT_BASE + MV2120_NOR_BOOT_SIZE - 1,
67
};
68
69
static struct platform_device mv2120_nor_flash = {
70
.name = "physmap-flash",
71
.id = 0,
72
.dev = {
73
.platform_data = &mv2120_nor_flash_data,
74
},
75
.resource = &mv2120_nor_flash_resource,
76
.num_resources = 1,
77
};
78
79
static struct gpio_keys_button mv2120_buttons[] = {
80
{
81
.code = KEY_RESTART,
82
.gpio = MV2120_GPIO_KEY_RESET,
83
.desc = "reset",
84
.active_low = 1,
85
}, {
86
.code = KEY_POWER,
87
.gpio = MV2120_GPIO_KEY_POWER,
88
.desc = "power",
89
.active_low = 1,
90
},
91
};
92
93
static struct gpio_keys_platform_data mv2120_button_data = {
94
.buttons = mv2120_buttons,
95
.nbuttons = ARRAY_SIZE(mv2120_buttons),
96
};
97
98
static struct platform_device mv2120_button_device = {
99
.name = "gpio-keys",
100
.id = -1,
101
.num_resources = 0,
102
.dev = {
103
.platform_data = &mv2120_button_data,
104
},
105
};
106
107
108
/****************************************************************************
109
* General Setup
110
****************************************************************************/
111
static unsigned int mv2120_mpp_modes[] __initdata = {
112
MPP0_GPIO, /* Sys status LED */
113
MPP1_GPIO, /* Sys error LED */
114
MPP2_GPIO, /* OverTemp interrupt */
115
MPP3_GPIO, /* RTC interrupt */
116
MPP4_GPIO, /* V_LED 5V */
117
MPP5_GPIO, /* V_LED 3.3V */
118
MPP6_UNUSED,
119
MPP7_UNUSED,
120
MPP8_GPIO, /* SATA 0 fail LED */
121
MPP9_GPIO, /* SATA 1 fail LED */
122
MPP10_UNUSED,
123
MPP11_UNUSED,
124
MPP12_SATA_LED, /* SATA 0 presence */
125
MPP13_SATA_LED, /* SATA 1 presence */
126
MPP14_SATA_LED, /* SATA 0 active */
127
MPP15_SATA_LED, /* SATA 1 active */
128
MPP16_UNUSED,
129
MPP17_GPIO, /* Reset button */
130
MPP18_GPIO, /* Power button */
131
MPP19_GPIO, /* Power off */
132
0,
133
};
134
135
static struct i2c_board_info __initdata mv2120_i2c_rtc = {
136
I2C_BOARD_INFO("pcf8563", 0x51),
137
.irq = 0,
138
};
139
140
static struct gpio_led mv2120_led_pins[] = {
141
{
142
.name = "mv2120:blue:health",
143
.gpio = 0,
144
},
145
{
146
.name = "mv2120:red:health",
147
.gpio = 1,
148
},
149
{
150
.name = "mv2120:led:bright",
151
.gpio = 4,
152
.default_trigger = "default-on",
153
},
154
{
155
.name = "mv2120:led:dimmed",
156
.gpio = 5,
157
},
158
{
159
.name = "mv2120:red:sata0",
160
.gpio = 8,
161
.active_low = 1,
162
},
163
{
164
.name = "mv2120:red:sata1",
165
.gpio = 9,
166
.active_low = 1,
167
},
168
169
};
170
171
static struct gpio_led_platform_data mv2120_led_data = {
172
.leds = mv2120_led_pins,
173
.num_leds = ARRAY_SIZE(mv2120_led_pins),
174
};
175
176
static struct platform_device mv2120_leds = {
177
.name = "leds-gpio",
178
.id = -1,
179
.dev = {
180
.platform_data = &mv2120_led_data,
181
}
182
};
183
184
static void mv2120_power_off(void)
185
{
186
pr_info("%s: triggering power-off...\n", __func__);
187
gpio_set_value(MV2120_GPIO_POWER_OFF, 0);
188
}
189
190
static void __init mv2120_init(void)
191
{
192
/* Setup basic Orion functions. Need to be called early. */
193
orion5x_init();
194
195
orion5x_mpp_conf(mv2120_mpp_modes);
196
197
/*
198
* Configure peripherals.
199
*/
200
orion5x_ehci0_init();
201
orion5x_ehci1_init();
202
orion5x_eth_init(&mv2120_eth_data);
203
orion5x_i2c_init();
204
orion5x_sata_init(&mv2120_sata_data);
205
orion5x_uart0_init();
206
orion5x_xor_init();
207
208
orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE);
209
platform_device_register(&mv2120_nor_flash);
210
211
platform_device_register(&mv2120_button_device);
212
213
if (gpio_request(MV2120_GPIO_RTC_IRQ, "rtc") == 0) {
214
if (gpio_direction_input(MV2120_GPIO_RTC_IRQ) == 0)
215
mv2120_i2c_rtc.irq = gpio_to_irq(MV2120_GPIO_RTC_IRQ);
216
else
217
gpio_free(MV2120_GPIO_RTC_IRQ);
218
}
219
i2c_register_board_info(0, &mv2120_i2c_rtc, 1);
220
platform_device_register(&mv2120_leds);
221
222
/* register mv2120 specific power-off method */
223
if (gpio_request(MV2120_GPIO_POWER_OFF, "POWEROFF") != 0 ||
224
gpio_direction_output(MV2120_GPIO_POWER_OFF, 1) != 0)
225
pr_err("mv2120: failed to setup power-off GPIO\n");
226
pm_power_off = mv2120_power_off;
227
}
228
229
/* Warning: HP uses a wrong mach-type (=526) in their bootloader */
230
MACHINE_START(MV2120, "HP Media Vault mv2120")
231
/* Maintainer: Martin Michlmayr <[email protected]> */
232
.boot_params = 0x00000100,
233
.init_machine = mv2120_init,
234
.map_io = orion5x_map_io,
235
.init_early = orion5x_init_early,
236
.init_irq = orion5x_init_irq,
237
.timer = &orion5x_timer,
238
.fixup = tag_fixup_mem32
239
MACHINE_END
240
241