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

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

Version: ~ [ linux-5.15-rc1 ] ~ [ linux-5.14.5 ] ~ [ linux-5.13.18 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.66 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.147 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.206 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.246 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.282 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.283 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ 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.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

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

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | 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.

osdn.jp