[PATCH] input: serio: ams-delta: toggle keyboard power over GPIO
Janusz Krzysztofik
jkrzyszt at tis.icnet.pl
Wed Dec 21 14:55:09 EST 2011
On Wednesday 21 of December 2011 at 20:09:45, Tony Lindgren wrote:
> * Janusz Krzysztofik <jkrzyszt at tis.icnet.pl> [111220 13:39]:
> > Don't use Amstrad Delta custom I/O functions once GPIO interface is
> > available for the underlying hardware.
> >
> > While requesting and initializing GPIO pins used, also take care of one
> > extra pin KEYBRD_DATAOUT which, even if not used by the driver, belongs
> > to the device and affects its functioning.
> >
> > Once done, move the driver initialization back to the device_initcall
> > level, reverting the temporary chane introduced with patch 1/7 "ARM:
> > OMAP1: ams-delta: register latch dependent devices later". That change
> > is no longer required once the driver takes care of registering used
> > GPIO pins, and it's better to initialize the device before others using
> > the latch2 based GPIO pins, otherwise a garbage is reported on boot,
> > perhaps due to random data already captured by the FIQ handler while the
> > keyboard related latch bits are written with random values during
> > initialization of those other latch2 dependent devices.
> >
> > Depends on patch 2/7 "ARM: OMAP1: ams-delta: convert latches to
> > basic_mmio_gpio"
> >
> > Signed-off-by: Janusz Krzysztofik <jkrzyszt at tis.icnet.pl>
>
> I'm assuming Dmitry's ack for an earlier version of this patch also
> covers this one when applying.
Hi Dmitry,
Can we assume your ack still valid for this version?
Thanks,
Janusz
> Regards,
>
> Tony
>
> > ---
> > Hi,
> > I'm submitting only this one refreshed on top of updated 1/7. All others
> > (2/7-6/7) don't require any refresh, can be rebased smoothly.
> >
> > Thanks,
> > Janusz
> >
> >
> > Changes against version 2:
> > * refreshed on top of updated patch 1/7 v2,
> > * changelog: corrected patch 1/7 summary (was inaccurate).
> >
> > Changes against initial version:
> > * was 9/10,
> > * rebased on top of v2 of patch 2/7, just in case,
> > * moved AMS_DELTA_GPIO_PIN_KEYBRD_DATAOUT pin handling from the board
> > code to the driver,
> > * reverted a temporary change to the driver initcall level, introduced
> > by the new solution provided with patch 1/7.
> >
> >
> > arch/arm/mach-omap1/board-ams-delta.c | 10 ----
> > arch/arm/plat-omap/include/plat/board-ams-delta.h | 2 -
> > drivers/input/serio/ams_delta_serio.c | 53 ++++++++++++--------
> > :x 3 files changed, 32 insertions(+), 33 deletions(-)
> >
> > diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c
> > index 3aba8f9..673cf21 100644
> > --- a/arch/arm/mach-omap1/board-ams-delta.c
> > +++ b/arch/arm/mach-omap1/board-ams-delta.c
> > @@ -227,16 +227,6 @@ static struct gpio latch_gpios[] __initconst = {
> > .label = "dockit2",
> > },
> > {
> > - .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_PWR,
> > - .flags = GPIOF_OUT_INIT_LOW,
> > - .label = "keybrd_pwr",
> > - },
> > - {
> > - .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATAOUT,
> > - .flags = GPIOF_OUT_INIT_LOW,
> > - .label = "keybrd_dataout",
> > - },
> > - {
> > .gpio = AMS_DELTA_GPIO_PIN_SCARD_RSTIN,
> > .flags = GPIOF_OUT_INIT_LOW,
> > .label = "scard_rstin",
> > diff --git a/arch/arm/plat-omap/include/plat/board-ams-delta.h b/arch/arm/plat-omap/include/plat/board-ams-delta.h
> > index e9ad673..027e79e 100644
> > --- a/arch/arm/plat-omap/include/plat/board-ams-delta.h
> > +++ b/arch/arm/plat-omap/include/plat/board-ams-delta.h
> > @@ -28,8 +28,6 @@
> >
> > #if defined (CONFIG_MACH_AMS_DELTA)
> >
> > -#define AMD_DELTA_LATCH2_KEYBRD_PWR 0x0100
> > -#define AMD_DELTA_LATCH2_KEYBRD_DATA 0x0200
> > #define AMD_DELTA_LATCH2_SCARD_RSTIN 0x0400
> > #define AMD_DELTA_LATCH2_SCARD_CMDVCC 0x0800
> > #define AMS_DELTA_LATCH2_MODEM_NRESET 0x1000
> > diff --git a/drivers/input/serio/ams_delta_serio.c b/drivers/input/serio/ams_delta_serio.c
> > index 835d37a..ef1ec40 100644
> > --- a/drivers/input/serio/ams_delta_serio.c
> > +++ b/drivers/input/serio/ams_delta_serio.c
> > @@ -92,8 +92,7 @@ static irqreturn_t ams_delta_serio_interrupt(int irq, void *dev_id)
> > static int ams_delta_serio_open(struct serio *serio)
> > {
> > /* enable keyboard */
> > - ams_delta_latch2_write(AMD_DELTA_LATCH2_KEYBRD_PWR,
> > - AMD_DELTA_LATCH2_KEYBRD_PWR);
> > + gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 1);
> >
> > return 0;
> > }
> > @@ -101,9 +100,32 @@ static int ams_delta_serio_open(struct serio *serio)
> > static void ams_delta_serio_close(struct serio *serio)
> > {
> > /* disable keyboard */
> > - ams_delta_latch2_write(AMD_DELTA_LATCH2_KEYBRD_PWR, 0);
> > + gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 0);
> > }
> >
> > +static struct gpio _gpios[] __initconst_or_module = {
> > + {
> > + .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATA,
> > + .flags = GPIOF_DIR_IN,
> > + .label = "serio-data",
> > + },
> > + {
> > + .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_CLK,
> > + .flags = GPIOF_DIR_IN,
> > + .label = "serio-clock",
> > + },
> > + {
> > + .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_PWR,
> > + .flags = GPIOF_OUT_INIT_LOW,
> > + .label = "serio-power",
> > + },
> > + {
> > + .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATAOUT,
> > + .flags = GPIOF_OUT_INIT_LOW,
> > + .label = "serio-dataout",
> > + },
> > +};
> > +
> > static int __init ams_delta_serio_init(void)
> > {
> > int err;
> > @@ -123,19 +145,11 @@ static int __init ams_delta_serio_init(void)
> > strlcpy(ams_delta_serio->phys, "GPIO/serio0",
> > sizeof(ams_delta_serio->phys));
> >
> > - err = gpio_request(AMS_DELTA_GPIO_PIN_KEYBRD_DATA, "serio-data");
> > + err = gpio_request_array(_gpios, ARRAY_SIZE(_gpios));
> > if (err) {
> > - pr_err("ams_delta_serio: Couldn't request gpio pin for data\n");
> > + pr_err("ams_delta_serio: Couldn't request gpio pins\n");
> > goto serio;
> > }
> > - gpio_direction_input(AMS_DELTA_GPIO_PIN_KEYBRD_DATA);
> > -
> > - err = gpio_request(AMS_DELTA_GPIO_PIN_KEYBRD_CLK, "serio-clock");
> > - if (err) {
> > - pr_err("ams_delta_serio: couldn't request gpio pin for clock\n");
> > - goto gpio_data;
> > - }
> > - gpio_direction_input(AMS_DELTA_GPIO_PIN_KEYBRD_CLK);
> >
> > err = request_irq(gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK),
> > ams_delta_serio_interrupt, IRQ_TYPE_EDGE_RISING,
> > @@ -143,7 +157,7 @@ static int __init ams_delta_serio_init(void)
> > if (err < 0) {
> > pr_err("ams_delta_serio: couldn't request gpio interrupt %d\n",
> > gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK));
> > - goto gpio_clk;
> > + goto gpio;
> > }
> > /*
> > * Since GPIO register handling for keyboard clock pin is performed
> > @@ -157,21 +171,18 @@ static int __init ams_delta_serio_init(void)
> > dev_info(&ams_delta_serio->dev, "%s\n", ams_delta_serio->name);
> >
> > return 0;
> > -gpio_clk:
> > - gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_CLK);
> > -gpio_data:
> > - gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA);
> > +gpio:
> > + gpio_free_array(_gpios, ARRAY_SIZE(_gpios));
> > serio:
> > kfree(ams_delta_serio);
> > return err;
> > }
> > -late_initcall(ams_delta_serio_init);
> > +module_init(ams_delta_serio_init);
> >
> > static void __exit ams_delta_serio_exit(void)
> > {
> > serio_unregister_port(ams_delta_serio);
> > free_irq(OMAP_GPIO_IRQ(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), 0);
> > - gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_CLK);
> > - gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA);
> > + gpio_free_array(_gpios, ARRAY_SIZE(_gpios));
> > }
> > module_exit(ams_delta_serio_exit);
>
More information about the linux-arm-kernel
mailing list