1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (C) 2011
3*4882a593Smuzhiyun * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2009 TechNexion Ltd.
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include <common.h>
11*4882a593Smuzhiyun #include <netdev.h>
12*4882a593Smuzhiyun #include <malloc.h>
13*4882a593Smuzhiyun #include <fpga.h>
14*4882a593Smuzhiyun #include <video_fb.h>
15*4882a593Smuzhiyun #include <asm/io.h>
16*4882a593Smuzhiyun #include <asm/arch/mem.h>
17*4882a593Smuzhiyun #include <asm/arch/mux.h>
18*4882a593Smuzhiyun #include <asm/arch/sys_proto.h>
19*4882a593Smuzhiyun #include <asm/omap_gpio.h>
20*4882a593Smuzhiyun #include <asm/arch/mmc_host_def.h>
21*4882a593Smuzhiyun #include <asm/arch/dss.h>
22*4882a593Smuzhiyun #include <asm/arch/clock.h>
23*4882a593Smuzhiyun #include <i2c.h>
24*4882a593Smuzhiyun #include <spartan3.h>
25*4882a593Smuzhiyun #include <asm/gpio.h>
26*4882a593Smuzhiyun #ifdef CONFIG_USB_EHCI_HCD
27*4882a593Smuzhiyun #include <usb.h>
28*4882a593Smuzhiyun #include <asm/ehci-omap.h>
29*4882a593Smuzhiyun #endif
30*4882a593Smuzhiyun #include "mt_ventoux.h"
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #define BUZZER 140
35*4882a593Smuzhiyun #define SPEAKER 141
36*4882a593Smuzhiyun #define USB1_PWR 127
37*4882a593Smuzhiyun #define USB2_PWR 149
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun #ifndef CONFIG_FPGA
40*4882a593Smuzhiyun #error "The Teejet mt_ventoux must have CONFIG_FPGA enabled"
41*4882a593Smuzhiyun #endif
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun #define FPGA_RESET 62
44*4882a593Smuzhiyun #define FPGA_PROG 116
45*4882a593Smuzhiyun #define FPGA_CCLK 117
46*4882a593Smuzhiyun #define FPGA_DIN 118
47*4882a593Smuzhiyun #define FPGA_INIT 119
48*4882a593Smuzhiyun #define FPGA_DONE 154
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun #define LCD_PWR 138
51*4882a593Smuzhiyun #define LCD_PON_PIN 139
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun #if defined(CONFIG_VIDEO) && !defined(CONFIG_SPL_BUILD)
54*4882a593Smuzhiyun static struct {
55*4882a593Smuzhiyun u32 xres;
56*4882a593Smuzhiyun u32 yres;
57*4882a593Smuzhiyun } panel_resolution[] = {
58*4882a593Smuzhiyun { 480, 272 },
59*4882a593Smuzhiyun { 800, 480 }
60*4882a593Smuzhiyun };
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun static struct panel_config lcd_cfg[] = {
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun .timing_h = PANEL_TIMING_H(40, 5, 2),
65*4882a593Smuzhiyun .timing_v = PANEL_TIMING_V(8, 8, 2),
66*4882a593Smuzhiyun .pol_freq = 0x00003000, /* Pol Freq */
67*4882a593Smuzhiyun .divisor = 0x00010033, /* 9 Mhz Pixel Clock */
68*4882a593Smuzhiyun .panel_type = 0x01, /* TFT */
69*4882a593Smuzhiyun .data_lines = 0x03, /* 24 Bit RGB */
70*4882a593Smuzhiyun .load_mode = 0x02, /* Frame Mode */
71*4882a593Smuzhiyun .panel_color = 0,
72*4882a593Smuzhiyun .gfx_format = GFXFORMAT_RGB24_UNPACKED,
73*4882a593Smuzhiyun },
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun .timing_h = PANEL_TIMING_H(20, 192, 4),
76*4882a593Smuzhiyun .timing_v = PANEL_TIMING_V(2, 20, 10),
77*4882a593Smuzhiyun .pol_freq = 0x00004000, /* Pol Freq */
78*4882a593Smuzhiyun .divisor = 0x0001000E, /* 36Mhz Pixel Clock */
79*4882a593Smuzhiyun .panel_type = 0x01, /* TFT */
80*4882a593Smuzhiyun .data_lines = 0x03, /* 24 Bit RGB */
81*4882a593Smuzhiyun .load_mode = 0x02, /* Frame Mode */
82*4882a593Smuzhiyun .panel_color = 0,
83*4882a593Smuzhiyun .gfx_format = GFXFORMAT_RGB24_UNPACKED,
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun #endif
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun /* Timing definitions for FPGA */
89*4882a593Smuzhiyun static const u32 gpmc_fpga[] = {
90*4882a593Smuzhiyun FPGA_GPMC_CONFIG1,
91*4882a593Smuzhiyun FPGA_GPMC_CONFIG2,
92*4882a593Smuzhiyun FPGA_GPMC_CONFIG3,
93*4882a593Smuzhiyun FPGA_GPMC_CONFIG4,
94*4882a593Smuzhiyun FPGA_GPMC_CONFIG5,
95*4882a593Smuzhiyun FPGA_GPMC_CONFIG6,
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun #ifdef CONFIG_USB_EHCI_HCD
99*4882a593Smuzhiyun static struct omap_usbhs_board_data usbhs_bdata = {
100*4882a593Smuzhiyun .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
101*4882a593Smuzhiyun .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
102*4882a593Smuzhiyun .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun
ehci_hcd_init(int index,enum usb_init_type init,struct ehci_hccr ** hccr,struct ehci_hcor ** hcor)105*4882a593Smuzhiyun int ehci_hcd_init(int index, enum usb_init_type init,
106*4882a593Smuzhiyun struct ehci_hccr **hccr, struct ehci_hcor **hcor)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun
ehci_hcd_stop(int index)111*4882a593Smuzhiyun int ehci_hcd_stop(int index)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun return omap_ehci_hcd_stop();
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun #endif
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun
fpga_reset(int nassert)118*4882a593Smuzhiyun static inline void fpga_reset(int nassert)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun gpio_set_value(FPGA_RESET, !nassert);
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun
fpga_pgm_fn(int nassert,int nflush,int cookie)123*4882a593Smuzhiyun int fpga_pgm_fn(int nassert, int nflush, int cookie)
124*4882a593Smuzhiyun {
125*4882a593Smuzhiyun debug("%s:%d: FPGA PROGRAM ", __func__, __LINE__);
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun gpio_set_value(FPGA_PROG, !nassert);
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun return nassert;
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun
fpga_init_fn(int cookie)132*4882a593Smuzhiyun int fpga_init_fn(int cookie)
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun return !gpio_get_value(FPGA_INIT);
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun
fpga_done_fn(int cookie)137*4882a593Smuzhiyun int fpga_done_fn(int cookie)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun return gpio_get_value(FPGA_DONE);
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun
fpga_pre_config_fn(int cookie)142*4882a593Smuzhiyun int fpga_pre_config_fn(int cookie)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun debug("%s:%d: FPGA pre-configuration\n", __func__, __LINE__);
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun /* Setting GPIOs for programming Mode */
147*4882a593Smuzhiyun gpio_request(FPGA_RESET, "FPGA_RESET");
148*4882a593Smuzhiyun gpio_direction_output(FPGA_RESET, 1);
149*4882a593Smuzhiyun gpio_request(FPGA_PROG, "FPGA_PROG");
150*4882a593Smuzhiyun gpio_direction_output(FPGA_PROG, 1);
151*4882a593Smuzhiyun gpio_request(FPGA_CCLK, "FPGA_CCLK");
152*4882a593Smuzhiyun gpio_direction_output(FPGA_CCLK, 1);
153*4882a593Smuzhiyun gpio_request(FPGA_DIN, "FPGA_DIN");
154*4882a593Smuzhiyun gpio_direction_output(FPGA_DIN, 0);
155*4882a593Smuzhiyun gpio_request(FPGA_INIT, "FPGA_INIT");
156*4882a593Smuzhiyun gpio_direction_input(FPGA_INIT);
157*4882a593Smuzhiyun gpio_request(FPGA_DONE, "FPGA_DONE");
158*4882a593Smuzhiyun gpio_direction_input(FPGA_DONE);
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun /* Be sure that signal are deasserted */
161*4882a593Smuzhiyun gpio_set_value(FPGA_RESET, 1);
162*4882a593Smuzhiyun gpio_set_value(FPGA_PROG, 1);
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun return 0;
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun
fpga_post_config_fn(int cookie)167*4882a593Smuzhiyun int fpga_post_config_fn(int cookie)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun debug("%s:%d: FPGA post-configuration\n", __func__, __LINE__);
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun fpga_reset(true);
172*4882a593Smuzhiyun udelay(100);
173*4882a593Smuzhiyun fpga_reset(false);
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun return 0;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun /* Write program to the FPGA */
fpga_wr_fn(int nassert_write,int flush,int cookie)179*4882a593Smuzhiyun int fpga_wr_fn(int nassert_write, int flush, int cookie)
180*4882a593Smuzhiyun {
181*4882a593Smuzhiyun gpio_set_value(FPGA_DIN, nassert_write);
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun return nassert_write;
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun
fpga_clk_fn(int assert_clk,int flush,int cookie)186*4882a593Smuzhiyun int fpga_clk_fn(int assert_clk, int flush, int cookie)
187*4882a593Smuzhiyun {
188*4882a593Smuzhiyun gpio_set_value(FPGA_CCLK, assert_clk);
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun return assert_clk;
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun xilinx_spartan3_slave_serial_fns mt_ventoux_fpga_fns = {
194*4882a593Smuzhiyun fpga_pre_config_fn,
195*4882a593Smuzhiyun fpga_pgm_fn,
196*4882a593Smuzhiyun fpga_clk_fn,
197*4882a593Smuzhiyun fpga_init_fn,
198*4882a593Smuzhiyun fpga_done_fn,
199*4882a593Smuzhiyun fpga_wr_fn,
200*4882a593Smuzhiyun fpga_post_config_fn,
201*4882a593Smuzhiyun };
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun xilinx_desc fpga = XILINX_XC6SLX4_DESC(slave_serial,
204*4882a593Smuzhiyun (void *)&mt_ventoux_fpga_fns, 0);
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun /* Initialize the FPGA */
mt_ventoux_init_fpga(void)207*4882a593Smuzhiyun static void mt_ventoux_init_fpga(void)
208*4882a593Smuzhiyun {
209*4882a593Smuzhiyun fpga_pre_config_fn(0);
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun /* Setting CS1 for FPGA access */
212*4882a593Smuzhiyun enable_gpmc_cs_config(gpmc_fpga, &gpmc_cfg->cs[1],
213*4882a593Smuzhiyun FPGA_BASE_ADDR, GPMC_SIZE_128M);
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun fpga_init();
216*4882a593Smuzhiyun fpga_add(fpga_xilinx, &fpga);
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun /*
220*4882a593Smuzhiyun * Routine: board_init
221*4882a593Smuzhiyun * Description: Early hardware init.
222*4882a593Smuzhiyun */
board_init(void)223*4882a593Smuzhiyun int board_init(void)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun /* boot param addr */
228*4882a593Smuzhiyun gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun mt_ventoux_init_fpga();
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun /* GPIO_140: speaker #mute */
233*4882a593Smuzhiyun MUX_VAL(CP(MCBSP3_DX), (IEN | PTU | EN | M4))
234*4882a593Smuzhiyun /* GPIO_141: Buzz Hi */
235*4882a593Smuzhiyun MUX_VAL(CP(MCBSP3_DR), (IEN | PTU | EN | M4))
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun /* Turning off the buzzer */
238*4882a593Smuzhiyun gpio_request(BUZZER, "BUZZER_MUTE");
239*4882a593Smuzhiyun gpio_request(SPEAKER, "SPEAKER");
240*4882a593Smuzhiyun gpio_direction_output(BUZZER, 0);
241*4882a593Smuzhiyun gpio_direction_output(SPEAKER, 0);
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun /* Activate USB power */
244*4882a593Smuzhiyun gpio_request(USB1_PWR, "USB1_PWR");
245*4882a593Smuzhiyun gpio_request(USB2_PWR, "USB2_PWR");
246*4882a593Smuzhiyun gpio_direction_output(USB1_PWR, 1);
247*4882a593Smuzhiyun gpio_direction_output(USB2_PWR, 1);
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun return 0;
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun #ifndef CONFIG_SPL_BUILD
misc_init_r(void)253*4882a593Smuzhiyun int misc_init_r(void)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun char *eth_addr;
256*4882a593Smuzhiyun struct tam3517_module_info info;
257*4882a593Smuzhiyun int ret;
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun TAM3517_READ_EEPROM(&info, ret);
260*4882a593Smuzhiyun omap_die_id_display();
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun if (ret)
263*4882a593Smuzhiyun return 0;
264*4882a593Smuzhiyun eth_addr = env_get("ethaddr");
265*4882a593Smuzhiyun if (!eth_addr)
266*4882a593Smuzhiyun TAM3517_READ_MAC_FROM_EEPROM(&info);
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun TAM3517_PRINT_SOM_INFO(&info);
269*4882a593Smuzhiyun return 0;
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun #endif
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun /*
274*4882a593Smuzhiyun * Routine: set_muxconf_regs
275*4882a593Smuzhiyun * Description: Setting up the configuration Mux registers specific to the
276*4882a593Smuzhiyun * hardware. Many pins need to be moved from protect to primary
277*4882a593Smuzhiyun * mode.
278*4882a593Smuzhiyun */
set_muxconf_regs(void)279*4882a593Smuzhiyun void set_muxconf_regs(void)
280*4882a593Smuzhiyun {
281*4882a593Smuzhiyun MUX_MT_VENTOUX();
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun /*
285*4882a593Smuzhiyun * Initializes on-chip ethernet controllers.
286*4882a593Smuzhiyun * to override, implement board_eth_init()
287*4882a593Smuzhiyun */
board_eth_init(bd_t * bis)288*4882a593Smuzhiyun int board_eth_init(bd_t *bis)
289*4882a593Smuzhiyun {
290*4882a593Smuzhiyun davinci_emac_initialize();
291*4882a593Smuzhiyun return 0;
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun #if defined(CONFIG_MMC_OMAP_HS) && \
295*4882a593Smuzhiyun !defined(CONFIG_SPL_BUILD)
board_mmc_init(bd_t * bis)296*4882a593Smuzhiyun int board_mmc_init(bd_t *bis)
297*4882a593Smuzhiyun {
298*4882a593Smuzhiyun return omap_mmc_init(0, 0, 0, -1, -1);
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun #endif
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun #if defined(CONFIG_VIDEO) && !defined(CONFIG_SPL_BUILD)
board_video_init(void)303*4882a593Smuzhiyun int board_video_init(void)
304*4882a593Smuzhiyun {
305*4882a593Smuzhiyun struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
306*4882a593Smuzhiyun struct panel_config *panel = &lcd_cfg[0];
307*4882a593Smuzhiyun char *s;
308*4882a593Smuzhiyun u32 index = 0;
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun void *fb;
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun fb = (void *)0x88000000;
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun s = env_get("panel");
315*4882a593Smuzhiyun if (s) {
316*4882a593Smuzhiyun index = simple_strtoul(s, NULL, 10);
317*4882a593Smuzhiyun if (index < ARRAY_SIZE(lcd_cfg))
318*4882a593Smuzhiyun panel = &lcd_cfg[index];
319*4882a593Smuzhiyun else
320*4882a593Smuzhiyun return 0;
321*4882a593Smuzhiyun }
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun panel->frame_buffer = fb;
324*4882a593Smuzhiyun printf("Panel: %dx%d\n", panel_resolution[index].xres,
325*4882a593Smuzhiyun panel_resolution[index].yres);
326*4882a593Smuzhiyun panel->lcd_size = (panel_resolution[index].yres - 1) << 16 |
327*4882a593Smuzhiyun (panel_resolution[index].xres - 1);
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun gpio_request(LCD_PWR, "LCD Power");
330*4882a593Smuzhiyun gpio_request(LCD_PON_PIN, "LCD Pon");
331*4882a593Smuzhiyun gpio_direction_output(LCD_PWR, 0);
332*4882a593Smuzhiyun gpio_direction_output(LCD_PON_PIN, 1);
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun setbits_le32(&prcm_base->fclken_dss, FCK_DSS_ON);
336*4882a593Smuzhiyun setbits_le32(&prcm_base->iclken_dss, ICK_DSS_ON);
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun omap3_dss_panel_config(panel);
339*4882a593Smuzhiyun omap3_dss_enable();
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun return 0;
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun #endif
344