From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754893AbcLTAZp (ORCPT ); Mon, 19 Dec 2016 19:25:45 -0500 Received: from fllnx209.ext.ti.com ([198.47.19.16]:9773 "EHLO fllnx209.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751621AbcLTAZn (ORCPT ); Mon, 19 Dec 2016 19:25:43 -0500 From: Nishanth Menon To: Jiri Slaby CC: Timur Tabi , Christopher Covington , , , Greg Kroah-Hartman , , Nishanth Menon Subject: [PATCH] tty: hvc_dcc: Add basic early_con support Date: Mon, 19 Dec 2016 18:23:36 -0600 Message-ID: <20161220002336.28733-1-nm@ti.com> X-Mailer: git-send-email 2.11.0.65.geff96d7 MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In some cases, earlycon can help catch errors with kernel boot prior to standard console is available. Example bootargs: console=hvc0 earlycon=hvcdcc Signed-off-by: Nishanth Menon --- Based on: v4.9 tag Also applies on: next-20161219 Tested on Simulation environment (which did not have serial console option) drivers/tty/hvc/hvc_dcc.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/drivers/tty/hvc/hvc_dcc.c b/drivers/tty/hvc/hvc_dcc.c index 82f240fb98f0..1ec06e550656 100644 --- a/drivers/tty/hvc/hvc_dcc.c +++ b/drivers/tty/hvc/hvc_dcc.c @@ -10,7 +10,9 @@ * GNU General Public License for more details. */ +#include #include +#include #include #include @@ -94,3 +96,45 @@ static int __init hvc_dcc_init(void) return PTR_ERR_OR_ZERO(p); } device_initcall(hvc_dcc_init); + +static int hvc_dcc_earlyputc(int c) +{ + unsigned long count = 0xFFFFFFFF; + static bool dead_dcc_earlycon; + + if (dead_dcc_earlycon) + return -EBUSY; + + while (count--) { + if (!(__dcc_getstatus() & DCC_STATUS_TX)) + break; + } + if (!count) { + dead_dcc_earlycon = true; + return -EBUSY; + } + __dcc_putchar(c); + return 0; +} + +static void hvc_dcc_earlywrite(struct console *con, const char *s, + unsigned int n) +{ + int r; + + while (n--) { + r = hvc_dcc_earlyputc(*s); + if (r) + break; + s++; + } +} + +static int +__init early_hvc_dcc_setup(struct earlycon_device *device, const char *opt) +{ + device->con->write = hvc_dcc_earlywrite; + return 0; +} + +EARLYCON_DECLARE(hvcdcc, early_hvc_dcc_setup); -- 2.11.0.65.geff96d7