Message ID | 20230725142343.1724130-5-hugo@hugovil.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9010:0:b0:3e4:2afc:c1 with SMTP id l16csp2522116vqg; Tue, 25 Jul 2023 07:47:40 -0700 (PDT) X-Google-Smtp-Source: APBJJlE/xoIAsNm6WEcbpqTVrcLvXAFMZGhvmr5ldnXcIHbM/YWKbmDHHWB0bCo/oOFVADu3woku X-Received: by 2002:a05:6a20:734d:b0:134:a478:6061 with SMTP id v13-20020a056a20734d00b00134a4786061mr15010510pzc.26.1690296460353; Tue, 25 Jul 2023 07:47:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690296460; cv=none; d=google.com; s=arc-20160816; b=VxShX0aqnHO2Cv/qg95jZELo5//ri4VqzVrN+uuyl5IJnRj+8rxZgheuxFGEQqdltN QrYkDvbVZ1rdb3VfOU2E/eRI0Kbb2CygaDyk+ccrVfTjlLWS96ZPPV9T4O72VTho8OuS 2QebRJBLqYsXH6rfoiWvmjyXqjgpGeM/FwHxU+TtzTYqJPS7EzASN7/+1815GMatAF+P VS/TOz4cczjXF6WEThp0tSTFImlV7Dm5cVH8hQ7x1FE96ThIGOsSIeX1nbS7xhLyi3zB xJy/byWqSFJYeeGXGO6cNeKV6t1Q5YLirZa2go8vn8XUOkbk0ouT6s+xbOX0Jd2y+uRR zYTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:subject:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:cc:to:from:dkim-signature; bh=eY2wZ9vhu1FfoaXy9aP9IFu/H9QUJ71zX/Q2ydr3vEg=; fh=6iQU/ZFDPB2EtbtrLPL1mq7BpEUKhm02utK8313rrOA=; b=EX+PFkxm8bXfgA6Pqngmr7SlPi8zEZ6tb3qOGXQKhJnptLvkp0iyx6lpsuSeLp+U7R eLMamMI8xSestA+YcXN5U2RFOoFXcGKz3DCfdl4DXyq7C5MIi8B1X93AguDJVEOdDcCV gCvJChyPDgOAVxzkSiZ3J70DmjGNTj88G2xvJQasnk3iO334bgXdbX3KTzrURLnTpMhn MvjhYAwj5J2rZenzZqWFV7tQ0tAX8aFzedGJk58pfN2A1O4PQ5ynqNnEcxADilpw4L0F QnHkXKP6zlVMw0i67nokL5DCQAi37QpKGE11Z/ExBmrPijBJppjsNNagphK9CRQDLRC5 eGbg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@hugovil.com header.s=x header.b=hsq9FVTc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id cw16-20020a056a00451000b00668230a86edsi11174767pfb.256.2023.07.25.07.47.26; Tue, 25 Jul 2023 07:47:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=fail header.i=@hugovil.com header.s=x header.b=hsq9FVTc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233069AbjGYOYj (ORCPT <rfc822;kautuk.consul.80@gmail.com> + 99 others); Tue, 25 Jul 2023 10:24:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36608 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232741AbjGYOYN (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Tue, 25 Jul 2023 10:24:13 -0400 Received: from mail.hugovil.com (mail.hugovil.com [162.243.120.170]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5FFDF2121; Tue, 25 Jul 2023 07:24:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=hugovil.com ; s=x; h=Subject:Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-Id:Date:Cc:To:From:Sender:Reply-To:Content-Type: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=eY2wZ9vhu1FfoaXy9aP9IFu/H9QUJ71zX/Q2ydr3vEg=; b=hsq9FVTcFvgpQxJeXw5LBh9ePo Wi4J6mXqSi3fMiU7LxG/QwG6pQW08TEU+Icxo/KvQegvqaqA2RAL805Ub51j0SIXpTRUszmcL3zSY DZBwbrhKl56IBpFejo4nRc9Rxz2gv+m54KanjGWCjn9dJa5a1DZKK2eh5SMRBUcURhM8=; Received: from modemcable061.19-161-184.mc.videotron.ca ([184.161.19.61]:34256 helo=localhost.localdomain) by mail.hugovil.com with esmtpa (Exim 4.92) (envelope-from <hugo@hugovil.com>) id 1qOIxA-0003Kt-Bb; Tue, 25 Jul 2023 10:23:56 -0400 From: Hugo Villeneuve <hugo@hugovil.com> To: gregkh@linuxfoundation.org, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, jirislaby@kernel.org, jringle@gridpoint.com, isaac.true@canonical.com, jesse.sung@canonical.com, l.perczak@camlintechnologies.com, tomasz.mon@camlingroup.com Cc: linux-serial@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, hugo@hugovil.com, linux-gpio@vger.kernel.org, Hugo Villeneuve <hvilleneuve@dimonoff.com>, stable@vger.kernel.org, Lech Perczak <lech.perczak@camlingroup.com> Date: Tue, 25 Jul 2023 10:23:36 -0400 Message-Id: <20230725142343.1724130-5-hugo@hugovil.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230725142343.1724130-1-hugo@hugovil.com> References: <20230725142343.1724130-1-hugo@hugovil.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 184.161.19.61 X-SA-Exim-Mail-From: hugo@hugovil.com X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Subject: [PATCH v9 04/10] serial: sc16is7xx: refactor GPIO controller registration X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.hugovil.com) Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1772404301182955014 X-GMAIL-MSGID: 1772404301182955014 |
Series |
serial: sc16is7xx: fix GPIO regression and rs485 improvements
|
|
Commit Message
Hugo Villeneuve
July 25, 2023, 2:23 p.m. UTC
From: Hugo Villeneuve <hvilleneuve@dimonoff.com> In preparation for upcoming patch "fix regression with GPIO configuration". To facilitate review and make code more modular. Cc: <stable@vger.kernel.org> # 6.1.x Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com> Reviewed-by: Lech Perczak <lech.perczak@camlingroup.com> Tested-by: Lech Perczak <lech.perczak@camlingroup.com> --- drivers/tty/serial/sc16is7xx.c | 40 ++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 16 deletions(-)
Comments
On Tue, Jul 25, 2023 at 10:23:36AM -0400, Hugo Villeneuve wrote: > From: Hugo Villeneuve <hvilleneuve@dimonoff.com> > > In preparation for upcoming patch "fix regression with GPIO > configuration". To facilitate review and make code more modular. I would much rather the issue be fixed _before_ the code is refactored, unless it is impossible to fix it without the refactor? > > Cc: <stable@vger.kernel.org> # 6.1.x What commit id does this fix? > Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com> > Reviewed-by: Lech Perczak <lech.perczak@camlingroup.com> > Tested-by: Lech Perczak <lech.perczak@camlingroup.com> > --- > drivers/tty/serial/sc16is7xx.c | 40 ++++++++++++++++++++-------------- > 1 file changed, 24 insertions(+), 16 deletions(-) > > diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c > index 32d43d00a583..5b0aeef9d534 100644 > --- a/drivers/tty/serial/sc16is7xx.c > +++ b/drivers/tty/serial/sc16is7xx.c > @@ -332,6 +332,7 @@ struct sc16is7xx_one { > > struct sc16is7xx_port { > const struct sc16is7xx_devtype *devtype; > + struct device *dev; Why is this pointer needed? Why is it grabbed and yet the reference count is never incremented? Who owns the reference count and when will it go away? And what device is this? The parent? Current device? What type of device is it? And why is it needed? Using "raw" devices is almost never something a driver should do, they are only passed into functions by the driver core, but then the driver should instantly turn them into the "real" structure. thanks, greg k-h
On Mon, 31 Jul 2023 17:55:42 +0200 Greg KH <gregkh@linuxfoundation.org> wrote: > On Tue, Jul 25, 2023 at 10:23:36AM -0400, Hugo Villeneuve wrote: > > From: Hugo Villeneuve <hvilleneuve@dimonoff.com> > > > > In preparation for upcoming patch "fix regression with GPIO > > configuration". To facilitate review and make code more modular. > > I would much rather the issue be fixed _before_ the code is refactored, > unless it is impossible to fix it without the refactor? Hi Greg, normally I would agree, but the refactor in this case helps a lot to address some issues raised by you and Andy in V7 of this series. Maybe I could merge it with the actual patch "fix regression with GPIO configuration"? > > Cc: <stable@vger.kernel.org> # 6.1.x > > What commit id does this fix? It doesn't fix anything, but I tought that I needed this tag since this patch is a prerequisite for the next patch in the series, which would be applied to stable kernels. I will remove this tag (assuming the patch stays as it is, depending on your answer to the above question). > > Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com> > > Reviewed-by: Lech Perczak <lech.perczak@camlingroup.com> > > Tested-by: Lech Perczak <lech.perczak@camlingroup.com> > > --- > > drivers/tty/serial/sc16is7xx.c | 40 ++++++++++++++++++++-------------- > > 1 file changed, 24 insertions(+), 16 deletions(-) > > > > diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c > > index 32d43d00a583..5b0aeef9d534 100644 > > --- a/drivers/tty/serial/sc16is7xx.c > > +++ b/drivers/tty/serial/sc16is7xx.c > > @@ -332,6 +332,7 @@ struct sc16is7xx_one { > > > > struct sc16is7xx_port { > > const struct sc16is7xx_devtype *devtype; > > + struct device *dev; > > Why is this pointer needed? > > Why is it grabbed and yet the reference count is never incremented? Who > owns the reference count and when will it go away? > > And what device is this? The parent? Current device? What type of > device is it? And why is it needed? > > Using "raw" devices is almost never something a driver should do, they > are only passed into functions by the driver core, but then the driver > should instantly turn them into the "real" structure. We already discussed that a lot in previous versions (v7)... I am trying my best to modify the code to address your concerns, but I am not fully understanding what you mean about raw devices, and you didn't answer some of my previous questions/interrogations in v7 about that. So, in the new function that I need to implement, sc16is7xx_setup_gpio_chip(), I absolutely need to use a raw device to read a device tree property and to set s->gpio.parent: count = device_property_count_u32(dev, ... ... s->gpio.parent = dev; Do we agree on that? Then, how do I pass this raw device to the device_property_count_u32() function and to the s->gpio.parent assignment? Should I modify sc16is7xx_setup_gpio_chip() like so: static int sc16is7xx_setup_gpio_chip(struct sc16is7xx_port *s) { struct device *dev = &s->p[0].port.dev; count = device_property_count_u32(dev, ... ... s->gpio.parent = dev; ? If not, can you show me how you would like to do it to avoid me trying to guess? Thank you, Hugo.
On Thu, Aug 03, 2023 at 12:14:49PM -0400, Hugo Villeneuve wrote: > On Mon, 31 Jul 2023 17:55:42 +0200 > Greg KH <gregkh@linuxfoundation.org> wrote: > > > On Tue, Jul 25, 2023 at 10:23:36AM -0400, Hugo Villeneuve wrote: > > > From: Hugo Villeneuve <hvilleneuve@dimonoff.com> > > > > > > In preparation for upcoming patch "fix regression with GPIO > > > configuration". To facilitate review and make code more modular. > > > > I would much rather the issue be fixed _before_ the code is refactored, > > unless it is impossible to fix it without the refactor? > > Hi Greg, > normally I would agree, but the refactor in this case helps a lot to > address some issues raised by you and Andy in V7 of this series. > > Maybe I could merge it with the actual patch "fix regression with GPIO > configuration"? Sure. > > > Cc: <stable@vger.kernel.org> # 6.1.x > > > > What commit id does this fix? > > It doesn't fix anything, but I tought that I needed this tag since > this patch is a prerequisite for the next patch in the series, which > would be applied to stable kernels. I will remove this tag (assuming > the patch stays as it is, depending on your answer to the above > question). > > > > > Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com> > > > Reviewed-by: Lech Perczak <lech.perczak@camlingroup.com> > > > Tested-by: Lech Perczak <lech.perczak@camlingroup.com> > > > --- > > > drivers/tty/serial/sc16is7xx.c | 40 ++++++++++++++++++++-------------- > > > 1 file changed, 24 insertions(+), 16 deletions(-) > > > > > > diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c > > > index 32d43d00a583..5b0aeef9d534 100644 > > > --- a/drivers/tty/serial/sc16is7xx.c > > > +++ b/drivers/tty/serial/sc16is7xx.c > > > @@ -332,6 +332,7 @@ struct sc16is7xx_one { > > > > > > struct sc16is7xx_port { > > > const struct sc16is7xx_devtype *devtype; > > > + struct device *dev; > > > > Why is this pointer needed? > > > > Why is it grabbed and yet the reference count is never incremented? Who > > owns the reference count and when will it go away? > > > > And what device is this? The parent? Current device? What type of > > device is it? And why is it needed? > > > > Using "raw" devices is almost never something a driver should do, they > > are only passed into functions by the driver core, but then the driver > > should instantly turn them into the "real" structure. > > We already discussed that a lot in previous versions (v7)... I am > trying my best to modify the code to address your concerns, but I am > not fully understanding what you mean about raw devices, and you didn't > answer some of my previous questions/interrogations in v7 about that. I don't have time to answer all questions, sorry. Please help review submitted patches to reduce my load and allow me to answer other stuff :) > So, in the new function that I > need to implement, sc16is7xx_setup_gpio_chip(), I absolutely need to use > a raw device to read a device tree property and to set > s->gpio.parent: > > count = device_property_count_u32(dev, ... > ... > s->gpio.parent = dev; > > Do we agree on that? Yes, but what type of parent is that? > Then, how do I pass this raw device to the > device_property_count_u32() function and to the s->gpio.parent > assignment? > > Should I modify sc16is7xx_setup_gpio_chip() like so: > > static int sc16is7xx_setup_gpio_chip(struct sc16is7xx_port *s) > { > struct device *dev = &s->p[0].port.dev; > > count = device_property_count_u32(dev, ... > ... > s->gpio.parent = dev; Again, what is the real type of that parent? It's a port, right, so pass in the port to this function and then do the "take the struct device of the port" at that point in time. thanks, greg k-h
On Fri, 4 Aug 2023 15:14:18 +0200 Greg KH <gregkh@linuxfoundation.org> wrote: > On Thu, Aug 03, 2023 at 12:14:49PM -0400, Hugo Villeneuve wrote: > > On Mon, 31 Jul 2023 17:55:42 +0200 > > Greg KH <gregkh@linuxfoundation.org> wrote: > > > > > On Tue, Jul 25, 2023 at 10:23:36AM -0400, Hugo Villeneuve wrote: > > > > From: Hugo Villeneuve <hvilleneuve@dimonoff.com> > > > > > > > > In preparation for upcoming patch "fix regression with GPIO > > > > configuration". To facilitate review and make code more modular. > > > > > > I would much rather the issue be fixed _before_ the code is refactored, > > > unless it is impossible to fix it without the refactor? > > > > Hi Greg, > > normally I would agree, but the refactor in this case helps a lot to > > address some issues raised by you and Andy in V7 of this series. > > > > Maybe I could merge it with the actual patch "fix regression with GPIO > > configuration"? > > Sure. Hi Greg, will do. > > > > Cc: <stable@vger.kernel.org> # 6.1.x > > > > > > What commit id does this fix? > > > > It doesn't fix anything, but I tought that I needed this tag since > > this patch is a prerequisite for the next patch in the series, which > > would be applied to stable kernels. I will remove this tag (assuming > > the patch stays as it is, depending on your answer to the above > > question). > > > > > > > > Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com> > > > > Reviewed-by: Lech Perczak <lech.perczak@camlingroup.com> > > > > Tested-by: Lech Perczak <lech.perczak@camlingroup.com> > > > > --- > > > > drivers/tty/serial/sc16is7xx.c | 40 ++++++++++++++++++++-------------- > > > > 1 file changed, 24 insertions(+), 16 deletions(-) > > > > > > > > diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c > > > > index 32d43d00a583..5b0aeef9d534 100644 > > > > --- a/drivers/tty/serial/sc16is7xx.c > > > > +++ b/drivers/tty/serial/sc16is7xx.c > > > > @@ -332,6 +332,7 @@ struct sc16is7xx_one { > > > > > > > > struct sc16is7xx_port { > > > > const struct sc16is7xx_devtype *devtype; > > > > + struct device *dev; > > > > > > Why is this pointer needed? > > > > > > Why is it grabbed and yet the reference count is never incremented? Who > > > owns the reference count and when will it go away? > > > > > > And what device is this? The parent? Current device? What type of > > > device is it? And why is it needed? > > > > > > Using "raw" devices is almost never something a driver should do, they > > > are only passed into functions by the driver core, but then the driver > > > should instantly turn them into the "real" structure. > > > > We already discussed that a lot in previous versions (v7)... I am > > trying my best to modify the code to address your concerns, but I am > > not fully understanding what you mean about raw devices, and you didn't > > answer some of my previous questions/interrogations in v7 about that. > > I don't have time to answer all questions, sorry. > > Please help review submitted patches to reduce my load and allow me to > answer other stuff :) Ok. > > So, in the new function that I > > need to implement, sc16is7xx_setup_gpio_chip(), I absolutely need to use > > a raw device to read a device tree property and to set > > s->gpio.parent: > > > > count = device_property_count_u32(dev, ... > > ... > > s->gpio.parent = dev; > > > > Do we agree on that? > > Yes, but what type of parent is that? I am confused by your question. I do not understand why the type of parent matters... And what do you call the parent: s, s->gpio or s->gpio.parent? For me, the way I understand it, the only question that matters is how I can extract the raw device structure pointer from maybe "struct sc16is7xx_port" or some other structure, and then use it in my new function... I should not have put "s->gpio.parent = dev" in the example, I think it just complexifies things. Lets start over with a more simple example and only: count = device_property_count_u32(dev, ... > > Then, how do I pass this raw device to the > > device_property_count_u32() function and to the s->gpio.parent > > assignment? > > > > Should I modify sc16is7xx_setup_gpio_chip() like so: > > > > static int sc16is7xx_setup_gpio_chip(struct sc16is7xx_port *s) > > { > > struct device *dev = &s->p[0].port.dev; > > > > count = device_property_count_u32(dev, ... > > ... > > s->gpio.parent = dev; > > Again, what is the real type of that parent? It's a port, right, so > pass in the port to this function and then do the "take the struct > device of the port" at that point in time. With the simplified example, is the following ok: static int sc16is7xx_setup_gpio_chip(struct sc16is7xx_port *s) { struct device *dev = &s->p[0].port.dev; count = device_property_count_u32(dev, ... ... } If not, please indicate how you would do it with an actual example... Thank you, Hugo.
On Fri, Aug 04, 2023 at 10:15:54AM -0400, Hugo Villeneuve wrote: > On Fri, 4 Aug 2023 15:14:18 +0200 > Greg KH <gregkh@linuxfoundation.org> wrote: > > > On Thu, Aug 03, 2023 at 12:14:49PM -0400, Hugo Villeneuve wrote: > > > On Mon, 31 Jul 2023 17:55:42 +0200 > > > Greg KH <gregkh@linuxfoundation.org> wrote: > > > > > > > On Tue, Jul 25, 2023 at 10:23:36AM -0400, Hugo Villeneuve wrote: > > > > > From: Hugo Villeneuve <hvilleneuve@dimonoff.com> > > > > > > > > > > In preparation for upcoming patch "fix regression with GPIO > > > > > configuration". To facilitate review and make code more modular. > > > > > > > > I would much rather the issue be fixed _before_ the code is refactored, > > > > unless it is impossible to fix it without the refactor? > > > > > > Hi Greg, > > > normally I would agree, but the refactor in this case helps a lot to > > > address some issues raised by you and Andy in V7 of this series. > > > > > > Maybe I could merge it with the actual patch "fix regression with GPIO > > > configuration"? > > > > Sure. > > Hi Greg, > will do. > > > > > > > Cc: <stable@vger.kernel.org> # 6.1.x > > > > > > > > What commit id does this fix? > > > > > > It doesn't fix anything, but I tought that I needed this tag since > > > this patch is a prerequisite for the next patch in the series, which > > > would be applied to stable kernels. I will remove this tag (assuming > > > the patch stays as it is, depending on your answer to the above > > > question). > > > > > > > > > > > Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com> > > > > > Reviewed-by: Lech Perczak <lech.perczak@camlingroup.com> > > > > > Tested-by: Lech Perczak <lech.perczak@camlingroup.com> > > > > > --- > > > > > drivers/tty/serial/sc16is7xx.c | 40 ++++++++++++++++++++-------------- > > > > > 1 file changed, 24 insertions(+), 16 deletions(-) > > > > > > > > > > diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c > > > > > index 32d43d00a583..5b0aeef9d534 100644 > > > > > --- a/drivers/tty/serial/sc16is7xx.c > > > > > +++ b/drivers/tty/serial/sc16is7xx.c > > > > > @@ -332,6 +332,7 @@ struct sc16is7xx_one { > > > > > > > > > > struct sc16is7xx_port { > > > > > const struct sc16is7xx_devtype *devtype; > > > > > + struct device *dev; > > > > > > > > Why is this pointer needed? > > > > > > > > Why is it grabbed and yet the reference count is never incremented? Who > > > > owns the reference count and when will it go away? > > > > > > > > And what device is this? The parent? Current device? What type of > > > > device is it? And why is it needed? > > > > > > > > Using "raw" devices is almost never something a driver should do, they > > > > are only passed into functions by the driver core, but then the driver > > > > should instantly turn them into the "real" structure. > > > > > > We already discussed that a lot in previous versions (v7)... I am > > > trying my best to modify the code to address your concerns, but I am > > > not fully understanding what you mean about raw devices, and you didn't > > > answer some of my previous questions/interrogations in v7 about that. > > > > I don't have time to answer all questions, sorry. > > > > Please help review submitted patches to reduce my load and allow me to > > answer other stuff :) > > Ok. > > > > > So, in the new function that I > > > need to implement, sc16is7xx_setup_gpio_chip(), I absolutely need to use > > > a raw device to read a device tree property and to set > > > s->gpio.parent: > > > > > > count = device_property_count_u32(dev, ... > > > ... > > > s->gpio.parent = dev; > > > > > > Do we agree on that? > > > > Yes, but what type of parent is that? > > I am confused by your question. I do not understand why the type of > parent matters... And what do you call the parent: s, s->gpio or > s->gpio.parent? > > For me, the way I understand it, the only question that matters is how I > can extract the raw device structure pointer from maybe "struct > sc16is7xx_port" or some other structure, and then use it in my > new function... > > I should not have put "s->gpio.parent = dev" in the example, I think it > just complexifies things. Lets start over with a more simple example and > only: > > count = device_property_count_u32(dev, ... > > > > > Then, how do I pass this raw device to the > > > device_property_count_u32() function and to the s->gpio.parent > > > assignment? > > > > > > Should I modify sc16is7xx_setup_gpio_chip() like so: > > > > > > static int sc16is7xx_setup_gpio_chip(struct sc16is7xx_port *s) > > > { > > > struct device *dev = &s->p[0].port.dev; > > > > > > count = device_property_count_u32(dev, ... > > > ... > > > s->gpio.parent = dev; > > > > Again, what is the real type of that parent? It's a port, right, so > > pass in the port to this function and then do the "take the struct > > device of the port" at that point in time. > > With the simplified example, is the following ok: > > static int sc16is7xx_setup_gpio_chip(struct sc16is7xx_port *s) > { > struct device *dev = &s->p[0].port.dev; > > count = device_property_count_u32(dev, ... > ... > } > > If not, please indicate how you would do it with an actual example... At this point, after reviewing 500+ patches today, I really have no idea, my brain is fried. Do what you think is right here and submit a new series and I'll be glad to review it. thanks, greg k-h
On Fri, 4 Aug 2023 17:09:13 +0200 Greg KH <gregkh@linuxfoundation.org> wrote: > On Fri, Aug 04, 2023 at 10:15:54AM -0400, Hugo Villeneuve wrote: > > On Fri, 4 Aug 2023 15:14:18 +0200 > > Greg KH <gregkh@linuxfoundation.org> wrote: > > > > > On Thu, Aug 03, 2023 at 12:14:49PM -0400, Hugo Villeneuve wrote: > > > > On Mon, 31 Jul 2023 17:55:42 +0200 > > > > Greg KH <gregkh@linuxfoundation.org> wrote: > > > > > > > > > On Tue, Jul 25, 2023 at 10:23:36AM -0400, Hugo Villeneuve wrote: > > > > > > From: Hugo Villeneuve <hvilleneuve@dimonoff.com> > > > > > > > > > > > > In preparation for upcoming patch "fix regression with GPIO > > > > > > configuration". To facilitate review and make code more modular. > > > > > > > > > > I would much rather the issue be fixed _before_ the code is refactored, > > > > > unless it is impossible to fix it without the refactor? > > > > > > > > Hi Greg, > > > > normally I would agree, but the refactor in this case helps a lot to > > > > address some issues raised by you and Andy in V7 of this series. > > > > > > > > Maybe I could merge it with the actual patch "fix regression with GPIO > > > > configuration"? > > > > > > Sure. > > > > Hi Greg, > > will do. > > > > > > > > > > Cc: <stable@vger.kernel.org> # 6.1.x > > > > > > > > > > What commit id does this fix? > > > > > > > > It doesn't fix anything, but I tought that I needed this tag since > > > > this patch is a prerequisite for the next patch in the series, which > > > > would be applied to stable kernels. I will remove this tag (assuming > > > > the patch stays as it is, depending on your answer to the above > > > > question). > > > > > > > > > > > > > > Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com> > > > > > > Reviewed-by: Lech Perczak <lech.perczak@camlingroup.com> > > > > > > Tested-by: Lech Perczak <lech.perczak@camlingroup.com> > > > > > > --- > > > > > > drivers/tty/serial/sc16is7xx.c | 40 ++++++++++++++++++++-------------- > > > > > > 1 file changed, 24 insertions(+), 16 deletions(-) > > > > > > > > > > > > diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c > > > > > > index 32d43d00a583..5b0aeef9d534 100644 > > > > > > --- a/drivers/tty/serial/sc16is7xx.c > > > > > > +++ b/drivers/tty/serial/sc16is7xx.c > > > > > > @@ -332,6 +332,7 @@ struct sc16is7xx_one { > > > > > > > > > > > > struct sc16is7xx_port { > > > > > > const struct sc16is7xx_devtype *devtype; > > > > > > + struct device *dev; > > > > > > > > > > Why is this pointer needed? > > > > > > > > > > Why is it grabbed and yet the reference count is never incremented? Who > > > > > owns the reference count and when will it go away? > > > > > > > > > > And what device is this? The parent? Current device? What type of > > > > > device is it? And why is it needed? > > > > > > > > > > Using "raw" devices is almost never something a driver should do, they > > > > > are only passed into functions by the driver core, but then the driver > > > > > should instantly turn them into the "real" structure. > > > > > > > > We already discussed that a lot in previous versions (v7)... I am > > > > trying my best to modify the code to address your concerns, but I am > > > > not fully understanding what you mean about raw devices, and you didn't > > > > answer some of my previous questions/interrogations in v7 about that. > > > > > > I don't have time to answer all questions, sorry. > > > > > > Please help review submitted patches to reduce my load and allow me to > > > answer other stuff :) > > > > Ok. > > > > > > > > So, in the new function that I > > > > need to implement, sc16is7xx_setup_gpio_chip(), I absolutely need to use > > > > a raw device to read a device tree property and to set > > > > s->gpio.parent: > > > > > > > > count = device_property_count_u32(dev, ... > > > > ... > > > > s->gpio.parent = dev; > > > > > > > > Do we agree on that? > > > > > > Yes, but what type of parent is that? > > > > I am confused by your question. I do not understand why the type of > > parent matters... And what do you call the parent: s, s->gpio or > > s->gpio.parent? > > > > For me, the way I understand it, the only question that matters is how I > > can extract the raw device structure pointer from maybe "struct > > sc16is7xx_port" or some other structure, and then use it in my > > new function... > > > > I should not have put "s->gpio.parent = dev" in the example, I think it > > just complexifies things. Lets start over with a more simple example and > > only: > > > > count = device_property_count_u32(dev, ... > > > > > > > > Then, how do I pass this raw device to the > > > > device_property_count_u32() function and to the s->gpio.parent > > > > assignment? > > > > > > > > Should I modify sc16is7xx_setup_gpio_chip() like so: > > > > > > > > static int sc16is7xx_setup_gpio_chip(struct sc16is7xx_port *s) > > > > { > > > > struct device *dev = &s->p[0].port.dev; > > > > > > > > count = device_property_count_u32(dev, ... > > > > ... > > > > s->gpio.parent = dev; > > > > > > Again, what is the real type of that parent? It's a port, right, so > > > pass in the port to this function and then do the "take the struct > > > device of the port" at that point in time. > > > > With the simplified example, is the following ok: > > > > static int sc16is7xx_setup_gpio_chip(struct sc16is7xx_port *s) > > { > > struct device *dev = &s->p[0].port.dev; > > > > count = device_property_count_u32(dev, ... > > ... > > } > > > > If not, please indicate how you would do it with an actual example... > > At this point, after reviewing 500+ patches today, I really have no > idea, my brain is fried. Do what you think is right here and submit a > new series and I'll be glad to review it. Ok :) Will do. Hugo.
diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c index 32d43d00a583..5b0aeef9d534 100644 --- a/drivers/tty/serial/sc16is7xx.c +++ b/drivers/tty/serial/sc16is7xx.c @@ -332,6 +332,7 @@ struct sc16is7xx_one { struct sc16is7xx_port { const struct sc16is7xx_devtype *devtype; + struct device *dev; struct regmap *regmap; struct clk *clk; #ifdef CONFIG_GPIOLIB @@ -1349,6 +1350,25 @@ static int sc16is7xx_gpio_direction_output(struct gpio_chip *chip, return 0; } + +static int sc16is7xx_setup_gpio_chip(struct sc16is7xx_port *s) +{ + if (!s->devtype->nr_gpio) + return 0; + + s->gpio.owner = THIS_MODULE; + s->gpio.parent = s->dev; + s->gpio.label = dev_name(s->dev); + s->gpio.direction_input = sc16is7xx_gpio_direction_input; + s->gpio.get = sc16is7xx_gpio_get; + s->gpio.direction_output = sc16is7xx_gpio_direction_output; + s->gpio.set = sc16is7xx_gpio_set; + s->gpio.base = -1; + s->gpio.ngpio = s->devtype->nr_gpio; + s->gpio.can_sleep = 1; + + return gpiochip_add_data(&s->gpio, s); +} #endif static const struct serial_rs485 sc16is7xx_rs485_supported = { @@ -1412,6 +1432,7 @@ static int sc16is7xx_probe(struct device *dev, s->regmap = regmap; s->devtype = devtype; + s->dev = dev; dev_set_drvdata(dev, s); mutex_init(&s->efr_lock); @@ -1502,22 +1523,9 @@ static int sc16is7xx_probe(struct device *dev, } #ifdef CONFIG_GPIOLIB - if (devtype->nr_gpio) { - /* Setup GPIO cotroller */ - s->gpio.owner = THIS_MODULE; - s->gpio.parent = dev; - s->gpio.label = dev_name(dev); - s->gpio.direction_input = sc16is7xx_gpio_direction_input; - s->gpio.get = sc16is7xx_gpio_get; - s->gpio.direction_output = sc16is7xx_gpio_direction_output; - s->gpio.set = sc16is7xx_gpio_set; - s->gpio.base = -1; - s->gpio.ngpio = devtype->nr_gpio; - s->gpio.can_sleep = 1; - ret = gpiochip_add_data(&s->gpio, s); - if (ret) - goto out_ports; - } + ret = sc16is7xx_setup_gpio_chip(s); + if (ret) + goto out_ports; #endif /*