Merge tag 'v3.11' into next
[platform/adaptation/renesas_rcar/renesas_kernel.git] / arch / arm / mach-shmobile / board-armadillo800eva-reference.c
1 /*
2  * armadillo 800 eva board support
3  *
4  * Copyright (C) 2012 Renesas Solutions Corp.
5  * Copyright (C) 2012 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; version 2 of the License.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  */
21
22 #include <linux/clk.h>
23 #include <linux/err.h>
24 #include <linux/kernel.h>
25 #include <linux/gpio.h>
26 #include <linux/io.h>
27 #include <linux/pinctrl/machine.h>
28 #include <mach/common.h>
29 #include <mach/r8a7740.h>
30 #include <asm/mach/arch.h>
31 #include <asm/hardware/cache-l2x0.h>
32
33 /*
34  * CON1         Camera Module
35  * CON2         Extension Bus
36  * CON3         HDMI Output
37  * CON4         Composite Video Output
38  * CON5         H-UDI JTAG
39  * CON6         ARM JTAG
40  * CON7         SD1
41  * CON8         SD2
42  * CON9         RTC BackUp
43  * CON10        Monaural Mic Input
44  * CON11        Stereo Headphone Output
45  * CON12        Audio Line Output(L)
46  * CON13        Audio Line Output(R)
47  * CON14        AWL13 Module
48  * CON15        Extension
49  * CON16        LCD1
50  * CON17        LCD2
51  * CON19        Power Input
52  * CON20        USB1
53  * CON21        USB2
54  * CON22        Serial
55  * CON23        LAN
56  * CON24        USB3
57  * LED1         Camera LED(Yellow)
58  * LED2         Power LED (Green)
59  * ED3-LED6     User LED(Yellow)
60  * LED7         LAN link LED(Green)
61  * LED8         LAN activity LED(Yellow)
62  */
63
64 /*
65  * DipSwitch
66  *
67  *                    SW1
68  *
69  * -12345678-+---------------+----------------------------
70  *  1        | boot          | hermit
71  *  0        | boot          | OS auto boot
72  * -12345678-+---------------+----------------------------
73  *   00      | boot device   | eMMC
74  *   10      | boot device   | SDHI0 (CON7)
75  *   01      | boot device   | -
76  *   11      | boot device   | Extension Buss (CS0)
77  * -12345678-+---------------+----------------------------
78  *     0     | Extension Bus | D8-D15 disable, eMMC enable
79  *     1     | Extension Bus | D8-D15 enable,  eMMC disable
80  * -12345678-+---------------+----------------------------
81  *      0    | SDHI1         | COM8 disable, COM14 enable
82  *      1    | SDHI1         | COM8 enable,  COM14 disable
83  * -12345678-+---------------+----------------------------
84  *       0   | USB0          | COM20 enable,  COM24 disable
85  *       1   | USB0          | COM20 disable, COM24 enable
86  * -12345678-+---------------+----------------------------
87  *        00 | JTAG          | SH-X2
88  *        10 | JTAG          | ARM
89  *        01 | JTAG          | -
90  *        11 | JTAG          | Boundary Scan
91  *-----------+---------------+----------------------------
92  */
93
94 /*
95  * FSI-WM8978
96  *
97  * this command is required when playback.
98  *
99  * # amixer set "Headphone" 50
100  *
101  * this command is required when capture.
102  *
103  * # amixer set "Input PGA" 15
104  * # amixer set "Left Input Mixer MicP" on
105  * # amixer set "Left Input Mixer MicN" on
106  * # amixer set "Right Input Mixer MicN" on
107  * # amixer set "Right Input Mixer MicP" on
108  */
109
110 /*
111  * USB function
112  *
113  * When you use USB Function,
114  * set SW1.6 ON, and connect cable to CN24.
115  *
116  * USBF needs workaround on R8A7740 chip.
117  * These are a little bit complex.
118  * see
119  *      usbhsf_power_ctrl()
120  */
121
122 static const struct pinctrl_map eva_pinctrl_map[] = {
123         /* SCIFA1 */
124         PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.1", "pfc-r8a7740",
125                                   "scifa1_data", "scifa1"),
126 };
127
128 static void __init eva_clock_init(void)
129 {
130         struct clk *system      = clk_get(NULL, "system_clk");
131         struct clk *xtal1       = clk_get(NULL, "extal1");
132         struct clk *usb24s      = clk_get(NULL, "usb24s");
133         struct clk *fsibck      = clk_get(NULL, "fsibck");
134
135         if (IS_ERR(system)      ||
136             IS_ERR(xtal1)       ||
137             IS_ERR(usb24s)      ||
138             IS_ERR(fsibck)) {
139                 pr_err("armadillo800eva board clock init failed\n");
140                 goto clock_error;
141         }
142
143         /* armadillo 800 eva extal1 is 24MHz */
144         clk_set_rate(xtal1, 24000000);
145
146         /* usb24s use extal1 (= system) clock (= 24MHz) */
147         clk_set_parent(usb24s, system);
148
149         /* FSIBCK is 12.288MHz, and it is parent of FSI-B */
150         clk_set_rate(fsibck, 12288000);
151
152 clock_error:
153         if (!IS_ERR(system))
154                 clk_put(system);
155         if (!IS_ERR(xtal1))
156                 clk_put(xtal1);
157         if (!IS_ERR(usb24s))
158                 clk_put(usb24s);
159         if (!IS_ERR(fsibck))
160                 clk_put(fsibck);
161 }
162
163 /*
164  * board init
165  */
166 static void __init eva_init(void)
167 {
168
169         r8a7740_clock_init(MD_CK0 | MD_CK2);
170         eva_clock_init();
171
172         pinctrl_register_mappings(eva_pinctrl_map, ARRAY_SIZE(eva_pinctrl_map));
173         r8a7740_pinmux_init();
174
175         r8a7740_meram_workaround();
176
177         /*
178          * Touchscreen
179          * TODO: Move reset GPIO over to .dts when we can reference it
180          */
181         gpio_request_one(166, GPIOF_OUT_INIT_HIGH, NULL); /* TP_RST_B */
182
183 #ifdef CONFIG_CACHE_L2X0
184         /* Early BRESP enable, Shared attribute override enable, 32K*8way */
185         l2x0_init(IOMEM(0xf0002000), 0x40440000, 0x82000fff);
186 #endif
187
188         r8a7740_add_standard_devices_dt();
189         r8a7740_pm_init();
190 }
191
192 #define RESCNT2 IOMEM(0xe6188020)
193 static void eva_restart(char mode, const char *cmd)
194 {
195         /* Do soft power on reset */
196         writel((1 << 31), RESCNT2);
197 }
198
199 static const char *eva_boards_compat_dt[] __initdata = {
200         "renesas,armadillo800eva-reference",
201         NULL,
202 };
203
204 DT_MACHINE_START(ARMADILLO800EVA_DT, "armadillo800eva-reference")
205         .map_io         = r8a7740_map_io,
206         .init_early     = r8a7740_init_delay,
207         .init_irq       = r8a7740_init_irq_of,
208         .init_machine   = eva_init,
209         .init_time      = shmobile_timer_init,
210         .init_late      = shmobile_init_late,
211         .dt_compat      = eva_boards_compat_dt,
212         .restart        = eva_restart,
213 MACHINE_END