~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arm/mach-orion5x/net2big-setup.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php