xref: /OK3568_Linux_fs/u-boot/board/siemens/rut/board.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Board functions for TI AM335X based rut board
3*4882a593Smuzhiyun  * (C) Copyright 2013 Siemens Schweiz AG
4*4882a593Smuzhiyun  * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Based on:
7*4882a593Smuzhiyun  * u-boot:/board/ti/am335x/board.c
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
12*4882a593Smuzhiyun  */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <common.h>
15*4882a593Smuzhiyun #include <errno.h>
16*4882a593Smuzhiyun #include <spi.h>
17*4882a593Smuzhiyun #include <spl.h>
18*4882a593Smuzhiyun #include <asm/arch/cpu.h>
19*4882a593Smuzhiyun #include <asm/arch/hardware.h>
20*4882a593Smuzhiyun #include <asm/arch/omap.h>
21*4882a593Smuzhiyun #include <asm/arch/ddr_defs.h>
22*4882a593Smuzhiyun #include <asm/arch/clock.h>
23*4882a593Smuzhiyun #include <asm/arch/gpio.h>
24*4882a593Smuzhiyun #include <asm/arch/mmc_host_def.h>
25*4882a593Smuzhiyun #include <asm/arch/sys_proto.h>
26*4882a593Smuzhiyun #include <asm/io.h>
27*4882a593Smuzhiyun #include <asm/emif.h>
28*4882a593Smuzhiyun #include <asm/gpio.h>
29*4882a593Smuzhiyun #include <i2c.h>
30*4882a593Smuzhiyun #include <miiphy.h>
31*4882a593Smuzhiyun #include <cpsw.h>
32*4882a593Smuzhiyun #include <video.h>
33*4882a593Smuzhiyun #include <watchdog.h>
34*4882a593Smuzhiyun #include "board.h"
35*4882a593Smuzhiyun #include "../common/factoryset.h"
36*4882a593Smuzhiyun #include "../../../drivers/video/da8xx-fb.h"
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /*
41*4882a593Smuzhiyun  * Read header information from EEPROM into global structure.
42*4882a593Smuzhiyun  */
read_eeprom(void)43*4882a593Smuzhiyun static int read_eeprom(void)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun 	return 0;
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #ifdef CONFIG_SPL_BUILD
board_init_ddr(void)49*4882a593Smuzhiyun static void board_init_ddr(void)
50*4882a593Smuzhiyun {
51*4882a593Smuzhiyun struct emif_regs rut_ddr3_emif_reg_data = {
52*4882a593Smuzhiyun 	.sdram_config = 0x61C04AB2,
53*4882a593Smuzhiyun 	.sdram_tim1 = 0x0888A39B,
54*4882a593Smuzhiyun 	.sdram_tim2 = 0x26337FDA,
55*4882a593Smuzhiyun 	.sdram_tim3 = 0x501F830F,
56*4882a593Smuzhiyun 	.emif_ddr_phy_ctlr_1 = 0x6,
57*4882a593Smuzhiyun 	.zq_config = 0x50074BE4,
58*4882a593Smuzhiyun 	.ref_ctrl = 0x93B,
59*4882a593Smuzhiyun };
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun struct ddr_data rut_ddr3_data = {
62*4882a593Smuzhiyun 	.datardsratio0 = 0x3b,
63*4882a593Smuzhiyun 	.datawdsratio0 = 0x85,
64*4882a593Smuzhiyun 	.datafwsratio0 = 0x100,
65*4882a593Smuzhiyun 	.datawrsratio0 = 0xc1,
66*4882a593Smuzhiyun };
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun struct cmd_control rut_ddr3_cmd_ctrl_data = {
69*4882a593Smuzhiyun 	.cmd0csratio = 0x40,
70*4882a593Smuzhiyun 	.cmd0iclkout = 1,
71*4882a593Smuzhiyun 	.cmd1csratio = 0x40,
72*4882a593Smuzhiyun 	.cmd1iclkout = 1,
73*4882a593Smuzhiyun 	.cmd2csratio = 0x40,
74*4882a593Smuzhiyun 	.cmd2iclkout = 1,
75*4882a593Smuzhiyun };
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun const struct ctrl_ioregs ioregs = {
78*4882a593Smuzhiyun 	.cm0ioctl		= RUT_IOCTRL_VAL,
79*4882a593Smuzhiyun 	.cm1ioctl		= RUT_IOCTRL_VAL,
80*4882a593Smuzhiyun 	.cm2ioctl		= RUT_IOCTRL_VAL,
81*4882a593Smuzhiyun 	.dt0ioctl		= RUT_IOCTRL_VAL,
82*4882a593Smuzhiyun 	.dt1ioctl		= RUT_IOCTRL_VAL,
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 	config_ddr(DDR_PLL_FREQ, &ioregs, &rut_ddr3_data,
86*4882a593Smuzhiyun 		   &rut_ddr3_cmd_ctrl_data, &rut_ddr3_emif_reg_data, 0);
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun 
request_and_pulse_reset(int gpio,const char * name)89*4882a593Smuzhiyun static int request_and_pulse_reset(int gpio, const char *name)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun 	int ret;
92*4882a593Smuzhiyun 	const int delay_us = 2000; /* 2ms */
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	ret = gpio_request(gpio, name);
95*4882a593Smuzhiyun 	if (ret < 0) {
96*4882a593Smuzhiyun 		printf("%s: Unable to request %s\n", __func__, name);
97*4882a593Smuzhiyun 		goto err;
98*4882a593Smuzhiyun 	}
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	ret = gpio_direction_output(gpio, 0);
101*4882a593Smuzhiyun 	if (ret < 0) {
102*4882a593Smuzhiyun 		printf("%s: Unable to set %s  as output\n", __func__, name);
103*4882a593Smuzhiyun 		goto err_free_gpio;
104*4882a593Smuzhiyun 	}
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	udelay(delay_us);
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	gpio_set_value(gpio, 1);
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun 	return 0;
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun err_free_gpio:
113*4882a593Smuzhiyun 	gpio_free(gpio);
114*4882a593Smuzhiyun err:
115*4882a593Smuzhiyun 	return ret;
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun #define GPIO_TO_PIN(bank, gpio)		(32 * (bank) + (gpio))
119*4882a593Smuzhiyun #define ETH_PHY_RESET_GPIO		GPIO_TO_PIN(2, 18)
120*4882a593Smuzhiyun #define MAXTOUCH_RESET_GPIO		GPIO_TO_PIN(3, 18)
121*4882a593Smuzhiyun #define DISPLAY_RESET_GPIO		GPIO_TO_PIN(3, 19)
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun #define REQUEST_AND_PULSE_RESET(N) \
124*4882a593Smuzhiyun 		request_and_pulse_reset(N, #N);
125*4882a593Smuzhiyun 
spl_siemens_board_init(void)126*4882a593Smuzhiyun static void spl_siemens_board_init(void)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun 	REQUEST_AND_PULSE_RESET(ETH_PHY_RESET_GPIO);
129*4882a593Smuzhiyun 	REQUEST_AND_PULSE_RESET(MAXTOUCH_RESET_GPIO);
130*4882a593Smuzhiyun 	REQUEST_AND_PULSE_RESET(DISPLAY_RESET_GPIO);
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun #endif /* if def CONFIG_SPL_BUILD */
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #if defined(CONFIG_DRIVER_TI_CPSW)
cpsw_control(int enabled)135*4882a593Smuzhiyun static void cpsw_control(int enabled)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun 	/* VTP can be added here */
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 	return;
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun static struct cpsw_slave_data cpsw_slaves[] = {
143*4882a593Smuzhiyun 	{
144*4882a593Smuzhiyun 		.slave_reg_ofs	= 0x208,
145*4882a593Smuzhiyun 		.sliver_reg_ofs	= 0xd80,
146*4882a593Smuzhiyun 		.phy_addr	= 1,
147*4882a593Smuzhiyun 		.phy_if		= PHY_INTERFACE_MODE_RMII,
148*4882a593Smuzhiyun 	},
149*4882a593Smuzhiyun 	{
150*4882a593Smuzhiyun 		.slave_reg_ofs	= 0x308,
151*4882a593Smuzhiyun 		.sliver_reg_ofs	= 0xdc0,
152*4882a593Smuzhiyun 		.phy_addr	= 0,
153*4882a593Smuzhiyun 		.phy_if		= PHY_INTERFACE_MODE_RMII,
154*4882a593Smuzhiyun 	},
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun static struct cpsw_platform_data cpsw_data = {
158*4882a593Smuzhiyun 	.mdio_base		= CPSW_MDIO_BASE,
159*4882a593Smuzhiyun 	.cpsw_base		= CPSW_BASE,
160*4882a593Smuzhiyun 	.mdio_div		= 0xff,
161*4882a593Smuzhiyun 	.channels		= 8,
162*4882a593Smuzhiyun 	.cpdma_reg_ofs		= 0x800,
163*4882a593Smuzhiyun 	.slaves			= 1,
164*4882a593Smuzhiyun 	.slave_data		= cpsw_slaves,
165*4882a593Smuzhiyun 	.ale_reg_ofs		= 0xd00,
166*4882a593Smuzhiyun 	.ale_entries		= 1024,
167*4882a593Smuzhiyun 	.host_port_reg_ofs	= 0x108,
168*4882a593Smuzhiyun 	.hw_stats_reg_ofs	= 0x900,
169*4882a593Smuzhiyun 	.bd_ram_ofs		= 0x2000,
170*4882a593Smuzhiyun 	.mac_control		= (1 << 5),
171*4882a593Smuzhiyun 	.control		= cpsw_control,
172*4882a593Smuzhiyun 	.host_port_num		= 0,
173*4882a593Smuzhiyun 	.version		= CPSW_CTRL_VERSION_2,
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun #if defined(CONFIG_DRIVER_TI_CPSW) || \
177*4882a593Smuzhiyun 	(defined(CONFIG_USB_ETHER) && defined(CONFIG_USB_MUSB_GADGET))
board_eth_init(bd_t * bis)178*4882a593Smuzhiyun int board_eth_init(bd_t *bis)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun 	struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
181*4882a593Smuzhiyun 	int n = 0;
182*4882a593Smuzhiyun 	int rv;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun #ifndef CONFIG_SPL_BUILD
185*4882a593Smuzhiyun 	factoryset_env_set();
186*4882a593Smuzhiyun #endif
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	/* Set rgmii mode and enable rmii clock to be sourced from chip */
189*4882a593Smuzhiyun 	writel((RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE), &cdev->miisel);
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 	rv = cpsw_register(&cpsw_data);
192*4882a593Smuzhiyun 	if (rv < 0)
193*4882a593Smuzhiyun 		printf("Error %d registering CPSW switch\n", rv);
194*4882a593Smuzhiyun 	else
195*4882a593Smuzhiyun 		n += rv;
196*4882a593Smuzhiyun 	return n;
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun #endif /* #if defined(CONFIG_DRIVER_TI_CPSW) */
199*4882a593Smuzhiyun #endif /* #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) */
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun #if defined(CONFIG_HW_WATCHDOG)
202*4882a593Smuzhiyun static bool hw_watchdog_init_done;
203*4882a593Smuzhiyun static int  hw_watchdog_trigger_level;
204*4882a593Smuzhiyun 
hw_watchdog_reset(void)205*4882a593Smuzhiyun void hw_watchdog_reset(void)
206*4882a593Smuzhiyun {
207*4882a593Smuzhiyun 	if (!hw_watchdog_init_done)
208*4882a593Smuzhiyun 		return;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	hw_watchdog_trigger_level = hw_watchdog_trigger_level ? 0 : 1;
211*4882a593Smuzhiyun 	gpio_set_value(WATCHDOG_TRIGGER_GPIO, hw_watchdog_trigger_level);
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun 
hw_watchdog_init(void)214*4882a593Smuzhiyun void hw_watchdog_init(void)
215*4882a593Smuzhiyun {
216*4882a593Smuzhiyun 	gpio_request(WATCHDOG_TRIGGER_GPIO, "watchdog_trigger");
217*4882a593Smuzhiyun 	gpio_direction_output(WATCHDOG_TRIGGER_GPIO, hw_watchdog_trigger_level);
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	hw_watchdog_reset();
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	hw_watchdog_init_done = 1;
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun #endif /* defined(CONFIG_HW_WATCHDOG) */
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun #if defined(CONFIG_VIDEO) && !defined(CONFIG_SPL_BUILD)
226*4882a593Smuzhiyun static struct da8xx_panel lcd_panels[] = {
227*4882a593Smuzhiyun 	/* FORMIKE, 4.3", 480x800, KWH043MC17-F01 */
228*4882a593Smuzhiyun 	[0] = {
229*4882a593Smuzhiyun 		.name   = "KWH043MC17-F01",
230*4882a593Smuzhiyun 		.width  = 480,
231*4882a593Smuzhiyun 		.height = 800,
232*4882a593Smuzhiyun 		.hfp = 50,              /* no spec, "don't care" values */
233*4882a593Smuzhiyun 		.hbp = 50,
234*4882a593Smuzhiyun 		.hsw = 50,
235*4882a593Smuzhiyun 		.vfp = 50,
236*4882a593Smuzhiyun 		.vbp = 50,
237*4882a593Smuzhiyun 		.vsw = 50,
238*4882a593Smuzhiyun 		.pxl_clk = 35910000,    /* tCYCD=20ns, max 50MHz, 60fps */
239*4882a593Smuzhiyun 		.invert_pxl_clk = 1,
240*4882a593Smuzhiyun 	},
241*4882a593Smuzhiyun 	/* FORMIKE, 4.3", 480x800, KWH043ST20-F01 */
242*4882a593Smuzhiyun 	[1] = {
243*4882a593Smuzhiyun 		.name   = "KWH043ST20-F01",
244*4882a593Smuzhiyun 		.width  = 480,
245*4882a593Smuzhiyun 		.height = 800,
246*4882a593Smuzhiyun 		.hfp = 50,              /* no spec, "don't care" values */
247*4882a593Smuzhiyun 		.hbp = 50,
248*4882a593Smuzhiyun 		.hsw = 50,
249*4882a593Smuzhiyun 		.vfp = 50,
250*4882a593Smuzhiyun 		.vbp = 50,
251*4882a593Smuzhiyun 		.vsw = 50,
252*4882a593Smuzhiyun 		.pxl_clk = 35910000,    /* tCYCD=20ns, max 50MHz, 60fps */
253*4882a593Smuzhiyun 		.invert_pxl_clk = 1,
254*4882a593Smuzhiyun 	},
255*4882a593Smuzhiyun 	/* Multi-Inno, 4.3", 480x800, MI0430VT-1 */
256*4882a593Smuzhiyun 	[2] = {
257*4882a593Smuzhiyun 		.name   = "MI0430VT-1",
258*4882a593Smuzhiyun 		.width  = 480,
259*4882a593Smuzhiyun 		.height = 800,
260*4882a593Smuzhiyun 		.hfp = 50,              /* no spec, "don't care" values */
261*4882a593Smuzhiyun 		.hbp = 50,
262*4882a593Smuzhiyun 		.hsw = 50,
263*4882a593Smuzhiyun 		.vfp = 50,
264*4882a593Smuzhiyun 		.vbp = 50,
265*4882a593Smuzhiyun 		.vsw = 50,
266*4882a593Smuzhiyun 		.pxl_clk = 35910000,    /* tCYCD=20ns, max 50MHz, 60fps */
267*4882a593Smuzhiyun 		.invert_pxl_clk = 1,
268*4882a593Smuzhiyun 	},
269*4882a593Smuzhiyun };
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun static const struct display_panel disp_panels[] = {
272*4882a593Smuzhiyun 	[0] = {
273*4882a593Smuzhiyun 		WVGA,
274*4882a593Smuzhiyun 		16,	/* RGB 888 */
275*4882a593Smuzhiyun 		16,
276*4882a593Smuzhiyun 		COLOR_ACTIVE,
277*4882a593Smuzhiyun 	},
278*4882a593Smuzhiyun 	[1] = {
279*4882a593Smuzhiyun 		WVGA,
280*4882a593Smuzhiyun 		16,	/* RGB 888 */
281*4882a593Smuzhiyun 		16,
282*4882a593Smuzhiyun 		COLOR_ACTIVE,
283*4882a593Smuzhiyun 	},
284*4882a593Smuzhiyun 	[2] = {
285*4882a593Smuzhiyun 		WVGA,
286*4882a593Smuzhiyun 		24,	/* RGB 888 */
287*4882a593Smuzhiyun 		16,
288*4882a593Smuzhiyun 		COLOR_ACTIVE,
289*4882a593Smuzhiyun 	},
290*4882a593Smuzhiyun };
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun static const struct lcd_ctrl_config lcd_cfgs[] = {
293*4882a593Smuzhiyun 	[0] = {
294*4882a593Smuzhiyun 		&disp_panels[0],
295*4882a593Smuzhiyun 		.ac_bias		= 255,
296*4882a593Smuzhiyun 		.ac_bias_intrpt		= 0,
297*4882a593Smuzhiyun 		.dma_burst_sz		= 16,
298*4882a593Smuzhiyun 		.bpp			= 16,
299*4882a593Smuzhiyun 		.fdd			= 0x80,
300*4882a593Smuzhiyun 		.tft_alt_mode		= 0,
301*4882a593Smuzhiyun 		.stn_565_mode		= 0,
302*4882a593Smuzhiyun 		.mono_8bit_mode		= 0,
303*4882a593Smuzhiyun 		.invert_line_clock	= 1,
304*4882a593Smuzhiyun 		.invert_frm_clock	= 1,
305*4882a593Smuzhiyun 		.sync_edge		= 0,
306*4882a593Smuzhiyun 		.sync_ctrl		= 1,
307*4882a593Smuzhiyun 		.raster_order		= 0,
308*4882a593Smuzhiyun 	},
309*4882a593Smuzhiyun 	[1] = {
310*4882a593Smuzhiyun 		&disp_panels[1],
311*4882a593Smuzhiyun 		.ac_bias		= 255,
312*4882a593Smuzhiyun 		.ac_bias_intrpt		= 0,
313*4882a593Smuzhiyun 		.dma_burst_sz		= 16,
314*4882a593Smuzhiyun 		.bpp			= 16,
315*4882a593Smuzhiyun 		.fdd			= 0x80,
316*4882a593Smuzhiyun 		.tft_alt_mode		= 0,
317*4882a593Smuzhiyun 		.stn_565_mode		= 0,
318*4882a593Smuzhiyun 		.mono_8bit_mode		= 0,
319*4882a593Smuzhiyun 		.invert_line_clock	= 1,
320*4882a593Smuzhiyun 		.invert_frm_clock	= 1,
321*4882a593Smuzhiyun 		.sync_edge		= 0,
322*4882a593Smuzhiyun 		.sync_ctrl		= 1,
323*4882a593Smuzhiyun 		.raster_order		= 0,
324*4882a593Smuzhiyun 	},
325*4882a593Smuzhiyun 	[2] = {
326*4882a593Smuzhiyun 		&disp_panels[2],
327*4882a593Smuzhiyun 		.ac_bias		= 255,
328*4882a593Smuzhiyun 		.ac_bias_intrpt		= 0,
329*4882a593Smuzhiyun 		.dma_burst_sz		= 16,
330*4882a593Smuzhiyun 		.bpp			= 24,
331*4882a593Smuzhiyun 		.fdd			= 0x80,
332*4882a593Smuzhiyun 		.tft_alt_mode		= 0,
333*4882a593Smuzhiyun 		.stn_565_mode		= 0,
334*4882a593Smuzhiyun 		.mono_8bit_mode		= 0,
335*4882a593Smuzhiyun 		.invert_line_clock	= 1,
336*4882a593Smuzhiyun 		.invert_frm_clock	= 1,
337*4882a593Smuzhiyun 		.sync_edge		= 0,
338*4882a593Smuzhiyun 		.sync_ctrl		= 1,
339*4882a593Smuzhiyun 		.raster_order		= 0,
340*4882a593Smuzhiyun 	},
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun };
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun /* no console on this board */
board_cfb_skip(void)345*4882a593Smuzhiyun int board_cfb_skip(void)
346*4882a593Smuzhiyun {
347*4882a593Smuzhiyun 	return 1;
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun #define PLL_GET_M(v) ((v >> 8) & 0x7ff)
351*4882a593Smuzhiyun #define PLL_GET_N(v) (v & 0x7f)
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun static struct dpll_regs dpll_lcd_regs = {
354*4882a593Smuzhiyun 	.cm_clkmode_dpll = CM_WKUP + 0x98,
355*4882a593Smuzhiyun 	.cm_idlest_dpll = CM_WKUP + 0x48,
356*4882a593Smuzhiyun 	.cm_clksel_dpll = CM_WKUP + 0x54,
357*4882a593Smuzhiyun };
358*4882a593Smuzhiyun 
get_clk(struct dpll_regs * dpll_regs)359*4882a593Smuzhiyun static int get_clk(struct dpll_regs *dpll_regs)
360*4882a593Smuzhiyun {
361*4882a593Smuzhiyun 	unsigned int val;
362*4882a593Smuzhiyun 	unsigned int m, n;
363*4882a593Smuzhiyun 	int f = 0;
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 	val = readl(dpll_regs->cm_clksel_dpll);
366*4882a593Smuzhiyun 	m = PLL_GET_M(val);
367*4882a593Smuzhiyun 	n = PLL_GET_N(val);
368*4882a593Smuzhiyun 	f = (m * V_OSCK) / n;
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun 	return f;
371*4882a593Smuzhiyun };
372*4882a593Smuzhiyun 
clk_get(int clk)373*4882a593Smuzhiyun int clk_get(int clk)
374*4882a593Smuzhiyun {
375*4882a593Smuzhiyun 	return get_clk(&dpll_lcd_regs);
376*4882a593Smuzhiyun };
377*4882a593Smuzhiyun 
conf_disp_pll(int m,int n)378*4882a593Smuzhiyun static int conf_disp_pll(int m, int n)
379*4882a593Smuzhiyun {
380*4882a593Smuzhiyun 	struct cm_perpll *cmper = (struct cm_perpll *)CM_PER;
381*4882a593Smuzhiyun 	struct dpll_params dpll_lcd = {m, n, -1, -1, -1, -1, -1};
382*4882a593Smuzhiyun #if defined(DISPL_PLL_SPREAD_SPECTRUM)
383*4882a593Smuzhiyun 	struct cm_wkuppll *cmwkup = (struct cm_wkuppll *)CM_WKUP;
384*4882a593Smuzhiyun #endif
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun 	u32 *const clk_domains[] = {
387*4882a593Smuzhiyun 		&cmper->lcdclkctrl,
388*4882a593Smuzhiyun 		0
389*4882a593Smuzhiyun 	};
390*4882a593Smuzhiyun 	u32 *const clk_modules_explicit_en[] = {
391*4882a593Smuzhiyun 		&cmper->lcdclkctrl,
392*4882a593Smuzhiyun 		&cmper->lcdcclkstctrl,
393*4882a593Smuzhiyun 		&cmper->spi1clkctrl,
394*4882a593Smuzhiyun 		0
395*4882a593Smuzhiyun 	};
396*4882a593Smuzhiyun 	do_enable_clocks(clk_domains, clk_modules_explicit_en, 1);
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	do_setup_dpll(&dpll_lcd_regs, &dpll_lcd);
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun #if defined(DISPL_PLL_SPREAD_SPECTRUM)
401*4882a593Smuzhiyun 	writel(0x64, &cmwkup->resv6[3]); /* 0x50 */
402*4882a593Smuzhiyun 	writel(0x800, &cmwkup->resv6[2]); /* 0x4c */
403*4882a593Smuzhiyun 	writel(readl(&cmwkup->clkmoddplldisp) | CM_CLKMODE_DPLL_SSC_EN_MASK,
404*4882a593Smuzhiyun 	       &cmwkup->clkmoddplldisp); /* 0x98 */
405*4882a593Smuzhiyun #endif
406*4882a593Smuzhiyun 	return 0;
407*4882a593Smuzhiyun }
408*4882a593Smuzhiyun 
set_gpio(int gpio,int state)409*4882a593Smuzhiyun static int set_gpio(int gpio, int state)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun 	gpio_request(gpio, "temp");
412*4882a593Smuzhiyun 	gpio_direction_output(gpio, state);
413*4882a593Smuzhiyun 	gpio_set_value(gpio, state);
414*4882a593Smuzhiyun 	gpio_free(gpio);
415*4882a593Smuzhiyun 	return 0;
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun 
enable_lcd(void)418*4882a593Smuzhiyun static int enable_lcd(void)
419*4882a593Smuzhiyun {
420*4882a593Smuzhiyun 	unsigned char buf[1];
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun 	set_gpio(BOARD_LCD_RESET, 0);
423*4882a593Smuzhiyun 	mdelay(1);
424*4882a593Smuzhiyun 	set_gpio(BOARD_LCD_RESET, 1);
425*4882a593Smuzhiyun 	mdelay(1);
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 	/* spi lcd init */
428*4882a593Smuzhiyun 	kwh043st20_f01_spi_startup(1, 0, 5000000, SPI_MODE_0);
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun 	/* backlight on */
431*4882a593Smuzhiyun 	buf[0] = 0xf;
432*4882a593Smuzhiyun 	i2c_write(0x24, 0x7, 1, buf, 1);
433*4882a593Smuzhiyun 	buf[0] = 0x3f;
434*4882a593Smuzhiyun 	i2c_write(0x24, 0x8, 1, buf, 1);
435*4882a593Smuzhiyun 	return 0;
436*4882a593Smuzhiyun }
437*4882a593Smuzhiyun 
arch_early_init_r(void)438*4882a593Smuzhiyun int arch_early_init_r(void)
439*4882a593Smuzhiyun {
440*4882a593Smuzhiyun 	enable_lcd();
441*4882a593Smuzhiyun 	return 0;
442*4882a593Smuzhiyun }
443*4882a593Smuzhiyun 
board_video_init(void)444*4882a593Smuzhiyun static int board_video_init(void)
445*4882a593Smuzhiyun {
446*4882a593Smuzhiyun 	int i;
447*4882a593Smuzhiyun 	int anzdisp = ARRAY_SIZE(lcd_panels);
448*4882a593Smuzhiyun 	int display = 1;
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun 	for (i = 0; i < anzdisp; i++) {
451*4882a593Smuzhiyun 		if (strncmp((const char *)factory_dat.disp_name,
452*4882a593Smuzhiyun 			    lcd_panels[i].name,
453*4882a593Smuzhiyun 		    strlen((const char *)factory_dat.disp_name)) == 0) {
454*4882a593Smuzhiyun 			printf("DISPLAY: %s\n", factory_dat.disp_name);
455*4882a593Smuzhiyun 			break;
456*4882a593Smuzhiyun 		}
457*4882a593Smuzhiyun 	}
458*4882a593Smuzhiyun 	if (i == anzdisp) {
459*4882a593Smuzhiyun 		i = 1;
460*4882a593Smuzhiyun 		printf("%s: %s not found, using default %s\n", __func__,
461*4882a593Smuzhiyun 		       factory_dat.disp_name, lcd_panels[i].name);
462*4882a593Smuzhiyun 	}
463*4882a593Smuzhiyun 	conf_disp_pll(24, 1);
464*4882a593Smuzhiyun 	da8xx_video_init(&lcd_panels[display], &lcd_cfgs[display],
465*4882a593Smuzhiyun 			 lcd_cfgs[display].bpp);
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun 	return 0;
468*4882a593Smuzhiyun }
469*4882a593Smuzhiyun #endif /* ifdef CONFIG_VIDEO */
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun #ifdef CONFIG_BOARD_LATE_INIT
board_late_init(void)472*4882a593Smuzhiyun int board_late_init(void)
473*4882a593Smuzhiyun {
474*4882a593Smuzhiyun 	int ret;
475*4882a593Smuzhiyun 	char tmp[2 * MAX_STRING_LENGTH + 2];
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun 	omap_nand_switch_ecc(1, 8);
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun 	if (factory_dat.asn[0] != 0)
480*4882a593Smuzhiyun 		sprintf(tmp, "%s_%s", factory_dat.asn,
481*4882a593Smuzhiyun 			factory_dat.comp_version);
482*4882a593Smuzhiyun 	else
483*4882a593Smuzhiyun 		strcpy(tmp, "QMX7.E38_4.0");
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun 	ret = env_set("boardid", tmp);
486*4882a593Smuzhiyun 	if (ret)
487*4882a593Smuzhiyun 		printf("error setting board id\n");
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun 	return 0;
490*4882a593Smuzhiyun }
491*4882a593Smuzhiyun #endif
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun #include "../common/board.c"
494