mbox series

[-next,0/2] allow gpio simulator be used as interrupt controller

Message ID 20220826080230.1712978-1-weiyongjun1@huawei.com
Headers show
Series allow gpio simulator be used as interrupt controller | expand

Message

Wei Yongjun Aug. 26, 2022, 8:02 a.m. UTC
This series allow gpio simulator be used as interrupt controller, the use
case is mockup some device which using GPIO as interrupt controller, such
as mcp2515 CAN device. With the dts [1], we can mockup a mcp2515 device,
and trigger irq by following commands:

 $ echo pull-down > /sys/bus/gpio/devices/gpiochip0/sim_gpio0/pull
 $ echo pull-up > /sys/bus/gpio/devices/gpiochip0/sim_gpio0/pull


--[1]---------------------------------------------------------
/dts-v1/;

#include <dt-bindings/interrupt-controller/irq.h>

/ {
	clk24m: clk24m {
		compatible = "fixed-clock";
		clock-output-names = "clk24m";
		clock-frequency = <24000000>;
		#clock-cells = <0>;
	};

	gpio-sim {
		compatible = "gpio-simulator";

		bank0: bank0 {
			gpio-controller;
			#gpio-cells = <2>;
			ngpios = <16>;

			interrupt-controller;
			#interrupt-cells = <2>;

			line_b-hog {
				gpio-hog;
				gpios = <0 1>;
				input;
				line-name = "irq-sim";
			};
		};
	};

	spi: spi {
		compatible = "spi-mockup";

		#address-cells = <1>;
		#size-cells = <0>;

		can0: can@1 {
			compatible = "microchip,mcp2515";
			reg = <1>;
			clocks = <&clk24m>;
			interrupt-parent = <&bank0>;
			interrupts = <0 IRQ_TYPE_EDGE_BOTH>;
		};

	};
};
------------------------------><-----------------------------

Wei Yongjun (2):
  genirq/irq_sim: Allow both one and two cell bindings
  gpio: sim: make gpio simulator can be used as interrupt controller

 drivers/gpio/gpio-sim.c | 2 +-
 kernel/irq/irq_sim.c    | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

Comments

Bartosz Golaszewski Aug. 31, 2022, 4:08 p.m. UTC | #1
On Fri, Aug 26, 2022 at 9:44 AM Wei Yongjun <weiyongjun1@huawei.com> wrote:
>
> This series allow gpio simulator be used as interrupt controller, the use
> case is mockup some device which using GPIO as interrupt controller, such
> as mcp2515 CAN device. With the dts [1], we can mockup a mcp2515 device,
> and trigger irq by following commands:
>
>  $ echo pull-down > /sys/bus/gpio/devices/gpiochip0/sim_gpio0/pull
>  $ echo pull-up > /sys/bus/gpio/devices/gpiochip0/sim_gpio0/pull
>
>
> --[1]---------------------------------------------------------
> /dts-v1/;
>
> #include <dt-bindings/interrupt-controller/irq.h>
>
> / {
>         clk24m: clk24m {
>                 compatible = "fixed-clock";
>                 clock-output-names = "clk24m";
>                 clock-frequency = <24000000>;
>                 #clock-cells = <0>;
>         };
>
>         gpio-sim {
>                 compatible = "gpio-simulator";
>
>                 bank0: bank0 {
>                         gpio-controller;
>                         #gpio-cells = <2>;
>                         ngpios = <16>;
>
>                         interrupt-controller;
>                         #interrupt-cells = <2>;
>
>                         line_b-hog {
>                                 gpio-hog;
>                                 gpios = <0 1>;
>                                 input;
>                                 line-name = "irq-sim";
>                         };

Why do you need this hog? The GPIO will be marked as requested once
the interrupt is taken by the driver.

>                 };
>         };
>
>         spi: spi {
>                 compatible = "spi-mockup";
>
>                 #address-cells = <1>;
>                 #size-cells = <0>;
>
>                 can0: can@1 {
>                         compatible = "microchip,mcp2515";
>                         reg = <1>;
>                         clocks = <&clk24m>;
>                         interrupt-parent = <&bank0>;
>                         interrupts = <0 IRQ_TYPE_EDGE_BOTH>;
>                 };
>
>         };
> };
> ------------------------------><-----------------------------
>
> Wei Yongjun (2):
>   genirq/irq_sim: Allow both one and two cell bindings
>   gpio: sim: make gpio simulator can be used as interrupt controller
>
>  drivers/gpio/gpio-sim.c | 2 +-
>  kernel/irq/irq_sim.c    | 1 +
>  2 files changed, 2 insertions(+), 1 deletion(-)
>
> --
> 2.34.1
>

Can you add some info about this to the documentation?

Otherwise looks good.

Bart
Wei Yongjun Sept. 26, 2022, 6:57 a.m. UTC | #2
On 2022/9/1 0:08, Bartosz Golaszewski wrote:
> On Fri, Aug 26, 2022 at 9:44 AM Wei Yongjun <weiyongjun1@huawei.com> wrote:
>>
>> This series allow gpio simulator be used as interrupt controller, the use
>> case is mockup some device which using GPIO as interrupt controller, such
>> as mcp2515 CAN device. With the dts [1], we can mockup a mcp2515 device,
>> and trigger irq by following commands:
>>
>>  $ echo pull-down > /sys/bus/gpio/devices/gpiochip0/sim_gpio0/pull
>>  $ echo pull-up > /sys/bus/gpio/devices/gpiochip0/sim_gpio0/pull
>>
>>
>> --[1]---------------------------------------------------------
>> /dts-v1/;
>>
>> #include <dt-bindings/interrupt-controller/irq.h>
>>
>> / {
>>         clk24m: clk24m {
>>                 compatible = "fixed-clock";
>>                 clock-output-names = "clk24m";
>>                 clock-frequency = <24000000>;
>>                 #clock-cells = <0>;
>>         };
>>
>>         gpio-sim {
>>                 compatible = "gpio-simulator";
>>
>>                 bank0: bank0 {
>>                         gpio-controller;
>>                         #gpio-cells = <2>;
>>                         ngpios = <16>;
>>
>>                         interrupt-controller;
>>                         #interrupt-cells = <2>;
>>
>>                         line_b-hog {
>>                                 gpio-hog;
>>                                 gpios = <0 1>;
>>                                 input;
>>                                 line-name = "irq-sim";
>>                         };
> 
> Why do you need this hog? The GPIO will be marked as requested once
> the interrupt is taken by the driver.

Sorry for reply later.

It seems that only if driver request gpio with fwnode_gpiod_get_index()
marks GPIO as request one.

If driver using request_threaded_irq() request one irq, the requested
status will not be marked. We need to use hog or request by userspace
to mark as requested.

> 
>>                 };
>>         };
>>
>>         spi: spi {
>>                 compatible = "spi-mockup";
>>
>>                 #address-cells = <1>;
>>                 #size-cells = <0>;
>>
>>                 can0: can@1 {
>>                         compatible = "microchip,mcp2515";
>>                         reg = <1>;
>>                         clocks = <&clk24m>;
>>                         interrupt-parent = <&bank0>;
>>                         interrupts = <0 IRQ_TYPE_EDGE_BOTH>;
>>                 };
>>
>>         };
>> };
>> ------------------------------><-----------------------------
>>
>> Wei Yongjun (2):
>>   genirq/irq_sim: Allow both one and two cell bindings
>>   gpio: sim: make gpio simulator can be used as interrupt controller
>>
>>  drivers/gpio/gpio-sim.c | 2 +-
>>  kernel/irq/irq_sim.c    | 1 +
>>  2 files changed, 2 insertions(+), 1 deletion(-)
>>
>> --
>> 2.34.1
>>
> 
> Can you add some info about this to the documentation?

Will do that

Thanks,
Wei Yongjun
Bartosz Golaszewski Sept. 26, 2022, 7:38 a.m. UTC | #3
On Mon, Sep 26, 2022 at 8:57 AM Wei Yongjun <weiyongjun1@huawei.com> wrote:
>
>
>
> On 2022/9/1 0:08, Bartosz Golaszewski wrote:
> > On Fri, Aug 26, 2022 at 9:44 AM Wei Yongjun <weiyongjun1@huawei.com> wrote:
> >>
> >> This series allow gpio simulator be used as interrupt controller, the use
> >> case is mockup some device which using GPIO as interrupt controller, such
> >> as mcp2515 CAN device. With the dts [1], we can mockup a mcp2515 device,
> >> and trigger irq by following commands:
> >>
> >>  $ echo pull-down > /sys/bus/gpio/devices/gpiochip0/sim_gpio0/pull
> >>  $ echo pull-up > /sys/bus/gpio/devices/gpiochip0/sim_gpio0/pull
> >>
> >>
> >> --[1]---------------------------------------------------------
> >> /dts-v1/;
> >>
> >> #include <dt-bindings/interrupt-controller/irq.h>
> >>
> >> / {
> >>         clk24m: clk24m {
> >>                 compatible = "fixed-clock";
> >>                 clock-output-names = "clk24m";
> >>                 clock-frequency = <24000000>;
> >>                 #clock-cells = <0>;
> >>         };
> >>
> >>         gpio-sim {
> >>                 compatible = "gpio-simulator";
> >>
> >>                 bank0: bank0 {
> >>                         gpio-controller;
> >>                         #gpio-cells = <2>;
> >>                         ngpios = <16>;
> >>
> >>                         interrupt-controller;
> >>                         #interrupt-cells = <2>;
> >>
> >>                         line_b-hog {
> >>                                 gpio-hog;
> >>                                 gpios = <0 1>;
> >>                                 input;
> >>                                 line-name = "irq-sim";
> >>                         };
> >
> > Why do you need this hog? The GPIO will be marked as requested once
> > the interrupt is taken by the driver.
>
> Sorry for reply later.
>
> It seems that only if driver request gpio with fwnode_gpiod_get_index()
> marks GPIO as request one.
>
> If driver using request_threaded_irq() request one irq, the requested
> status will not be marked. We need to use hog or request by userspace
> to mark as requested.
>

Right, of course. Thanks.

> >
> >>                 };
> >>         };
> >>
> >>         spi: spi {
> >>                 compatible = "spi-mockup";
> >>
> >>                 #address-cells = <1>;
> >>                 #size-cells = <0>;
> >>
> >>                 can0: can@1 {
> >>                         compatible = "microchip,mcp2515";
> >>                         reg = <1>;
> >>                         clocks = <&clk24m>;
> >>                         interrupt-parent = <&bank0>;
> >>                         interrupts = <0 IRQ_TYPE_EDGE_BOTH>;
> >>                 };
> >>
> >>         };
> >> };
> >> ------------------------------><-----------------------------
> >>
> >> Wei Yongjun (2):
> >>   genirq/irq_sim: Allow both one and two cell bindings
> >>   gpio: sim: make gpio simulator can be used as interrupt controller
> >>
> >>  drivers/gpio/gpio-sim.c | 2 +-
> >>  kernel/irq/irq_sim.c    | 1 +
> >>  2 files changed, 2 insertions(+), 1 deletion(-)
> >>
> >> --
> >> 2.34.1
> >>
> >
> > Can you add some info about this to the documentation?
>

Ok, I'll wait for v2.

And you can drop the -next prefix too, it doesn't fix anything in next.

Bart

> Will do that
>
> Thanks,
> Wei Yongjun