xref: /openbmc/u-boot/arch/arm/mach-at91/arm926ejs/at91sam9x5_devices.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
262011840SMasahiro Yamada /*
362011840SMasahiro Yamada  * Copyright (C) 2012 Atmel Corporation
462011840SMasahiro Yamada  */
562011840SMasahiro Yamada 
662011840SMasahiro Yamada #include <common.h>
762011840SMasahiro Yamada #include <asm/arch/at91_common.h>
8eced5a7eSWenyou Yang #include <asm/arch/clk.h>
962011840SMasahiro Yamada #include <asm/arch/gpio.h>
1062011840SMasahiro Yamada #include <asm/io.h>
1162011840SMasahiro Yamada 
get_chip_id(void)1262011840SMasahiro Yamada unsigned int get_chip_id(void)
1362011840SMasahiro Yamada {
1462011840SMasahiro Yamada 	/* The 0x40 is the offset of cidr in DBGU */
1562011840SMasahiro Yamada 	return readl(ATMEL_BASE_DBGU + 0x40) & ~ARCH_ID_VERSION_MASK;
1662011840SMasahiro Yamada }
1762011840SMasahiro Yamada 
get_extension_chip_id(void)1862011840SMasahiro Yamada unsigned int get_extension_chip_id(void)
1962011840SMasahiro Yamada {
2062011840SMasahiro Yamada 	/* The 0x44 is the offset of exid in DBGU */
2162011840SMasahiro Yamada 	return readl(ATMEL_BASE_DBGU + 0x44);
2262011840SMasahiro Yamada }
2362011840SMasahiro Yamada 
has_emac1()2462011840SMasahiro Yamada unsigned int has_emac1()
2562011840SMasahiro Yamada {
2662011840SMasahiro Yamada 	return cpu_is_at91sam9x25();
2762011840SMasahiro Yamada }
2862011840SMasahiro Yamada 
has_emac0()2962011840SMasahiro Yamada unsigned int has_emac0()
3062011840SMasahiro Yamada {
3162011840SMasahiro Yamada 	return !(cpu_is_at91sam9g15());
3262011840SMasahiro Yamada }
3362011840SMasahiro Yamada 
has_lcdc()3462011840SMasahiro Yamada unsigned int has_lcdc()
3562011840SMasahiro Yamada {
3662011840SMasahiro Yamada 	return cpu_is_at91sam9g15() || cpu_is_at91sam9g35()
3762011840SMasahiro Yamada 		|| cpu_is_at91sam9x35();
3862011840SMasahiro Yamada }
3962011840SMasahiro Yamada 
get_cpu_name()4062011840SMasahiro Yamada char *get_cpu_name()
4162011840SMasahiro Yamada {
4262011840SMasahiro Yamada 	unsigned int extension_id = get_extension_chip_id();
4362011840SMasahiro Yamada 
4462011840SMasahiro Yamada 	if (cpu_is_at91sam9x5()) {
4562011840SMasahiro Yamada 		switch (extension_id) {
4662011840SMasahiro Yamada 		case ARCH_EXID_AT91SAM9G15:
4762011840SMasahiro Yamada 			return "AT91SAM9G15";
4862011840SMasahiro Yamada 		case ARCH_EXID_AT91SAM9G25:
4962011840SMasahiro Yamada 			return "AT91SAM9G25";
5062011840SMasahiro Yamada 		case ARCH_EXID_AT91SAM9G35:
5162011840SMasahiro Yamada 			return "AT91SAM9G35";
5262011840SMasahiro Yamada 		case ARCH_EXID_AT91SAM9X25:
5362011840SMasahiro Yamada 			return "AT91SAM9X25";
5462011840SMasahiro Yamada 		case ARCH_EXID_AT91SAM9X35:
5562011840SMasahiro Yamada 			return "AT91SAM9X35";
5662011840SMasahiro Yamada 		default:
5762011840SMasahiro Yamada 			return "Unknown CPU type";
5862011840SMasahiro Yamada 		}
5962011840SMasahiro Yamada 	} else {
6062011840SMasahiro Yamada 		return "Unknown CPU type";
6162011840SMasahiro Yamada 	}
6262011840SMasahiro Yamada }
6362011840SMasahiro Yamada 
at91_seriald_hw_init(void)6462011840SMasahiro Yamada void at91_seriald_hw_init(void)
6562011840SMasahiro Yamada {
662dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 9, 0);	/* DRXD */
672dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 10, 1);	/* DTXD */
6862011840SMasahiro Yamada 
69eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_SYS);
7062011840SMasahiro Yamada }
7162011840SMasahiro Yamada 
at91_serial0_hw_init(void)7262011840SMasahiro Yamada void at91_serial0_hw_init(void)
7362011840SMasahiro Yamada {
742dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 0, 1);	/* TXD */
752dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 1, 0);	/* RXD */
7662011840SMasahiro Yamada 
77eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_USART0);
7862011840SMasahiro Yamada }
7962011840SMasahiro Yamada 
at91_serial1_hw_init(void)8062011840SMasahiro Yamada void at91_serial1_hw_init(void)
8162011840SMasahiro Yamada {
822dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 5, 1);	/* TXD */
832dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 6, 0);	/* RXD */
8462011840SMasahiro Yamada 
85eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_USART1);
8662011840SMasahiro Yamada }
8762011840SMasahiro Yamada 
at91_serial2_hw_init(void)8862011840SMasahiro Yamada void at91_serial2_hw_init(void)
8962011840SMasahiro Yamada {
902dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 7, 1);	/* TXD */
912dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 8, 0);	/* RXD */
9262011840SMasahiro Yamada 
93eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_USART2);
9462011840SMasahiro Yamada }
9562011840SMasahiro Yamada 
at91_mci_hw_init(void)9662011840SMasahiro Yamada void at91_mci_hw_init(void)
9762011840SMasahiro Yamada {
9862011840SMasahiro Yamada 	/* Initialize the MCI0 */
992dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 17, 1);	/* MCCK */
1002dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 16, 1);	/* MCCDA */
1012dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 15, 1);	/* MCDA0 */
1022dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 18, 1);	/* MCDA1 */
1032dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 19, 1);	/* MCDA2 */
1042dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 20, 1);	/* MCDA3 */
10562011840SMasahiro Yamada 
106eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_HSMCI0);
10762011840SMasahiro Yamada }
10862011840SMasahiro Yamada 
10962011840SMasahiro Yamada #ifdef CONFIG_ATMEL_SPI
at91_spi0_hw_init(unsigned long cs_mask)11062011840SMasahiro Yamada void at91_spi0_hw_init(unsigned long cs_mask)
11162011840SMasahiro Yamada {
1122dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 11, 0);	/* SPI0_MISO */
1132dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 12, 0);	/* SPI0_MOSI */
1142dc63f73SWenyou Yang 	at91_pio3_set_a_periph(AT91_PIO_PORTA, 13, 0);	/* SPI0_SPCK */
11562011840SMasahiro Yamada 
116eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_SPI0);
11762011840SMasahiro Yamada 
11862011840SMasahiro Yamada 	if (cs_mask & (1 << 0))
1192dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTA, 14, 0);
12062011840SMasahiro Yamada 	if (cs_mask & (1 << 1))
1212dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTA, 7, 0);
12262011840SMasahiro Yamada 	if (cs_mask & (1 << 2))
1232dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTA, 1, 0);
12462011840SMasahiro Yamada 	if (cs_mask & (1 << 3))
1252dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTB, 3, 0);
12662011840SMasahiro Yamada 	if (cs_mask & (1 << 4))
12762011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTA, 14, 0);
12862011840SMasahiro Yamada 	if (cs_mask & (1 << 5))
12962011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTA, 7, 0);
13062011840SMasahiro Yamada 	if (cs_mask & (1 << 6))
13162011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTA, 1, 0);
13262011840SMasahiro Yamada 	if (cs_mask & (1 << 7))
13362011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTB, 3, 0);
13462011840SMasahiro Yamada }
13562011840SMasahiro Yamada 
at91_spi1_hw_init(unsigned long cs_mask)13662011840SMasahiro Yamada void at91_spi1_hw_init(unsigned long cs_mask)
13762011840SMasahiro Yamada {
1382dc63f73SWenyou Yang 	at91_pio3_set_b_periph(AT91_PIO_PORTA, 21, 0);	/* SPI1_MISO */
1392dc63f73SWenyou Yang 	at91_pio3_set_b_periph(AT91_PIO_PORTA, 22, 0);	/* SPI1_MOSI */
1402dc63f73SWenyou Yang 	at91_pio3_set_b_periph(AT91_PIO_PORTA, 23, 0);	/* SPI1_SPCK */
14162011840SMasahiro Yamada 
142eced5a7eSWenyou Yang 	at91_periph_clk_enable(ATMEL_ID_SPI1);
14362011840SMasahiro Yamada 
14462011840SMasahiro Yamada 	if (cs_mask & (1 << 0))
1452dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTA, 8, 0);
14662011840SMasahiro Yamada 	if (cs_mask & (1 << 1))
1472dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTA, 0, 0);
14862011840SMasahiro Yamada 	if (cs_mask & (1 << 2))
1492dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTA, 31, 0);
15062011840SMasahiro Yamada 	if (cs_mask & (1 << 3))
1512dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTA, 30, 0);
15262011840SMasahiro Yamada 	if (cs_mask & (1 << 4))
15362011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTA, 8, 0);
15462011840SMasahiro Yamada 	if (cs_mask & (1 << 5))
15562011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTA, 0, 0);
15662011840SMasahiro Yamada 	if (cs_mask & (1 << 6))
15762011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTA, 31, 0);
15862011840SMasahiro Yamada 	if (cs_mask & (1 << 7))
15962011840SMasahiro Yamada 		at91_set_pio_output(AT91_PIO_PORTA, 30, 0);
16062011840SMasahiro Yamada }
16162011840SMasahiro Yamada #endif
16262011840SMasahiro Yamada 
1638850c5d5STom Rini #if defined(CONFIG_USB_OHCI_NEW) || defined(CONFIG_USB_EHCI_HCD)
at91_uhp_hw_init(void)16462011840SMasahiro Yamada void at91_uhp_hw_init(void)
16562011840SMasahiro Yamada {
16662011840SMasahiro Yamada 	/* Enable VBus on UHP ports */
16762011840SMasahiro Yamada 	at91_set_pio_output(AT91_PIO_PORTD, 18, 0); /* port A */
16862011840SMasahiro Yamada 	at91_set_pio_output(AT91_PIO_PORTD, 19, 0); /* port B */
16962011840SMasahiro Yamada #if defined(CONFIG_USB_OHCI_NEW)
17062011840SMasahiro Yamada 	/* port C is OHCI only */
17162011840SMasahiro Yamada 	at91_set_pio_output(AT91_PIO_PORTD, 20, 0); /* port C */
17262011840SMasahiro Yamada #endif
17362011840SMasahiro Yamada }
17462011840SMasahiro Yamada #endif
17562011840SMasahiro Yamada 
17662011840SMasahiro Yamada #ifdef CONFIG_MACB
at91_macb_hw_init(void)17762011840SMasahiro Yamada void at91_macb_hw_init(void)
17862011840SMasahiro Yamada {
17962011840SMasahiro Yamada 	if (has_emac0()) {
18062011840SMasahiro Yamada 		/* Enable EMAC0 clock */
181eced5a7eSWenyou Yang 		at91_periph_clk_enable(ATMEL_ID_EMAC0);
18262011840SMasahiro Yamada 		/* EMAC0 pins setup */
1832dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 4, 0);	/* ETXCK */
1842dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 3, 0);	/* ERXDV */
1852dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 0, 0);	/* ERX0 */
1862dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 1, 0);	/* ERX1 */
1872dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 2, 0);	/* ERXER */
1882dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 7, 0);	/* ETXEN */
1892dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 9, 0);	/* ETX0 */
1902dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 10, 0);	/* ETX1 */
1912dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 5, 0);	/* EMDIO */
1922dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 6, 0);	/* EMDC */
19362011840SMasahiro Yamada 	}
19462011840SMasahiro Yamada 
19562011840SMasahiro Yamada 	if (has_emac1()) {
19662011840SMasahiro Yamada 		/* Enable EMAC1 clock */
197eced5a7eSWenyou Yang 		at91_periph_clk_enable(ATMEL_ID_EMAC1);
19862011840SMasahiro Yamada 		/* EMAC1 pins setup */
1992dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTC, 29, 0);	/* ETXCK */
2002dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTC, 28, 0);	/* ECRSDV */
2012dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTC, 20, 0);	/* ERXO */
2022dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTC, 21, 0);	/* ERX1 */
2032dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTC, 16, 0);	/* ERXER */
2042dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTC, 27, 0);	/* ETXEN */
2052dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTC, 18, 0);	/* ETX0 */
2062dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTC, 19, 0);	/* ETX1 */
2072dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTC, 31, 0);	/* EMDIO */
2082dc63f73SWenyou Yang 		at91_pio3_set_b_periph(AT91_PIO_PORTC, 30, 0);	/* EMDC */
20962011840SMasahiro Yamada 	}
21062011840SMasahiro Yamada 
21162011840SMasahiro Yamada #ifndef CONFIG_RMII
21262011840SMasahiro Yamada 	/* Only emac0 support MII */
21362011840SMasahiro Yamada 	if (has_emac0()) {
2142dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 16, 0);	/* ECRS */
2152dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 17, 0);	/* ECOL */
2162dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 13, 0);	/* ERX2 */
2172dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 14, 0);	/* ERX3 */
2182dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 15, 0);	/* ERXCK */
2192dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 11, 0);	/* ETX2 */
2202dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 12, 0);	/* ETX3 */
2212dc63f73SWenyou Yang 		at91_pio3_set_a_periph(AT91_PIO_PORTB, 8, 0);	/* ETXER */
22262011840SMasahiro Yamada 	}
22362011840SMasahiro Yamada #endif
22462011840SMasahiro Yamada }
22562011840SMasahiro Yamada #endif
226