/*
 * Copyright (C) 2008
 * Mark Jonas <mark.jonas@de.bosch.com>
 *
 * board/mpr2/mpr2.c
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include <common.h>
#include <asm/io.h>
#include <asm/processor.h>

int checkboard(void)
{
	puts("BOARD: MPR2\n");
	return 0;
}

int board_init(void)
{
	/*
	 * For MPR2 A.3 through A.7
	 */

	/* CS2: Ethernet (0xA8000000 - 0xABFFFFFF) */
	__raw_writel(0x36db0400, CS2BCR);    /* 4 idle cycles, normal space, 16 bit data bus */
	__raw_writel(0x000003c0, CS2WCR);    /* (WR:8), no ext. wait */

	/* CS4: CAN1 (0xB0000000 - 0xB3FFFFFF) */
	__raw_writel(0x00000200, CS4BCR);    /* no idle cycles, normal space, 8 bit data bus */
	__raw_writel(0x00100981, CS4WCR);    /* (SW:1.5 WR:3 HW:1.5), ext. wait */

	/* CS5a: CAN2 (0xB4000000 - 0xB5FFFFFF) */
	__raw_writel(0x00000200, CS5ABCR);   /* no idle cycles, normal space, 8 bit data bus */
	__raw_writel(0x00100981, CS5AWCR);   /* (SW:1.5 WR:3 HW:1.5), ext. wait */

	/* CS5b: CAN3 (0xB6000000 - 0xB7FFFFFF) */
	__raw_writel(0x00000200, CS5BBCR);   /* no idle cycles, normal space, 8 bit data bus */
	__raw_writel(0x00100981, CS5BWCR);   /* (SW:1.5 WR:3 HW:1.5), ext. wait */

	/* CS6a: Rotary (0xB8000000 - 0xB9FFFFFF) */
	__raw_writel(0x00000200, CS6ABCR);   /* no idle cycles, normal space, 8 bit data bus */
	__raw_writel(0x001009C1, CS6AWCR);   /* (SW:1.5 WR:3 HW:1.5), no ext. wait */

	/* set Pin Select Register A: /PCC_CD1, /PCC_CD2, PCC_BVD1, PCC_BVD2, /IOIS16, IRQ4, IRQ5, USB1d_SUSPEND */
	__raw_writew(0xAABC, PSELA);  /*    10        10        10        10       10    11    11             00 */

	/* set Pin Select Register B: /SCIF0_RTS, /SCIF0_CTS, LCD_VCPWC, LCD_VEPWC, IIC_SDA, IIC_SCL, Reserved */
	__raw_writew(0x3C00, PSELB);  /*       0           0         11         11        0        0  00000000 */

	/* set Pin Select Register C: SIOF1_SCK, SIOF1_RxD, SCIF1_RxD, SCIF1_TxD, Reserved */
	__raw_writew(0x0000, PSELC);  /*     00         00         00         00  00000000 */

	/* set Pin Select Register D: Reserved, SIOF1_TxD, Reserved, SIOF1_MCLK, Reserved, SIOF1_SYNC, Reserved, SCIF1_SCK, Reserved */
	__raw_writew(0x0000, PSELD);  /*     0         00        00          00        00          00        00         00         0 */

	/* OTH:  (00) Other fuction
	 * GPO:  (01) General Purpose Output
	 * GPI:  (11) General Purpose Input
	 * GPI+: (10) General Purpose Input with internal pull-up
	 *-------------------------------------------------------
	 * A7 GPO(LED8);     A6 GPO(LED7);     A5 GPO(LED6);        A4 GPO(LED5);
	 * A3 GPO(LED4);     A2 GPO(LED3);     A1 GPO(LED2);        A0 GPO(LED1); */
	__raw_writew(0x5555, PACR);   /* 01 01 01 01 01 01 01 01 */

	/* B7 GPO(RST4);     B6 GPO(RST3);     B5 GPO(RST2);        B4 GPO(RST1);
	 * B3 GPO(PB3);      B2 GPO(PB2);      B1 GPO(PB1);         B0 GPO(PB0); */
	__raw_writew(0x5555, PBCR);   /* 01 01 01 01 01 01 01 01 */

	/* C7 GPO(PC7);      C6 GPO(PC6);      C5 GPO(PC5);         C4 GPO(PC4);
	 * C3 LCD_DATA3;     C2 LCD_DATA2;     C1 LCD_DATA1;        C0 LCD_DATA0; */
	__raw_writew(0x5500, PCCR);   /* 01 01 01 01 00 00 00 00 */

	/* D7 GPO(PD7);      D6 GPO(PD6);      D5 GPO(PD5);         D4 GPO(PD4);
	 * D3 GPO(PD3);      D2 GPO(PD2);      D1 GPO(PD1);         D0 GPO(PD0); */
	__raw_writew(0x5555, PDCR);   /* 01 01 01 01 01 01 01 01 */

	/* E7 (x);           E6 GPI(nu);       E5 GPI(nu);          E4 LCD_M_DISP;
	 * E3 LCD_CL1;       E2 LCD_CL2;       E1 LCD_DON;          E0 LCD_FLM; */
	__raw_writew(0x2800, PECR);   /* 00 10 10 00 00 00 00 00 */

	/* F7 (x);           F6 DA1(VLCD);     F5 DA0(nc);          F4 AN3;
	 * F3 AN2(MID_AD);   F2 AN1(EARTH_AD); F1 AN0(TEMP);        F0 GPI+(nc); */
	__raw_writew(0x0002, PFCR);   /* 00 00 00 00 00 00 00 10 */

	/* G7 (x);          G6 IRQ5(TOUCH_BUSY); G5 IRQ4(TOUCH_IRQ);G4 GPI(KEY2);
	 * G3 GPI(KEY1);     G2 GPO(LED11);      G1 GPO(LED10);     G0 GPO(LED9); */
	__raw_writew(0x03D5, PGCR);   /* 00 00 00 11 11 01 01 01 */

	/* H7 (x);            H6 /RAS(BRAS);      H5 /CAS(BCAS);    H4 CKE(BCKE);
	 * H3 GPO(EARTH_OFF); H2 GPO(EARTH_TEST); H1 USB2_PWR;      H0 USB1_PWR; */
	__raw_writew(0x0050, PHCR);   /* 00 00 00 00 01 01 00 00 */

	/* J7 (x);           J6 AUDCK;         J5 ASEBRKAK;         J4 AUDATA3;
	 * J3 AUDATA2;       J2 AUDATA1;       J1 AUDATA0;          J0 AUDSYNC; */
	__raw_writew(0x0000, PJCR);   /* 00 00 00 00 00 00 00 00 */

	/* K7 (x);           K6 (x);           K5 (x);              K4 (x)
	 * K3 PINT7(/PWR2);  K2 PINT6(/PWR1);  K1 PINT5(nc);        K0 PINT4(FLASH_READY); */
	__raw_writew(0x00FB, PKCR);   /* 00 00 00 00 11 11 10 11 */

	/* L7 TRST;          L6 TMS;           L5 TDO;              L4 TDI;
	 * L3 TCK;           L2 (x);           L1 (x);              L0 (x); */
	__raw_writew(0x0000, PLCR);    /* 00 00 00 00 00 00 00 00 */

	/* M7 GPO(CURRENT_SINK);M6 GPO(PWR_SWITCH);  M5 GPO(LAN_SPEED);   M4 GPO(LAN_RESET);
	 * M3 GPO(BUZZER);      M2 GPO(LCD_BL);      M1 CS5B(CAN3_CS);    M0 GPI+(nc); */
	__raw_writew(0x5552, PMCR);   /* 01 01 01 01 01 01 00 10 */
	__raw_writeb(0xF0, PMDR);     /* CURRENT_SINK=off, PWR_SWITCH=off, LAN_SPEED=100MBit, LAN_RESET=off, BUZZER=off, LCD_BL=off */

	/* P7 (x);           P6 (x);           P5 (x);              P4 GPO(on pullup);
	 * P3 IRQ3(LAN_IRQ); P2 IRQ2(CAN3_IRQ);P1 IRQ1(CAN2_IRQ);   P0 IRQ0(CAN1_IRQ); */
	__raw_writew(0x0100, PPCR);   /* 00 00 00 01 00 00 00 00 */
	__raw_writeb(0x10, PPDR);     /* no current flow through pullup */

	/* R7 A25;           R6 A24;           R5 A23;              R4 A22;
	 * R3 A21;           R2 A20;           R1 A19;              R0 A0; */
	__raw_writew(0x0000, PRCR);   /* 00 00 00 00 00 00 00 00 */

	/* S7 (x);              S6 (x);        S5 (x);              S4 GPO(EEPROM_CS2);
	 * S3 GPO(EEPROM_CS1);  S2 SIOF0_TXD;  S1 SIOF0_RXD;        S0 SIOF0_SCK; */
	__raw_writew(0x0140, PSCR);   /* 00 00 00 01 01 00 00 00 */

	/* T7 (x);           T6 (x);           T5 (x);              T4 COM1_CTS;
	 * T3 COM1_RTS;      T2 COM1_TXD;      T1 COM1_RXD;         T0 GPO(WDOG); */
	__raw_writew(0x0001, PTCR);   /* 00 00 00 00 00 00 00 01 */

	/* U7 (x);           U6 (x);           U5 (x);              U4 GPI+(/AC_FAULT);
	 * U3 GPO(TOUCH_CS); U2 TOUCH_TXD;     U1 TOUCH_RXD;        U0 TOUCH_SCK; */
	__raw_writew(0x0240, PUCR);   /* 00 00 00 10 01 00 00 00 */

	/* V7 (x);           V6 (x);           V5 (x);              V4 GPO(MID2);
	 * V3 GPO(MID1);     V2 CARD_TxD;      V1 CARD_RxD;         V0 GPI+(/BAT_FAULT); */
	__raw_writew(0x0142, PVCR);   /* 00 00 00 01 01 00 00 10 */

	return 0;
}

int dram_init(void)
{
	DECLARE_GLOBAL_DATA_PTR;

	gd->bd->bi_memstart = CONFIG_SYS_SDRAM_BASE;
	gd->bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE;
	printf("SDRAM: %dMB\n", CONFIG_SYS_SDRAM_SIZE / (1024 * 1024));
	return 0;
}
