blob: a445c7507e2ef035ea6798b088dd18e6b8ab41d4 [file] [log] [blame]
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +01001/*
2 * (C) Copyright 2007-2008
Stelian Popc9e798d2011-11-01 00:00:39 +01003 * Stelian Pop <stelian@popies.net>
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +01004 * Lead Tech Design <www.leadtechdesign.com>
5 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02006 * SPDX-License-Identifier: GPL-2.0+
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +01007 */
8
9#include <common.h>
Asen Dimov3ad24802011-07-26 01:23:39 +000010#include <asm/io.h>
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +010011#include <asm/arch/at91_common.h>
12#include <asm/arch/at91_pmc.h>
13#include <asm/arch/gpio.h>
Asen Dimov3ad24802011-07-26 01:23:39 +000014
15/*
16 * if CONFIG_AT91_GPIO_PULLUP ist set, keep pullups on on all
17 * peripheral pins. Good to have if hardware is soldered optionally
18 * or in case of SPI no slave is selected. Avoid lines to float
19 * needlessly. Use a short local PUP define.
20 *
21 * Due to errata "TXD floats when CTS is inactive" pullups are always
22 * on for TXD pins.
23 */
24#ifdef CONFIG_AT91_GPIO_PULLUP
25# define PUP CONFIG_AT91_GPIO_PULLUP
26#else
27# define PUP 0
28#endif
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +010029
Jean-Christophe PLAGNIOL-VILLARD1699da62009-05-13 21:01:13 +020030void at91_serial0_hw_init(void)
31{
Asen Dimov3ad24802011-07-26 01:23:39 +000032 at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC;
Jens Scharsig0cf0b932010-02-03 22:46:58 +010033
Jens Scharsig7f9e8632010-02-03 22:46:46 +010034 at91_set_a_periph(AT91_PIO_PORTC, 8, 1); /* TXD0 */
35 at91_set_a_periph(AT91_PIO_PORTC, 9, 0); /* RXD0 */
Asen Dimov3ad24802011-07-26 01:23:39 +000036 writel(1 << ATMEL_ID_USART0, &pmc->pcer);
Jean-Christophe PLAGNIOL-VILLARD1699da62009-05-13 21:01:13 +020037}
38
39void at91_serial1_hw_init(void)
40{
Asen Dimov3ad24802011-07-26 01:23:39 +000041 at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC;
Jens Scharsig0cf0b932010-02-03 22:46:58 +010042
Jens Scharsig7f9e8632010-02-03 22:46:46 +010043 at91_set_a_periph(AT91_PIO_PORTC, 12, 1); /* TXD1 */
44 at91_set_a_periph(AT91_PIO_PORTC, 13, 0); /* RXD1 */
Asen Dimov3ad24802011-07-26 01:23:39 +000045 writel(1 << ATMEL_ID_USART1, &pmc->pcer);
Jean-Christophe PLAGNIOL-VILLARD1699da62009-05-13 21:01:13 +020046}
47
48void at91_serial2_hw_init(void)
49{
Asen Dimov3ad24802011-07-26 01:23:39 +000050 at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC;
Jens Scharsig0cf0b932010-02-03 22:46:58 +010051
Jens Scharsig7f9e8632010-02-03 22:46:46 +010052 at91_set_a_periph(AT91_PIO_PORTC, 14, 1); /* TXD2 */
53 at91_set_a_periph(AT91_PIO_PORTC, 15, 0); /* RXD2 */
Asen Dimov3ad24802011-07-26 01:23:39 +000054 writel(1 << ATMEL_ID_USART2, &pmc->pcer);
Jean-Christophe PLAGNIOL-VILLARD1699da62009-05-13 21:01:13 +020055}
56
Asen Dimov3ad24802011-07-26 01:23:39 +000057void at91_seriald_hw_init(void)
Jean-Christophe PLAGNIOL-VILLARD1699da62009-05-13 21:01:13 +020058{
Asen Dimov3ad24802011-07-26 01:23:39 +000059 at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC;
Jens Scharsig0cf0b932010-02-03 22:46:58 +010060
Jens Scharsig7f9e8632010-02-03 22:46:46 +010061 at91_set_a_periph(AT91_PIO_PORTA, 9, 0); /* DRXD */
62 at91_set_a_periph(AT91_PIO_PORTA, 10, 1); /* DTXD */
Asen Dimov3ad24802011-07-26 01:23:39 +000063 writel(1 << ATMEL_ID_SYS, &pmc->pcer);
Jean-Christophe PLAGNIOL-VILLARD1699da62009-05-13 21:01:13 +020064}
65
Asen Dimov3ad24802011-07-26 01:23:39 +000066#if defined(CONFIG_HAS_DATAFLASH) || defined(CONFIG_ATMEL_SPI)
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +010067void at91_spi0_hw_init(unsigned long cs_mask)
68{
Asen Dimov3ad24802011-07-26 01:23:39 +000069 at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC;
Jens Scharsig0cf0b932010-02-03 22:46:58 +010070
Asen Dimov3ad24802011-07-26 01:23:39 +000071 at91_set_a_periph(AT91_PIO_PORTA, 0, PUP); /* SPI0_MISO */
72 at91_set_a_periph(AT91_PIO_PORTA, 1, PUP); /* SPI0_MOSI */
73 at91_set_a_periph(AT91_PIO_PORTA, 2, PUP); /* SPI0_SPCK */
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +010074
75 /* Enable clock */
Asen Dimov3ad24802011-07-26 01:23:39 +000076 writel(1 << ATMEL_ID_SPI0, &pmc->pcer);
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +010077
78 if (cs_mask & (1 << 0)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +010079 at91_set_a_periph(AT91_PIO_PORTA, 3, 1);
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +010080 }
81 if (cs_mask & (1 << 1)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +010082 at91_set_a_periph(AT91_PIO_PORTA, 4, 1);
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +010083 }
84 if (cs_mask & (1 << 2)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +010085 at91_set_a_periph(AT91_PIO_PORTA, 5, 1);
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +010086 }
87 if (cs_mask & (1 << 3)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +010088 at91_set_a_periph(AT91_PIO_PORTA, 6, 1);
Jean-Christophe PLAGNIOL-VILLARDa47492a2009-03-27 13:14:52 +010089 }
90 if (cs_mask & (1 << 4)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +010091 at91_set_pio_output(AT91_PIO_PORTA, 3, 1);
Jean-Christophe PLAGNIOL-VILLARDa47492a2009-03-27 13:14:52 +010092 }
93 if (cs_mask & (1 << 5)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +010094 at91_set_pio_output(AT91_PIO_PORTA, 4, 1);
Jean-Christophe PLAGNIOL-VILLARDa47492a2009-03-27 13:14:52 +010095 }
96 if (cs_mask & (1 << 6)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +010097 at91_set_pio_output(AT91_PIO_PORTA, 5, 1);
Jean-Christophe PLAGNIOL-VILLARDa47492a2009-03-27 13:14:52 +010098 }
99 if (cs_mask & (1 << 7)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +0100100 at91_set_pio_output(AT91_PIO_PORTA, 6, 1);
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +0100101 }
102}
103
104void at91_spi1_hw_init(unsigned long cs_mask)
105{
Asen Dimov3ad24802011-07-26 01:23:39 +0000106 at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC;
Jens Scharsig0cf0b932010-02-03 22:46:58 +0100107
Asen Dimov3ad24802011-07-26 01:23:39 +0000108 at91_set_a_periph(AT91_PIO_PORTB, 30, PUP); /* SPI1_MISO */
109 at91_set_a_periph(AT91_PIO_PORTB, 31, PUP); /* SPI1_MOSI */
110 at91_set_a_periph(AT91_PIO_PORTB, 29, PUP); /* SPI1_SPCK */
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +0100111
112 /* Enable clock */
Asen Dimov3ad24802011-07-26 01:23:39 +0000113 writel(1 << ATMEL_ID_SPI1, &pmc->pcer);
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +0100114
115 if (cs_mask & (1 << 0)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +0100116 at91_set_a_periph(AT91_PIO_PORTB, 28, 1);
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +0100117 }
118 if (cs_mask & (1 << 1)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +0100119 at91_set_b_periph(AT91_PIO_PORTA, 24, 1);
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +0100120 }
121 if (cs_mask & (1 << 2)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +0100122 at91_set_b_periph(AT91_PIO_PORTA, 25, 1);
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +0100123 }
124 if (cs_mask & (1 << 3)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +0100125 at91_set_a_periph(AT91_PIO_PORTA, 26, 1);
Jean-Christophe PLAGNIOL-VILLARDa47492a2009-03-27 13:14:52 +0100126 }
127 if (cs_mask & (1 << 4)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +0100128 at91_set_pio_output(AT91_PIO_PORTB, 28, 1);
Jean-Christophe PLAGNIOL-VILLARDa47492a2009-03-27 13:14:52 +0100129 }
130 if (cs_mask & (1 << 5)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +0100131 at91_set_pio_output(AT91_PIO_PORTA, 24, 1);
Jean-Christophe PLAGNIOL-VILLARDa47492a2009-03-27 13:14:52 +0100132 }
133 if (cs_mask & (1 << 6)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +0100134 at91_set_pio_output(AT91_PIO_PORTA, 25, 1);
Jean-Christophe PLAGNIOL-VILLARDa47492a2009-03-27 13:14:52 +0100135 }
136 if (cs_mask & (1 << 7)) {
Jens Scharsig7f9e8632010-02-03 22:46:46 +0100137 at91_set_pio_output(AT91_PIO_PORTA, 26, 1);
Jean-Christophe PLAGNIOL-VILLARD7ebafb72009-03-21 21:07:59 +0100138 }
139}
Jean-Christophe PLAGNIOL-VILLARD1699da62009-05-13 21:01:13 +0200140#endif