b52edf0f6718c0d297653d096af959e57c55b6bf
[openwrt/staging/yousong.git] / target / linux / adm5120 / files / arch / mips / adm5120 / infineon / infineon.c
1 /*
2 * Infineon Reference Boards
3 *
4 * Copyright (C) 2007-2008 Gabor Juhos <juhosg@openwrt.org>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published
8 * by the Free Software Foundation.
9 *
10 */
11
12 #include "infineon.h"
13
14 #include <prom/admboot.h>
15
16 #define EASY_CONFIG_OFFSET 0x10000
17 #define EASY_CONFIG_SIZE 0x1000
18
19 #ifdef CONFIG_MTD_PARTITIONS
20 static struct mtd_partition easy_partitions[] = {
21 {
22 .name = "admboot",
23 .offset = 0,
24 .size = 64*1024,
25 .mask_flags = MTD_WRITEABLE,
26 } , {
27 .name = "boardcfg",
28 .offset = MTDPART_OFS_APPEND,
29 .size = 64*1024,
30 } , {
31 .name = "firmware",
32 .offset = MTDPART_OFS_APPEND,
33 .size = MTDPART_SIZ_FULL,
34 }
35 };
36 #endif /* CONFIG_MTD_PARTITIONS */
37
38 static __init void easy_setup_mac(void)
39 {
40 u8 mac_base[6];
41 int err;
42
43 err = admboot_get_mac_base(EASY_CONFIG_OFFSET,
44 EASY_CONFIG_SIZE, mac_base);
45
46 if ((err) || !is_valid_ether_addr(mac_base))
47 random_ether_addr(mac_base);
48
49 adm5120_setup_eth_macs(mac_base);
50 }
51
52 static void switch_bank_gpio3(unsigned bank)
53 {
54 switch (bank) {
55 case 0:
56 gpio_set_value(ADM5120_GPIO_PIN3, 0);
57 break;
58 case 1:
59 gpio_set_value(ADM5120_GPIO_PIN3, 1);
60 break;
61 }
62 }
63
64 void __init easy_setup_pqfp(void)
65 {
66 /* setup flash A20 line */
67 gpio_request(ADM5120_GPIO_PIN3, NULL);
68 gpio_direction_output(ADM5120_GPIO_PIN3, 0);
69 adm5120_flash0_data.switch_bank = switch_bank_gpio3;
70
71 #ifdef CONFIG_MTD_PARTITIONS
72 adm5120_flash0_data.nr_parts = ARRAY_SIZE(easy_partitions);
73 adm5120_flash0_data.parts = easy_partitions;
74 #endif /* CONFIG_MTD_PARTITIONS */
75
76 adm5120_add_device_uart(0);
77 adm5120_add_device_uart(1);
78
79 adm5120_add_device_flash(0);
80
81 easy_setup_mac();
82 }
83
84 static void switch_bank_gpio5(unsigned bank)
85 {
86 switch (bank) {
87 case 0:
88 gpio_set_value(ADM5120_GPIO_PIN5, 0);
89 break;
90 case 1:
91 gpio_set_value(ADM5120_GPIO_PIN5, 1);
92 break;
93 }
94 }
95
96 void __init easy_setup_bga(void)
97 {
98 /* setup flash A20 line */
99 gpio_request(ADM5120_GPIO_PIN5, NULL);
100 gpio_direction_output(ADM5120_GPIO_PIN5, 0);
101 adm5120_flash0_data.switch_bank = switch_bank_gpio5;
102
103 #ifdef CONFIG_MTD_PARTITIONS
104 adm5120_flash0_data.nr_parts = ARRAY_SIZE(easy_partitions);
105 adm5120_flash0_data.parts = easy_partitions;
106 #endif /* CONFIG_MTD_PARTITIONS */
107
108 adm5120_add_device_uart(0);
109 adm5120_add_device_uart(1);
110
111 adm5120_add_device_flash(0);
112
113 easy_setup_mac();
114 }