Message ID | a0f895b3-f895-f256-1274-a61571264617@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | mmc: meson-gx: support platform interrupt as card detect interrupt | expand |
On Mon, 30 Jan 2023 at 00:10, Heiner Kallweit <hkallweit1@gmail.com> wrote: > > On certain platforms like Amlogic Meson gpiod_to_irq() isn't supported > due to the design of gpio / interrupt controller. Therefore provide an > option to specify the cd interrupt e.g. by device tree. The host > controller can store the interrupt in cd_irq for use by > mmc_gpiod_request_cd_irq(). > > Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> > --- > drivers/mmc/core/slot-gpio.c | 2 +- > include/linux/mmc/host.h | 1 + > 2 files changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/core/slot-gpio.c b/drivers/mmc/core/slot-gpio.c > index dd2a4b6ab..69c22a997 100644 > --- a/drivers/mmc/core/slot-gpio.c > +++ b/drivers/mmc/core/slot-gpio.c > @@ -99,7 +99,7 @@ void mmc_gpiod_request_cd_irq(struct mmc_host *host) > * IRQ number is already used by another unit and cannot be shared. > */ > if (!(host->caps & MMC_CAP_NEEDS_POLL)) > - irq = gpiod_to_irq(ctx->cd_gpio); > + irq = host->cd_irq > 0 ? host->cd_irq : gpiod_to_irq(ctx->cd_gpio); > > if (irq >= 0) { > if (!ctx->cd_gpio_isr) > diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h > index 8fdd3cf97..e998e919e 100644 > --- a/include/linux/mmc/host.h > +++ b/include/linux/mmc/host.h > @@ -470,6 +470,7 @@ struct mmc_host { > > struct delayed_work detect; > int detect_change; /* card detect flag */ > + int cd_irq; /* for use by mmc_gpiod_request_cd_irq */ Rather than putting this in the struct mmc_host, I would prefer to keep it more internal to the mmc core/slot code. That said, what do you think of moving this into the struct mmc_gpio instead? Of course, that also means that we need to add new slot gpio helper that users can call to set the corresponding value for the cd_irq. Would that be okay to you? > struct mmc_slot slot; > > const struct mmc_bus_ops *bus_ops; /* current bus driver */ Kind regards Uffe
On 13.02.2023 23:46, Ulf Hansson wrote: > On Mon, 30 Jan 2023 at 00:10, Heiner Kallweit <hkallweit1@gmail.com> wrote: >> >> On certain platforms like Amlogic Meson gpiod_to_irq() isn't supported >> due to the design of gpio / interrupt controller. Therefore provide an >> option to specify the cd interrupt e.g. by device tree. The host >> controller can store the interrupt in cd_irq for use by >> mmc_gpiod_request_cd_irq(). >> >> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> >> --- >> drivers/mmc/core/slot-gpio.c | 2 +- >> include/linux/mmc/host.h | 1 + >> 2 files changed, 2 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/mmc/core/slot-gpio.c b/drivers/mmc/core/slot-gpio.c >> index dd2a4b6ab..69c22a997 100644 >> --- a/drivers/mmc/core/slot-gpio.c >> +++ b/drivers/mmc/core/slot-gpio.c >> @@ -99,7 +99,7 @@ void mmc_gpiod_request_cd_irq(struct mmc_host *host) >> * IRQ number is already used by another unit and cannot be shared. >> */ >> if (!(host->caps & MMC_CAP_NEEDS_POLL)) >> - irq = gpiod_to_irq(ctx->cd_gpio); >> + irq = host->cd_irq > 0 ? host->cd_irq : gpiod_to_irq(ctx->cd_gpio); >> >> if (irq >= 0) { >> if (!ctx->cd_gpio_isr) >> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h >> index 8fdd3cf97..e998e919e 100644 >> --- a/include/linux/mmc/host.h >> +++ b/include/linux/mmc/host.h >> @@ -470,6 +470,7 @@ struct mmc_host { >> >> struct delayed_work detect; >> int detect_change; /* card detect flag */ >> + int cd_irq; /* for use by mmc_gpiod_request_cd_irq */ > > Rather than putting this in the struct mmc_host, I would prefer to > keep it more internal to the mmc core/slot code. > > That said, what do you think of moving this into the struct mmc_gpio > instead? Of course, that also means that we need to add new slot gpio > helper that users can call to set the corresponding value for the > cd_irq. > > Would that be okay to you? > Yes, that's the better approach. >> struct mmc_slot slot; >> >> const struct mmc_bus_ops *bus_ops; /* current bus driver */ > > Kind regards > Uffe
diff --git a/drivers/mmc/core/slot-gpio.c b/drivers/mmc/core/slot-gpio.c index dd2a4b6ab..69c22a997 100644 --- a/drivers/mmc/core/slot-gpio.c +++ b/drivers/mmc/core/slot-gpio.c @@ -99,7 +99,7 @@ void mmc_gpiod_request_cd_irq(struct mmc_host *host) * IRQ number is already used by another unit and cannot be shared. */ if (!(host->caps & MMC_CAP_NEEDS_POLL)) - irq = gpiod_to_irq(ctx->cd_gpio); + irq = host->cd_irq > 0 ? host->cd_irq : gpiod_to_irq(ctx->cd_gpio); if (irq >= 0) { if (!ctx->cd_gpio_isr) diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 8fdd3cf97..e998e919e 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -470,6 +470,7 @@ struct mmc_host { struct delayed_work detect; int detect_change; /* card detect flag */ + int cd_irq; /* for use by mmc_gpiod_request_cd_irq */ struct mmc_slot slot; const struct mmc_bus_ops *bus_ops; /* current bus driver */
On certain platforms like Amlogic Meson gpiod_to_irq() isn't supported due to the design of gpio / interrupt controller. Therefore provide an option to specify the cd interrupt e.g. by device tree. The host controller can store the interrupt in cd_irq for use by mmc_gpiod_request_cd_irq(). Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> --- drivers/mmc/core/slot-gpio.c | 2 +- include/linux/mmc/host.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-)