Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp2830644pxv; Sat, 3 Jul 2021 23:01:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxdVyRT1w6T2B5dTNOHGowltb2G5xh7cF/gQpcTGgJ37pw6dYTeLJvm2nHjIoMfLIoP/lxv X-Received: by 2002:a92:7f04:: with SMTP id a4mr5802450ild.156.1625378507929; Sat, 03 Jul 2021 23:01:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625378507; cv=none; d=google.com; s=arc-20160816; b=Jl9OisFwppf6dZ+5HDm1JyOe/hi4/53Qgwcs+2PPxJMk1Wl3KZ0jq2HV7MO+PuykH1 xGNBJunIiyl0lmSoOXUWfWVraWbe3F1D0BDtnjUxKkdUnKlAwfv8eq2LVlcRCl0qm01V GNwRw7aAij7JPnPn6PfkCfu1KfIpOYA9JHo+/htfLQdVb8qL6ynwM/YQFnLSaUEUjCKN RYy/hH6gReD8lqGE6hUjE/b8UV6ke8HPSz08dOB89aXhh84ShfZLGNTG6VwBJZQMRqVZ mGLqeEMLBzn4MSLPsy/1DjZTSjqyYTI+b7m2LiP+H4tjgfS3yWq57JBL+rRTO0TxHRdi G+KQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=kf/H9JjJmGnHIaVeVVll6XvW7wIZP51HMkNthrDXfI8=; b=rGmS+Cx8gvQs2tTVZLKNh7Wnq80JbcMo7YC3KBV70X/Jje4HwFKHtHonVkPQ2a4nkG i/89WpmXb40i/CaKFL67eLUealaW9j7cKIUlttWratlNuLMHhgeR41DyHKLyPmiow7Pw wptDVGth+VvDjUnfavzlH76YnV/5myzCb/yZK7e02Ntl7D+4vXnSFMGyuTvfT/QtdZM6 FqX9W3mnL8Nmz8Ymt10lXfEDW1n0+6tZlsKCJr1HxQowK4QZsBkGojVwtvm7MQlC4fJK wtMv7XiU7gi0eJ4x1sedSIsTCdwcIoSKe4AbTDLrhnG7V4I6631QhMAki7r2X+gOHLPK pmEw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=de1PSN6j; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c9si8255672iom.40.2021.07.03.23.01.26; Sat, 03 Jul 2021 23:01:47 -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=@gmail.com header.s=20161025 header.b=de1PSN6j; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229503AbhGDGAb (ORCPT + 99 others); Sun, 4 Jul 2021 02:00:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47552 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229476AbhGDGAb (ORCPT ); Sun, 4 Jul 2021 02:00:31 -0400 Received: from mail-vs1-xe30.google.com (mail-vs1-xe30.google.com [IPv6:2607:f8b0:4864:20::e30]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 82EB9C061762; Sat, 3 Jul 2021 22:57:55 -0700 (PDT) Received: by mail-vs1-xe30.google.com with SMTP id c26so8296926vso.8; Sat, 03 Jul 2021 22:57:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=kf/H9JjJmGnHIaVeVVll6XvW7wIZP51HMkNthrDXfI8=; b=de1PSN6jLhM/HbuNPvArURudupbavN538rDQUrs5N4BdbSCbB9VQYyVTl0xMduvavL jIBtXvjh1QvMAZhZjxJvxqEfi+tGkvipzFcfo7zwlVNIa3OfokBqMs4eIJItKcRW8Bq8 DKizsOXf4iPJcT35gd1FEGrNjwUH5Uh5zMu+et0N9KsvProOLdWDJHWUhHtPiOb9d5Ld s5la8jXL/3iIWjhvQI6NDVA+w/gXjMvWxdqdenLNdvDb3XbF4p0DexYV37qjuCcYo9Ap sqHMlD5Va+1vj0XjijxWuuB1xWpnHY1gJfvLvlsGdoBKWXfQM6mlJhmMJrBn8/hRfTwP HVFg== 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=kf/H9JjJmGnHIaVeVVll6XvW7wIZP51HMkNthrDXfI8=; b=eMMEsHzVRZRSqcTJW+ulHVnv5aGHzbWArn2D3PK2CzG0GutihUAO3GsyG2WNMqUx9p W75bSq3xu9FILdqqy0Un4GALnR9vFkxePCDH1LbAjz9MvKUDz2Qh/3etGFCQSiVKtZgc BmycH2dJCsYkGRGb3IdofvG8kc+gbcTJp3qtzHYBcb+1Ti26g7sP0qs0CgxqoVC7Fs0w vlMl+pJnnTznjQyoAzckiFbYtd9Nw1hQMzv0uleb443C5MDNopzBLZMWbvjQz3e2sw8/ aPPqR3ZpXfcGbNTiczqkvR3BkpU9ywKL2YoPl7UYFviQl9ZkbgT2kk4TVWi7puZJPzkh VwNw== X-Gm-Message-State: AOAM53349YldQoPQtD1uKb9WZyae+Qh5GJ5E11Y7hVTledqlJC7iEuze 56P/HHHp6nXanOYcBwrtyEMJKO7zVg0os4HD8+o= X-Received: by 2002:a67:e116:: with SMTP id d22mr5766089vsl.49.1625378274495; Sat, 03 Jul 2021 22:57:54 -0700 (PDT) MIME-Version: 1.0 References: <20210626161819.30508-1-sergio.paracuellos@gmail.com> In-Reply-To: From: Sergio Paracuellos Date: Sun, 4 Jul 2021 07:57:43 +0200 Message-ID: Subject: Re: [PATCH v2] gpio: mt7621: support gpio-line-names property To: Andy Shevchenko Cc: Linus Walleij , "open list:GPIO SUBSYSTEM" , Bartosz Golaszewski , Matthias Brugger , John Thomson , Linux Kernel Mailing List , NeilBrown , =?UTF-8?Q?Ren=C3=A9_van_Dorst?= , Nicholas Mc Guire Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, Jul 3, 2021 at 9:36 PM Andy Shevchenko wrote: > > On Sat, Jul 3, 2021 at 3:51 PM Sergio Paracuellos > wrote: > > On Sat, Jul 3, 2021 at 2:05 PM Sergio Paracuellos > > wrote: > > > On Sat, Jul 3, 2021 at 1:32 PM Andy Shevchenko > > > wrote: > > > > On Sat, Jul 3, 2021 at 2:06 PM Sergio Paracuellos > > > > wrote: > > > > > On Fri, Jul 2, 2021 at 1:30 PM Sergio Paracuellos > > > > > wrote: > > > > > > > > ... > > > > > > > > > - ret = devprop_gpiochip_set_names(gc); > > > > > + ret = devprop_gpiochip_set_names(gc, 0); > > > > > > > > I had been expecting that this parameter would be in the field of the gpiochip. > > > > > > > > ... > > > > > > If doing it in that way is preferred, I have no problem at all. But in > > > that case I think there is no need for a new > > > 'devprop_gpiochip_set_names_base' and we can assume for all drivers to > > > be zero and if is set taking it into account directly in > > > devprop_gpiochip_set_names function? Is this what you mean by having > > > this field added there?? > > The below is closer to what I meant, yes. I have not much time to look > into the details, but I don't have objections about what you suggested > below. Additional comments there as well. Thanks for your time and review, Andy. Let's wait to see if Linus and Bartosz are also ok with this approach. > > > How about something like this? > > > > diff --git a/drivers/gpio/gpio-mt7621.c b/drivers/gpio/gpio-mt7621.c > > index 82fb20dca53a..5854a9343491 100644 > > --- a/drivers/gpio/gpio-mt7621.c > > +++ b/drivers/gpio/gpio-mt7621.c > > @@ -241,6 +241,7 @@ mediatek_gpio_bank_probe(struct device *dev, > > if (!rg->chip.label) > > return -ENOMEM; > > > > + rg->chip.offset = bank * MTK_BANK_WIDTH; > > rg->irq_chip.name = dev_name(dev); > > rg->irq_chip.parent_device = dev; > > rg->irq_chip.irq_unmask = mediatek_gpio_irq_unmask; > > Obviously it should be a separate patch :-) Of course :). I will include one separate patch per driver using the custom set names stuff: gpio-mt7621 and gpio-brcmstb. I don't know if any other one is also following that wrong pattern. > > > diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c > > index 6e3c4d7a7d14..0587f46b7c22 100644 > > --- a/drivers/gpio/gpiolib.c > > +++ b/drivers/gpio/gpiolib.c > > @@ -380,10 +380,10 @@ static int devprop_gpiochip_set_names(struct > > gpio_chip *chip) > > return 0; > > > > count = device_property_string_array_count(dev, "gpio-line-names"); > > - if (count < 0) > > > + if (count < 0 || count <= chip->offset) > > Please, split it into two conditionals and add a comment to the second one. For sure I will do, thanks. > > > return 0; > > > > - if (count > gdev->ngpio) { > > + if (count > gdev->ngpio && chip->offset == 0) { > > dev_warn(&gdev->dev, "gpio-line-names is length %d but > > should be at most length %d", > > count, gdev->ngpio); > > count = gdev->ngpio; > > @@ -401,8 +401,9 @@ static int devprop_gpiochip_set_names(struct > > gpio_chip *chip) > > return ret; > > } > > > > + count = (chip->offset >= count) ? (chip->offset - count) : count; > > Too many parentheses. Ok, I will also change this. > > > for (i = 0; i < count; i++) > > - gdev->descs[i].name = names[i]; > > + gdev->descs[i].name = names[chip->offset + i]; > > > > kfree(names); > > > > diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h > > index 4a7e295c3640..39e0786586f6 100644 > > --- a/include/linux/gpio/driver.h > > +++ b/include/linux/gpio/driver.h > > @@ -312,6 +312,9 @@ struct gpio_irq_chip { > > * get rid of the static GPIO number space in the long run. > > * @ngpio: the number of GPIOs handled by this controller; the last GPIO > > * handled is (base + ngpio - 1). > > + * @offset: when multiple gpio chips belong to the same device this > > + * can be used as offset within the device so friendly names can > > + * be properly assigned. > > * @names: if set, must be an array of strings to use as alternative > > * names for the GPIOs in this chip. Any entry in the array > > * may be NULL if there is no alias for the GPIO, however the > > @@ -398,6 +401,7 @@ struct gpio_chip { > > > > int base; > > u16 ngpio; > > + int offset; > > u16 (as ngpio has that type) > > > const char *const *names; > > bool can_sleep; > > > > > > Does this sound reasonable? So the gpiolib related patch updated code with your proposed changes looks as follows: diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 6e3c4d7a7d14..0c773d9ef292 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -383,7 +383,18 @@ static int devprop_gpiochip_set_names(struct gpio_chip *chip) if (count < 0) return 0; - if (count > gdev->ngpio) { + /* + * When offset is set in the driver side we assume the driver internally + * is using more than one gpiochip per the same device. We have to stop + * setting friendly names if the specified ones with 'gpio-line-names' + * are less than the offset in the device itself. This means all the + * lines are not present for every single pin within all the internal + * gpiochips. + */ + if (count <= chip->offset) + return 0; + + if (count > gdev->ngpio && chip->offset == 0) { dev_warn(&gdev->dev, "gpio-line-names is length %d but should be at most length %d", count, gdev->ngpio); count = gdev->ngpio; @@ -401,8 +412,9 @@ static int devprop_gpiochip_set_names(struct gpio_chip *chip) return ret; } + count = (chip->offset >= count) ? chip->offset - count : count; for (i = 0; i < count; i++) - gdev->descs[i].name = names[i]; + gdev->descs[i].name = names[chip->offset + i]; kfree(names); diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h index 4a7e295c3640..7a77f533d8fe 100644 --- a/include/linux/gpio/driver.h +++ b/include/linux/gpio/driver.h @@ -312,6 +312,9 @@ struct gpio_irq_chip { * get rid of the static GPIO number space in the long run. * @ngpio: the number of GPIOs handled by this controller; the last GPIO * handled is (base + ngpio - 1). + * @offset: when multiple gpio chips belong to the same device this + * can be used as offset within the device so friendly names can + * be properly assigned. * @names: if set, must be an array of strings to use as alternative * names for the GPIOs in this chip. Any entry in the array * may be NULL if there is no alias for the GPIO, however the @@ -398,6 +401,7 @@ struct gpio_chip { int base; u16 ngpio; + u16 offset; const char *const *names; bool can_sleep; Best regards, Sergio Paracuellos > > > > > > The problem I see with this approach is that > > > > > 'devprop_gpiochip_set_names' already trusts in gpio_device already > > > > > created and this happens in 'gpiochip_add_data_with_key'. So doing in > > > > > this way force "broken drivers" to call this new > > > > > 'devprop_gpiochip_set_names_base' function after > > > > > 'devm_gpiochip_add_data' is called so the core code has already set up > > > > > the friendly names repeated for all gpio chip banks and the approach > > > > > would be to "overwrite" those in a second pass which sounds more like > > > > > a hack than a solution. > > > > > > > > > > But maybe I am missing something in what you were pointing out here. > > > > > > > > Would the above work? > > -- > With Best Regards, > Andy Shevchenko