Received: by 2002:a25:23cc:0:0:0:0:0 with SMTP id j195csp1521482ybj; Fri, 8 May 2020 03:19:08 -0700 (PDT) X-Google-Smtp-Source: APiQypK8yqG5c62/NttIcLAplUFI+U+qn726X9VhM9rP2MM9XGBWeCUzUJkCdO31pxrvPimAAsXb X-Received: by 2002:a17:907:402f:: with SMTP id nr23mr1294316ejb.240.1588933148239; Fri, 08 May 2020 03:19:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588933148; cv=none; d=google.com; s=arc-20160816; b=VskuuvwlJmcM1ijX2jX4f8oFMtBLpOKjE2GpmNEsccbBBIoDCdWdu3CEe12GM3B5LQ oeStKuVlopi+gbsDMW5qHiv6r8pjEq6OHhUYXdvyZ/jZuKD5AngWX8uKYqYdz0rXMlCj S2WlgvlzkkKQ7YYfL6nOpZ+Nl7JAEEN5ANzhuk7Y3wRrtbi8VesJzVLrkmcqkODZhWM/ 4cnbu/YQDuRaZ0CtusR15jK1RC8r35SLZaGbfo7aFajGLZvxrega8OVJUQ26C/mXZo0J HC417BiIkB5Zyt7XtCix+MMIkpkGkPveySD1SCVQ7j7MofDEwWhv/wE59j1quEhDfIPU T95w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=CEXsi/2/gcHTicFNwkUKYKOSQzsw2JinoKBtqiEq4Ak=; b=THF4gKYpXmLvlopJoXaEgt5AwdbSls13t6oJwByJsl8o0xW1ZkuOk/BIa4CHjhqcSU jvNyp7HKJg9BtLbRkAgOXI33ogbtNjDwLg/JYaRTjvF75cWEufflJXpbGD+riH1PaC6x svGIOjJZRa1PS0h7YJNX78bfq0bwszTLyU9kFlS7oN3oov/Mgk5fTDsdC9OiQIce/90J jOvjgwKB6xNsi4Iucrx+uiIZVlcRS9/YQOxpzZL+Y3y6rNY/kcMGy4e68abyH8psIooV kjc79S79ATFW5YQp1YU2U3Psh8U3yePwjHp/qCDky4C0ZuptjGHO6a1CoNbGMpwjfIIw /dwA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@antmicro.com header.s=google header.b=ZCLfulpe; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dd8si649191ejb.486.2020.05.08.03.18.42; Fri, 08 May 2020 03:19:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@antmicro.com header.s=google header.b=ZCLfulpe; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727788AbgEHKQm (ORCPT + 99 others); Fri, 8 May 2020 06:16:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36748 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726807AbgEHKQl (ORCPT ); Fri, 8 May 2020 06:16:41 -0400 Received: from mail-il1-x141.google.com (mail-il1-x141.google.com [IPv6:2607:f8b0:4864:20::141]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ACBE4C05BD09 for ; Fri, 8 May 2020 03:16:41 -0700 (PDT) Received: by mail-il1-x141.google.com with SMTP id r2so914207ilo.6 for ; Fri, 08 May 2020 03:16:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antmicro.com; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=CEXsi/2/gcHTicFNwkUKYKOSQzsw2JinoKBtqiEq4Ak=; b=ZCLfulpeyngEd4yz2SJvKG3yGrxKwnKhhi5QX4GfJlG5uS0LTTYAlfqjrncV+NJ2/p mwJC5c3jyQiDEf8ODHYJIAcLZZAgv9aZsrcPWwsbl8b7T3CX2Os7HixRvqGywrEvNeRb k5BA2Xd+AxSS9Z8W8WzZRfRgpQFRdsK4sGlFk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=CEXsi/2/gcHTicFNwkUKYKOSQzsw2JinoKBtqiEq4Ak=; b=pIGPYRJ1uE0kHe/wj/BlPp6MYCoMNDPvjsxKvwJwjP2i74xEXQ1oM2B7f9MOM6Bpb2 XA+mc/1Su5K+AIg2Y3zvBjzhWaTpi3C+FT632H59a6v9kmASsjZJ8b5hL8B8vlOjFy4Y MWf5YDg0OzGlL6p6hT4noqPEPZXPxSXoEBwftM2SoX7WbRAl6HwlcOz847yV8TtmlUch G4bvomxS15K/cYARsWBNYX7QcNyQcjyxTLdg/cvwyL7D0HosjscIvvLAZ3q0wdCRanof LYIbtHns6d78iz4umGF7CcR3hYRDjGpbp2dkCgSc6534UkInh172dsnXjwbyjKURABVc rEGg== X-Gm-Message-State: AGi0PuZZvy5HFEXToAQddChbFP+0QKuyWDnJg1moHoeFvAMUR9PnUZwf s1Ttz2yihv7cuaHo9ze23jVX/SiFlo/NiiqztP1wXg== X-Received: by 2002:a92:2910:: with SMTP id l16mr2003308ilg.256.1588933000778; Fri, 08 May 2020 03:16:40 -0700 (PDT) MIME-Version: 1.0 References: <20200425133939.3508912-0-mholenko@antmicro.com> <20200425133939.3508912-5-mholenko@antmicro.com> In-Reply-To: From: Mateusz Holenko Date: Fri, 8 May 2020 12:16:28 +0200 Message-ID: Subject: Re: [PATCH v5 5/5] drivers/tty/serial: add LiteUART driver To: Andy Shevchenko Cc: Rob Herring , Mark Rutland , Greg Kroah-Hartman , Jiri Slaby , devicetree , "open list:SERIAL DRIVERS" , Stafford Horne , Karol Gugala , Mauro Carvalho Chehab , "David S. Miller" , "Paul E. McKenney" , Filip Kokosinski , Pawel Czarnecki , Joel Stanley , Jonathan Cameron , Maxime Ripard , Shawn Guo , Heiko Stuebner , Sam Ravnborg , Icenowy Zheng , Laurent Pinchart , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, May 5, 2020 at 4:02 PM Andy Shevchenko wrote: > > On Mon, May 4, 2020 at 4:44 PM Mateusz Holenko wrote: > > On Tue, Apr 28, 2020 at 5:50 PM Andy Shevchenko > > wrote: > > > On Sat, Apr 25, 2020 at 2:45 PM Mateusz Holenko wrote: > > ... > > > > > Signed-off-by: Filip Kokosinski > > > > Signed-off-by: Mateusz Holenko > > > > > > Co-developed-by? > > > > Most of the coding here is done by Filip Kokosinski - I'm responsible > > for managing the patches and sending to LKML so I don't think I > > qualify as a co-developer :) > > I see. > > ... > > > > > +#define OFF_RXTX 0x00 > > > > +#define SIZE_RXTX 1 > > > > +#define OFF_TXFULL 0x04 > > > > +#define SIZE_TXFULL 1 > > > > +#define OFF_RXEMPTY 0x08 > > > > +#define SIZE_RXEMPTY 1 > > > > +#define OFF_EV_STATUS 0x0c > > > > +#define SIZE_EV_STATUS 1 > > > > +#define OFF_EV_PENDING 0x10 > > > > +#define SIZE_EV_PENDING 1 > > > > +#define OFF_EV_ENABLE 0x14 > > > > +#define SIZE_EV_ENABLE 1 > > > > > > Why do you need all those SIZE_*? > > > This is related to how LiteX peripherals (LiteUART being one of them) > > handle register access. > > The LiteX HW splits a classic 32-bit register into 4 32-bit registers, > > each one containing only 8-bit part of it. > > > > SIZE in this context means how many of those "subregisters" (still > > 32-bit wide, but with only 8-bit of meaningful data) to read/write. > > The "litex.h" header (patch 3 of this patchset) provides common > > functions for doing it, but it must know the size for each register. > > So, can't you simple use them as is? I still didn't get how SIZE helps here. > > ... Do you mean to call litex_get_reg() with 1 directly as a second argument instead of using a defined value (which in the context of uart driver is 1 for every register anyway)? Sure, this is doable. We just thought a named define will explain better what's going on. In general case, register's offsets and sizes might differ between LiteX configurations (LiteX is an SoC generator capable of creating different setups) so having a dynamic size in litex_get_reg() is useful. With this patchset we are targeting a single (default) configuration (so it's enough for OFF_ and SIZE_ to be fixed), but this could be extended to be more dynamic in the future. > > > > +static struct uart_driver liteuart_driver = { > > > > + .owner = THIS_MODULE, > > > > + .driver_name = DRIVER_NAME, > > > > + .dev_name = DEV_NAME, > > > > > > Much easier to see if any name collisions are happen by grepping > > > similar struct definitions, but these macros are making life harder. > > > > Do you mean to avoid indirection caused by defines and write e.g., > > `.driver_name = "liteuart"`? > > > > OK, but the reason we have defines in the first place is because we > > use the same name in many places and we want to avoid inconsistencies > > (typos, partial rename, etc.). > > What's more, looking at other serial drivers I see the notation is not > > consistent - many of them use defines for name/major/minor as well. > > The problem here that .driver_name is a part of user visible > interface, so, when you rename it it will affect the module alias. > How DEV_NAME is shared? It should not be, otherwise it will collide > with other drivers. I meant that DRIVER_NAME define is used in the file in many places: * liteuart_driver.driver_name * liteuart_type() * liteuart_platfrom_driver.driver.name * liteuart_console.name * MODULE_ALIAS It's not shared with other drivers, but used multiple times in the code of this one. DEV_NAME/DRIVER_MAJOR/DRIVER_MINOR are indeed referenced only once so it's no problem to write those values directly and get rid of their defines. > > > > + .major = DRIVER_MAJOR, > > > > + .minor = DRIVER_MINOR, > > > > > > Ditto. > > Ditto. > > > > > +}; > > ... What do you mean by '...' ? > > > > > +static const char *liteuart_type(struct uart_port *port) > > > > +{ > > > > + return (port->type == PORT_LITEUART) ? DRIVER_NAME : NULL; > > > > +} > > > > > > Do we need this check? Do we need a port type at all? > > > This is inspired by serial_core.c and other serial drivers. > > We don't support any alternative `port->types` values so it's probably > > not necessary for us, but it seems that this is how other serial > > drivers are written too. > > Legacy drivers are not the best example to take. So, if you can > survive without UART type, please go with it. Otherwise commit message > should point out why it's needed so eagerly. > > ... I guess we'll be good without the UART type. > > > > + /* look for aliases; auto-enumerate for free index if not found */ > > > > + dev_id = of_alias_get_id(np, "serial"); > > > > + if (dev_id < 0) > > > > + dev_id = find_first_zero_bit(liteuart_ports_in_use, > > > > + CONFIG_SERIAL_LITEUART_MAX_PORTS); > > > > > > Racy. > > > > We'll protect it with a mutex to avoid race conditions. > > Rather consider to use xArray API. > > ... We'll check that up. > > > > + .of_match_table = of_match_ptr(liteuart_of_match), > > > > > > of_match_ptr() makes no sense (you have depends on OF). > > > > You mean that `of_match_ptr(X)` resolves simply to `X` when > > `CONFIG_OF` is defined? > > In this context it surely can be simplified. > > Yes. > > ... OK. > > > > +static int __init liteuart_console_init(void) > > > > +{ > > > > > +} > > > > > > > + > > > > > > Extra blank line. > > > > You mean we should remove an empty line between the definition of > > liteuart_console_init() and the call to console_initcall()? It seems > > to be inconsistent across different drivers, but sure - no problem. > > Less LOCs is good (but keep common sense applied). > > ... Sure. > > > > +/* LiteUART */ > > > > +#define PORT_LITEUART 123 > > > > > > We have holes in the list, use them. > > > > > > And again why we need this? > > > > This is inspired by other serial drivers that also reserves > > identifiers in this file and handles them the same way we do. We > > simply followed the convention. > > See above. This ID is a part of UAPI which is kinda redundant nowadays. > You need to provide a good argument for that. Otherwise, get rid of it. We'll remove this and see if everything works fine. > -- > With Best Regards, > Andy Shevchenko Thanks for the discussion! -- Mateusz Holenko Antmicro Ltd | www.antmicro.com Roosevelta 22, 60-829 Poznan, Poland