1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (C) 2009
3*4882a593Smuzhiyun * Marek Vasut <marek.vasut@gmail.com>
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Heavily based on pxa255_idp platform
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include <common.h>
11*4882a593Smuzhiyun #include <command.h>
12*4882a593Smuzhiyun #include <serial.h>
13*4882a593Smuzhiyun #include <asm/arch/hardware.h>
14*4882a593Smuzhiyun #include <asm/arch/pxa.h>
15*4882a593Smuzhiyun #include <asm/arch/regs-mmc.h>
16*4882a593Smuzhiyun #include <spi.h>
17*4882a593Smuzhiyun #include <asm/io.h>
18*4882a593Smuzhiyun #include <usb.h>
19*4882a593Smuzhiyun #include <asm/mach-types.h>
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun #ifdef CONFIG_CMD_SPI
24*4882a593Smuzhiyun void lcd_start(void);
25*4882a593Smuzhiyun #else
lcd_start(void)26*4882a593Smuzhiyun inline void lcd_start(void) {};
27*4882a593Smuzhiyun #endif
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun /*
30*4882a593Smuzhiyun * Miscelaneous platform dependent initialisations
31*4882a593Smuzhiyun */
board_init(void)32*4882a593Smuzhiyun int board_init(void)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun /* arch number of Z2 */
35*4882a593Smuzhiyun gd->bd->bi_arch_number = MACH_TYPE_ZIPIT2;
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun /* adress of boot parameters */
38*4882a593Smuzhiyun gd->bd->bi_boot_params = 0xa0000100;
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun /* Enable LCD */
41*4882a593Smuzhiyun lcd_start();
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun return 0;
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun
dram_init(void)46*4882a593Smuzhiyun int dram_init(void)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun pxa2xx_dram_init();
49*4882a593Smuzhiyun gd->ram_size = PHYS_SDRAM_1_SIZE;
50*4882a593Smuzhiyun return 0;
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun #ifdef CONFIG_CMD_USB
board_usb_init(int index,enum usb_init_type init)54*4882a593Smuzhiyun int board_usb_init(int index, enum usb_init_type init)
55*4882a593Smuzhiyun {
56*4882a593Smuzhiyun /* enable port 2 */
57*4882a593Smuzhiyun writel(readl(UP2OCR) | UP2OCR_HXOE | UP2OCR_HXS |
58*4882a593Smuzhiyun UP2OCR_DMPDE | UP2OCR_DPPDE, UP2OCR);
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun return 0;
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun
board_usb_cleanup(int index,enum usb_init_type init)63*4882a593Smuzhiyun int board_usb_cleanup(int index, enum usb_init_type init)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun return 0;
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun
usb_board_stop(void)68*4882a593Smuzhiyun void usb_board_stop(void)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun #endif
72*4882a593Smuzhiyun
dram_init_banksize(void)73*4882a593Smuzhiyun int dram_init_banksize(void)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
76*4882a593Smuzhiyun gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun return 0;
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun #ifdef CONFIG_CMD_MMC
board_mmc_init(bd_t * bis)82*4882a593Smuzhiyun int board_mmc_init(bd_t *bis)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun pxa_mmc_register(0);
85*4882a593Smuzhiyun return 0;
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun #endif
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun #ifdef CONFIG_CMD_SPI
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun struct {
92*4882a593Smuzhiyun unsigned char reg;
93*4882a593Smuzhiyun unsigned short data;
94*4882a593Smuzhiyun unsigned char mdelay;
95*4882a593Smuzhiyun } lcd_data[] = {
96*4882a593Smuzhiyun { 0x07, 0x0000, 0 },
97*4882a593Smuzhiyun { 0x13, 0x0000, 10 },
98*4882a593Smuzhiyun { 0x11, 0x3004, 0 },
99*4882a593Smuzhiyun { 0x14, 0x200F, 0 },
100*4882a593Smuzhiyun { 0x10, 0x1a20, 0 },
101*4882a593Smuzhiyun { 0x13, 0x0040, 50 },
102*4882a593Smuzhiyun { 0x13, 0x0060, 0 },
103*4882a593Smuzhiyun { 0x13, 0x0070, 200 },
104*4882a593Smuzhiyun { 0x01, 0x0127, 0 },
105*4882a593Smuzhiyun { 0x02, 0x0700, 0 },
106*4882a593Smuzhiyun { 0x03, 0x1030, 0 },
107*4882a593Smuzhiyun { 0x08, 0x0208, 0 },
108*4882a593Smuzhiyun { 0x0B, 0x0620, 0 },
109*4882a593Smuzhiyun { 0x0C, 0x0110, 0 },
110*4882a593Smuzhiyun { 0x30, 0x0120, 0 },
111*4882a593Smuzhiyun { 0x31, 0x0127, 0 },
112*4882a593Smuzhiyun { 0x32, 0x0000, 0 },
113*4882a593Smuzhiyun { 0x33, 0x0503, 0 },
114*4882a593Smuzhiyun { 0x34, 0x0727, 0 },
115*4882a593Smuzhiyun { 0x35, 0x0124, 0 },
116*4882a593Smuzhiyun { 0x36, 0x0706, 0 },
117*4882a593Smuzhiyun { 0x37, 0x0701, 0 },
118*4882a593Smuzhiyun { 0x38, 0x0F00, 0 },
119*4882a593Smuzhiyun { 0x39, 0x0F00, 0 },
120*4882a593Smuzhiyun { 0x40, 0x0000, 0 },
121*4882a593Smuzhiyun { 0x41, 0x0000, 0 },
122*4882a593Smuzhiyun { 0x42, 0x013f, 0 },
123*4882a593Smuzhiyun { 0x43, 0x0000, 0 },
124*4882a593Smuzhiyun { 0x44, 0x013f, 0 },
125*4882a593Smuzhiyun { 0x45, 0x0000, 0 },
126*4882a593Smuzhiyun { 0x46, 0xef00, 0 },
127*4882a593Smuzhiyun { 0x47, 0x013f, 0 },
128*4882a593Smuzhiyun { 0x48, 0x0000, 0 },
129*4882a593Smuzhiyun { 0x07, 0x0015, 30 },
130*4882a593Smuzhiyun { 0x07, 0x0017, 0 },
131*4882a593Smuzhiyun { 0x20, 0x0000, 0 },
132*4882a593Smuzhiyun { 0x21, 0x0000, 0 },
133*4882a593Smuzhiyun { 0x22, 0x0000, 0 },
134*4882a593Smuzhiyun };
135*4882a593Smuzhiyun
zipitz2_spi_sda(int set)136*4882a593Smuzhiyun void zipitz2_spi_sda(int set)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun /* GPIO 13 */
139*4882a593Smuzhiyun if (set)
140*4882a593Smuzhiyun writel((1 << 13), GPSR0);
141*4882a593Smuzhiyun else
142*4882a593Smuzhiyun writel((1 << 13), GPCR0);
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun
zipitz2_spi_scl(int set)145*4882a593Smuzhiyun void zipitz2_spi_scl(int set)
146*4882a593Smuzhiyun {
147*4882a593Smuzhiyun /* GPIO 22 */
148*4882a593Smuzhiyun if (set)
149*4882a593Smuzhiyun writel((1 << 22), GPCR0);
150*4882a593Smuzhiyun else
151*4882a593Smuzhiyun writel((1 << 22), GPSR0);
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun
zipitz2_spi_read(void)154*4882a593Smuzhiyun unsigned char zipitz2_spi_read(void)
155*4882a593Smuzhiyun {
156*4882a593Smuzhiyun /* GPIO 40 */
157*4882a593Smuzhiyun return !!(readl(GPLR1) & (1 << 8));
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun
spi_cs_is_valid(unsigned int bus,unsigned int cs)160*4882a593Smuzhiyun int spi_cs_is_valid(unsigned int bus, unsigned int cs)
161*4882a593Smuzhiyun {
162*4882a593Smuzhiyun /* Always valid */
163*4882a593Smuzhiyun return 1;
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun
spi_cs_activate(struct spi_slave * slave)166*4882a593Smuzhiyun void spi_cs_activate(struct spi_slave *slave)
167*4882a593Smuzhiyun {
168*4882a593Smuzhiyun /* GPIO 88 low */
169*4882a593Smuzhiyun writel((1 << 24), GPCR2);
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun
spi_cs_deactivate(struct spi_slave * slave)172*4882a593Smuzhiyun void spi_cs_deactivate(struct spi_slave *slave)
173*4882a593Smuzhiyun {
174*4882a593Smuzhiyun /* GPIO 88 high */
175*4882a593Smuzhiyun writel((1 << 24), GPSR2);
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun
lcd_start(void)178*4882a593Smuzhiyun void lcd_start(void)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun int i;
181*4882a593Smuzhiyun unsigned char reg[3] = { 0x74, 0x00, 0 };
182*4882a593Smuzhiyun unsigned char data[3] = { 0x76, 0, 0 };
183*4882a593Smuzhiyun unsigned char dummy[3] = { 0, 0, 0 };
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun /* PWM2 AF */
186*4882a593Smuzhiyun writel(readl(GAFR0_L) | 0x00800000, GAFR0_L);
187*4882a593Smuzhiyun /* Enable clock to all PWM */
188*4882a593Smuzhiyun writel(readl(CKEN) | 0x3, CKEN);
189*4882a593Smuzhiyun /* Configure PWM2 */
190*4882a593Smuzhiyun writel(0x4f, PWM_CTRL2);
191*4882a593Smuzhiyun writel(0x2ff, PWM_PWDUTY2);
192*4882a593Smuzhiyun writel(792, PWM_PERVAL2);
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun /* Toggle the reset pin to reset the LCD */
195*4882a593Smuzhiyun writel((1 << 19), GPSR0);
196*4882a593Smuzhiyun udelay(100000);
197*4882a593Smuzhiyun writel((1 << 19), GPCR0);
198*4882a593Smuzhiyun udelay(20000);
199*4882a593Smuzhiyun writel((1 << 19), GPSR0);
200*4882a593Smuzhiyun udelay(20000);
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun /* Program the LCD init sequence */
203*4882a593Smuzhiyun for (i = 0; i < sizeof(lcd_data) / sizeof(lcd_data[0]); i++) {
204*4882a593Smuzhiyun reg[0] = 0x74;
205*4882a593Smuzhiyun reg[1] = 0x0;
206*4882a593Smuzhiyun reg[2] = lcd_data[i].reg;
207*4882a593Smuzhiyun spi_xfer(NULL, 24, reg, dummy, SPI_XFER_BEGIN | SPI_XFER_END);
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun data[0] = 0x76;
210*4882a593Smuzhiyun data[1] = lcd_data[i].data >> 8;
211*4882a593Smuzhiyun data[2] = lcd_data[i].data & 0xff;
212*4882a593Smuzhiyun spi_xfer(NULL, 24, data, dummy, SPI_XFER_BEGIN | SPI_XFER_END);
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun if (lcd_data[i].mdelay)
215*4882a593Smuzhiyun udelay(lcd_data[i].mdelay * 1000);
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun writel((1 << 11), GPSR0);
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun #endif
221