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