All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
To: Sergey Shtylyov <s.shtylyov@omp.ru>
Cc: "Andrew Lunn" <andrew@lunn.ch>,
	"Ulf Hansson" <ulf.hansson@linaro.org>,
	"Vignesh Raghavendra" <vigneshr@ti.com>,
	"KVM list" <kvm@vger.kernel.org>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	linux-iio@vger.kernel.org,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Amit Kucheria" <amitk@kernel.org>,
	"ALSA Development Mailing List" <alsa-devel@alsa-project.org>,
	"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>,
	"Jaroslav Kysela" <perex@perex.cz>,
	"Guenter Roeck" <groeck@chromium.org>,
	"Thierry Reding" <thierry.reding@gmail.com>,
	"MTD Maling List" <linux-mtd@lists.infradead.org>,
	"Linux I2C" <linux-i2c@vger.kernel.org>,
	"Miquel Raynal" <miquel.raynal@bootlin.com>,
	linux-phy@lists.infradead.org,
	"Jiri Slaby" <jirislaby@kernel.org>,
	openipmi-developer@lists.sourceforge.net,
	"David S. Miller" <davem@davemloft.net>,
	"Khuong Dinh" <khuong@os.amperecomputing.com>,
	"Florian Fainelli" <f.fainelli@gmail.com>,
	"Matthias Schiffer" <matthias.schiffer@ew.tq-group.com>,
	"Joakim Zhang" <qiangqing.zhang@nxp.com>,
	"Kamal Dasu" <kdasu.kdev@gmail.com>,
	"Lee Jones" <lee.jones@linaro.org>,
	"Bartosz Golaszewski" <brgl@bgdev.pl>,
	"Daniel Lezcano" <daniel.lezcano@linaro.org>,
	"Kishon Vijay Abraham I" <kishon@ti.com>,
	"Geert Uytterhoeven" <geert@linux-m68k.org>,
	"open list:SERIAL DRIVERS" <linux-serial@vger.kernel.org>,
	"Yoshihiro Shimoda" <yoshihiro.shimoda.uh@renesas.com>,
	bcm-kernel-feedback-list <bcm-kernel-feedback-list@broadcom.com>,
	"Zhang Rui" <rui.zhang@intel.com>,
	"Linux PWM List" <linux-pwm@vger.kernel.org>,
	"Robert Richter" <rric@kernel.org>,
	"Saravanan Sekar" <sravanhome@gmail.com>,
	"Corey Minyard" <minyard@acm.org>,
	"Linux PM list" <linux-pm@vger.kernel.org>,
	"Liam Girdwood" <lgirdwood@gmail.com>,
	"Mauro Carvalho Chehab" <mchehab@kernel.org>,
	"John Garry" <john.garry@huawei.com>,
	"Peter Korsgaard" <peter@korsgaard.com>,
	"William Breathitt Gray" <vilhelm.gray@gmail.com>,
	"Mark Gross" <markgross@kernel.org>,
	"Hans de Goede" <hdegoede@redhat.com>,
	"Alex Williamson" <alex.williamson@redhat.com>,
	"Mark Brown" <broonie@kernel.org>,
	"Borislav Petkov" <bp@alien8.de>,
	"Sebastian Reichel" <sre@kernel.org>,
	"Jakub Kicinski" <kuba@kernel.org>,
	"Matthias Brugger" <matthias.bgg@gmail.com>,
	"Takashi Iwai" <tiwai@suse.com>,
	platform-driver-x86@vger.kernel.org,
	"Benson Leung" <bleung@chromium.org>,
	"Linux ARM" <linux-arm-kernel@lists.infradead.org>,
	linux-edac@vger.kernel.org, "Tony Luck" <tony.luck@intel.com>,
	"Mun Yew Tham" <mun.yew.tham@intel.com>,
	"Eric Auger" <eric.auger@redhat.com>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"open list:GPIO SUBSYSTEM" <linux-gpio@vger.kernel.org>,
	"Cornelia Huck" <cohuck@redhat.com>,
	"Linux MMC List" <linux-mmc@vger.kernel.org>,
	"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
	linux-spi <linux-spi@vger.kernel.org>,
	Linux-Renesas <linux-renesas-soc@vger.kernel.org>,
	"Vinod Koul" <vkoul@kernel.org>,
	"James Morse" <james.morse@arm.com>,
	"Zha Qipeng" <qipeng.zha@intel.com>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Richard Weinberger" <richard@nod.at>,
	"Niklas Söderlund" <niklas.soderlund@ragnatech.se>,
	linux-mediatek@lists.infradead.org,
	"Brian Norris" <computersforpeace@gmail.com>,
	netdev@vger.kernel.org
Subject: Re: [PATCH 1/2] platform: make platform_get_irq_optional() optional
Date: Fri, 14 Jan 2022 21:22:26 +0100	[thread overview]
Message-ID: <20220114202226.ugzklxv4wzr6egwj@pengutronix.de> (raw)
In-Reply-To: <61b80939-357d-14f5-df99-b8d102a4e1a1@omp.ru>

[-- Attachment #1: Type: text/plain, Size: 7563 bytes --]

On Fri, Jan 14, 2022 at 10:14:10PM +0300, Sergey Shtylyov wrote:
> On 1/14/22 12:25 PM, Uwe Kleine-König wrote:
> 
> >>>>> To me it sounds much more logical for the driver to check if an
> >>>>> optional irq is non-zero (available) or zero (not available), than to
> >>>>> sprinkle around checks for -ENXIO. In addition, you have to remember
> >>>>> that this one returns -ENXIO, while other APIs use -ENOENT or -ENOSYS
> >>>>> (or some other error code) to indicate absence. I thought not having
> >>>>> to care about the actual error code was the main reason behind the
> >>>>> introduction of the *_optional() APIs.
> >>>
> >>>> No, the main benefit of gpiod_get_optional() (and clk_get_optional()) is
> >>>> that you can handle an absent GPIO (or clk) as if it were available.
> >>
> >>    Hm, I've just looked at these and must note that they match 1:1 with
> >> platform_get_irq_optional(). Unfortunately, we can't however behave the
> >> same way in request_irq() -- because it has to support IRQ0 for the sake
> >> of i8253 drivers in arch/...
> > 
> > Let me reformulate your statement to the IMHO equivalent:
> > 
> > 	If you set aside the differences between
> > 	platform_get_irq_optional() and gpiod_get_optional(),
> 
>    Sorry, I should make it clear this is actually the diff between a would-be
> platform_get_irq_optional() after my patch, not the current code...

The similarity is that with your patch both gpiod_get_optional() and
platform_get_irq_optional() return NULL and 0 on not-found. The relevant
difference however is that for a gpiod NULL is a dummy value, while for
irqs it's not. So the similarity is only syntactically, but not
semantically.

> > 	platform_get_irq_optional() is like gpiod_get_optional().
> > 
> > The introduction of gpiod_get_optional() made it possible to simplify
> > the following code:
> > 
> > 	reset_gpio = gpiod_get(...)
> > 	if IS_ERR(reset_gpio):
> > 		error = PTR_ERR(reset_gpio)
> > 		if error != -ENDEV:
> 
>    ENODEV?

Yes, typo.

> > 			return error
> > 	else:
> > 		gpiod_set_direction(reset_gpiod, INACTIVE)
> > 
> > to
> > 
> > 	reset_gpio = gpiod_get_optional(....)
> > 	if IS_ERR(reset_gpio):
> > 		return reset_gpio
> > 	gpiod_set_direction(reset_gpiod, INACTIVE)
> > 
> > and I never need to actually know if the reset_gpio actually exists.
> > Either the line is put into its inactive state, or it doesn't exist and
> > then gpiod_set_direction is a noop. For a regulator or a clk this works
> > in a similar way.
> > 
> > However for an interupt this cannot work. You will always have to check
> > if the irq is actually there or not because if it's not you cannot just
> > ignore that. So there is no benefit of an optional irq.
> > 
> > Leaving error message reporting aside, the introduction of
> > platform_get_irq_optional() allows to change
> > 
> > 	irq = platform_get_irq(...);
> > 	if (irq < 0 && irq != -ENXIO) {
> > 		return irq;
> > 	} else if (irq >= 0) {
> 
>    Rather (irq > 0) actually, IRQ0 is considered invalid (but still returned).

This is a topic I don't feel strong for, so I'm sloppy here. If changing
this is all that is needed to convince you of my point ...

> > 		... setup irq operation ...
> > 	} else { /* irq == -ENXIO */
> > 		... setup polling ...
> > 	}
> > 
> > to
> > 	
> > 	irq = platform_get_irq_optional(...);
> > 	if (irq < 0 && irq != -ENXIO) {
> > 		return irq;
> > 	} else if (irq >= 0) {
> > 		... setup irq operation ...
> > 	} else { /* irq == -ENXIO */
> > 		... setup polling ...
> > 	}
> > 
> > which isn't a win. When changing the return value as you suggest, it can
> > be changed instead to:
> > 
> > 	irq = platform_get_irq_optional(...);
> > 	if (irq < 0) {
> > 		return irq;
> > 	} else if (irq > 0) {
> > 		... setup irq operation ...
> > 	} else { /* irq == 0 */
> > 		... setup polling ...
> > 	}
> > 
> > which is a tad nicer. If that is your goal however I ask you to also
> > change the semantic of platform_get_irq() to return 0 on "not found".
> 
>     Well, I'm not totally opposed to that... but would there be a considerable win?

Well, compared to your suggestion of making platform_get_irq_optional()
return 0 on "not-found" the considerable win would be that
platform_get_irq_optional() and platform_get_irq() are not different
just because platform_get_irq() is to hard to change.

> Anyway, we should 1st stop returning 0 for "valid" IRQs -- this is done by my patch
> the discussed patch series are atop of.
> 
> > Note the win is considerably less compared to gpiod_get_optional vs
> 
>    If there's any at all... We'd basically have to touch /all/ platform_get_irq()
> calls (and get an even larger CC list ;-)).

You got me wrong here. I meant that even if you change both
platform_get_irq() and platform_get_irq_optional() to return 0 on
"not-found", the win is small compared to the benefit of having both
clk_get() and clk_get_optional().

> > gpiod_get however. And then it still lacks the semantic of a dummy irq
> > which IMHO forfeits the right to call it ..._optional().
> 
>    Not quite grasping it... Why e.g. clk_get() doesn't return 0 for a not found clock?

Because NULL is not an error value for clk and when calling clk_get()
you want a failure when the clk you asked for isn't available.

Sure you could do the following in a case where you want to insist the
clk to be actually available:

	clk = clk_get_optional(...)
	if (IS_ERR_OR_NULL(clk)) {
		err = PTR_ERR(clk) || -ENODEV;
		return dev_err_probe(dev, err, ....);
	}

but this is more ugly than

	clk = clk_get(...)
	if (IS_ERR(clk)) {
		err = PTR_ERR(clk);
		return dev_err_probe(dev, err, ....);
	}

Additionally the first usage would hard-code in the drivers that NULL is
the dummy value which you might want to consider a layer violation.

You have to understand that for clk (and regulator and gpiod) NULL is a
valid descriptor that can actually be used, it just has no effect. So
this is a convenience value for the case "If the clk/regulator/gpiod in
question isn't available, there is nothing to do". This is what makes
clk_get_optional() and the others really useful and justifies their
existence. This doesn't apply to platform_get_irq_optional().

So clk_get() is sane and sensible for cases where you need the clk to be
there. It doesn't emit an error message, because the caller knows better
if it's worth an error message and in some cases the caller can also
emit a better error message than clk_get() itself.

clk_get_optional() is sane and sensible for cases where the clk might be
absent and it helps you because you don't have to differentiate between
"not found" and "there is an actual resource".

The reason for platform_get_irq_optional()'s existence is just that
platform_get_irq() emits an error message which is wrong or suboptimal
in some cases (and IMHO is platform_get_irq() root fault). It doesn't
simplify handling the "not found" case. So let's not pretend by the
choice of function names that there is a similarity between clk_get() +
clk_get_optional() and platform_get_irq() + platform_get_irq_optional().

And as you cannot change platform_get_irq_optional() to return a working
dummy value, IMHO the only sane way out is renaming it.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
To: Sergey Shtylyov <s.shtylyov@omp.ru>
Cc: "Andrew Lunn" <andrew@lunn.ch>,
	"Ulf Hansson" <ulf.hansson@linaro.org>,
	"Vignesh Raghavendra" <vigneshr@ti.com>,
	"KVM list" <kvm@vger.kernel.org>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	linux-iio@vger.kernel.org,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Amit Kucheria" <amitk@kernel.org>,
	"ALSA Development Mailing List" <alsa-devel@alsa-project.org>,
	"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>,
	"Jaroslav Kysela" <perex@perex.cz>,
	"Guenter Roeck" <groeck@chromium.org>,
	"Thierry Reding" <thierry.reding@gmail.com>,
	"MTD Maling List" <linux-mtd@lists.infradead.org>,
	"Linux I2C" <linux-i2c@vger.kernel.org>,
	"Miquel Raynal" <miquel.raynal@bootlin.com>,
	linux-phy@lists.infradead.org,
	"Jiri Slaby" <jirislaby@kernel.org>,
	openipmi-developer@lists.sourceforge.net,
	"David S. Miller" <davem@davemloft.net>,
	"Khuong Dinh" <khuong@os.amperecomputing.com>,
	"Florian Fainelli" <f.fainelli@gmail.com>,
	"Matthias Schiffer" <matthias.schiffer@ew.tq-group.com>,
	"Joakim Zhang" <qiangqing.zhang@nxp.com>,
	"Kamal Dasu" <kdasu.kdev@gmail.com>,
	"Lee Jones" <lee.jones@linaro.org>,
	"Bartosz Golaszewski" <brgl@bgdev.pl>,
	"Daniel Lezcano" <daniel.lezcano@linaro.org>,
	"Kishon Vijay Abraham I" <kishon@ti.com>,
	"Geert Uytterhoeven" <geert@linux-m68k.org>,
	"open list:SERIAL DRIVERS" <linux-serial@vger.kernel.org>,
	"Yoshihiro Shimoda" <yoshihiro.shimoda.uh@renesas.com>,
	bcm-kernel-feedback-list <bcm-kernel-feedback-list@broadcom.com>,
	"Zhang Rui" <rui.zhang@intel.com>,
	"Linux PWM List" <linux-pwm@vger.kernel.org>,
	"Robert Richter" <rric@kernel.org>,
	"Saravanan Sekar" <sravanhome@gmail.com>,
	"Corey Minyard" <minyard@acm.org>,
	"Linux PM list" <linux-pm@vger.kernel.org>,
	"Liam Girdwood" <lgirdwood@gmail.com>,
	"Mauro Carvalho Chehab" <mchehab@kernel.org>,
	"John Garry" <john.garry@huawei.com>,
	"Peter Korsgaard" <peter@korsgaard.com>,
	"William Breathitt Gray" <vilhelm.gray@gmail.com>,
	"Mark Gross" <markgross@kernel.org>,
	"Hans de Goede" <hdegoede@redhat.com>,
	"Alex Williamson" <alex.williamson@redhat.com>,
	"Mark Brown" <broonie@kernel.org>,
	"Borislav Petkov" <bp@alien8.de>,
	"Sebastian Reichel" <sre@kernel.org>,
	"Jakub Kicinski" <kuba@kernel.org>,
	"Matthias Brugger" <matthias.bgg@gmail.com>,
	"Takashi Iwai" <tiwai@suse.com>,
	platform-driver-x86@vger.kernel.org,
	"Benson Leung" <bleung@chromium.org>,
	"Linux ARM" <linux-arm-kernel@lists.infradead.org>,
	linux-edac@vger.kernel.org, "Tony Luck" <tony.luck@intel.com>,
	"Mun Yew Tham" <mun.yew.tham@intel.com>,
	"Eric Auger" <eric.auger@redhat.com>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"open list:GPIO SUBSYSTEM" <linux-gpio@vger.kernel.org>,
	"Cornelia Huck" <cohuck@redhat.com>,
	"Linux MMC List" <linux-mmc@vger.kernel.org>,
	"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
	linux-spi <linux-spi@vger.kernel.org>,
	Linux-Renesas <linux-renesas-soc@vger.kernel.org>,
	"Vinod Koul" <vkoul@kernel.org>,
	"James Morse" <james.morse@arm.com>,
	"Zha Qipeng" <qipeng.zha@intel.com>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Richard Weinberger" <richard@nod.at>,
	"Niklas Söderlund" <niklas.soderlund@ragnatech.se>,
	linux-mediatek@lists.infradead.org,
	"Brian Norris" <computersforpeace@gmail.com>,
	netdev@vger.kernel.org
Subject: Re: [PATCH 1/2] platform: make platform_get_irq_optional() optional
Date: Fri, 14 Jan 2022 21:22:26 +0100	[thread overview]
Message-ID: <20220114202226.ugzklxv4wzr6egwj@pengutronix.de> (raw)
In-Reply-To: <61b80939-357d-14f5-df99-b8d102a4e1a1@omp.ru>


[-- Attachment #1.1: Type: text/plain, Size: 7563 bytes --]

On Fri, Jan 14, 2022 at 10:14:10PM +0300, Sergey Shtylyov wrote:
> On 1/14/22 12:25 PM, Uwe Kleine-König wrote:
> 
> >>>>> To me it sounds much more logical for the driver to check if an
> >>>>> optional irq is non-zero (available) or zero (not available), than to
> >>>>> sprinkle around checks for -ENXIO. In addition, you have to remember
> >>>>> that this one returns -ENXIO, while other APIs use -ENOENT or -ENOSYS
> >>>>> (or some other error code) to indicate absence. I thought not having
> >>>>> to care about the actual error code was the main reason behind the
> >>>>> introduction of the *_optional() APIs.
> >>>
> >>>> No, the main benefit of gpiod_get_optional() (and clk_get_optional()) is
> >>>> that you can handle an absent GPIO (or clk) as if it were available.
> >>
> >>    Hm, I've just looked at these and must note that they match 1:1 with
> >> platform_get_irq_optional(). Unfortunately, we can't however behave the
> >> same way in request_irq() -- because it has to support IRQ0 for the sake
> >> of i8253 drivers in arch/...
> > 
> > Let me reformulate your statement to the IMHO equivalent:
> > 
> > 	If you set aside the differences between
> > 	platform_get_irq_optional() and gpiod_get_optional(),
> 
>    Sorry, I should make it clear this is actually the diff between a would-be
> platform_get_irq_optional() after my patch, not the current code...

The similarity is that with your patch both gpiod_get_optional() and
platform_get_irq_optional() return NULL and 0 on not-found. The relevant
difference however is that for a gpiod NULL is a dummy value, while for
irqs it's not. So the similarity is only syntactically, but not
semantically.

> > 	platform_get_irq_optional() is like gpiod_get_optional().
> > 
> > The introduction of gpiod_get_optional() made it possible to simplify
> > the following code:
> > 
> > 	reset_gpio = gpiod_get(...)
> > 	if IS_ERR(reset_gpio):
> > 		error = PTR_ERR(reset_gpio)
> > 		if error != -ENDEV:
> 
>    ENODEV?

Yes, typo.

> > 			return error
> > 	else:
> > 		gpiod_set_direction(reset_gpiod, INACTIVE)
> > 
> > to
> > 
> > 	reset_gpio = gpiod_get_optional(....)
> > 	if IS_ERR(reset_gpio):
> > 		return reset_gpio
> > 	gpiod_set_direction(reset_gpiod, INACTIVE)
> > 
> > and I never need to actually know if the reset_gpio actually exists.
> > Either the line is put into its inactive state, or it doesn't exist and
> > then gpiod_set_direction is a noop. For a regulator or a clk this works
> > in a similar way.
> > 
> > However for an interupt this cannot work. You will always have to check
> > if the irq is actually there or not because if it's not you cannot just
> > ignore that. So there is no benefit of an optional irq.
> > 
> > Leaving error message reporting aside, the introduction of
> > platform_get_irq_optional() allows to change
> > 
> > 	irq = platform_get_irq(...);
> > 	if (irq < 0 && irq != -ENXIO) {
> > 		return irq;
> > 	} else if (irq >= 0) {
> 
>    Rather (irq > 0) actually, IRQ0 is considered invalid (but still returned).

This is a topic I don't feel strong for, so I'm sloppy here. If changing
this is all that is needed to convince you of my point ...

> > 		... setup irq operation ...
> > 	} else { /* irq == -ENXIO */
> > 		... setup polling ...
> > 	}
> > 
> > to
> > 	
> > 	irq = platform_get_irq_optional(...);
> > 	if (irq < 0 && irq != -ENXIO) {
> > 		return irq;
> > 	} else if (irq >= 0) {
> > 		... setup irq operation ...
> > 	} else { /* irq == -ENXIO */
> > 		... setup polling ...
> > 	}
> > 
> > which isn't a win. When changing the return value as you suggest, it can
> > be changed instead to:
> > 
> > 	irq = platform_get_irq_optional(...);
> > 	if (irq < 0) {
> > 		return irq;
> > 	} else if (irq > 0) {
> > 		... setup irq operation ...
> > 	} else { /* irq == 0 */
> > 		... setup polling ...
> > 	}
> > 
> > which is a tad nicer. If that is your goal however I ask you to also
> > change the semantic of platform_get_irq() to return 0 on "not found".
> 
>     Well, I'm not totally opposed to that... but would there be a considerable win?

Well, compared to your suggestion of making platform_get_irq_optional()
return 0 on "not-found" the considerable win would be that
platform_get_irq_optional() and platform_get_irq() are not different
just because platform_get_irq() is to hard to change.

> Anyway, we should 1st stop returning 0 for "valid" IRQs -- this is done by my patch
> the discussed patch series are atop of.
> 
> > Note the win is considerably less compared to gpiod_get_optional vs
> 
>    If there's any at all... We'd basically have to touch /all/ platform_get_irq()
> calls (and get an even larger CC list ;-)).

You got me wrong here. I meant that even if you change both
platform_get_irq() and platform_get_irq_optional() to return 0 on
"not-found", the win is small compared to the benefit of having both
clk_get() and clk_get_optional().

> > gpiod_get however. And then it still lacks the semantic of a dummy irq
> > which IMHO forfeits the right to call it ..._optional().
> 
>    Not quite grasping it... Why e.g. clk_get() doesn't return 0 for a not found clock?

Because NULL is not an error value for clk and when calling clk_get()
you want a failure when the clk you asked for isn't available.

Sure you could do the following in a case where you want to insist the
clk to be actually available:

	clk = clk_get_optional(...)
	if (IS_ERR_OR_NULL(clk)) {
		err = PTR_ERR(clk) || -ENODEV;
		return dev_err_probe(dev, err, ....);
	}

but this is more ugly than

	clk = clk_get(...)
	if (IS_ERR(clk)) {
		err = PTR_ERR(clk);
		return dev_err_probe(dev, err, ....);
	}

Additionally the first usage would hard-code in the drivers that NULL is
the dummy value which you might want to consider a layer violation.

You have to understand that for clk (and regulator and gpiod) NULL is a
valid descriptor that can actually be used, it just has no effect. So
this is a convenience value for the case "If the clk/regulator/gpiod in
question isn't available, there is nothing to do". This is what makes
clk_get_optional() and the others really useful and justifies their
existence. This doesn't apply to platform_get_irq_optional().

So clk_get() is sane and sensible for cases where you need the clk to be
there. It doesn't emit an error message, because the caller knows better
if it's worth an error message and in some cases the caller can also
emit a better error message than clk_get() itself.

clk_get_optional() is sane and sensible for cases where the clk might be
absent and it helps you because you don't have to differentiate between
"not found" and "there is an actual resource".

The reason for platform_get_irq_optional()'s existence is just that
platform_get_irq() emits an error message which is wrong or suboptimal
in some cases (and IMHO is platform_get_irq() root fault). It doesn't
simplify handling the "not found" case. So let's not pretend by the
choice of function names that there is a similarity between clk_get() +
clk_get_optional() and platform_get_irq() + platform_get_irq_optional().

And as you cannot change platform_get_irq_optional() to return a working
dummy value, IMHO the only sane way out is renaming it.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 144 bytes --]

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

WARNING: multiple messages have this Message-ID (diff)
From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
To: Sergey Shtylyov <s.shtylyov@omp.ru>
Cc: "Andrew Lunn" <andrew@lunn.ch>,
	"Ulf Hansson" <ulf.hansson@linaro.org>,
	"Vignesh Raghavendra" <vigneshr@ti.com>,
	"KVM list" <kvm@vger.kernel.org>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	linux-iio@vger.kernel.org,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Amit Kucheria" <amitk@kernel.org>,
	"ALSA Development Mailing List" <alsa-devel@alsa-project.org>,
	"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>,
	"Jaroslav Kysela" <perex@perex.cz>,
	"Guenter Roeck" <groeck@chromium.org>,
	"Thierry Reding" <thierry.reding@gmail.com>,
	"MTD Maling List" <linux-mtd@lists.infradead.org>,
	"Linux I2C" <linux-i2c@vger.kernel.org>,
	"Miquel Raynal" <miquel.raynal@bootlin.com>,
	linux-phy@lists.infradead.org,
	"Jiri Slaby" <jirislaby@kernel.org>,
	openipmi-developer@lists.sourceforge.net,
	"David S. Miller" <davem@davemloft.net>,
	"Khuong Dinh" <khuong@os.amperecomputing.com>,
	"Florian Fainelli" <f.fainelli@gmail.com>,
	"Matthias Schiffer" <matthias.schiffer@ew.tq-group.com>,
	"Joakim Zhang" <qiangqing.zhang@nxp.com>,
	"Kamal Dasu" <kdasu.kdev@gmail.com>,
	"Lee Jones" <lee.jones@linaro.org>,
	"Bartosz Golaszewski" <brgl@bgdev.pl>,
	"Daniel Lezcano" <daniel.lezcano@linaro.org>,
	"Kishon Vijay Abraham I" <kishon@ti.com>,
	"Geert Uytterhoeven" <geert@linux-m68k.org>,
	"open list:SERIAL DRIVERS" <linux-serial@vger.kernel.org>,
	"Yoshihiro Shimoda" <yoshihiro.shimoda.uh@renesas.com>,
	bcm-kernel-feedback-list <bcm-kernel-feedback-list@broadcom.com>,
	"Zhang Rui" <rui.zhang@intel.com>,
	"Linux PWM List" <linux-pwm@vger.kernel.org>,
	"Robert Richter" <rric@kernel.org>,
	"Saravanan Sekar" <sravanhome@gmail.com>,
	"Corey Minyard" <minyard@acm.org>,
	"Linux PM list" <linux-pm@vger.kernel.org>,
	"Liam Girdwood" <lgirdwood@gmail.com>,
	"Mauro Carvalho Chehab" <mchehab@kernel.org>,
	"John Garry" <john.garry@huawei.com>,
	"Peter Korsgaard" <peter@korsgaard.com>,
	"William Breathitt Gray" <vilhelm.gray@gmail.com>,
	"Mark Gross" <markgross@kernel.org>,
	"Hans de Goede" <hdegoede@redhat.com>,
	"Alex Williamson" <alex.williamson@redhat.com>,
	"Mark Brown" <broonie@kernel.org>,
	"Borislav Petkov" <bp@alien8.de>,
	"Sebastian Reichel" <sre@kernel.org>,
	"Jakub Kicinski" <kuba@kernel.org>,
	"Matthias Brugger" <matthias.bgg@gmail.com>,
	"Takashi Iwai" <tiwai@suse.com>,
	platform-driver-x86@vger.kernel.org,
	"Benson Leung" <bleung@chromium.org>,
	"Linux ARM" <linux-arm-kernel@lists.infradead.org>,
	linux-edac@vger.kernel.org, "Tony Luck" <tony.luck@intel.com>,
	"Mun Yew Tham" <mun.yew.tham@intel.com>,
	"Eric Auger" <eric.auger@redhat.com>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"open list:GPIO SUBSYSTEM" <linux-gpio@vger.kernel.org>,
	"Cornelia Huck" <cohuck@redhat.com>,
	"Linux MMC List" <linux-mmc@vger.kernel.org>,
	"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
	linux-spi <linux-spi@vger.kernel.org>,
	Linux-Renesas <linux-renesas-soc@vger.kernel.org>,
	"Vinod Koul" <vkoul@kernel.org>,
	"James Morse" <james.morse@arm.com>,
	"Zha Qipeng" <qipeng.zha@intel.com>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Richard Weinberger" <richard@nod.at>,
	"Niklas Söderlund" <niklas.soderlund@ragnatech.se>,
	linux-mediatek@lists.infradead.org,
	"Brian Norris" <computersforpeace@gmail.com>,
	netdev@vger.kernel.org
Subject: Re: [PATCH 1/2] platform: make platform_get_irq_optional() optional
Date: Fri, 14 Jan 2022 21:22:26 +0100	[thread overview]
Message-ID: <20220114202226.ugzklxv4wzr6egwj@pengutronix.de> (raw)
In-Reply-To: <61b80939-357d-14f5-df99-b8d102a4e1a1@omp.ru>


[-- Attachment #1.1: Type: text/plain, Size: 7563 bytes --]

On Fri, Jan 14, 2022 at 10:14:10PM +0300, Sergey Shtylyov wrote:
> On 1/14/22 12:25 PM, Uwe Kleine-König wrote:
> 
> >>>>> To me it sounds much more logical for the driver to check if an
> >>>>> optional irq is non-zero (available) or zero (not available), than to
> >>>>> sprinkle around checks for -ENXIO. In addition, you have to remember
> >>>>> that this one returns -ENXIO, while other APIs use -ENOENT or -ENOSYS
> >>>>> (or some other error code) to indicate absence. I thought not having
> >>>>> to care about the actual error code was the main reason behind the
> >>>>> introduction of the *_optional() APIs.
> >>>
> >>>> No, the main benefit of gpiod_get_optional() (and clk_get_optional()) is
> >>>> that you can handle an absent GPIO (or clk) as if it were available.
> >>
> >>    Hm, I've just looked at these and must note that they match 1:1 with
> >> platform_get_irq_optional(). Unfortunately, we can't however behave the
> >> same way in request_irq() -- because it has to support IRQ0 for the sake
> >> of i8253 drivers in arch/...
> > 
> > Let me reformulate your statement to the IMHO equivalent:
> > 
> > 	If you set aside the differences between
> > 	platform_get_irq_optional() and gpiod_get_optional(),
> 
>    Sorry, I should make it clear this is actually the diff between a would-be
> platform_get_irq_optional() after my patch, not the current code...

The similarity is that with your patch both gpiod_get_optional() and
platform_get_irq_optional() return NULL and 0 on not-found. The relevant
difference however is that for a gpiod NULL is a dummy value, while for
irqs it's not. So the similarity is only syntactically, but not
semantically.

> > 	platform_get_irq_optional() is like gpiod_get_optional().
> > 
> > The introduction of gpiod_get_optional() made it possible to simplify
> > the following code:
> > 
> > 	reset_gpio = gpiod_get(...)
> > 	if IS_ERR(reset_gpio):
> > 		error = PTR_ERR(reset_gpio)
> > 		if error != -ENDEV:
> 
>    ENODEV?

Yes, typo.

> > 			return error
> > 	else:
> > 		gpiod_set_direction(reset_gpiod, INACTIVE)
> > 
> > to
> > 
> > 	reset_gpio = gpiod_get_optional(....)
> > 	if IS_ERR(reset_gpio):
> > 		return reset_gpio
> > 	gpiod_set_direction(reset_gpiod, INACTIVE)
> > 
> > and I never need to actually know if the reset_gpio actually exists.
> > Either the line is put into its inactive state, or it doesn't exist and
> > then gpiod_set_direction is a noop. For a regulator or a clk this works
> > in a similar way.
> > 
> > However for an interupt this cannot work. You will always have to check
> > if the irq is actually there or not because if it's not you cannot just
> > ignore that. So there is no benefit of an optional irq.
> > 
> > Leaving error message reporting aside, the introduction of
> > platform_get_irq_optional() allows to change
> > 
> > 	irq = platform_get_irq(...);
> > 	if (irq < 0 && irq != -ENXIO) {
> > 		return irq;
> > 	} else if (irq >= 0) {
> 
>    Rather (irq > 0) actually, IRQ0 is considered invalid (but still returned).

This is a topic I don't feel strong for, so I'm sloppy here. If changing
this is all that is needed to convince you of my point ...

> > 		... setup irq operation ...
> > 	} else { /* irq == -ENXIO */
> > 		... setup polling ...
> > 	}
> > 
> > to
> > 	
> > 	irq = platform_get_irq_optional(...);
> > 	if (irq < 0 && irq != -ENXIO) {
> > 		return irq;
> > 	} else if (irq >= 0) {
> > 		... setup irq operation ...
> > 	} else { /* irq == -ENXIO */
> > 		... setup polling ...
> > 	}
> > 
> > which isn't a win. When changing the return value as you suggest, it can
> > be changed instead to:
> > 
> > 	irq = platform_get_irq_optional(...);
> > 	if (irq < 0) {
> > 		return irq;
> > 	} else if (irq > 0) {
> > 		... setup irq operation ...
> > 	} else { /* irq == 0 */
> > 		... setup polling ...
> > 	}
> > 
> > which is a tad nicer. If that is your goal however I ask you to also
> > change the semantic of platform_get_irq() to return 0 on "not found".
> 
>     Well, I'm not totally opposed to that... but would there be a considerable win?

Well, compared to your suggestion of making platform_get_irq_optional()
return 0 on "not-found" the considerable win would be that
platform_get_irq_optional() and platform_get_irq() are not different
just because platform_get_irq() is to hard to change.

> Anyway, we should 1st stop returning 0 for "valid" IRQs -- this is done by my patch
> the discussed patch series are atop of.
> 
> > Note the win is considerably less compared to gpiod_get_optional vs
> 
>    If there's any at all... We'd basically have to touch /all/ platform_get_irq()
> calls (and get an even larger CC list ;-)).

You got me wrong here. I meant that even if you change both
platform_get_irq() and platform_get_irq_optional() to return 0 on
"not-found", the win is small compared to the benefit of having both
clk_get() and clk_get_optional().

> > gpiod_get however. And then it still lacks the semantic of a dummy irq
> > which IMHO forfeits the right to call it ..._optional().
> 
>    Not quite grasping it... Why e.g. clk_get() doesn't return 0 for a not found clock?

Because NULL is not an error value for clk and when calling clk_get()
you want a failure when the clk you asked for isn't available.

Sure you could do the following in a case where you want to insist the
clk to be actually available:

	clk = clk_get_optional(...)
	if (IS_ERR_OR_NULL(clk)) {
		err = PTR_ERR(clk) || -ENODEV;
		return dev_err_probe(dev, err, ....);
	}

but this is more ugly than

	clk = clk_get(...)
	if (IS_ERR(clk)) {
		err = PTR_ERR(clk);
		return dev_err_probe(dev, err, ....);
	}

Additionally the first usage would hard-code in the drivers that NULL is
the dummy value which you might want to consider a layer violation.

You have to understand that for clk (and regulator and gpiod) NULL is a
valid descriptor that can actually be used, it just has no effect. So
this is a convenience value for the case "If the clk/regulator/gpiod in
question isn't available, there is nothing to do". This is what makes
clk_get_optional() and the others really useful and justifies their
existence. This doesn't apply to platform_get_irq_optional().

So clk_get() is sane and sensible for cases where you need the clk to be
there. It doesn't emit an error message, because the caller knows better
if it's worth an error message and in some cases the caller can also
emit a better error message than clk_get() itself.

clk_get_optional() is sane and sensible for cases where the clk might be
absent and it helps you because you don't have to differentiate between
"not found" and "there is an actual resource".

The reason for platform_get_irq_optional()'s existence is just that
platform_get_irq() emits an error message which is wrong or suboptimal
in some cases (and IMHO is platform_get_irq() root fault). It doesn't
simplify handling the "not found" case. So let's not pretend by the
choice of function names that there is a similarity between clk_get() +
clk_get_optional() and platform_get_irq() + platform_get_irq_optional().

And as you cannot change platform_get_irq_optional() to return a working
dummy value, IMHO the only sane way out is renaming it.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 170 bytes --]

_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

WARNING: multiple messages have this Message-ID (diff)
From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
To: Sergey Shtylyov <s.shtylyov@omp.ru>
Cc: "Andrew Lunn" <andrew@lunn.ch>,
	"Ulf Hansson" <ulf.hansson@linaro.org>,
	"Vignesh Raghavendra" <vigneshr@ti.com>,
	"KVM list" <kvm@vger.kernel.org>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	linux-iio@vger.kernel.org,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Amit Kucheria" <amitk@kernel.org>,
	"ALSA Development Mailing List" <alsa-devel@alsa-project.org>,
	"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>,
	"Jaroslav Kysela" <perex@perex.cz>,
	"Guenter Roeck" <groeck@chromium.org>,
	"Thierry Reding" <thierry.reding@gmail.com>,
	"MTD Maling List" <linux-mtd@lists.infradead.org>,
	"Linux I2C" <linux-i2c@vger.kernel.org>,
	"Miquel Raynal" <miquel.raynal@bootlin.com>,
	linux-phy@lists.infradead.org,
	"Jiri Slaby" <jirislaby@kernel.org>,
	openipmi-developer@lists.sourceforge.net,
	"David S. Miller" <davem@davemloft.net>,
	"Khuong Dinh" <khuong@os.amperecomputing.com>,
	"Florian Fainelli" <f.fainelli@gmail.com>,
	"Matthias Schiffer" <matthias.schiffer@ew.tq-group.com>,
	"Joakim Zhang" <qiangqing.zhang@nxp.com>,
	"Kamal Dasu" <kdasu.kdev@gmail.com>,
	"Lee Jones" <lee.jones@linaro.org>,
	"Bartosz Golaszewski" <brgl@bgdev.pl>,
	"Daniel Lezcano" <daniel.lezcano@linaro.org>,
	"Kishon Vijay Abraham I" <kishon@ti.com>,
	"Geert Uytterhoeven" <geert@linux-m68k.org>,
	"open list:SERIAL DRIVERS" <linux-serial@vger.kernel.org>,
	"Yoshihiro Shimoda" <yoshihiro.shimoda.uh@renesas.com>,
	bcm-kernel-feedback-list <bcm-kernel-feedback-list@broadcom.com>,
	"Zhang Rui" <rui.zhang@intel.com>,
	"Linux PWM List" <linux-pwm@vger.kernel.org>,
	"Robert Richter" <rric@kernel.org>,
	"Saravanan Sekar" <sravanhome@gmail.com>,
	"Corey Minyard" <minyard@acm.org>,
	"Linux PM list" <linux-pm@vger.kernel.org>,
	"Liam Girdwood" <lgirdwood@gmail.com>,
	"Mauro Carvalho Chehab" <mchehab@kernel.org>,
	"John Garry" <john.garry@huawei.com>,
	"Peter Korsgaard" <peter@korsgaard.com>,
	"William Breathitt Gray" <vilhelm.gray@gmail.com>,
	"Mark Gross" <markgross@kernel.org>,
	"Hans de Goede" <hdegoede@redhat.com>,
	"Alex Williamson" <alex.williamson@redhat.com>,
	"Mark Brown" <broonie@kernel.org>,
	"Borislav Petkov" <bp@alien8.de>,
	"Sebastian Reichel" <sre@kernel.org>,
	"Jakub Kicinski" <kuba@kernel.org>,
	"Matthias Brugger" <matthias.bgg@gmail.com>,
	"Takashi Iwai" <tiwai@suse.com>,
	platform-driver-x86@vger.kernel.org,
	"Benson Leung" <bleung@chromium.org>,
	"Linux ARM" <linux-arm-kernel@lists.infradead.org>,
	linux-edac@vger.kernel.org, "Tony Luck" <tony.luck@intel.com>,
	"Mun Yew Tham" <mun.yew.tham@intel.com>,
	"Eric Auger" <eric.auger@redhat.com>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"open list:GPIO SUBSYSTEM" <linux-gpio@vger.kernel.org>,
	"Cornelia Huck" <cohuck@redhat.com>,
	"Linux MMC List" <linux-mmc@vger.kernel.org>,
	"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
	linux-spi <linux-spi@vger.kernel.org>,
	Linux-Renesas <linux-renesas-soc@vger.kernel.org>,
	"Vinod Koul" <vkoul@kernel.org>,
	"James Morse" <james.morse@arm.com>,
	"Zha Qipeng" <qipeng.zha@intel.com>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Richard Weinberger" <richard@nod.at>,
	"Niklas Söderlund" <niklas.soderlund@ragnatech.se>,
	linux-mediatek@lists.infradead.org,
	"Brian Norris" <computersforpeace@gmail.com>,
	netdev@vger.kernel.org
Subject: Re: [PATCH 1/2] platform: make platform_get_irq_optional() optional
Date: Fri, 14 Jan 2022 21:22:26 +0100	[thread overview]
Message-ID: <20220114202226.ugzklxv4wzr6egwj@pengutronix.de> (raw)
In-Reply-To: <61b80939-357d-14f5-df99-b8d102a4e1a1@omp.ru>


[-- Attachment #1.1: Type: text/plain, Size: 7563 bytes --]

On Fri, Jan 14, 2022 at 10:14:10PM +0300, Sergey Shtylyov wrote:
> On 1/14/22 12:25 PM, Uwe Kleine-König wrote:
> 
> >>>>> To me it sounds much more logical for the driver to check if an
> >>>>> optional irq is non-zero (available) or zero (not available), than to
> >>>>> sprinkle around checks for -ENXIO. In addition, you have to remember
> >>>>> that this one returns -ENXIO, while other APIs use -ENOENT or -ENOSYS
> >>>>> (or some other error code) to indicate absence. I thought not having
> >>>>> to care about the actual error code was the main reason behind the
> >>>>> introduction of the *_optional() APIs.
> >>>
> >>>> No, the main benefit of gpiod_get_optional() (and clk_get_optional()) is
> >>>> that you can handle an absent GPIO (or clk) as if it were available.
> >>
> >>    Hm, I've just looked at these and must note that they match 1:1 with
> >> platform_get_irq_optional(). Unfortunately, we can't however behave the
> >> same way in request_irq() -- because it has to support IRQ0 for the sake
> >> of i8253 drivers in arch/...
> > 
> > Let me reformulate your statement to the IMHO equivalent:
> > 
> > 	If you set aside the differences between
> > 	platform_get_irq_optional() and gpiod_get_optional(),
> 
>    Sorry, I should make it clear this is actually the diff between a would-be
> platform_get_irq_optional() after my patch, not the current code...

The similarity is that with your patch both gpiod_get_optional() and
platform_get_irq_optional() return NULL and 0 on not-found. The relevant
difference however is that for a gpiod NULL is a dummy value, while for
irqs it's not. So the similarity is only syntactically, but not
semantically.

> > 	platform_get_irq_optional() is like gpiod_get_optional().
> > 
> > The introduction of gpiod_get_optional() made it possible to simplify
> > the following code:
> > 
> > 	reset_gpio = gpiod_get(...)
> > 	if IS_ERR(reset_gpio):
> > 		error = PTR_ERR(reset_gpio)
> > 		if error != -ENDEV:
> 
>    ENODEV?

Yes, typo.

> > 			return error
> > 	else:
> > 		gpiod_set_direction(reset_gpiod, INACTIVE)
> > 
> > to
> > 
> > 	reset_gpio = gpiod_get_optional(....)
> > 	if IS_ERR(reset_gpio):
> > 		return reset_gpio
> > 	gpiod_set_direction(reset_gpiod, INACTIVE)
> > 
> > and I never need to actually know if the reset_gpio actually exists.
> > Either the line is put into its inactive state, or it doesn't exist and
> > then gpiod_set_direction is a noop. For a regulator or a clk this works
> > in a similar way.
> > 
> > However for an interupt this cannot work. You will always have to check
> > if the irq is actually there or not because if it's not you cannot just
> > ignore that. So there is no benefit of an optional irq.
> > 
> > Leaving error message reporting aside, the introduction of
> > platform_get_irq_optional() allows to change
> > 
> > 	irq = platform_get_irq(...);
> > 	if (irq < 0 && irq != -ENXIO) {
> > 		return irq;
> > 	} else if (irq >= 0) {
> 
>    Rather (irq > 0) actually, IRQ0 is considered invalid (but still returned).

This is a topic I don't feel strong for, so I'm sloppy here. If changing
this is all that is needed to convince you of my point ...

> > 		... setup irq operation ...
> > 	} else { /* irq == -ENXIO */
> > 		... setup polling ...
> > 	}
> > 
> > to
> > 	
> > 	irq = platform_get_irq_optional(...);
> > 	if (irq < 0 && irq != -ENXIO) {
> > 		return irq;
> > 	} else if (irq >= 0) {
> > 		... setup irq operation ...
> > 	} else { /* irq == -ENXIO */
> > 		... setup polling ...
> > 	}
> > 
> > which isn't a win. When changing the return value as you suggest, it can
> > be changed instead to:
> > 
> > 	irq = platform_get_irq_optional(...);
> > 	if (irq < 0) {
> > 		return irq;
> > 	} else if (irq > 0) {
> > 		... setup irq operation ...
> > 	} else { /* irq == 0 */
> > 		... setup polling ...
> > 	}
> > 
> > which is a tad nicer. If that is your goal however I ask you to also
> > change the semantic of platform_get_irq() to return 0 on "not found".
> 
>     Well, I'm not totally opposed to that... but would there be a considerable win?

Well, compared to your suggestion of making platform_get_irq_optional()
return 0 on "not-found" the considerable win would be that
platform_get_irq_optional() and platform_get_irq() are not different
just because platform_get_irq() is to hard to change.

> Anyway, we should 1st stop returning 0 for "valid" IRQs -- this is done by my patch
> the discussed patch series are atop of.
> 
> > Note the win is considerably less compared to gpiod_get_optional vs
> 
>    If there's any at all... We'd basically have to touch /all/ platform_get_irq()
> calls (and get an even larger CC list ;-)).

You got me wrong here. I meant that even if you change both
platform_get_irq() and platform_get_irq_optional() to return 0 on
"not-found", the win is small compared to the benefit of having both
clk_get() and clk_get_optional().

> > gpiod_get however. And then it still lacks the semantic of a dummy irq
> > which IMHO forfeits the right to call it ..._optional().
> 
>    Not quite grasping it... Why e.g. clk_get() doesn't return 0 for a not found clock?

Because NULL is not an error value for clk and when calling clk_get()
you want a failure when the clk you asked for isn't available.

Sure you could do the following in a case where you want to insist the
clk to be actually available:

	clk = clk_get_optional(...)
	if (IS_ERR_OR_NULL(clk)) {
		err = PTR_ERR(clk) || -ENODEV;
		return dev_err_probe(dev, err, ....);
	}

but this is more ugly than

	clk = clk_get(...)
	if (IS_ERR(clk)) {
		err = PTR_ERR(clk);
		return dev_err_probe(dev, err, ....);
	}

Additionally the first usage would hard-code in the drivers that NULL is
the dummy value which you might want to consider a layer violation.

You have to understand that for clk (and regulator and gpiod) NULL is a
valid descriptor that can actually be used, it just has no effect. So
this is a convenience value for the case "If the clk/regulator/gpiod in
question isn't available, there is nothing to do". This is what makes
clk_get_optional() and the others really useful and justifies their
existence. This doesn't apply to platform_get_irq_optional().

So clk_get() is sane and sensible for cases where you need the clk to be
there. It doesn't emit an error message, because the caller knows better
if it's worth an error message and in some cases the caller can also
emit a better error message than clk_get() itself.

clk_get_optional() is sane and sensible for cases where the clk might be
absent and it helps you because you don't have to differentiate between
"not found" and "there is an actual resource".

The reason for platform_get_irq_optional()'s existence is just that
platform_get_irq() emits an error message which is wrong or suboptimal
in some cases (and IMHO is platform_get_irq() root fault). It doesn't
simplify handling the "not found" case. So let's not pretend by the
choice of function names that there is a similarity between clk_get() +
clk_get_optional() and platform_get_irq() + platform_get_irq_optional().

And as you cannot change platform_get_irq_optional() to return a working
dummy value, IMHO the only sane way out is renaming it.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 112 bytes --]

-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

WARNING: multiple messages have this Message-ID (diff)
From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
To: Sergey Shtylyov <s.shtylyov@omp.ru>
Cc: "Andrew Lunn" <andrew@lunn.ch>,
	"Ulf Hansson" <ulf.hansson@linaro.org>,
	"Vignesh Raghavendra" <vigneshr@ti.com>,
	"KVM list" <kvm@vger.kernel.org>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	linux-iio@vger.kernel.org,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Amit Kucheria" <amitk@kernel.org>,
	"ALSA Development Mailing List" <alsa-devel@alsa-project.org>,
	"Guenter Roeck" <groeck@chromium.org>,
	"Thierry Reding" <thierry.reding@gmail.com>,
	"MTD Maling List" <linux-mtd@lists.infradead.org>,
	"Linux I2C" <linux-i2c@vger.kernel.org>,
	"open list:GPIO SUBSYSTEM" <linux-gpio@vger.kernel.org>,
	"Miquel Raynal" <miquel.raynal@bootlin.com>,
	linux-phy@lists.infradead.org, netdev@vger.kernel.org,
	linux-spi <linux-spi@vger.kernel.org>,
	"Jiri Slaby" <jirislaby@kernel.org>,
	"Khuong Dinh" <khuong@os.amperecomputing.com>,
	"Florian Fainelli" <f.fainelli@gmail.com>,
	"Matthias Schiffer" <matthias.schiffer@ew.tq-group.com>,
	"Kamal Dasu" <kdasu.kdev@gmail.com>,
	"Lee Jones" <lee.jones@linaro.org>,
	"Bartosz Golaszewski" <brgl@bgdev.pl>,
	"Daniel Lezcano" <daniel.lezcano@linaro.org>,
	"Kishon Vijay Abraham I" <kishon@ti.com>,
	"Geert Uytterhoeven" <geert@linux-m68k.org>,
	"open list:SERIAL DRIVERS" <linux-serial@vger.kernel.org>,
	bcm-kernel-feedback-list <bcm-kernel-feedback-list@broadcom.com>,
	"Zhang Rui" <rui.zhang@intel.com>,
	platform-driver-x86@vger.kernel.org,
	"Linux PWM List" <linux-pwm@vger.kernel.org>,
	"Robert Richter" <rric@kernel.org>,
	"Saravanan Sekar" <sravanhome@gmail.com>,
	"Corey Minyard" <minyard@acm.org>,
	"Linux PM list" <linux-pm@vger.kernel.org>,
	"Liam Girdwood" <lgirdwood@gmail.com>,
	"Mauro Carvalho Chehab" <mchehab@kernel.org>,
	"John Garry" <john.garry@huawei.com>,
	"Takashi Iwai" <tiwai@suse.com>,
	"Peter Korsgaard" <peter@korsgaard.com>,
	"William Breathitt Gray" <vilhelm.gray@gmail.com>,
	"Mark Gross" <markgross@kernel.org>,
	"Hans de Goede" <hdegoede@redhat.com>,
	"Alex Williamson" <alex.williamson@redhat.com>,
	"Mark Brown" <broonie@kernel.org>,
	"Borislav Petkov" <bp@alien8.de>,
	"Jakub Kicinski" <kuba@kernel.org>,
	"Matthias Brugger" <matthias.bgg@gmail.com>,
	openipmi-developer@lists.sourceforge.net,
	"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>,
	"Benson Leung" <bleung@chromium.org>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Linux ARM" <linux-arm-kernel@lists.infradead.org>,
	linux-edac@vger.kernel.org, "Tony Luck" <tony.luck@intel.com>,
	"Richard Weinberger" <richard@nod.at>,
	"Mun Yew Tham" <mun.yew.tham@intel.com>,
	"Eric Auger" <eric.auger@redhat.com>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Yoshihiro Shimoda" <yoshihiro.shimoda.uh@renesas.com>,
	"Cornelia Huck" <cohuck@redhat.com>,
	"Linux MMC List" <linux-mmc@vger.kernel.org>,
	"Joakim Zhang" <qiangqing.zhang@nxp.com>,
	"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
	Linux-Renesas <linux-renesas-soc@vger.kernel.org>,
	"Vinod Koul" <vkoul@kernel.org>,
	"James Morse" <james.morse@arm.com>,
	"Zha Qipeng" <qipeng.zha@intel.com>,
	"Sebastian Reichel" <sre@kernel.org>,
	"Niklas Söderlund" <niklas.soderlund@ragnatech.se>,
	linux-mediatek@lists.infradead.org,
	"Brian Norris" <computersforpeace@gmail.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: Re: [PATCH 1/2] platform: make platform_get_irq_optional() optional
Date: Fri, 14 Jan 2022 21:22:26 +0100	[thread overview]
Message-ID: <20220114202226.ugzklxv4wzr6egwj@pengutronix.de> (raw)
In-Reply-To: <61b80939-357d-14f5-df99-b8d102a4e1a1@omp.ru>

[-- Attachment #1: Type: text/plain, Size: 7563 bytes --]

On Fri, Jan 14, 2022 at 10:14:10PM +0300, Sergey Shtylyov wrote:
> On 1/14/22 12:25 PM, Uwe Kleine-König wrote:
> 
> >>>>> To me it sounds much more logical for the driver to check if an
> >>>>> optional irq is non-zero (available) or zero (not available), than to
> >>>>> sprinkle around checks for -ENXIO. In addition, you have to remember
> >>>>> that this one returns -ENXIO, while other APIs use -ENOENT or -ENOSYS
> >>>>> (or some other error code) to indicate absence. I thought not having
> >>>>> to care about the actual error code was the main reason behind the
> >>>>> introduction of the *_optional() APIs.
> >>>
> >>>> No, the main benefit of gpiod_get_optional() (and clk_get_optional()) is
> >>>> that you can handle an absent GPIO (or clk) as if it were available.
> >>
> >>    Hm, I've just looked at these and must note that they match 1:1 with
> >> platform_get_irq_optional(). Unfortunately, we can't however behave the
> >> same way in request_irq() -- because it has to support IRQ0 for the sake
> >> of i8253 drivers in arch/...
> > 
> > Let me reformulate your statement to the IMHO equivalent:
> > 
> > 	If you set aside the differences between
> > 	platform_get_irq_optional() and gpiod_get_optional(),
> 
>    Sorry, I should make it clear this is actually the diff between a would-be
> platform_get_irq_optional() after my patch, not the current code...

The similarity is that with your patch both gpiod_get_optional() and
platform_get_irq_optional() return NULL and 0 on not-found. The relevant
difference however is that for a gpiod NULL is a dummy value, while for
irqs it's not. So the similarity is only syntactically, but not
semantically.

> > 	platform_get_irq_optional() is like gpiod_get_optional().
> > 
> > The introduction of gpiod_get_optional() made it possible to simplify
> > the following code:
> > 
> > 	reset_gpio = gpiod_get(...)
> > 	if IS_ERR(reset_gpio):
> > 		error = PTR_ERR(reset_gpio)
> > 		if error != -ENDEV:
> 
>    ENODEV?

Yes, typo.

> > 			return error
> > 	else:
> > 		gpiod_set_direction(reset_gpiod, INACTIVE)
> > 
> > to
> > 
> > 	reset_gpio = gpiod_get_optional(....)
> > 	if IS_ERR(reset_gpio):
> > 		return reset_gpio
> > 	gpiod_set_direction(reset_gpiod, INACTIVE)
> > 
> > and I never need to actually know if the reset_gpio actually exists.
> > Either the line is put into its inactive state, or it doesn't exist and
> > then gpiod_set_direction is a noop. For a regulator or a clk this works
> > in a similar way.
> > 
> > However for an interupt this cannot work. You will always have to check
> > if the irq is actually there or not because if it's not you cannot just
> > ignore that. So there is no benefit of an optional irq.
> > 
> > Leaving error message reporting aside, the introduction of
> > platform_get_irq_optional() allows to change
> > 
> > 	irq = platform_get_irq(...);
> > 	if (irq < 0 && irq != -ENXIO) {
> > 		return irq;
> > 	} else if (irq >= 0) {
> 
>    Rather (irq > 0) actually, IRQ0 is considered invalid (but still returned).

This is a topic I don't feel strong for, so I'm sloppy here. If changing
this is all that is needed to convince you of my point ...

> > 		... setup irq operation ...
> > 	} else { /* irq == -ENXIO */
> > 		... setup polling ...
> > 	}
> > 
> > to
> > 	
> > 	irq = platform_get_irq_optional(...);
> > 	if (irq < 0 && irq != -ENXIO) {
> > 		return irq;
> > 	} else if (irq >= 0) {
> > 		... setup irq operation ...
> > 	} else { /* irq == -ENXIO */
> > 		... setup polling ...
> > 	}
> > 
> > which isn't a win. When changing the return value as you suggest, it can
> > be changed instead to:
> > 
> > 	irq = platform_get_irq_optional(...);
> > 	if (irq < 0) {
> > 		return irq;
> > 	} else if (irq > 0) {
> > 		... setup irq operation ...
> > 	} else { /* irq == 0 */
> > 		... setup polling ...
> > 	}
> > 
> > which is a tad nicer. If that is your goal however I ask you to also
> > change the semantic of platform_get_irq() to return 0 on "not found".
> 
>     Well, I'm not totally opposed to that... but would there be a considerable win?

Well, compared to your suggestion of making platform_get_irq_optional()
return 0 on "not-found" the considerable win would be that
platform_get_irq_optional() and platform_get_irq() are not different
just because platform_get_irq() is to hard to change.

> Anyway, we should 1st stop returning 0 for "valid" IRQs -- this is done by my patch
> the discussed patch series are atop of.
> 
> > Note the win is considerably less compared to gpiod_get_optional vs
> 
>    If there's any at all... We'd basically have to touch /all/ platform_get_irq()
> calls (and get an even larger CC list ;-)).

You got me wrong here. I meant that even if you change both
platform_get_irq() and platform_get_irq_optional() to return 0 on
"not-found", the win is small compared to the benefit of having both
clk_get() and clk_get_optional().

> > gpiod_get however. And then it still lacks the semantic of a dummy irq
> > which IMHO forfeits the right to call it ..._optional().
> 
>    Not quite grasping it... Why e.g. clk_get() doesn't return 0 for a not found clock?

Because NULL is not an error value for clk and when calling clk_get()
you want a failure when the clk you asked for isn't available.

Sure you could do the following in a case where you want to insist the
clk to be actually available:

	clk = clk_get_optional(...)
	if (IS_ERR_OR_NULL(clk)) {
		err = PTR_ERR(clk) || -ENODEV;
		return dev_err_probe(dev, err, ....);
	}

but this is more ugly than

	clk = clk_get(...)
	if (IS_ERR(clk)) {
		err = PTR_ERR(clk);
		return dev_err_probe(dev, err, ....);
	}

Additionally the first usage would hard-code in the drivers that NULL is
the dummy value which you might want to consider a layer violation.

You have to understand that for clk (and regulator and gpiod) NULL is a
valid descriptor that can actually be used, it just has no effect. So
this is a convenience value for the case "If the clk/regulator/gpiod in
question isn't available, there is nothing to do". This is what makes
clk_get_optional() and the others really useful and justifies their
existence. This doesn't apply to platform_get_irq_optional().

So clk_get() is sane and sensible for cases where you need the clk to be
there. It doesn't emit an error message, because the caller knows better
if it's worth an error message and in some cases the caller can also
emit a better error message than clk_get() itself.

clk_get_optional() is sane and sensible for cases where the clk might be
absent and it helps you because you don't have to differentiate between
"not found" and "there is an actual resource".

The reason for platform_get_irq_optional()'s existence is just that
platform_get_irq() emits an error message which is wrong or suboptimal
in some cases (and IMHO is platform_get_irq() root fault). It doesn't
simplify handling the "not found" case. So let's not pretend by the
choice of function names that there is a similarity between clk_get() +
clk_get_optional() and platform_get_irq() + platform_get_irq_optional().

And as you cannot change platform_get_irq_optional() to return a working
dummy value, IMHO the only sane way out is renaming it.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

  reply	other threads:[~2022-01-14 20:25 UTC|newest]

Thread overview: 467+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-10 19:54 [PATCH 0/2] Make platform_get_irq[_byname]_optional() optional Sergey Shtylyov
2022-01-10 19:54 ` [PATCH 1/2] platform: make platform_get_irq_optional() optional Sergey Shtylyov
2022-01-10 19:54   ` Sergey Shtylyov
2022-01-10 19:54   ` Sergey Shtylyov
2022-01-10 19:54   ` Sergey Shtylyov
2022-01-10 19:54   ` Sergey Shtylyov
2022-01-10 20:10   ` Uwe Kleine-König
2022-01-10 20:10     ` Uwe Kleine-König
2022-01-10 20:10     ` Uwe Kleine-König
2022-01-10 20:10     ` Uwe Kleine-König
2022-01-10 20:10     ` Uwe Kleine-König
2022-01-10 21:07     ` Andy Shevchenko
2022-01-10 21:07       ` Andy Shevchenko
2022-01-10 21:07       ` Andy Shevchenko
2022-01-10 21:07       ` Andy Shevchenko
2022-01-10 21:07       ` Andy Shevchenko
2022-01-10 21:44       ` Uwe Kleine-König
2022-01-10 21:44         ` Uwe Kleine-König
2022-01-10 21:44         ` Uwe Kleine-König
2022-01-10 21:44         ` Uwe Kleine-König
2022-01-10 21:44         ` Uwe Kleine-König
2022-01-10 21:18     ` Andrew Lunn
2022-01-10 21:18       ` Andrew Lunn
2022-01-10 21:18       ` Andrew Lunn
2022-01-10 21:18       ` Andrew Lunn
2022-01-10 21:18       ` Andrew Lunn
2022-01-12  8:33       ` Geert Uytterhoeven
2022-01-12  8:33         ` Geert Uytterhoeven
2022-01-12  8:33         ` Geert Uytterhoeven
2022-01-12  8:33         ` Geert Uytterhoeven
2022-01-12  8:33         ` Geert Uytterhoeven
2022-01-12  8:50         ` Uwe Kleine-König
2022-01-12  8:50           ` Uwe Kleine-König
2022-01-12  8:50           ` Uwe Kleine-König
2022-01-12  8:50           ` Uwe Kleine-König
2022-01-12  8:50           ` Uwe Kleine-König
2022-01-12 10:27           ` Geert Uytterhoeven
2022-01-12 10:27             ` Geert Uytterhoeven
2022-01-12 10:27             ` Geert Uytterhoeven
2022-01-12 10:27             ` Geert Uytterhoeven
2022-01-12 10:27             ` Geert Uytterhoeven
2022-01-12 12:27             ` Andy Shevchenko
2022-01-12 12:27               ` Andy Shevchenko
2022-01-12 12:27               ` Andy Shevchenko
2022-01-12 12:27               ` Andy Shevchenko
2022-01-12 12:27               ` Andy Shevchenko
2022-01-12 13:38             ` Andrew Lunn
2022-01-12 13:38               ` Andrew Lunn
2022-01-12 13:38               ` Andrew Lunn
2022-01-12 13:38               ` Andrew Lunn
2022-01-12 13:38               ` Andrew Lunn
2022-01-12 13:51               ` Andy Shevchenko
2022-01-12 13:51                 ` Andy Shevchenko
2022-01-12 13:51                 ` Andy Shevchenko
2022-01-12 13:51                 ` Andy Shevchenko
2022-01-12 13:51                 ` Andy Shevchenko
2022-01-12 13:54               ` Geert Uytterhoeven
2022-01-12 13:54                 ` Geert Uytterhoeven
2022-01-12 13:54                 ` Geert Uytterhoeven
2022-01-12 13:54                 ` Geert Uytterhoeven
2022-01-12 13:54                 ` Geert Uytterhoeven
2022-01-12 14:41                 ` Rafael J. Wysocki
2022-01-12 14:41                   ` Rafael J. Wysocki
2022-01-12 14:41                   ` Rafael J. Wysocki
2022-01-12 14:41                   ` Rafael J. Wysocki
2022-01-12 14:41                   ` Rafael J. Wysocki
2022-01-12 15:05                   ` Sergey Shtylyov
2022-01-12 15:05                     ` Sergey Shtylyov
2022-01-12 15:05                     ` Sergey Shtylyov
2022-01-12 15:05                     ` Sergey Shtylyov
2022-01-12 15:05                     ` Sergey Shtylyov
2022-01-12 15:13                     ` Hans de Goede
2022-01-12 15:13                       ` Hans de Goede
2022-01-12 15:13                       ` Hans de Goede
2022-01-12 15:13                       ` Hans de Goede
2022-01-12 15:13                       ` Hans de Goede
2022-01-12 15:48                       ` Rafael J. Wysocki
2022-01-12 15:48                         ` Rafael J. Wysocki
2022-01-12 15:48                         ` Rafael J. Wysocki
2022-01-12 15:48                         ` Rafael J. Wysocki
2022-01-12 15:48                         ` Rafael J. Wysocki
2022-01-12 16:21                   ` Andy Shevchenko
2022-01-12 16:21                     ` Andy Shevchenko
2022-01-12 16:21                     ` Andy Shevchenko
2022-01-12 16:21                     ` Andy Shevchenko
2022-01-12 16:21                     ` Andy Shevchenko
2022-01-12 21:31             ` Uwe Kleine-König
2022-01-12 21:31               ` Uwe Kleine-König
2022-01-12 21:31               ` Uwe Kleine-König
2022-01-12 21:31               ` Uwe Kleine-König
2022-01-12 21:31               ` Uwe Kleine-König
2022-01-12 21:45               ` Mark Brown
2022-01-12 21:45                 ` Mark Brown
2022-01-12 21:45                 ` Mark Brown
2022-01-12 21:45                 ` Mark Brown
2022-01-12 21:45                 ` Mark Brown
2022-01-13 11:08                 ` Uwe Kleine-König
2022-01-13 11:08                   ` Uwe Kleine-König
2022-01-13 11:08                   ` Uwe Kleine-König
2022-01-13 11:08                   ` Uwe Kleine-König
2022-01-13 11:08                   ` Uwe Kleine-König
2022-01-13 14:45                   ` Mark Brown
2022-01-13 14:45                     ` Mark Brown
2022-01-13 14:45                     ` Mark Brown
2022-01-13 14:45                     ` Mark Brown
2022-01-13 14:45                     ` Mark Brown
2022-01-13 19:43                     ` [PATCH] driver core: platform: Rename platform_get_irq_optional() to platform_get_irq_silent() Uwe Kleine-König
2022-01-13 19:43                       ` Uwe Kleine-König
2022-01-13 19:43                       ` Uwe Kleine-König
2022-01-13 19:43                       ` Uwe Kleine-König
2022-01-13 19:43                       ` Uwe Kleine-König
2022-01-13 20:17                       ` Mark Brown
2022-01-13 20:17                         ` Mark Brown
2022-01-13 20:17                         ` Mark Brown
2022-01-13 20:17                         ` Mark Brown
2022-01-13 20:17                         ` Mark Brown
2022-01-13 20:57                         ` Sergey Shtylyov
2022-01-13 20:57                           ` Sergey Shtylyov
2022-01-13 20:57                           ` Sergey Shtylyov
2022-01-13 20:57                           ` Sergey Shtylyov
2022-01-13 20:57                           ` Sergey Shtylyov
2022-01-13 22:43                           ` Uwe Kleine-König
2022-01-13 22:43                             ` Uwe Kleine-König
2022-01-13 22:43                             ` Uwe Kleine-König
2022-01-13 22:43                             ` Uwe Kleine-König
2022-01-13 22:43                             ` Uwe Kleine-König
2022-01-14  9:58                             ` Geert Uytterhoeven
2022-01-14  9:58                               ` Geert Uytterhoeven
2022-01-14  9:58                               ` Geert Uytterhoeven
2022-01-14  9:58                               ` Geert Uytterhoeven
2022-01-14  9:58                               ` Geert Uytterhoeven
2022-01-15 15:21                               ` Uwe Kleine-König
2022-01-15 15:21                                 ` Uwe Kleine-König
2022-01-15 15:21                                 ` Uwe Kleine-König
2022-01-15 15:21                                 ` Uwe Kleine-König
2022-01-15 15:21                                 ` Uwe Kleine-König
2022-01-15 21:06                                 ` Sergey Shtylyov
2022-01-15 21:06                                   ` Sergey Shtylyov
2022-01-15 21:06                                   ` Sergey Shtylyov
2022-01-15 21:06                                   ` Sergey Shtylyov
2022-01-15 21:06                                   ` Sergey Shtylyov
2022-01-14 11:34                           ` Sergey Shtylyov
2022-01-14 11:34                             ` Sergey Shtylyov
2022-01-14 11:34                             ` Sergey Shtylyov
2022-01-14 11:34                             ` Sergey Shtylyov
2022-01-14 11:34                             ` Sergey Shtylyov
2022-01-13 20:31                       ` Guenter Roeck
2022-01-13 20:31                         ` Guenter Roeck
2022-01-13 20:31                         ` Guenter Roeck
2022-01-13 20:31                         ` Guenter Roeck
2022-01-13 20:31                         ` Guenter Roeck
2022-01-13 21:42                       ` Florian Fainelli
2022-01-13 21:42                         ` Florian Fainelli
2022-01-13 21:42                         ` Florian Fainelli
2022-01-13 21:42                         ` Florian Fainelli
2022-01-13 21:42                         ` Florian Fainelli
2022-01-13 23:06                         ` Uwe Kleine-König
2022-01-13 23:06                           ` Uwe Kleine-König
2022-01-13 23:06                           ` Uwe Kleine-König
2022-01-13 23:06                           ` Uwe Kleine-König
2022-01-13 23:06                           ` Uwe Kleine-König
2022-01-14 17:55                         ` Sergey Shtylyov
2022-01-14 17:55                           ` Sergey Shtylyov
2022-01-14 17:55                           ` Sergey Shtylyov
2022-01-14 17:55                           ` Sergey Shtylyov
2022-01-14 17:55                           ` Sergey Shtylyov
2022-01-15 13:55                           ` Uwe Kleine-König
2022-01-15 13:55                             ` Uwe Kleine-König
2022-01-15 13:55                             ` Uwe Kleine-König
2022-01-15 13:55                             ` Uwe Kleine-König
2022-01-15 13:55                             ` Uwe Kleine-König
2022-01-19 18:36                             ` Andy Shevchenko
2022-01-19 18:36                               ` Andy Shevchenko
2022-01-19 18:36                               ` Andy Shevchenko
2022-01-19 18:36                               ` Andy Shevchenko
2022-01-19 18:36                               ` Andy Shevchenko
2022-01-19 19:44                               ` Sergey Shtylyov
2022-01-19 19:44                                 ` Sergey Shtylyov
2022-01-19 19:44                                 ` Sergey Shtylyov
2022-01-19 19:44                                 ` Sergey Shtylyov
2022-01-19 19:44                                 ` Sergey Shtylyov
2022-01-19 18:40                             ` Andy Shevchenko
2022-01-19 18:40                               ` Andy Shevchenko
2022-01-19 18:40                               ` Andy Shevchenko
2022-01-19 18:40                               ` Andy Shevchenko
2022-01-19 18:40                               ` Andy Shevchenko
2022-01-14  6:57                       ` Peter Korsgaard
2022-01-14  6:57                         ` Peter Korsgaard
2022-01-14  6:57                         ` Peter Korsgaard
2022-01-14  6:57                         ` Peter Korsgaard
2022-01-14  6:57                         ` Peter Korsgaard
2022-01-14 13:04                       ` Andy Shevchenko
2022-01-14 13:04                         ` Andy Shevchenko
2022-01-14 13:04                         ` Andy Shevchenko
2022-01-14 13:04                         ` Andy Shevchenko
2022-01-14 13:04                         ` Andy Shevchenko
2022-01-15 15:45                         ` Uwe Kleine-König
2022-01-15 15:45                           ` Uwe Kleine-König
2022-01-15 15:45                           ` Uwe Kleine-König
2022-01-15 15:45                           ` Uwe Kleine-König
2022-01-15 15:45                           ` Uwe Kleine-König
2022-01-19 18:51                           ` Andy Shevchenko
2022-01-19 18:51                             ` Andy Shevchenko
2022-01-19 18:51                             ` Andy Shevchenko
2022-01-19 18:51                             ` Andy Shevchenko
2022-01-19 18:51                             ` Andy Shevchenko
2022-01-19 19:47                             ` Sergey Shtylyov
2022-01-19 19:47                               ` Sergey Shtylyov
2022-01-19 19:47                               ` Sergey Shtylyov
2022-01-19 19:47                               ` Sergey Shtylyov
2022-01-19 19:47                               ` Sergey Shtylyov
2022-01-19 20:55                               ` Andy Shevchenko
2022-01-19 20:55                                 ` Andy Shevchenko
2022-01-19 20:55                                 ` Andy Shevchenko
2022-01-19 20:55                                 ` Andy Shevchenko
2022-01-19 20:55                                 ` Andy Shevchenko
2022-01-20  7:57                             ` Uwe Kleine-König
2022-01-20  7:57                               ` Uwe Kleine-König
2022-01-20  7:57                               ` Uwe Kleine-König
2022-01-20  7:57                               ` Uwe Kleine-König
2022-01-24 15:01                               ` Andy Shevchenko
2022-01-24 15:01                                 ` Andy Shevchenko
2022-01-24 15:01                                 ` Andy Shevchenko
2022-01-24 15:01                                 ` Andy Shevchenko
2022-01-24 15:01                                 ` Andy Shevchenko
2022-01-24 21:02                                 ` Sergey Shtylyov
2022-01-24 21:02                                   ` Sergey Shtylyov
2022-01-24 21:02                                   ` Sergey Shtylyov
2022-01-24 21:02                                   ` Sergey Shtylyov
2022-01-24 21:02                                   ` Sergey Shtylyov
2022-01-25  8:25                                   ` Geert Uytterhoeven
2022-01-25  8:25                                     ` Geert Uytterhoeven
2022-01-25  8:25                                     ` Geert Uytterhoeven
2022-01-25  8:25                                     ` Geert Uytterhoeven
2022-01-25  8:25                                     ` Geert Uytterhoeven
2022-01-25 12:56                                     ` Matthias Schiffer
2022-01-25 12:56                                       ` Matthias Schiffer
2022-01-25 12:56                                       ` Matthias Schiffer
2022-01-25 12:56                                       ` Matthias Schiffer
2022-01-25 12:56                                       ` Matthias Schiffer
2022-01-25 14:01                                       ` Andy Shevchenko
2022-01-25 14:01                                         ` Andy Shevchenko
2022-01-25 14:01                                         ` Andy Shevchenko
2022-01-25 14:01                                         ` Andy Shevchenko
2022-01-25 14:01                                         ` Andy Shevchenko
2022-01-14 19:45                       ` Sergey Shtylyov
2022-01-14 19:45                         ` Sergey Shtylyov
2022-01-14 19:45                         ` Sergey Shtylyov
2022-01-14 19:45                         ` Sergey Shtylyov
2022-01-14 19:45                         ` Sergey Shtylyov
2022-01-14 20:29                         ` Uwe Kleine-König
2022-01-14 20:29                           ` Uwe Kleine-König
2022-01-14 20:29                           ` Uwe Kleine-König
2022-01-14 20:29                           ` Uwe Kleine-König
2022-01-14 20:29                           ` Uwe Kleine-König
2022-01-15 13:08                           ` Sergey Shtylyov
2022-01-15 13:08                             ` Sergey Shtylyov
2022-01-15 13:08                             ` Sergey Shtylyov
2022-01-15 13:08                             ` Sergey Shtylyov
2022-01-15 13:08                             ` Sergey Shtylyov
2022-01-19 18:52                         ` Andy Shevchenko
2022-01-19 18:52                           ` Andy Shevchenko
2022-01-19 18:52                           ` Andy Shevchenko
2022-01-19 18:52                           ` Andy Shevchenko
2022-01-19 18:52                           ` Andy Shevchenko
2022-01-13 20:35                 ` [PATCH 1/2] platform: make platform_get_irq_optional() optional Sergey Shtylyov
2022-01-13 20:35                   ` Sergey Shtylyov
2022-01-13 20:35                   ` Sergey Shtylyov
2022-01-13 20:35                   ` Sergey Shtylyov
2022-01-13 20:35                   ` Sergey Shtylyov
2022-01-14  9:25                   ` Uwe Kleine-König
2022-01-14  9:25                     ` Uwe Kleine-König
2022-01-14  9:25                     ` Uwe Kleine-König
2022-01-14  9:25                     ` Uwe Kleine-König
2022-01-14  9:25                     ` Uwe Kleine-König
2022-01-14  9:39                     ` Geert Uytterhoeven
2022-01-14  9:39                       ` Geert Uytterhoeven
2022-01-14  9:39                       ` Geert Uytterhoeven
2022-01-14  9:39                       ` Geert Uytterhoeven
2022-01-14  9:39                       ` Geert Uytterhoeven
2022-01-14 19:14                     ` Sergey Shtylyov
2022-01-14 19:14                       ` Sergey Shtylyov
2022-01-14 19:14                       ` Sergey Shtylyov
2022-01-14 19:14                       ` Sergey Shtylyov
2022-01-14 19:14                       ` Sergey Shtylyov
2022-01-14 20:22                       ` Uwe Kleine-König [this message]
2022-01-14 20:22                         ` Uwe Kleine-König
2022-01-14 20:22                         ` Uwe Kleine-König
2022-01-14 20:22                         ` Uwe Kleine-König
2022-01-14 20:22                         ` Uwe Kleine-König
2022-01-15 20:22                         ` Sergey Shtylyov
2022-01-15 20:22                           ` Sergey Shtylyov
2022-01-15 20:22                           ` Sergey Shtylyov
2022-01-15 20:22                           ` Sergey Shtylyov
2022-01-15 20:22                           ` Sergey Shtylyov
2022-01-17  8:41                           ` Geert Uytterhoeven
2022-01-17  8:41                             ` Geert Uytterhoeven
2022-01-17  8:41                             ` Geert Uytterhoeven
2022-01-17  8:41                             ` Geert Uytterhoeven
2022-01-17  8:41                             ` Geert Uytterhoeven
2022-01-17  9:24                             ` Uwe Kleine-König
2022-01-17  9:24                               ` Uwe Kleine-König
2022-01-17  9:24                               ` Uwe Kleine-König
2022-01-17  9:24                               ` Uwe Kleine-König
2022-01-17  9:24                               ` Uwe Kleine-König
2022-01-17 10:35                               ` Geert Uytterhoeven
2022-01-17 10:35                                 ` Geert Uytterhoeven
2022-01-17 10:35                                 ` Geert Uytterhoeven
2022-01-17 10:35                                 ` Geert Uytterhoeven
2022-01-17 10:35                                 ` Geert Uytterhoeven
2022-01-17 11:49                                 ` Uwe Kleine-König
2022-01-17 11:49                                   ` Uwe Kleine-König
2022-01-17 11:49                                   ` Uwe Kleine-König
2022-01-17 11:49                                   ` Uwe Kleine-König
2022-01-17 11:49                                   ` Uwe Kleine-König
2022-01-17 13:08                                   ` Geert Uytterhoeven
2022-01-17 13:08                                     ` Geert Uytterhoeven
2022-01-17 13:08                                     ` Geert Uytterhoeven
2022-01-17 13:08                                     ` Geert Uytterhoeven
2022-01-17 13:08                                     ` Geert Uytterhoeven
2022-01-17 17:06                                     ` Uwe Kleine-König
2022-01-17 17:06                                       ` Uwe Kleine-König
2022-01-17 17:06                                       ` Uwe Kleine-König
2022-01-17 17:06                                       ` Uwe Kleine-König
2022-01-17 17:06                                       ` Uwe Kleine-König
2022-01-18  8:25                                       ` Geert Uytterhoeven
2022-01-18  8:25                                         ` Geert Uytterhoeven
2022-01-18  8:25                                         ` Geert Uytterhoeven
2022-01-18  8:25                                         ` Geert Uytterhoeven
2022-01-18  8:25                                         ` Geert Uytterhoeven
2022-01-18  9:09                                         ` Uwe Kleine-König
2022-01-18  9:09                                           ` Uwe Kleine-König
2022-01-18  9:09                                           ` Uwe Kleine-König
2022-01-18  9:09                                           ` Uwe Kleine-König
2022-01-18  9:09                                           ` Uwe Kleine-König
2022-01-18  9:37                                           ` Geert Uytterhoeven
2022-01-18  9:37                                             ` Geert Uytterhoeven
2022-01-18  9:37                                             ` Geert Uytterhoeven
2022-01-18  9:37                                             ` Geert Uytterhoeven
2022-01-18  9:37                                             ` Geert Uytterhoeven
2022-01-18 12:08                                             ` Uwe Kleine-König
2022-01-18 12:08                                               ` Uwe Kleine-König
2022-01-18 12:08                                               ` Uwe Kleine-König
2022-01-18 12:08                                               ` Uwe Kleine-König
2022-01-18 12:08                                               ` Uwe Kleine-König
2022-01-18 12:49                                               ` Geert Uytterhoeven
2022-01-18 12:49                                                 ` Geert Uytterhoeven
2022-01-18 12:49                                                 ` Geert Uytterhoeven
2022-01-18 12:49                                                 ` Geert Uytterhoeven
2022-01-18 12:49                                                 ` Geert Uytterhoeven
2022-01-18 14:29                                                 ` Uwe Kleine-König
2022-01-18 14:29                                                   ` Uwe Kleine-König
2022-01-18 14:29                                                   ` Uwe Kleine-König
2022-01-18 14:29                                                   ` Uwe Kleine-König
2022-01-18 14:29                                                   ` Uwe Kleine-König
2022-01-19 16:12                                                   ` Sergey Shtylyov
2022-01-19 16:12                                                     ` Sergey Shtylyov
2022-01-19 16:12                                                     ` Sergey Shtylyov
2022-01-19 16:12                                                     ` Sergey Shtylyov
2022-01-19 16:12                                                     ` Sergey Shtylyov
2022-01-19 18:29                                                     ` Sergey Shtylyov
2022-01-19 18:29                                                       ` Sergey Shtylyov
2022-01-19 18:29                                                       ` Sergey Shtylyov
2022-01-19 18:29                                                       ` Sergey Shtylyov
2022-01-19 18:29                                                       ` Sergey Shtylyov
2022-01-20 11:27                                     ` Sergey Shtylyov
2022-01-20 11:27                                       ` Sergey Shtylyov
2022-01-20 11:27                                       ` Sergey Shtylyov
2022-01-20 11:27                                       ` Sergey Shtylyov
2022-01-16 18:15                         ` Sergey Shtylyov
2022-01-16 18:15                           ` Sergey Shtylyov
2022-01-16 18:15                           ` Sergey Shtylyov
2022-01-16 18:15                           ` Sergey Shtylyov
2022-01-16 18:15                           ` Sergey Shtylyov
2022-01-17  8:47                           ` Uwe Kleine-König
2022-01-17  8:47                             ` Uwe Kleine-König
2022-01-17  8:47                             ` Uwe Kleine-König
2022-01-17  8:47                             ` Uwe Kleine-König
2022-01-17  8:47                             ` Uwe Kleine-König
2022-01-18 20:21                             ` Sergey Shtylyov
2022-01-18 20:21                               ` Sergey Shtylyov
2022-01-18 20:21                               ` Sergey Shtylyov
2022-01-18 20:21                               ` Sergey Shtylyov
2022-01-18 20:21                               ` Sergey Shtylyov
2022-01-18 22:26                               ` Uwe Kleine-König
2022-01-18 22:26                                 ` Uwe Kleine-König
2022-01-18 22:26                                 ` Uwe Kleine-König
2022-01-18 22:26                                 ` Uwe Kleine-König
2022-01-18 22:26                                 ` Uwe Kleine-König
2022-01-19 15:34                                 ` Sergey Shtylyov
2022-01-19 15:34                                   ` Sergey Shtylyov
2022-01-19 15:34                                   ` Sergey Shtylyov
2022-01-19 15:34                                   ` Sergey Shtylyov
2022-01-19 15:34                                   ` Sergey Shtylyov
2022-01-19 18:58                             ` Andy Shevchenko
2022-01-19 18:58                               ` Andy Shevchenko
2022-01-19 18:58                               ` Andy Shevchenko
2022-01-19 18:58                               ` Andy Shevchenko
2022-01-19 18:58                               ` Andy Shevchenko
2022-01-19 19:49                               ` Sergey Shtylyov
2022-01-19 19:49                                 ` Sergey Shtylyov
2022-01-19 19:49                                 ` Sergey Shtylyov
2022-01-19 19:49                                 ` Sergey Shtylyov
2022-01-19 19:49                                 ` Sergey Shtylyov
2022-01-14 18:46                   ` Sergey Shtylyov
2022-01-14 18:46                     ` Sergey Shtylyov
2022-01-14 18:46                     ` Sergey Shtylyov
2022-01-14 18:46                     ` Sergey Shtylyov
2022-01-14 18:46                     ` Sergey Shtylyov
2022-01-15 18:36   ` [PATCH 1/2] platform: make platform_get_irq_optional() optional (summary) Uwe Kleine-König
2022-01-15 18:36     ` Uwe Kleine-König
2022-01-15 18:36     ` Uwe Kleine-König
2022-01-15 18:36     ` Uwe Kleine-König
2022-01-15 18:36     ` Uwe Kleine-König
2022-01-16 14:19     ` Greg Kroah-Hartman
2022-01-16 14:19       ` Greg Kroah-Hartman
2022-01-16 14:19       ` Greg Kroah-Hartman
2022-01-16 14:19       ` Greg Kroah-Hartman
2022-01-16 14:19       ` Greg Kroah-Hartman
2022-01-18  9:18       ` Uwe Kleine-König
2022-01-18  9:18         ` Uwe Kleine-König
2022-01-18  9:18         ` Uwe Kleine-König
2022-01-18  9:18         ` Uwe Kleine-König
2022-01-18  9:18         ` Uwe Kleine-König
2022-01-18  9:32         ` Greg Kroah-Hartman
2022-01-18  9:32           ` Greg Kroah-Hartman
2022-01-18  9:32           ` Greg Kroah-Hartman
2022-01-18  9:32           ` Greg Kroah-Hartman
2022-01-18  9:32           ` Greg Kroah-Hartman
2022-01-19 10:56         ` Sergey Shtylyov
2022-01-19 10:56           ` Sergey Shtylyov
2022-01-19 10:56           ` Sergey Shtylyov
2022-01-19 10:56           ` Sergey Shtylyov
2022-01-19 10:56           ` Sergey Shtylyov
2022-01-19 11:33           ` Uwe Kleine-König
2022-01-19 11:33             ` Uwe Kleine-König
2022-01-19 11:33             ` Uwe Kleine-König
2022-01-19 11:33             ` Uwe Kleine-König
2022-01-19 11:33             ` Uwe Kleine-König
2022-01-19 11:42             ` Sergey Shtylyov
2022-01-19 11:42               ` Sergey Shtylyov
2022-01-19 11:42               ` Sergey Shtylyov
2022-01-19 11:42               ` Sergey Shtylyov
2022-01-19 11:42               ` Sergey Shtylyov
2022-01-19 19:06     ` Andy Shevchenko
2022-01-19 19:06       ` Andy Shevchenko
2022-01-19 19:06       ` Andy Shevchenko
2022-01-19 19:06       ` Andy Shevchenko
2022-01-19 19:06       ` Andy Shevchenko
2022-01-17 11:57   ` [PATCH 1/2] platform: make platform_get_irq_optional() optional Sergey Shtylyov
2022-01-17 11:57     ` Sergey Shtylyov
2022-01-17 11:57     ` Sergey Shtylyov
2022-01-17 11:57     ` Sergey Shtylyov
2022-01-17 11:57     ` Sergey Shtylyov
2022-01-19 15:02     ` Uwe Kleine-König
2022-01-19 15:02       ` Uwe Kleine-König
2022-01-19 15:02       ` Uwe Kleine-König
2022-01-19 15:02       ` Uwe Kleine-König
2022-01-19 15:02       ` Uwe Kleine-König
2022-01-19 15:50       ` Sergey Shtylyov
2022-01-19 15:50         ` Sergey Shtylyov
2022-01-19 15:50         ` Sergey Shtylyov
2022-01-19 15:50         ` Sergey Shtylyov
2022-01-19 15:50         ` Sergey Shtylyov
2022-01-10 19:54 ` [PATCH 2/2] platform: make platform_get_irq_byname_optional() optional Sergey Shtylyov
2022-01-10 19:54   ` Sergey Shtylyov
2022-01-10 19:54   ` Sergey Shtylyov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220114202226.ugzklxv4wzr6egwj@pengutronix.de \
    --to=u.kleine-koenig@pengutronix.de \
    --cc=alex.williamson@redhat.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=amitk@kernel.org \
    --cc=andrew@lunn.ch \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=bcm-kernel-feedback-list@broadcom.com \
    --cc=bleung@chromium.org \
    --cc=bp@alien8.de \
    --cc=brgl@bgdev.pl \
    --cc=broonie@kernel.org \
    --cc=cohuck@redhat.com \
    --cc=computersforpeace@gmail.com \
    --cc=daniel.lezcano@linaro.org \
    --cc=davem@davemloft.net \
    --cc=eric.auger@redhat.com \
    --cc=f.fainelli@gmail.com \
    --cc=geert@linux-m68k.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=groeck@chromium.org \
    --cc=hdegoede@redhat.com \
    --cc=james.morse@arm.com \
    --cc=jirislaby@kernel.org \
    --cc=john.garry@huawei.com \
    --cc=kdasu.kdev@gmail.com \
    --cc=kernel@pengutronix.de \
    --cc=khuong@os.amperecomputing.com \
    --cc=kishon@ti.com \
    --cc=kuba@kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=lee.jones@linaro.org \
    --cc=lgirdwood@gmail.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-edac@vger.kernel.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=linux-phy@lists.infradead.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux-pwm@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=linux-spi@vger.kernel.org \
    --cc=markgross@kernel.org \
    --cc=matthias.bgg@gmail.com \
    --cc=matthias.schiffer@ew.tq-group.com \
    --cc=mchehab@kernel.org \
    --cc=minyard@acm.org \
    --cc=miquel.raynal@bootlin.com \
    --cc=mun.yew.tham@intel.com \
    --cc=netdev@vger.kernel.org \
    --cc=niklas.soderlund@ragnatech.se \
    --cc=openipmi-developer@lists.sourceforge.net \
    --cc=perex@perex.cz \
    --cc=peter@korsgaard.com \
    --cc=platform-driver-x86@vger.kernel.org \
    --cc=qiangqing.zhang@nxp.com \
    --cc=qipeng.zha@intel.com \
    --cc=rafael@kernel.org \
    --cc=richard@nod.at \
    --cc=rric@kernel.org \
    --cc=rui.zhang@intel.com \
    --cc=s.shtylyov@omp.ru \
    --cc=sravanhome@gmail.com \
    --cc=sre@kernel.org \
    --cc=thierry.reding@gmail.com \
    --cc=tiwai@suse.com \
    --cc=tony.luck@intel.com \
    --cc=ulf.hansson@linaro.org \
    --cc=vigneshr@ti.com \
    --cc=vilhelm.gray@gmail.com \
    --cc=vkoul@kernel.org \
    --cc=yoshihiro.shimoda.uh@renesas.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.