GNU Linux-libre 6.1.90-gnu
[releases.git] / arch / arm / mach-orion5x / net2big-setup.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * arch/arm/mach-orion5x/net2big-setup.c
4  *
5  * LaCie 2Big Network NAS setup
6  *
7  * Copyright (C) 2009 Simon Guinot <sguinot@lacie.com>
8  */
9
10 #include <linux/kernel.h>
11 #include <linux/init.h>
12 #include <linux/platform_device.h>
13 #include <linux/mtd/physmap.h>
14 #include <linux/mv643xx_eth.h>
15 #include <linux/leds.h>
16 #include <linux/gpio_keys.h>
17 #include <linux/input.h>
18 #include <linux/i2c.h>
19 #include <linux/ata_platform.h>
20 #include <linux/gpio.h>
21 #include <linux/delay.h>
22 #include <asm/mach-types.h>
23 #include <asm/mach/arch.h>
24 #include <plat/orion-gpio.h>
25 #include "common.h"
26 #include "mpp.h"
27 #include "orion5x.h"
28
29 /*****************************************************************************
30  * LaCie 2Big Network Info
31  ****************************************************************************/
32
33 /*
34  * 512KB NOR flash Device bus boot chip select
35  */
36
37 #define NET2BIG_NOR_BOOT_BASE           0xfff80000
38 #define NET2BIG_NOR_BOOT_SIZE           SZ_512K
39
40 /*****************************************************************************
41  * 512KB NOR Flash on Boot Device
42  ****************************************************************************/
43
44 /*
45  * TODO: Check write support on flash MX29LV400CBTC-70G
46  */
47
48 static struct mtd_partition net2big_partitions[] = {
49         {
50                 .name           = "Full512kb",
51                 .size           = MTDPART_SIZ_FULL,
52                 .offset         = 0x00000000,
53                 .mask_flags     = MTD_WRITEABLE,
54         },
55 };
56
57 static struct physmap_flash_data net2big_nor_flash_data = {
58         .width          = 1,
59         .parts          = net2big_partitions,
60         .nr_parts       = ARRAY_SIZE(net2big_partitions),
61 };
62
63 static struct resource net2big_nor_flash_resource = {
64         .flags                  = IORESOURCE_MEM,
65         .start                  = NET2BIG_NOR_BOOT_BASE,
66         .end                    = NET2BIG_NOR_BOOT_BASE
67                                         + NET2BIG_NOR_BOOT_SIZE - 1,
68 };
69
70 static struct platform_device net2big_nor_flash = {
71         .name                   = "physmap-flash",
72         .id                     = 0,
73         .dev            = {
74                 .platform_data  = &net2big_nor_flash_data,
75         },
76         .num_resources          = 1,
77         .resource               = &net2big_nor_flash_resource,
78 };
79
80 /*****************************************************************************
81  * Ethernet
82  ****************************************************************************/
83
84 static struct mv643xx_eth_platform_data net2big_eth_data = {
85         .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
86 };
87
88 /*****************************************************************************
89  * I2C devices
90  ****************************************************************************/
91
92 /*
93  * i2c addr | chip         | description
94  * 0x32     | Ricoh 5C372b | RTC
95  * 0x50     | HT24LC08     | eeprom (1kB)
96  */
97 static struct i2c_board_info __initdata net2big_i2c_devices[] = {
98         {
99                 I2C_BOARD_INFO("rs5c372b", 0x32),
100         }, {
101                 I2C_BOARD_INFO("24c08", 0x50),
102         },
103 };
104
105 /*****************************************************************************
106  * SATA
107  ****************************************************************************/
108
109 static struct mv_sata_platform_data net2big_sata_data = {
110         .n_ports        = 2,
111 };
112
113 #define NET2BIG_GPIO_SATA_POWER_REQ     19
114 #define NET2BIG_GPIO_SATA0_POWER        23
115 #define NET2BIG_GPIO_SATA1_POWER        25
116
117 static void __init net2big_sata_power_init(void)
118 {
119         int err;
120
121         /* Configure GPIOs over MPP max number. */
122         orion_gpio_set_valid(NET2BIG_GPIO_SATA0_POWER, 1);
123         orion_gpio_set_valid(NET2BIG_GPIO_SATA1_POWER, 1);
124
125         err = gpio_request(NET2BIG_GPIO_SATA0_POWER, "SATA0 power status");
126         if (err == 0) {
127                 err = gpio_direction_input(NET2BIG_GPIO_SATA0_POWER);
128                 if (err)
129                         gpio_free(NET2BIG_GPIO_SATA0_POWER);
130         }
131         if (err) {
132                 pr_err("net2big: failed to setup SATA0 power GPIO\n");
133                 return;
134         }
135
136         err = gpio_request(NET2BIG_GPIO_SATA1_POWER, "SATA1 power status");
137         if (err == 0) {
138                 err = gpio_direction_input(NET2BIG_GPIO_SATA1_POWER);
139                 if (err)
140                         gpio_free(NET2BIG_GPIO_SATA1_POWER);
141         }
142         if (err) {
143                 pr_err("net2big: failed to setup SATA1 power GPIO\n");
144                 goto err_free_1;
145         }
146
147         err = gpio_request(NET2BIG_GPIO_SATA_POWER_REQ, "SATA power request");
148         if (err == 0) {
149                 err = gpio_direction_output(NET2BIG_GPIO_SATA_POWER_REQ, 0);
150                 if (err)
151                         gpio_free(NET2BIG_GPIO_SATA_POWER_REQ);
152         }
153         if (err) {
154                 pr_err("net2big: failed to setup SATA power request GPIO\n");
155                 goto err_free_2;
156         }
157
158         if (gpio_get_value(NET2BIG_GPIO_SATA0_POWER) &&
159                 gpio_get_value(NET2BIG_GPIO_SATA1_POWER)) {
160                 return;
161         }
162
163         /*
164          * SATA power up on both disk is done by pulling high the CPLD power
165          * request line. The 300ms delay is related to the CPLD clock and is
166          * needed to be sure that the CPLD has take into account the low line
167          * status.
168          */
169         msleep(300);
170         gpio_set_value(NET2BIG_GPIO_SATA_POWER_REQ, 1);
171         pr_info("net2big: power up SATA hard disks\n");
172
173         return;
174
175 err_free_2:
176         gpio_free(NET2BIG_GPIO_SATA1_POWER);
177 err_free_1:
178         gpio_free(NET2BIG_GPIO_SATA0_POWER);
179
180         return;
181 }
182
183 /*****************************************************************************
184  * GPIO LEDs
185  ****************************************************************************/
186
187 /*
188  * The power front LEDs (blue and red) and SATA red LEDs are controlled via a
189  * single GPIO line and are compatible with the leds-gpio driver.
190  *
191  * The SATA blue LEDs have some hardware blink capabilities which are detailed
192  * in the following array:
193  *
194  * SATAx blue LED | SATAx activity | LED state
195  *                |                |
196  *       0        |       0        |  blink (rate 300ms)
197  *       1        |       0        |  off
198  *       ?        |       1        |  on
199  *
200  * Notes: The blue and the red front LED's can't be on at the same time.
201  *        Blue LED have priority.
202  */
203
204 #define NET2BIG_GPIO_PWR_RED_LED        6
205 #define NET2BIG_GPIO_PWR_BLUE_LED       16
206 #define NET2BIG_GPIO_PWR_LED_BLINK_STOP 7
207
208 #define NET2BIG_GPIO_SATA0_RED_LED      11
209 #define NET2BIG_GPIO_SATA1_RED_LED      10
210
211 #define NET2BIG_GPIO_SATA0_BLUE_LED     17
212 #define NET2BIG_GPIO_SATA1_BLUE_LED     13
213
214 static struct gpio_led net2big_leds[] = {
215         {
216                 .name = "net2big:red:power",
217                 .gpio = NET2BIG_GPIO_PWR_RED_LED,
218         },
219         {
220                 .name = "net2big:blue:power",
221                 .gpio = NET2BIG_GPIO_PWR_BLUE_LED,
222         },
223         {
224                 .name = "net2big:red:sata0",
225                 .gpio = NET2BIG_GPIO_SATA0_RED_LED,
226         },
227         {
228                 .name = "net2big:red:sata1",
229                 .gpio = NET2BIG_GPIO_SATA1_RED_LED,
230         },
231 };
232
233 static struct gpio_led_platform_data net2big_led_data = {
234         .num_leds = ARRAY_SIZE(net2big_leds),
235         .leds = net2big_leds,
236 };
237
238 static struct platform_device net2big_gpio_leds = {
239         .name           = "leds-gpio",
240         .id             = -1,
241         .dev            = {
242                 .platform_data  = &net2big_led_data,
243         },
244 };
245
246 static void __init net2big_gpio_leds_init(void)
247 {
248         int err;
249
250         /* Stop initial CPLD slow red/blue blinking on power LED. */
251         err = gpio_request(NET2BIG_GPIO_PWR_LED_BLINK_STOP,
252                            "Power LED blink stop");
253         if (err == 0) {
254                 err = gpio_direction_output(NET2BIG_GPIO_PWR_LED_BLINK_STOP, 1);
255                 if (err)
256                         gpio_free(NET2BIG_GPIO_PWR_LED_BLINK_STOP);
257         }
258         if (err)
259                 pr_err("net2big: failed to setup power LED blink GPIO\n");
260
261         /*
262          * Configure SATA0 and SATA1 blue LEDs to blink in relation with the
263          * hard disk activity.
264          */
265         err = gpio_request(NET2BIG_GPIO_SATA0_BLUE_LED,
266                            "SATA0 blue LED control");
267         if (err == 0) {
268                 err = gpio_direction_output(NET2BIG_GPIO_SATA0_BLUE_LED, 1);
269                 if (err)
270                         gpio_free(NET2BIG_GPIO_SATA0_BLUE_LED);
271         }
272         if (err)
273                 pr_err("net2big: failed to setup SATA0 blue LED GPIO\n");
274
275         err = gpio_request(NET2BIG_GPIO_SATA1_BLUE_LED,
276                            "SATA1 blue LED control");
277         if (err == 0) {
278                 err = gpio_direction_output(NET2BIG_GPIO_SATA1_BLUE_LED, 1);
279                 if (err)
280                         gpio_free(NET2BIG_GPIO_SATA1_BLUE_LED);
281         }
282         if (err)
283                 pr_err("net2big: failed to setup SATA1 blue LED GPIO\n");
284
285         platform_device_register(&net2big_gpio_leds);
286 }
287
288 /****************************************************************************
289  * GPIO keys
290  ****************************************************************************/
291
292 #define NET2BIG_GPIO_PUSH_BUTTON        18
293 #define NET2BIG_GPIO_POWER_SWITCH_ON    8
294 #define NET2BIG_GPIO_POWER_SWITCH_OFF   9
295
296 #define NET2BIG_SWITCH_POWER_ON         0x1
297 #define NET2BIG_SWITCH_POWER_OFF        0x2
298
299 static struct gpio_keys_button net2big_buttons[] = {
300         {
301                 .type           = EV_SW,
302                 .code           = NET2BIG_SWITCH_POWER_OFF,
303                 .gpio           = NET2BIG_GPIO_POWER_SWITCH_OFF,
304                 .desc           = "Power rocker switch (auto|off)",
305                 .active_low     = 0,
306         },
307         {
308                 .type           = EV_SW,
309                 .code           = NET2BIG_SWITCH_POWER_ON,
310                 .gpio           = NET2BIG_GPIO_POWER_SWITCH_ON,
311                 .desc           = "Power rocker switch (on|auto)",
312                 .active_low     = 0,
313         },
314         {
315                 .type           = EV_KEY,
316                 .code           = KEY_POWER,
317                 .gpio           = NET2BIG_GPIO_PUSH_BUTTON,
318                 .desc           = "Front Push Button",
319                 .active_low     = 0,
320         },
321 };
322
323 static struct gpio_keys_platform_data net2big_button_data = {
324         .buttons        = net2big_buttons,
325         .nbuttons       = ARRAY_SIZE(net2big_buttons),
326 };
327
328 static struct platform_device net2big_gpio_buttons = {
329         .name           = "gpio-keys",
330         .id             = -1,
331         .dev            = {
332                 .platform_data  = &net2big_button_data,
333         },
334 };
335
336 /*****************************************************************************
337  * General Setup
338  ****************************************************************************/
339
340 static unsigned int net2big_mpp_modes[] __initdata = {
341         MPP0_GPIO,      /* Raid mode (bit 0) */
342         MPP1_GPIO,      /* USB port 2 fuse (0 = Fail, 1 = Ok) */
343         MPP2_GPIO,      /* Raid mode (bit 1) */
344         MPP3_GPIO,      /* Board ID (bit 0) */
345         MPP4_GPIO,      /* Fan activity (0 = Off, 1 = On) */
346         MPP5_GPIO,      /* Fan fail detection */
347         MPP6_GPIO,      /* Red front LED (0 = Off, 1 = On) */
348         MPP7_GPIO,      /* Disable initial blinking on front LED */
349         MPP8_GPIO,      /* Rear power switch (on|auto) */
350         MPP9_GPIO,      /* Rear power switch (auto|off) */
351         MPP10_GPIO,     /* SATA 1 red LED (0 = Off, 1 = On) */
352         MPP11_GPIO,     /* SATA 0 red LED (0 = Off, 1 = On) */
353         MPP12_GPIO,     /* Board ID (bit 1) */
354         MPP13_GPIO,     /* SATA 1 blue LED blink control */
355         MPP14_SATA_LED,
356         MPP15_SATA_LED,
357         MPP16_GPIO,     /* Blue front LED control */
358         MPP17_GPIO,     /* SATA 0 blue LED blink control */
359         MPP18_GPIO,     /* Front button (0 = Released, 1 = Pushed ) */
360         MPP19_GPIO,     /* SATA{0,1} power On/Off request */
361         0,
362         /* 22: USB port 1 fuse (0 = Fail, 1 = Ok) */
363         /* 23: SATA 0 power status */
364         /* 24: Board power off */
365         /* 25: SATA 1 power status */
366 };
367
368 #define NET2BIG_GPIO_POWER_OFF          24
369
370 static void net2big_power_off(void)
371 {
372         gpio_set_value(NET2BIG_GPIO_POWER_OFF, 1);
373 }
374
375 static void __init net2big_init(void)
376 {
377         /*
378          * Setup basic Orion functions. Need to be called early.
379          */
380         orion5x_init();
381
382         orion5x_mpp_conf(net2big_mpp_modes);
383
384         /*
385          * Configure peripherals.
386          */
387         orion5x_ehci0_init();
388         orion5x_ehci1_init();
389         orion5x_eth_init(&net2big_eth_data);
390         orion5x_i2c_init();
391         orion5x_uart0_init();
392         orion5x_xor_init();
393
394         net2big_sata_power_init();
395         orion5x_sata_init(&net2big_sata_data);
396
397         mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
398                                     ORION_MBUS_DEVBUS_BOOT_ATTR,
399                                     NET2BIG_NOR_BOOT_BASE,
400                                     NET2BIG_NOR_BOOT_SIZE);
401         platform_device_register(&net2big_nor_flash);
402
403         platform_device_register(&net2big_gpio_buttons);
404         net2big_gpio_leds_init();
405
406         i2c_register_board_info(0, net2big_i2c_devices,
407                                 ARRAY_SIZE(net2big_i2c_devices));
408
409         orion_gpio_set_valid(NET2BIG_GPIO_POWER_OFF, 1);
410
411         if (gpio_request(NET2BIG_GPIO_POWER_OFF, "power-off") == 0 &&
412             gpio_direction_output(NET2BIG_GPIO_POWER_OFF, 0) == 0)
413                 pm_power_off = net2big_power_off;
414         else
415                 pr_err("net2big: failed to configure power-off GPIO\n");
416
417         pr_notice("net2big: Flash writing is not yet supported.\n");
418 }
419
420 /* Warning: LaCie use a wrong mach-type (0x20e=526) in their bootloader. */
421 MACHINE_START(NET2BIG, "LaCie 2Big Network")
422         .atag_offset    = 0x100,
423         .nr_irqs        = ORION5X_NR_IRQS,
424         .init_machine   = net2big_init,
425         .map_io         = orion5x_map_io,
426         .init_early     = orion5x_init_early,
427         .init_irq       = orion5x_init_irq,
428         .init_time      = orion5x_timer_init,
429         .fixup          = tag_fixup_mem32,
430         .restart        = orion5x_restart,
431 MACHINE_END