From: "Andreas Färber" <afaerber@suse.de> To: arm@kernel.org Cc: linux-arm-kernel@lists.infradead.org, mp-cs@actions-semi.com, 96boards@ucrobotics.com, support@lemaker.org, linux-kernel@vger.kernel.org, "Andreas Färber" <afaerber@suse.de>, "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>, "Jiri Slaby" <jslaby@suse.com>, linux-serial@vger.kernel.org Subject: [PATCH v2 08/17] tty: serial: Add Actions Semi Owl UART earlycon Date: Fri, 24 Feb 2017 04:40:46 +0100 [thread overview] Message-ID: <20170224034055.18807-9-afaerber@suse.de> (raw) In-Reply-To: <20170224034055.18807-1-afaerber@suse.de> This implements an earlycon for Actions Semi S500/S900 SoCs. Based on LeMaker linux-actions tree. Signed-off-by: Andreas Färber <afaerber@suse.de> --- v1 -> v2: * Extended Kconfig help to mention earlycon (Arnd) * Spelled out Actions Semiconductor in Kconfig help * Adopted "actions" vendor prefix drivers/tty/serial/Kconfig | 19 ++++++ drivers/tty/serial/Makefile | 1 + drivers/tty/serial/owl-uart.c | 135 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 155 insertions(+) create mode 100644 drivers/tty/serial/owl-uart.c diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig index 6117ac8..e145822 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig @@ -1677,6 +1677,25 @@ config SERIAL_MVEBU_CONSOLE and warnings and which allows logins in single user mode) Otherwise, say 'N'. +config SERIAL_OWL + bool "Actions Semi Owl serial port support" + depends on ARCH_ACTIONS || COMPILE_TEST + select SERIAL_CORE + help + This driver is for Actions Semiconductor S500/S900 SoC's UART. + Say 'Y' here if you wish to use the on-board serial port. + Otherwise, say 'N'. + +config SERIAL_OWL_CONSOLE + bool "Console on Actions Semi Owl serial port" + depends on SERIAL_OWL=y + select SERIAL_CORE_CONSOLE + select SERIAL_EARLYCON + default y + help + Say 'Y' here if you wish to use Actions Semiconductor S500/S900 UART + as the system console. Only earlycon is implemented currently. + endmenu config SERIAL_MCTRL_GPIO diff --git a/drivers/tty/serial/Makefile b/drivers/tty/serial/Makefile index 2d6288b..91f3571 100644 --- a/drivers/tty/serial/Makefile +++ b/drivers/tty/serial/Makefile @@ -91,6 +91,7 @@ obj-$(CONFIG_SERIAL_STM32) += stm32-usart.o obj-$(CONFIG_SERIAL_MVEBU_UART) += mvebu-uart.o obj-$(CONFIG_SERIAL_PIC32) += pic32_uart.o obj-$(CONFIG_SERIAL_MPS2_UART) += mps2-uart.o +obj-$(CONFIG_SERIAL_OWL) += owl-uart.o # GPIOLIB helpers for modem control lines obj-$(CONFIG_SERIAL_MCTRL_GPIO) += serial_mctrl_gpio.o diff --git a/drivers/tty/serial/owl-uart.c b/drivers/tty/serial/owl-uart.c new file mode 100644 index 0000000..e097443 --- /dev/null +++ b/drivers/tty/serial/owl-uart.c @@ -0,0 +1,135 @@ +/* + * Actions Semi Owl family serial console + * + * Copyright 2013 Actions Semi Inc. + * Author: Actions Semi, Inc. + * + * Copyright (c) 2016-2017 Andreas Färber + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/console.h> +#include <linux/delay.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/serial.h> +#include <linux/serial_core.h> + +#define OWL_UART_CTL 0x000 +#define OWL_UART_TXDAT 0x008 +#define OWL_UART_STAT 0x00c + +#define OWL_UART_CTL_TRFS_TX (1 << 14) +#define OWL_UART_CTL_EN (1 << 15) +#define OWL_UART_CTL_RXIE (1 << 18) +#define OWL_UART_CTL_TXIE (1 << 19) + +#define OWL_UART_STAT_RIP (1 << 0) +#define OWL_UART_STAT_TIP (1 << 1) +#define OWL_UART_STAT_TFFU (1 << 6) +#define OWL_UART_STAT_TRFL_MASK (0x1f << 11) +#define OWL_UART_STAT_UTBB (1 << 17) + +static inline void owl_uart_write(struct uart_port *port, u32 val, unsigned int off) +{ + writel(val, port->membase + off); +} + +static inline u32 owl_uart_read(struct uart_port *port, unsigned int off) +{ + return readl(port->membase + off); +} + +#ifdef CONFIG_SERIAL_OWL_CONSOLE + +static void owl_console_putchar(struct uart_port *port, int ch) +{ + if (!port->membase) + return; + + while (owl_uart_read(port, OWL_UART_STAT) & OWL_UART_STAT_TFFU) + cpu_relax(); + + owl_uart_write(port, ch, OWL_UART_TXDAT); +} + +static void owl_uart_port_write(struct uart_port *port, const char *s, + u_int count) +{ + u32 old_ctl, val; + unsigned long flags; + int locked; + + local_irq_save(flags); + + if (port->sysrq) + locked = 0; + else if (oops_in_progress) + locked = spin_trylock(&port->lock); + else { + spin_lock(&port->lock); + locked = 1; + } + + old_ctl = owl_uart_read(port, OWL_UART_CTL); + val = old_ctl | OWL_UART_CTL_TRFS_TX; + /* disable IRQ */ + val &= ~(OWL_UART_CTL_RXIE | OWL_UART_CTL_TXIE); + owl_uart_write(port, val, OWL_UART_CTL); + + uart_console_write(port, s, count, owl_console_putchar); + + /* wait until all contents have been sent out */ + while (owl_uart_read(port, OWL_UART_STAT) & OWL_UART_STAT_TRFL_MASK) + cpu_relax(); + + /* clear IRQ pending */ + val = owl_uart_read(port, OWL_UART_STAT); + val |= OWL_UART_STAT_TIP | OWL_UART_STAT_RIP; + owl_uart_write(port, val, OWL_UART_STAT); + + owl_uart_write(port, old_ctl, OWL_UART_CTL); + + if (locked) + spin_unlock(&port->lock); + + local_irq_restore(flags); +} + +static void owl_uart_early_console_write(struct console *co, + const char *s, + u_int count) +{ + struct earlycon_device *dev = co->data; + + owl_uart_port_write(&dev->port, s, count); +} + +static int __init +owl_uart_early_console_setup(struct earlycon_device *device, const char *opt) +{ + if (!device->port.membase) + return -ENODEV; + + device->con->write = owl_uart_early_console_write; + + return 0; +} +OF_EARLYCON_DECLARE(owl, "actions,owl-uart", + owl_uart_early_console_setup); + +#endif /* CONFIG_SERIAL_OWL_CONSOLE */ -- 2.10.2
WARNING: multiple messages have this Message-ID (diff)
From: afaerber@suse.de (Andreas Färber) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v2 08/17] tty: serial: Add Actions Semi Owl UART earlycon Date: Fri, 24 Feb 2017 04:40:46 +0100 [thread overview] Message-ID: <20170224034055.18807-9-afaerber@suse.de> (raw) In-Reply-To: <20170224034055.18807-1-afaerber@suse.de> This implements an earlycon for Actions Semi S500/S900 SoCs. Based on LeMaker linux-actions tree. Signed-off-by: Andreas F?rber <afaerber@suse.de> --- v1 -> v2: * Extended Kconfig help to mention earlycon (Arnd) * Spelled out Actions Semiconductor in Kconfig help * Adopted "actions" vendor prefix drivers/tty/serial/Kconfig | 19 ++++++ drivers/tty/serial/Makefile | 1 + drivers/tty/serial/owl-uart.c | 135 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 155 insertions(+) create mode 100644 drivers/tty/serial/owl-uart.c diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig index 6117ac8..e145822 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig @@ -1677,6 +1677,25 @@ config SERIAL_MVEBU_CONSOLE and warnings and which allows logins in single user mode) Otherwise, say 'N'. +config SERIAL_OWL + bool "Actions Semi Owl serial port support" + depends on ARCH_ACTIONS || COMPILE_TEST + select SERIAL_CORE + help + This driver is for Actions Semiconductor S500/S900 SoC's UART. + Say 'Y' here if you wish to use the on-board serial port. + Otherwise, say 'N'. + +config SERIAL_OWL_CONSOLE + bool "Console on Actions Semi Owl serial port" + depends on SERIAL_OWL=y + select SERIAL_CORE_CONSOLE + select SERIAL_EARLYCON + default y + help + Say 'Y' here if you wish to use Actions Semiconductor S500/S900 UART + as the system console. Only earlycon is implemented currently. + endmenu config SERIAL_MCTRL_GPIO diff --git a/drivers/tty/serial/Makefile b/drivers/tty/serial/Makefile index 2d6288b..91f3571 100644 --- a/drivers/tty/serial/Makefile +++ b/drivers/tty/serial/Makefile @@ -91,6 +91,7 @@ obj-$(CONFIG_SERIAL_STM32) += stm32-usart.o obj-$(CONFIG_SERIAL_MVEBU_UART) += mvebu-uart.o obj-$(CONFIG_SERIAL_PIC32) += pic32_uart.o obj-$(CONFIG_SERIAL_MPS2_UART) += mps2-uart.o +obj-$(CONFIG_SERIAL_OWL) += owl-uart.o # GPIOLIB helpers for modem control lines obj-$(CONFIG_SERIAL_MCTRL_GPIO) += serial_mctrl_gpio.o diff --git a/drivers/tty/serial/owl-uart.c b/drivers/tty/serial/owl-uart.c new file mode 100644 index 0000000..e097443 --- /dev/null +++ b/drivers/tty/serial/owl-uart.c @@ -0,0 +1,135 @@ +/* + * Actions Semi Owl family serial console + * + * Copyright 2013 Actions Semi Inc. + * Author: Actions Semi, Inc. + * + * Copyright (c) 2016-2017 Andreas F?rber + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/console.h> +#include <linux/delay.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/serial.h> +#include <linux/serial_core.h> + +#define OWL_UART_CTL 0x000 +#define OWL_UART_TXDAT 0x008 +#define OWL_UART_STAT 0x00c + +#define OWL_UART_CTL_TRFS_TX (1 << 14) +#define OWL_UART_CTL_EN (1 << 15) +#define OWL_UART_CTL_RXIE (1 << 18) +#define OWL_UART_CTL_TXIE (1 << 19) + +#define OWL_UART_STAT_RIP (1 << 0) +#define OWL_UART_STAT_TIP (1 << 1) +#define OWL_UART_STAT_TFFU (1 << 6) +#define OWL_UART_STAT_TRFL_MASK (0x1f << 11) +#define OWL_UART_STAT_UTBB (1 << 17) + +static inline void owl_uart_write(struct uart_port *port, u32 val, unsigned int off) +{ + writel(val, port->membase + off); +} + +static inline u32 owl_uart_read(struct uart_port *port, unsigned int off) +{ + return readl(port->membase + off); +} + +#ifdef CONFIG_SERIAL_OWL_CONSOLE + +static void owl_console_putchar(struct uart_port *port, int ch) +{ + if (!port->membase) + return; + + while (owl_uart_read(port, OWL_UART_STAT) & OWL_UART_STAT_TFFU) + cpu_relax(); + + owl_uart_write(port, ch, OWL_UART_TXDAT); +} + +static void owl_uart_port_write(struct uart_port *port, const char *s, + u_int count) +{ + u32 old_ctl, val; + unsigned long flags; + int locked; + + local_irq_save(flags); + + if (port->sysrq) + locked = 0; + else if (oops_in_progress) + locked = spin_trylock(&port->lock); + else { + spin_lock(&port->lock); + locked = 1; + } + + old_ctl = owl_uart_read(port, OWL_UART_CTL); + val = old_ctl | OWL_UART_CTL_TRFS_TX; + /* disable IRQ */ + val &= ~(OWL_UART_CTL_RXIE | OWL_UART_CTL_TXIE); + owl_uart_write(port, val, OWL_UART_CTL); + + uart_console_write(port, s, count, owl_console_putchar); + + /* wait until all contents have been sent out */ + while (owl_uart_read(port, OWL_UART_STAT) & OWL_UART_STAT_TRFL_MASK) + cpu_relax(); + + /* clear IRQ pending */ + val = owl_uart_read(port, OWL_UART_STAT); + val |= OWL_UART_STAT_TIP | OWL_UART_STAT_RIP; + owl_uart_write(port, val, OWL_UART_STAT); + + owl_uart_write(port, old_ctl, OWL_UART_CTL); + + if (locked) + spin_unlock(&port->lock); + + local_irq_restore(flags); +} + +static void owl_uart_early_console_write(struct console *co, + const char *s, + u_int count) +{ + struct earlycon_device *dev = co->data; + + owl_uart_port_write(&dev->port, s, count); +} + +static int __init +owl_uart_early_console_setup(struct earlycon_device *device, const char *opt) +{ + if (!device->port.membase) + return -ENODEV; + + device->con->write = owl_uart_early_console_write; + + return 0; +} +OF_EARLYCON_DECLARE(owl, "actions,owl-uart", + owl_uart_early_console_setup); + +#endif /* CONFIG_SERIAL_OWL_CONSOLE */ -- 2.10.2
next prev parent reply other threads:[~2017-02-24 3:42 UTC|newest] Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-02-24 3:40 [PATCH v2 00/17] ARM: Initial Actions Semi S500 and S900 enablement Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 3:40 ` [PATCH v2 01/17] dt-bindings: Add vendor prefix for Actions Semi Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-27 14:57 ` Andreas Färber 2017-02-27 14:57 ` Andreas Färber 2017-02-27 14:57 ` Andreas Färber 2017-02-28 0:11 ` Rob Herring 2017-02-28 0:11 ` Rob Herring 2017-02-28 0:11 ` Rob Herring 2017-02-24 3:40 ` [PATCH v2 02/17] dt-bindings: arm: Document Actions Semi S500 Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-28 0:12 ` Rob Herring 2017-02-28 0:12 ` Rob Herring 2017-02-28 0:12 ` Rob Herring 2017-02-24 3:40 ` [RFC v2 03/17] dt-bindings: timer: Document Owl timer Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 3:45 ` Andreas Färber 2017-02-24 3:45 ` Andreas Färber 2017-02-27 14:40 ` Andreas Färber 2017-02-27 14:40 ` Andreas Färber 2017-02-27 14:40 ` Andreas Färber 2017-02-28 0:15 ` Rob Herring 2017-02-28 0:15 ` Rob Herring 2017-02-28 0:15 ` Rob Herring 2017-02-24 3:40 ` [PATCH v2 04/17] clocksource: Add " Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 22:29 ` Daniel Lezcano 2017-02-24 22:29 ` Daniel Lezcano 2017-02-24 23:25 ` Andreas Färber 2017-02-24 23:25 ` Andreas Färber 2017-02-25 21:59 ` Daniel Lezcano 2017-02-25 21:59 ` Daniel Lezcano 2017-02-26 14:40 ` Andreas Färber 2017-02-26 14:40 ` Andreas Färber 2017-02-26 14:56 ` Daniel Lezcano 2017-02-26 14:56 ` Daniel Lezcano 2017-02-24 3:40 ` [PATCH v2 05/17] ARM: Prepare Actions Semi S500 Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 3:40 ` [PATCH v2 06/17] ARM64: Prepare Actions Semi S900 Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 3:40 ` [PATCH v2 07/17] dt-bindings: serial: Document Actions Semi Owl UARTs Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-28 0:16 ` Rob Herring 2017-02-28 0:16 ` Rob Herring 2017-02-28 0:16 ` Rob Herring 2017-02-24 3:40 ` Andreas Färber [this message] 2017-02-24 3:40 ` [PATCH v2 08/17] tty: serial: Add Actions Semi Owl UART earlycon Andreas Färber 2017-02-24 3:40 ` [PATCH v2 09/17] Documentation: kernel-parameters: Document owl earlycon Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-03-03 22:46 ` Jonathan Corbet 2017-03-03 22:46 ` Jonathan Corbet 2017-03-03 23:28 ` Andreas Färber 2017-03-03 23:28 ` Andreas Färber 2017-02-24 3:40 ` [PATCH v2 10/17] ARM: dts: Add Actions Semi S500 and LeMaker Guitar Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 23:36 ` Andreas Färber 2017-02-24 23:36 ` Andreas Färber 2017-02-24 23:36 ` Andreas Färber 2017-02-24 3:40 ` [PATCH v2 11/17] dt-bindings: Add vendor prefix for uCRobotics Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-28 0:16 ` Rob Herring 2017-02-28 0:16 ` Rob Herring 2017-02-24 3:40 ` [PATCH v2 12/17] dt-bindings: arm: Document Actions Semi S900 Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-28 0:17 ` Rob Herring 2017-02-28 0:17 ` Rob Herring 2017-02-28 0:17 ` Rob Herring 2017-02-24 3:40 ` [RFC v2 13/17] ARM64: dts: Add Actions Semi S900 and Bubblegum-96 Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 3:49 ` Andreas Färber 2017-02-24 3:49 ` Andreas Färber 2017-02-24 3:49 ` Andreas Färber 2017-02-24 3:40 ` [RFC v2 14/17] MAINTAINERS: Add Actions Semi Owl section Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 3:40 ` [PATCH v2 15/17] tty: serial: owl: Implement console driver Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 3:40 ` [PATCH v2 16/17] ARM64: dts: actions: s900-bubblegum-96: Add fake uart5 clk Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 3:40 ` [PATCH v2 17/17] ARM: dts: s500-guitar-bb-rev-b: Add fake uart3 clock Andreas Färber 2017-02-24 3:40 ` Andreas Färber 2017-02-24 3:40 ` Andreas Färber
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=20170224034055.18807-9-afaerber@suse.de \ --to=afaerber@suse.de \ --cc=96boards@ucrobotics.com \ --cc=arm@kernel.org \ --cc=gregkh@linuxfoundation.org \ --cc=jslaby@suse.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-serial@vger.kernel.org \ --cc=mp-cs@actions-semi.com \ --cc=support@lemaker.org \ /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: linkBe 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.