xref: /openbmc/u-boot/arch/arm/mach-at91/arm926ejs/at91sam9260_devices.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
262011840SMasahiro Yamada /*
362011840SMasahiro Yamada  * (C) Copyright 2007-2008
462011840SMasahiro Yamada  * Stelian Pop <stelian@popies.net>
562011840SMasahiro Yamada  * Lead Tech Design <www.leadtechdesign.com>
662011840SMasahiro Yamada  */
762011840SMasahiro Yamada 
862011840SMasahiro Yamada #include <common.h>
962011840SMasahiro Yamada #include <dm.h>
1062011840SMasahiro Yamada #include <asm/io.h>
1162011840SMasahiro Yamada #include <asm/arch/at91sam9260_matrix.h>
1262011840SMasahiro Yamada #include <asm/arch/at91_common.h>
1362011840SMasahiro Yamada #include <asm/arch/at91sam9_sdramc.h>
14eced5a7eSWenyou Yang #include <asm/arch/clk.h>
1562011840SMasahiro Yamada #include <asm/arch/gpio.h>
1662011840SMasahiro Yamada 
1762011840SMasahiro Yamada /*
1862011840SMasahiro Yamada  * if CONFIG_AT91_GPIO_PULLUP ist set, keep pullups on on all
1962011840SMasahiro Yamada  * peripheral pins. Good to have if hardware is soldered optionally
2062011840SMasahiro Yamada  * or in case of SPI no slave is selected. Avoid lines to float
2162011840SMasahiro Yamada  * needlessly. Use a short local PUP define.
2262011840SMasahiro Yamada  *
2362011840SMasahiro Yamada  * Due to errata "TXD floats when CTS is inactive" pullups are always
2462011840SMasahiro Yamada  * on for TXD pins.
2562011840SMasahiro Yamada  */
2662011840SMasahiro Yamada #ifdef CONFIG_AT91_GPIO_PULLUP
2762011840SMasahiro Yamada # define PUP CONFIG_AT91_GPIO_PULLUP
2862011840SMasahiro Yamada #else
2962011840SMasahiro Yamada # define PUP 0
3062011840SMasahiro Yamada #endif
3162011840SMasahiro Yamada 
at91_serial0_hw_init(void)3262011840SMasahiro Yamada void at91_serial0_hw_init(void)
3362011840SMasahiro Yamada {
3462011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTB, 4, 1);		/* TXD0 */
3562011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTB, 5, PUP);		/* RXD0 */
36eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_USART0);
3762011840SMasahiro Yamada }
3862011840SMasahiro Yamada 
at91_serial1_hw_init(void)3962011840SMasahiro Yamada void at91_serial1_hw_init(void)
4062011840SMasahiro Yamada {
4162011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTB, 6, 1);		/* TXD1 */
4262011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTB, 7, PUP);		/* RXD1 */
43eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_USART1);
4462011840SMasahiro Yamada }
4562011840SMasahiro Yamada 
at91_serial2_hw_init(void)4662011840SMasahiro Yamada void at91_serial2_hw_init(void)
4762011840SMasahiro Yamada {
4862011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTB, 8, 1);		/* TXD2 */
4962011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTB, 9, PUP);		/* RXD2 */
50eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_USART2);
5162011840SMasahiro Yamada }
5262011840SMasahiro Yamada 
at91_seriald_hw_init(void)5362011840SMasahiro Yamada void at91_seriald_hw_init(void)
5462011840SMasahiro Yamada {
5562011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTB, 14, PUP);		/* DRXD */
5662011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTB, 15, 1);		/* DTXD */
57eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_SYS);
5862011840SMasahiro Yamada }
5962011840SMasahiro Yamada 
60c68c03f5STuomas Tynkkynen #ifdef CONFIG_ATMEL_SPI
at91_spi0_hw_init(unsigned long cs_mask)6162011840SMasahiro Yamada void at91_spi0_hw_init(unsigned long cs_mask)
6262011840SMasahiro Yamada {
6362011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 0, PUP);	/* SPI0_MISO */
6462011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 1, PUP);	/* SPI0_MOSI */
6562011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 2, PUP);	/* SPI0_SPCK */
6662011840SMasahiro Yamada 
67eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_SPI0);
6862011840SMasahiro Yamada 
6962011840SMasahiro Yamada 	if (cs_mask & (1 << 0)) {
7062011840SMasahiro Yamada 		at91_set_a_periph(AT91_PIO_PORTA, 3, 1);
7162011840SMasahiro Yamada 	}
7262011840SMasahiro Yamada 	if (cs_mask & (1 << 1)) {
7362011840SMasahiro Yamada 		at91_set_b_periph(AT91_PIO_PORTC, 11, 1);
7462011840SMasahiro Yamada 	}
7562011840SMasahiro Yamada 	if (cs_mask & (1 << 2)) {
7662011840SMasahiro Yamada 		at91_set_b_periph(AT91_PIO_PORTC, 16, 1);
7762011840SMasahiro Yamada 	}
7862011840SMasahiro Yamada 	if (cs_mask & (1 << 3)) {
7962011840SMasahiro Yamada 		at91_set_b_periph(AT91_PIO_PORTC, 17, 1);
8062011840SMasahiro Yamada 	}
8162011840SMasahiro Yamada 	if (cs_mask & (1 << 4)) {
8262011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTA, 3, 1);
8362011840SMasahiro Yamada 	}
8462011840SMasahiro Yamada 	if (cs_mask & (1 << 5)) {
8562011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTC, 11, 1);
8662011840SMasahiro Yamada 	}
8762011840SMasahiro Yamada 	if (cs_mask & (1 << 6)) {
8862011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTC, 16, 1);
8962011840SMasahiro Yamada 	}
9062011840SMasahiro Yamada 	if (cs_mask & (1 << 7)) {
9162011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTC, 17, 1);
9262011840SMasahiro Yamada 	}
9362011840SMasahiro Yamada }
9462011840SMasahiro Yamada 
at91_spi1_hw_init(unsigned long cs_mask)9562011840SMasahiro Yamada void at91_spi1_hw_init(unsigned long cs_mask)
9662011840SMasahiro Yamada {
9762011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTB, 0, PUP);	/* SPI1_MISO */
9862011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTB, 1, PUP);	/* SPI1_MOSI */
9962011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTB, 2, PUP);	/* SPI1_SPCK */
10062011840SMasahiro Yamada 
101eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_SPI1);
10262011840SMasahiro Yamada 
10362011840SMasahiro Yamada 	if (cs_mask & (1 << 0)) {
10462011840SMasahiro Yamada 		at91_set_a_periph(AT91_PIO_PORTB, 3, 1);
10562011840SMasahiro Yamada 	}
10662011840SMasahiro Yamada 	if (cs_mask & (1 << 1)) {
10762011840SMasahiro Yamada 		at91_set_b_periph(AT91_PIO_PORTC, 5, 1);
10862011840SMasahiro Yamada 	}
10962011840SMasahiro Yamada 	if (cs_mask & (1 << 2)) {
11062011840SMasahiro Yamada 		at91_set_b_periph(AT91_PIO_PORTC, 4, 1);
11162011840SMasahiro Yamada 	}
11262011840SMasahiro Yamada 	if (cs_mask & (1 << 3)) {
11362011840SMasahiro Yamada 		at91_set_b_periph(AT91_PIO_PORTC, 3, 1);
11462011840SMasahiro Yamada 	}
11562011840SMasahiro Yamada 	if (cs_mask & (1 << 4)) {
11662011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTB, 3, 1);
11762011840SMasahiro Yamada 	}
11862011840SMasahiro Yamada 	if (cs_mask & (1 << 5)) {
11962011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTC, 5, 1);
12062011840SMasahiro Yamada 	}
12162011840SMasahiro Yamada 	if (cs_mask & (1 << 6)) {
12262011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTC, 4, 1);
12362011840SMasahiro Yamada 	}
12462011840SMasahiro Yamada 	if (cs_mask & (1 << 7)) {
12562011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTC, 3, 1);
12662011840SMasahiro Yamada 	}
12762011840SMasahiro Yamada }
12862011840SMasahiro Yamada #endif
12962011840SMasahiro Yamada 
13062011840SMasahiro Yamada #ifdef CONFIG_MACB
at91_macb_hw_init(void)13162011840SMasahiro Yamada void at91_macb_hw_init(void)
13262011840SMasahiro Yamada {
133eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_EMAC0);
13462011840SMasahiro Yamada 
13562011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 19, 0);	/* ETXCK_EREFCK */
13662011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 17, 0);	/* ERXDV */
13762011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 14, 0);	/* ERX0 */
13862011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 15, 0);	/* ERX1 */
13962011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 18, 0);	/* ERXER */
14062011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 16, 0);	/* ETXEN */
14162011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 12, 0);	/* ETX0 */
14262011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 13, 0);	/* ETX1 */
14362011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 21, 0);	/* EMDIO */
14462011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 20, 0);	/* EMDC */
14562011840SMasahiro Yamada 
14662011840SMasahiro Yamada #ifndef CONFIG_RMII
14762011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 28, 0);	/* ECRS */
14862011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 29, 0);	/* ECOL */
14962011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 25, 0);	/* ERX2 */
15062011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 26, 0);	/* ERX3 */
15162011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 27, 0);	/* ERXCK */
152f6b42c14SMasahiro Yamada #if defined(CONFIG_AT91SAM9260EK)
15362011840SMasahiro Yamada 	/*
15462011840SMasahiro Yamada 	 * use PA10, PA11 for ETX2, ETX3.
15562011840SMasahiro Yamada 	 * PA23 and PA24 are for TWI EEPROM
15662011840SMasahiro Yamada 	 */
15762011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 10, 0);	/* ETX2 */
15862011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 11, 0);	/* ETX3 */
15962011840SMasahiro Yamada #else
16062011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 23, 0);	/* ETX2 */
16162011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 24, 0);	/* ETX3 */
16262011840SMasahiro Yamada #if defined(CONFIG_AT91SAM9G20)
16362011840SMasahiro Yamada 	/* 9G20 BOOT ROM initializes those pins to multi-drive, undo that */
16462011840SMasahiro Yamada 	at91_set_pio_multi_drive(AT91_PIO_PORTA, 23, 0);
16562011840SMasahiro Yamada 	at91_set_pio_multi_drive(AT91_PIO_PORTA, 24, 0);
16662011840SMasahiro Yamada #endif
16762011840SMasahiro Yamada #endif
16862011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 22, 0);	/* ETXER */
16962011840SMasahiro Yamada #endif
17062011840SMasahiro Yamada }
17162011840SMasahiro Yamada #endif
17262011840SMasahiro Yamada 
17362011840SMasahiro Yamada #if defined(CONFIG_GENERIC_ATMEL_MCI)
at91_mci_hw_init(void)17462011840SMasahiro Yamada void at91_mci_hw_init(void)
17562011840SMasahiro Yamada {
176eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_MCI);
17762011840SMasahiro Yamada 
17862011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 8, 1);	/* MCCK */
17962011840SMasahiro Yamada #if defined(CONFIG_ATMEL_MCI_PORTB)
18062011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 1, 1);	/* MCCDB */
18162011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 0, 1);	/* MCDB0 */
18262011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 5, 1);	/* MCDB1 */
18362011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 4, 1);	/* MCDB2 */
18462011840SMasahiro Yamada 	at91_set_b_periph(AT91_PIO_PORTA, 3, 1);	/* MCDB3 */
18562011840SMasahiro Yamada #else
18662011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 7, 1);	/* MCCDA */
18762011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 6, 1);	/* MCDA0 */
18862011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 9, 1);	/* MCDA1 */
18962011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 10, 1);	/* MCDA2 */
19062011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTA, 11, 1);	/* MCDA3 */
19162011840SMasahiro Yamada #endif
19262011840SMasahiro Yamada }
19362011840SMasahiro Yamada #endif
19462011840SMasahiro Yamada 
at91_sdram_hw_init(void)19562011840SMasahiro Yamada void at91_sdram_hw_init(void)
19662011840SMasahiro Yamada {
19762011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 16, 0);
19862011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 17, 0);
19962011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 18, 0);
20062011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 19, 0);
20162011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 20, 0);
20262011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 21, 0);
20362011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 22, 0);
20462011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 23, 0);
20562011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 24, 0);
20662011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 25, 0);
20762011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 26, 0);
20862011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 27, 0);
20962011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 28, 0);
21062011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 29, 0);
21162011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 30, 0);
21262011840SMasahiro Yamada 	at91_set_a_periph(AT91_PIO_PORTC, 31, 0);
21362011840SMasahiro Yamada }
21462011840SMasahiro Yamada 
21562011840SMasahiro Yamada /* Platform data for the GPIOs */
21662011840SMasahiro Yamada static const struct at91_port_platdata at91sam9260_plat[] = {
21762011840SMasahiro Yamada 	{ ATMEL_BASE_PIOA, "PA" },
21862011840SMasahiro Yamada 	{ ATMEL_BASE_PIOB, "PB" },
21962011840SMasahiro Yamada 	{ ATMEL_BASE_PIOC, "PC" },
22062011840SMasahiro Yamada };
22162011840SMasahiro Yamada 
22262011840SMasahiro Yamada U_BOOT_DEVICES(at91sam9260_gpios) = {
22362011840SMasahiro Yamada 	{ "gpio_at91", &at91sam9260_plat[0] },
22462011840SMasahiro Yamada 	{ "gpio_at91", &at91sam9260_plat[1] },
22562011840SMasahiro Yamada 	{ "gpio_at91", &at91sam9260_plat[2] },
22662011840SMasahiro Yamada };
227