diff options
Diffstat (limited to 'arch/arm/mach-mxs/mach-mx28evk.c')
-rw-r--r-- | arch/arm/mach-mxs/mach-mx28evk.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/arch/arm/mach-mxs/mach-mx28evk.c b/arch/arm/mach-mxs/mach-mx28evk.c new file mode 100644 index 000000000000..d162e95910f3 --- /dev/null +++ b/arch/arm/mach-mxs/mach-mx28evk.c | |||
@@ -0,0 +1,138 @@ | |||
1 | /* | ||
2 | * Copyright 2010 Freescale Semiconductor, Inc. All Rights Reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | */ | ||
14 | |||
15 | #include <linux/delay.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/gpio.h> | ||
18 | #include <linux/irq.h> | ||
19 | #include <linux/clk.h> | ||
20 | |||
21 | #include <asm/mach-types.h> | ||
22 | #include <asm/mach/arch.h> | ||
23 | #include <asm/mach/time.h> | ||
24 | |||
25 | #include <mach/common.h> | ||
26 | #include <mach/iomux-mx28.h> | ||
27 | |||
28 | #include "devices-mx28.h" | ||
29 | #include "gpio.h" | ||
30 | |||
31 | #define MX28EVK_FEC_PHY_POWER MXS_GPIO_NR(2, 15) | ||
32 | #define MX28EVK_FEC_PHY_RESET MXS_GPIO_NR(4, 13) | ||
33 | |||
34 | static const iomux_cfg_t mx28evk_pads[] __initconst = { | ||
35 | /* duart */ | ||
36 | MX28_PAD_PWM0__DUART_RX | | ||
37 | (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL), | ||
38 | MX28_PAD_PWM1__DUART_TX | | ||
39 | (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL), | ||
40 | |||
41 | /* fec0 */ | ||
42 | MX28_PAD_ENET0_MDC__ENET0_MDC | | ||
43 | (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), | ||
44 | MX28_PAD_ENET0_MDIO__ENET0_MDIO | | ||
45 | (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), | ||
46 | MX28_PAD_ENET0_RX_EN__ENET0_RX_EN | | ||
47 | (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), | ||
48 | MX28_PAD_ENET0_RXD0__ENET0_RXD0 | | ||
49 | (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), | ||
50 | MX28_PAD_ENET0_RXD1__ENET0_RXD1 | | ||
51 | (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), | ||
52 | MX28_PAD_ENET0_TX_EN__ENET0_TX_EN | | ||
53 | (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), | ||
54 | MX28_PAD_ENET0_TXD0__ENET0_TXD0 | | ||
55 | (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), | ||
56 | MX28_PAD_ENET0_TXD1__ENET0_TXD1 | | ||
57 | (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), | ||
58 | MX28_PAD_ENET_CLK__CLKCTRL_ENET | | ||
59 | (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), | ||
60 | /* phy power line */ | ||
61 | MX28_PAD_SSP1_DATA3__GPIO_2_15 | | ||
62 | (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL), | ||
63 | /* phy reset line */ | ||
64 | MX28_PAD_ENET0_RX_CLK__GPIO_4_13 | | ||
65 | (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL), | ||
66 | }; | ||
67 | |||
68 | /* fec */ | ||
69 | static void __init mx28evk_fec_reset(void) | ||
70 | { | ||
71 | int ret; | ||
72 | struct clk *clk; | ||
73 | |||
74 | /* Enable fec phy clock */ | ||
75 | clk = clk_get_sys("pll2", NULL); | ||
76 | if (!IS_ERR(clk)) | ||
77 | clk_enable(clk); | ||
78 | |||
79 | /* Power up fec phy */ | ||
80 | ret = gpio_request(MX28EVK_FEC_PHY_POWER, "fec-phy-power"); | ||
81 | if (ret) { | ||
82 | pr_err("Failed to request gpio fec-phy-%s: %d\n", "power", ret); | ||
83 | return; | ||
84 | } | ||
85 | |||
86 | ret = gpio_direction_output(MX28EVK_FEC_PHY_POWER, 0); | ||
87 | if (ret) { | ||
88 | pr_err("Failed to drive gpio fec-phy-%s: %d\n", "power", ret); | ||
89 | return; | ||
90 | } | ||
91 | |||
92 | /* Reset fec phy */ | ||
93 | ret = gpio_request(MX28EVK_FEC_PHY_RESET, "fec-phy-reset"); | ||
94 | if (ret) { | ||
95 | pr_err("Failed to request gpio fec-phy-%s: %d\n", "reset", ret); | ||
96 | return; | ||
97 | } | ||
98 | |||
99 | gpio_direction_output(MX28EVK_FEC_PHY_RESET, 0); | ||
100 | if (ret) { | ||
101 | pr_err("Failed to drive gpio fec-phy-%s: %d\n", "reset", ret); | ||
102 | return; | ||
103 | } | ||
104 | |||
105 | mdelay(1); | ||
106 | gpio_set_value(MX28EVK_FEC_PHY_RESET, 1); | ||
107 | } | ||
108 | |||
109 | static const struct fec_platform_data mx28_fec_pdata __initconst = { | ||
110 | .phy = PHY_INTERFACE_MODE_RMII, | ||
111 | }; | ||
112 | |||
113 | static void __init mx28evk_init(void) | ||
114 | { | ||
115 | mxs_iomux_setup_multiple_pads(mx28evk_pads, ARRAY_SIZE(mx28evk_pads)); | ||
116 | |||
117 | mx28_add_duart(); | ||
118 | |||
119 | mx28evk_fec_reset(); | ||
120 | mx28_add_fec(0, &mx28_fec_pdata); | ||
121 | } | ||
122 | |||
123 | static void __init mx28evk_timer_init(void) | ||
124 | { | ||
125 | mx28_clocks_init(); | ||
126 | } | ||
127 | |||
128 | static struct sys_timer mx28evk_timer = { | ||
129 | .init = mx28evk_timer_init, | ||
130 | }; | ||
131 | |||
132 | MACHINE_START(MX28EVK, "Freescale MX28 EVK") | ||
133 | /* Maintainer: Freescale Semiconductor, Inc. */ | ||
134 | .map_io = mx28_map_io, | ||
135 | .init_irq = mx28_init_irq, | ||
136 | .init_machine = mx28evk_init, | ||
137 | .timer = &mx28evk_timer, | ||
138 | MACHINE_END | ||