From: "Andreas Bießmann" <andreas.devel@googlemail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 6/7] dm: at91: Add driver model support for the serial driver
Date: Thu, 23 Oct 2014 22:04:15 +0200 [thread overview]
Message-ID: <54495F3F.7040403@googlemail.com> (raw)
In-Reply-To: <1412619262-23903-7-git-send-email-sjg@chromium.org>
Hi Simon,
On 06.10.14 20:14, Simon Glass wrote:
> Add driver model support while retaining the existing legacy code. This
> allows the driver to support boards that have converted to driver model
> as well as those that have not.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> arch/arm/include/asm/arch-at91/at91_serial.h | 15 +++++
> drivers/serial/atmel_usart.c | 85 ++++++++++++++++++++++++++++
> 2 files changed, 100 insertions(+)
> create mode 100644 arch/arm/include/asm/arch-at91/at91_serial.h
>
> diff --git a/arch/arm/include/asm/arch-at91/at91_serial.h b/arch/arm/include/asm/arch-at91/at91_serial.h
> new file mode 100644
> index 0000000..9f78ed4
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-at91/at91_serial.h
> @@ -0,0 +1,15 @@
> +/*
> + * Copyright (c) 2014 Google, Inc
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#ifndef _AT91_SERIAL_H
> +#define _AT91_SERIAL_H
> +
> +/* Information about a serial port */
> +struct at91_serial_platdata {
> + uint32_t base_addr;
> +};
> +
> +#endif
> diff --git a/drivers/serial/atmel_usart.c b/drivers/serial/atmel_usart.c
> index ce36e99..d3e2ade 100644
> --- a/drivers/serial/atmel_usart.c
> +++ b/drivers/serial/atmel_usart.c
> @@ -7,11 +7,17 @@
> * SPDX-License-Identifier: GPL-2.0+
> */
> #include <common.h>
> +#include <dm.h>
> +#include <errno.h>
> #include <watchdog.h>
> #include <serial.h>
> #include <linux/compiler.h>
>
> #include <asm/io.h>
> +#ifdef CONFIG_DM_SERIAL
> +/* Should this be made common with avr32? */
yes, we should do so. Therefore I vote for atmel_serial.h.
> +#include <asm/arch/at91_serial.h>
> +#endif
> #include <asm/arch/clk.h>
> #include <asm/arch/hardware.h>
>
> @@ -60,6 +66,7 @@ static void atmel_serial_activate(atmel_usart3_t *usart)
> __udelay(100);
> }
>
> +#ifndef CONFIG_DM_SERIAL
> static void atmel_serial_setbrg(void)
> {
> atmel_serial_setbrg_internal((atmel_usart3_t *)CONFIG_USART_BASE,
> @@ -123,3 +130,81 @@ __weak struct serial_device *default_serial_console(void)
> {
> return &atmel_serial_drv;
> }
> +#endif
> +
> +#ifdef CONFIG_DM_SERIAL
> +
> +struct at91_serial_priv {
> + atmel_usart3_t *usart;
> +};
> +
> +int at91_serial_setbrg(struct udevice *dev, int baudrate)
> +{
> + struct at91_serial_priv *priv = dev_get_priv(dev);
> +
> + atmel_serial_setbrg_internal(priv->usart, 0 /* ignored */, baudrate);
> + atmel_serial_activate(priv->usart);
> +
> + return 0;
> +}
> +
> +static int at91_serial_getc(struct udevice *dev)
> +{
> + struct at91_serial_priv *priv = dev_get_priv(dev);
> +
> + if (!(readl(&priv->usart->csr) & USART3_BIT(RXRDY)))
> + return -EAGAIN;
> +
> + return readl(&priv->usart->rhr);
> +}
> +
> +static int at91_serial_putc(struct udevice *dev, const char ch)
> +{
> + struct at91_serial_priv *priv = dev_get_priv(dev);
> +
> + if (!(readl(&priv->usart->csr) & USART3_BIT(TXRDY)))
> + return -EAGAIN;
> +
> + writel(ch, &priv->usart->thr);
> +
> + return 0;
> +}
> +
> +static int at91_serial_pending(struct udevice *dev, bool input)
> +{
> + struct at91_serial_priv *priv = dev_get_priv(dev);
> + uint32_t csr = readl(&priv->usart->csr);
> +
> + if (input)
> + return csr & USART3_BIT(RXRDY) ? 1 : 0;
> + else
> + return csr & USART3_BIT(TXEMPTY) ? 0 : 1;
> +}
> +
> +static const struct dm_serial_ops at91_serial_ops = {
> + .putc = at91_serial_putc,
> + .pending = at91_serial_pending,
> + .getc = at91_serial_getc,
> + .setbrg = at91_serial_setbrg,
> +};
> +
> +static int at91_serial_probe(struct udevice *dev)
> +{
> + struct at91_serial_platdata *plat = dev->platdata;
> + struct at91_serial_priv *priv = dev_get_priv(dev);
> +
> + priv->usart = (atmel_usart3_t *)plat->base_addr;
> + atmel_serial_init_internal(priv->usart);
> +
> + return 0;
> +}
> +
> +U_BOOT_DRIVER(serial_at91) = {
Please name it 'atmel' rather than 'at91' at91 is just one (legacy)
product family, there is also avr32 (ok, outdated) but new and growing
'sama5'.
> + .name = "serial_at91",
> + .id = UCLASS_SERIAL,
> + .probe = at91_serial_probe,
> + .ops = &at91_serial_ops,
> + .flags = DM_FLAG_PRE_RELOC,
> + .priv_auto_alloc_size = sizeof(struct at91_serial_priv),
> +};
> +#endif
>
The patch looks good to me, but I wonder if changing the baudrate is
working as expected. Did you test this?
Best regards
Andreas Bie?mann
next prev parent reply other threads:[~2014-10-23 20:04 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-06 18:14 [U-Boot] [PATCH 0/7] dm: Introduce driver model for Atmel at91 Simon Glass
2014-10-06 18:14 ` [U-Boot] [PATCH 1/7] dm: at91: Correct text base for snapper9260 Simon Glass
2014-10-23 5:07 ` Andreas Bießmann
2014-10-23 5:10 ` Andreas Bießmann
2014-10-23 5:12 ` Simon Glass
2014-10-23 5:21 ` Andreas Bießmann
2014-10-23 20:10 ` Simon Glass
2014-10-06 18:14 ` [U-Boot] [PATCH 2/7] dm: at91: Move snapper9260 to generic baord Simon Glass
2014-10-06 18:14 ` [U-Boot] [PATCH 3/7] dm: at91: Add driver model support for atmel GPIO driver Simon Glass
2014-10-23 6:52 ` Andreas Bießmann
2014-10-06 18:14 ` [U-Boot] [PATCH 4/7] dm: at91: Add platform data for GPIO on at91sam9260-based boards Simon Glass
2014-10-23 6:58 ` Andreas Bießmann
2014-10-06 18:14 ` [U-Boot] [PATCH 5/7] dm: at91: Refactor serial driver slightly for driver model Simon Glass
2014-10-23 19:40 ` Andreas Bießmann
2014-10-06 18:14 ` [U-Boot] [PATCH 6/7] dm: at91: Add driver model support for the serial driver Simon Glass
2014-10-23 20:04 ` Andreas Bießmann [this message]
2014-10-06 18:14 ` [U-Boot] [PATCH 7/7] dm: at91: Convert snapper9260 to use driver model Simon Glass
2014-10-23 20:09 ` Andreas Bießmann
2014-10-23 4:09 ` [U-Boot] [PATCH 0/7] dm: Introduce driver model for Atmel at91 Simon Glass
2014-10-23 20:09 ` Andreas Bießmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54495F3F.7040403@googlemail.com \
--to=andreas.devel@googlemail.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.