From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751419AbdFFBAC (ORCPT ); Mon, 5 Jun 2017 21:00:02 -0400 Received: from mx2.suse.de ([195.135.220.15]:34062 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751440AbdFFAzK (ORCPT ); Mon, 5 Jun 2017 20:55:10 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= To: linux-arm-kernel@lists.infradead.org Cc: mp-cs@actions-semi.com, Thomas Liau , =?UTF-8?q?=E5=BC=A0=E4=B8=9C=E9=A3=8E?= , =?UTF-8?q?=E5=88=98=E7=82=9C?= , =?UTF-8?q?=E5=BC=A0=E5=A4=A9=E7=9B=8A?= , 96boards@ucrobotics.com, support@lemaker.org, linux-kernel@vger.kernel.org, =?UTF-8?q?Andreas=20F=C3=A4rber?= , Greg Kroah-Hartman , Jiri Slaby , linux-serial@vger.kernel.org Subject: [PATCH v4 09/28] tty: serial: Add Actions Semi Owl UART earlycon Date: Tue, 6 Jun 2017 02:54:07 +0200 Message-Id: <20170606005426.26446-10-afaerber@suse.de> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20170606005426.26446-1-afaerber@suse.de> References: <20170606005426.26446-1-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This implements an earlycon for Actions Semi S500/S900 SoCs. Based on LeMaker linux-actions tree. Signed-off-by: Andreas Färber --- v3 -> v4: Unchanged v2 -> v3: * Adopted BIT() macro 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 5c8850f7a2a0..38f90ea45cf7 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig @@ -1688,6 +1688,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 53c03e005132..fe88a75d9a59 100644 --- a/drivers/tty/serial/Makefile +++ b/drivers/tty/serial/Makefile @@ -92,6 +92,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 000000000000..1b8008797a1b --- /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 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define OWL_UART_CTL 0x000 +#define OWL_UART_TXDAT 0x008 +#define OWL_UART_STAT 0x00c + +#define OWL_UART_CTL_TRFS_TX BIT(14) +#define OWL_UART_CTL_EN BIT(15) +#define OWL_UART_CTL_RXIE BIT(18) +#define OWL_UART_CTL_TXIE BIT(19) + +#define OWL_UART_STAT_RIP BIT(0) +#define OWL_UART_STAT_TIP BIT(1) +#define OWL_UART_STAT_TFFU BIT(6) +#define OWL_UART_STAT_TRFL_MASK (0x1f << 11) +#define OWL_UART_STAT_UTBB BIT(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.12.3 From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Subject: [PATCH v4 09/28] tty: serial: Add Actions Semi Owl UART earlycon Date: Tue, 6 Jun 2017 02:54:07 +0200 Message-ID: <20170606005426.26446-10-afaerber@suse.de> References: <20170606005426.26446-1-afaerber@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20170606005426.26446-1-afaerber@suse.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: linux-arm-kernel@lists.infradead.org Cc: support@lemaker.org, =?UTF-8?q?=E5=BC=A0=E5=A4=A9=E7=9B=8A?= , Greg Kroah-Hartman , 96boards@ucrobotics.com, linux-kernel@vger.kernel.org, Thomas Liau , mp-cs@actions-semi.com, linux-serial@vger.kernel.org, =?UTF-8?q?=E5=88=98=E7=82=9C?= , Jiri Slaby , =?UTF-8?q?Andreas=20F=C3=A4rber?= , =?UTF-8?q?=E5=BC=A0=E4=B8=9C=E9=A3=8E?= List-Id: linux-serial@vger.kernel.org VGhpcyBpbXBsZW1lbnRzIGFuIGVhcmx5Y29uIGZvciBBY3Rpb25zIFNlbWkgUzUwMC9TOTAwIFNv Q3MuCgpCYXNlZCBvbiBMZU1ha2VyIGxpbnV4LWFjdGlvbnMgdHJlZS4KClNpZ25lZC1vZmYtYnk6 IEFuZHJlYXMgRsOkcmJlciA8YWZhZXJiZXJAc3VzZS5kZT4KLS0tCiB2MyAtPiB2NDogVW5jaGFu Z2VkCiAKIHYyIC0+IHYzOgogKiBBZG9wdGVkIEJJVCgpIG1hY3JvCiAKIHYxIC0+IHYyOgogKiBF eHRlbmRlZCBLY29uZmlnIGhlbHAgdG8gbWVudGlvbiBlYXJseWNvbiAoQXJuZCkKICogU3BlbGxl ZCBvdXQgQWN0aW9ucyBTZW1pY29uZHVjdG9yIGluIEtjb25maWcgaGVscAogKiBBZG9wdGVkICJh Y3Rpb25zIiB2ZW5kb3IgcHJlZml4CiAKIGRyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnICAgIHwg IDE5ICsrKysrKwogZHJpdmVycy90dHkvc2VyaWFsL01ha2VmaWxlICAgfCAgIDEgKwogZHJpdmVy cy90dHkvc2VyaWFsL293bC11YXJ0LmMgfCAxMzUgKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDE1NSBpbnNlcnRpb25zKCspCiBjcmVh dGUgbW9kZSAxMDA2NDQgZHJpdmVycy90dHkvc2VyaWFsL293bC11YXJ0LmMKCmRpZmYgLS1naXQg YS9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmln CmluZGV4IDVjODg1MGY3YTJhMC4uMzhmOTBlYTQ1Y2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0 eS9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZwpAQCAtMTY4 OCw2ICsxNjg4LDI1IEBAIGNvbmZpZyBTRVJJQUxfTVZFQlVfQ09OU09MRQogCSAgYW5kIHdhcm5p bmdzIGFuZCB3aGljaCBhbGxvd3MgbG9naW5zIGluIHNpbmdsZSB1c2VyIG1vZGUpCiAJICBPdGhl cndpc2UsIHNheSAnTicuCiAKK2NvbmZpZyBTRVJJQUxfT1dMCisJYm9vbCAiQWN0aW9ucyBTZW1p IE93bCBzZXJpYWwgcG9ydCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9BQ1RJT05TIHx8IENP TVBJTEVfVEVTVAorCXNlbGVjdCBTRVJJQUxfQ09SRQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlz IGZvciBBY3Rpb25zIFNlbWljb25kdWN0b3IgUzUwMC9TOTAwIFNvQydzIFVBUlQuCisJICBTYXkg J1knIGhlcmUgaWYgeW91IHdpc2ggdG8gdXNlIHRoZSBvbi1ib2FyZCBzZXJpYWwgcG9ydC4KKwkg IE90aGVyd2lzZSwgc2F5ICdOJy4KKworY29uZmlnIFNFUklBTF9PV0xfQ09OU09MRQorCWJvb2wg IkNvbnNvbGUgb24gQWN0aW9ucyBTZW1pIE93bCBzZXJpYWwgcG9ydCIKKwlkZXBlbmRzIG9uIFNF UklBTF9PV0w9eQorCXNlbGVjdCBTRVJJQUxfQ09SRV9DT05TT0xFCisJc2VsZWN0IFNFUklBTF9F QVJMWUNPTgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSAnWScgaGVyZSBpZiB5b3Ugd2lzaCB0 byB1c2UgQWN0aW9ucyBTZW1pY29uZHVjdG9yIFM1MDAvUzkwMCBVQVJUCisJICBhcyB0aGUgc3lz dGVtIGNvbnNvbGUuIE9ubHkgZWFybHljb24gaXMgaW1wbGVtZW50ZWQgY3VycmVudGx5LgorCiBl bmRtZW51CiAKIGNvbmZpZyBTRVJJQUxfTUNUUkxfR1BJTwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90 dHkvc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy90dHkvc2VyaWFsL01ha2VmaWxlCmluZGV4IDUz YzAzZTAwNTEzMi4uZmU4OGE3NWQ5YTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwv TWFrZWZpbGUKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL01ha2VmaWxlCkBAIC05Miw2ICs5Miw3 IEBAIG9iai0kKENPTkZJR19TRVJJQUxfU1RNMzIpCSs9IHN0bTMyLXVzYXJ0Lm8KIG9iai0kKENP TkZJR19TRVJJQUxfTVZFQlVfVUFSVCkJKz0gbXZlYnUtdWFydC5vCiBvYmotJChDT05GSUdfU0VS SUFMX1BJQzMyKQkrPSBwaWMzMl91YXJ0Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfTVBTMl9VQVJU KQkrPSBtcHMyLXVhcnQubworb2JqLSQoQ09ORklHX1NFUklBTF9PV0wpCSs9IG93bC11YXJ0Lm8K IAogIyBHUElPTElCIGhlbHBlcnMgZm9yIG1vZGVtIGNvbnRyb2wgbGluZXMKIG9iai0kKENPTkZJ R19TRVJJQUxfTUNUUkxfR1BJTykJKz0gc2VyaWFsX21jdHJsX2dwaW8ubwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy90dHkvc2VyaWFsL293bC11YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvb3dsLXVh cnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjFiODAwODc5N2Ex YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9vd2wtdWFydC5jCkBAIC0w LDAgKzEsMTM1IEBACisvKgorICogQWN0aW9ucyBTZW1pIE93bCBmYW1pbHkgc2VyaWFsIGNvbnNv bGUKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBBY3Rpb25zIFNlbWkgSW5jLgorICogQXV0aG9yOiBB Y3Rpb25zIFNlbWksIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNyBBbmRyZWFz IEbDpHJiZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2Yg IHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICog RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vu c2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo aXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dy YW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisj aW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5j bHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxs aW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUg PGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisKKyNkZWZp bmUgT1dMX1VBUlRfQ1RMCTB4MDAwCisjZGVmaW5lIE9XTF9VQVJUX1RYREFUCTB4MDA4CisjZGVm aW5lIE9XTF9VQVJUX1NUQVQJMHgwMGMKKworI2RlZmluZSBPV0xfVUFSVF9DVExfVFJGU19UWAkJ QklUKDE0KQorI2RlZmluZSBPV0xfVUFSVF9DVExfRU4JCQlCSVQoMTUpCisjZGVmaW5lIE9XTF9V QVJUX0NUTF9SWElFCQlCSVQoMTgpCisjZGVmaW5lIE9XTF9VQVJUX0NUTF9UWElFCQlCSVQoMTkp CisKKyNkZWZpbmUgT1dMX1VBUlRfU1RBVF9SSVAJCUJJVCgwKQorI2RlZmluZSBPV0xfVUFSVF9T VEFUX1RJUAkJQklUKDEpCisjZGVmaW5lIE9XTF9VQVJUX1NUQVRfVEZGVQkJQklUKDYpCisjZGVm aW5lIE9XTF9VQVJUX1NUQVRfVFJGTF9NQVNLCQkoMHgxZiA8PCAxMSkKKyNkZWZpbmUgT1dMX1VB UlRfU1RBVF9VVEJCCQlCSVQoMTcpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvd2xfdWFydF93cml0 ZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1MzIgdmFsLCB1bnNpZ25lZCBpbnQgb2ZmKQorewor CXdyaXRlbCh2YWwsIHBvcnQtPm1lbWJhc2UgKyBvZmYpOworfQorCitzdGF0aWMgaW5saW5lIHUz MiBvd2xfdWFydF9yZWFkKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBvZmYp Cit7CisJcmV0dXJuIHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBvZmYpOworfQorCisjaWZkZWYgQ09O RklHX1NFUklBTF9PV0xfQ09OU09MRQorCitzdGF0aWMgdm9pZCBvd2xfY29uc29sZV9wdXRjaGFy KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjaCkKK3sKKwlpZiAoIXBvcnQtPm1lbWJhc2Up CisJCXJldHVybjsKKworCXdoaWxlIChvd2xfdWFydF9yZWFkKHBvcnQsIE9XTF9VQVJUX1NUQVQp ICYgT1dMX1VBUlRfU1RBVF9URkZVKQorCQljcHVfcmVsYXgoKTsKKworCW93bF91YXJ0X3dyaXRl KHBvcnQsIGNoLCBPV0xfVUFSVF9UWERBVCk7Cit9CisKK3N0YXRpYyB2b2lkIG93bF91YXJ0X3Bv cnRfd3JpdGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgY29uc3QgY2hhciAqcywKKwkJCQl1X2lu dCBjb3VudCkKK3sKKwl1MzIgb2xkX2N0bCwgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJ aW50IGxvY2tlZDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmIChwb3J0LT5zeXNy cSkKKwkJbG9ja2VkID0gMDsKKwllbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKQorCQlsb2NrZWQg PSBzcGluX3RyeWxvY2soJnBvcnQtPmxvY2spOworCWVsc2UgeworCQlzcGluX2xvY2soJnBvcnQt PmxvY2spOworCQlsb2NrZWQgPSAxOworCX0KKworCW9sZF9jdGwgPSBvd2xfdWFydF9yZWFkKHBv cnQsIE9XTF9VQVJUX0NUTCk7CisJdmFsID0gb2xkX2N0bCB8IE9XTF9VQVJUX0NUTF9UUkZTX1RY OworCS8qIGRpc2FibGUgSVJRICovCisJdmFsICY9IH4oT1dMX1VBUlRfQ1RMX1JYSUUgfCBPV0xf VUFSVF9DVExfVFhJRSk7CisJb3dsX3VhcnRfd3JpdGUocG9ydCwgdmFsLCBPV0xfVUFSVF9DVEwp OworCisJdWFydF9jb25zb2xlX3dyaXRlKHBvcnQsIHMsIGNvdW50LCBvd2xfY29uc29sZV9wdXRj aGFyKTsKKworCS8qIHdhaXQgdW50aWwgYWxsIGNvbnRlbnRzIGhhdmUgYmVlbiBzZW50IG91dCAq LworCXdoaWxlIChvd2xfdWFydF9yZWFkKHBvcnQsIE9XTF9VQVJUX1NUQVQpICYgT1dMX1VBUlRf U1RBVF9UUkZMX01BU0spCisJCWNwdV9yZWxheCgpOworCisJLyogY2xlYXIgSVJRIHBlbmRpbmcg Ki8KKwl2YWwgPSBvd2xfdWFydF9yZWFkKHBvcnQsIE9XTF9VQVJUX1NUQVQpOworCXZhbCB8PSBP V0xfVUFSVF9TVEFUX1RJUCB8IE9XTF9VQVJUX1NUQVRfUklQOworCW93bF91YXJ0X3dyaXRlKHBv cnQsIHZhbCwgT1dMX1VBUlRfU1RBVCk7CisKKwlvd2xfdWFydF93cml0ZShwb3J0LCBvbGRfY3Rs LCBPV0xfVUFSVF9DVEwpOworCisJaWYgKGxvY2tlZCkKKwkJc3Bpbl91bmxvY2soJnBvcnQtPmxv Y2spOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBvd2xf dWFydF9lYXJseV9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywKKwkJCQkJIGNvbnN0 IGNoYXIgKnMsCisJCQkJCSB1X2ludCBjb3VudCkKK3sKKwlzdHJ1Y3QgZWFybHljb25fZGV2aWNl ICpkZXYgPSBjby0+ZGF0YTsKKworCW93bF91YXJ0X3BvcnRfd3JpdGUoJmRldi0+cG9ydCwgcywg Y291bnQpOworfQorCitzdGF0aWMgaW50IF9faW5pdAorb3dsX3VhcnRfZWFybHlfY29uc29sZV9z ZXR1cChzdHJ1Y3QgZWFybHljb25fZGV2aWNlICpkZXZpY2UsIGNvbnN0IGNoYXIgKm9wdCkKK3sK KwlpZiAoIWRldmljZS0+cG9ydC5tZW1iYXNlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldmlj ZS0+Y29uLT53cml0ZSA9IG93bF91YXJ0X2Vhcmx5X2NvbnNvbGVfd3JpdGU7CisKKwlyZXR1cm4g MDsKK30KK09GX0VBUkxZQ09OX0RFQ0xBUkUob3dsLCAiYWN0aW9ucyxvd2wtdWFydCIsCisJCSAg ICBvd2xfdWFydF9lYXJseV9jb25zb2xlX3NldHVwKTsKKworI2VuZGlmIC8qIENPTkZJR19TRVJJ QUxfT1dMX0NPTlNPTEUgKi8KLS0gCjIuMTIuMwoKCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4 LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: afaerber@suse.de (=?UTF-8?q?Andreas=20F=C3=A4rber?=) Date: Tue, 6 Jun 2017 02:54:07 +0200 Subject: [PATCH v4 09/28] tty: serial: Add Actions Semi Owl UART earlycon In-Reply-To: <20170606005426.26446-1-afaerber@suse.de> References: <20170606005426.26446-1-afaerber@suse.de> Message-ID: <20170606005426.26446-10-afaerber@suse.de> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org This implements an earlycon for Actions Semi S500/S900 SoCs. Based on LeMaker linux-actions tree. Signed-off-by: Andreas F?rber --- v3 -> v4: Unchanged v2 -> v3: * Adopted BIT() macro 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 5c8850f7a2a0..38f90ea45cf7 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig @@ -1688,6 +1688,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 53c03e005132..fe88a75d9a59 100644 --- a/drivers/tty/serial/Makefile +++ b/drivers/tty/serial/Makefile @@ -92,6 +92,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 000000000000..1b8008797a1b --- /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 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define OWL_UART_CTL 0x000 +#define OWL_UART_TXDAT 0x008 +#define OWL_UART_STAT 0x00c + +#define OWL_UART_CTL_TRFS_TX BIT(14) +#define OWL_UART_CTL_EN BIT(15) +#define OWL_UART_CTL_RXIE BIT(18) +#define OWL_UART_CTL_TXIE BIT(19) + +#define OWL_UART_STAT_RIP BIT(0) +#define OWL_UART_STAT_TIP BIT(1) +#define OWL_UART_STAT_TFFU BIT(6) +#define OWL_UART_STAT_TRFL_MASK (0x1f << 11) +#define OWL_UART_STAT_UTBB BIT(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.12.3