xref: /rk3399_rockchip-uboot/drivers/serial/atmel_usart.c (revision 329f0f52fa9fa572b0edbc8dfc34698dbe8efb6a)
11378df79SJean-Christophe PLAGNIOL-VILLARD /*
21378df79SJean-Christophe PLAGNIOL-VILLARD  * Copyright (C) 2004-2006 Atmel Corporation
31378df79SJean-Christophe PLAGNIOL-VILLARD  *
4125637c5SAndreas Bießmann  * Modified to support C structur SoC access by
5125637c5SAndreas Bießmann  * Andreas Bießmann <biessmann@corscience.de>
6125637c5SAndreas Bießmann  *
71378df79SJean-Christophe PLAGNIOL-VILLARD  * This program is free software; you can redistribute it and/or modify
81378df79SJean-Christophe PLAGNIOL-VILLARD  * it under the terms of the GNU General Public License as published by
91378df79SJean-Christophe PLAGNIOL-VILLARD  * the Free Software Foundation; either version 2 of the License, or
101378df79SJean-Christophe PLAGNIOL-VILLARD  * (at your option) any later version.
111378df79SJean-Christophe PLAGNIOL-VILLARD  *
121378df79SJean-Christophe PLAGNIOL-VILLARD  * This program is distributed in the hope that it will be useful,
131378df79SJean-Christophe PLAGNIOL-VILLARD  * but WITHOUT ANY WARRANTY; without even the implied warranty of
141378df79SJean-Christophe PLAGNIOL-VILLARD  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
151378df79SJean-Christophe PLAGNIOL-VILLARD  * GNU General Public License for more details.
161378df79SJean-Christophe PLAGNIOL-VILLARD  *
171378df79SJean-Christophe PLAGNIOL-VILLARD  * You should have received a copy of the GNU General Public License
181378df79SJean-Christophe PLAGNIOL-VILLARD  * along with this program; if not, write to the Free Software
191378df79SJean-Christophe PLAGNIOL-VILLARD  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
201378df79SJean-Christophe PLAGNIOL-VILLARD  */
211378df79SJean-Christophe PLAGNIOL-VILLARD #include <common.h>
22843a2654SJean-Christophe PLAGNIOL-VILLARD #include <watchdog.h>
231378df79SJean-Christophe PLAGNIOL-VILLARD 
241378df79SJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h>
251378df79SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/clk.h>
26*329f0f52SReinhard Meyer #include <asm/arch/hardware.h>
271378df79SJean-Christophe PLAGNIOL-VILLARD 
281378df79SJean-Christophe PLAGNIOL-VILLARD #include "atmel_usart.h"
291378df79SJean-Christophe PLAGNIOL-VILLARD 
301378df79SJean-Christophe PLAGNIOL-VILLARD DECLARE_GLOBAL_DATA_PTR;
311378df79SJean-Christophe PLAGNIOL-VILLARD 
321378df79SJean-Christophe PLAGNIOL-VILLARD void serial_setbrg(void)
331378df79SJean-Christophe PLAGNIOL-VILLARD {
34*329f0f52SReinhard Meyer 	atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE;
351378df79SJean-Christophe PLAGNIOL-VILLARD 	unsigned long divisor;
361378df79SJean-Christophe PLAGNIOL-VILLARD 	unsigned long usart_hz;
371378df79SJean-Christophe PLAGNIOL-VILLARD 
381378df79SJean-Christophe PLAGNIOL-VILLARD 	/*
391378df79SJean-Christophe PLAGNIOL-VILLARD 	 *              Master Clock
401378df79SJean-Christophe PLAGNIOL-VILLARD 	 * Baud Rate = --------------
411378df79SJean-Christophe PLAGNIOL-VILLARD 	 *                16 * CD
421378df79SJean-Christophe PLAGNIOL-VILLARD 	 */
43*329f0f52SReinhard Meyer 	usart_hz = get_usart_clk_rate(CONFIG_USART_ID);
441378df79SJean-Christophe PLAGNIOL-VILLARD 	divisor = (usart_hz / 16 + gd->baudrate / 2) / gd->baudrate;
45125637c5SAndreas Bießmann 	writel(USART3_BF(CD, divisor), &usart->brgr);
461378df79SJean-Christophe PLAGNIOL-VILLARD }
471378df79SJean-Christophe PLAGNIOL-VILLARD 
481378df79SJean-Christophe PLAGNIOL-VILLARD int serial_init(void)
491378df79SJean-Christophe PLAGNIOL-VILLARD {
50*329f0f52SReinhard Meyer 	atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE;
51125637c5SAndreas Bießmann 
52125637c5SAndreas Bießmann 	writel(USART3_BIT(RSTRX) | USART3_BIT(RSTTX), &usart->cr);
531378df79SJean-Christophe PLAGNIOL-VILLARD 
541378df79SJean-Christophe PLAGNIOL-VILLARD 	serial_setbrg();
551378df79SJean-Christophe PLAGNIOL-VILLARD 
56125637c5SAndreas Bießmann 	writel(USART3_BIT(RXEN) | USART3_BIT(TXEN), &usart->cr);
57125637c5SAndreas Bießmann 	writel((USART3_BF(USART_MODE, USART3_USART_MODE_NORMAL)
581378df79SJean-Christophe PLAGNIOL-VILLARD 			   | USART3_BF(USCLKS, USART3_USCLKS_MCK)
591378df79SJean-Christophe PLAGNIOL-VILLARD 			   | USART3_BF(CHRL, USART3_CHRL_8)
601378df79SJean-Christophe PLAGNIOL-VILLARD 			   | USART3_BF(PAR, USART3_PAR_NONE)
61125637c5SAndreas Bießmann 			   | USART3_BF(NBSTOP, USART3_NBSTOP_1)),
62125637c5SAndreas Bießmann 			   &usart->mr);
631378df79SJean-Christophe PLAGNIOL-VILLARD 
641378df79SJean-Christophe PLAGNIOL-VILLARD 	return 0;
651378df79SJean-Christophe PLAGNIOL-VILLARD }
661378df79SJean-Christophe PLAGNIOL-VILLARD 
671378df79SJean-Christophe PLAGNIOL-VILLARD void serial_putc(char c)
681378df79SJean-Christophe PLAGNIOL-VILLARD {
69*329f0f52SReinhard Meyer 	atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE;
70125637c5SAndreas Bießmann 
711378df79SJean-Christophe PLAGNIOL-VILLARD 	if (c == '\n')
721378df79SJean-Christophe PLAGNIOL-VILLARD 		serial_putc('\r');
731378df79SJean-Christophe PLAGNIOL-VILLARD 
74125637c5SAndreas Bießmann 	while (!(readl(&usart->csr) & USART3_BIT(TXRDY)));
75125637c5SAndreas Bießmann 	writel(c, &usart->thr);
761378df79SJean-Christophe PLAGNIOL-VILLARD }
771378df79SJean-Christophe PLAGNIOL-VILLARD 
781378df79SJean-Christophe PLAGNIOL-VILLARD void serial_puts(const char *s)
791378df79SJean-Christophe PLAGNIOL-VILLARD {
801378df79SJean-Christophe PLAGNIOL-VILLARD 	while (*s)
811378df79SJean-Christophe PLAGNIOL-VILLARD 		serial_putc(*s++);
821378df79SJean-Christophe PLAGNIOL-VILLARD }
831378df79SJean-Christophe PLAGNIOL-VILLARD 
841378df79SJean-Christophe PLAGNIOL-VILLARD int serial_getc(void)
851378df79SJean-Christophe PLAGNIOL-VILLARD {
86*329f0f52SReinhard Meyer 	atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE;
87125637c5SAndreas Bießmann 
88125637c5SAndreas Bießmann 	while (!(readl(&usart->csr) & USART3_BIT(RXRDY)))
89843a2654SJean-Christophe PLAGNIOL-VILLARD 		 WATCHDOG_RESET();
90125637c5SAndreas Bießmann 	return readl(&usart->rhr);
911378df79SJean-Christophe PLAGNIOL-VILLARD }
921378df79SJean-Christophe PLAGNIOL-VILLARD 
931378df79SJean-Christophe PLAGNIOL-VILLARD int serial_tstc(void)
941378df79SJean-Christophe PLAGNIOL-VILLARD {
95*329f0f52SReinhard Meyer 	atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE;
96125637c5SAndreas Bießmann 	return (readl(&usart->csr) & USART3_BIT(RXRDY)) != 0;
971378df79SJean-Christophe PLAGNIOL-VILLARD }
98