xref: /OK3568_Linux_fs/u-boot/board/teejet/mt_ventoux/mt_ventoux.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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