Skip to content

Commit

Permalink
MIPS: ath79: add common GPIO buttons device
Browse files Browse the repository at this point in the history
Almost all boards have one or more push buttons connected to GPIO lines.
This patch adds common code to register a platform_device for them.

The patch also adds support for the buttons on the PB44 board.

Signed-off-by: Gabor Juhos <[email protected]>
Signed-off-by: Imre Kaloz <[email protected]>
Cc: [email protected]
Cc: Luis R. Rodriguez <[email protected]>
Cc: Cliff Holden <[email protected]>
Cc: Kathy Giori <[email protected]>
Patchwork: https://patchwork.linux-mips.org/patch/1954/
Signed-off-by: Ralf Baechle <[email protected]>
  • Loading branch information
juhosg authored and ralfbaechle committed Jan 18, 2011
1 parent 858f763 commit 3f348c5
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 0 deletions.
4 changes: 4 additions & 0 deletions arch/mips/ath79/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ menu "Atheros AR71XX/AR724X/AR913X machine selection"
config ATH79_MACH_PB44
bool "Atheros PB44 reference board"
select SOC_AR71XX
select ATH79_DEV_GPIO_BUTTONS
select ATH79_DEV_LEDS_GPIO
help
Say 'Y' here if you want your kernel to support the
Expand All @@ -21,6 +22,9 @@ config SOC_AR724X
config SOC_AR913X
def_bool n

config ATH79_DEV_GPIO_BUTTONS
def_bool n

config ATH79_DEV_LEDS_GPIO
def_bool n

Expand Down
1 change: 1 addition & 0 deletions arch/mips/ath79/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
# Devices
#
obj-y += dev-common.o
obj-$(CONFIG_ATH79_DEV_GPIO_BUTTONS) += dev-gpio-buttons.o
obj-$(CONFIG_ATH79_DEV_LEDS_GPIO) += dev-leds-gpio.o

#
Expand Down
58 changes: 58 additions & 0 deletions arch/mips/ath79/dev-gpio-buttons.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*
* Atheros AR71XX/AR724X/AR913X GPIO button support
*
* Copyright (C) 2008-2010 Gabor Juhos <[email protected]>
* Copyright (C) 2008 Imre Kaloz <[email protected]>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation.
*/

#include "linux/init.h"
#include "linux/slab.h"
#include <linux/platform_device.h>

#include "dev-gpio-buttons.h"

void __init ath79_register_gpio_keys_polled(int id,
unsigned poll_interval,
unsigned nbuttons,
struct gpio_keys_button *buttons)
{
struct platform_device *pdev;
struct gpio_keys_platform_data pdata;
struct gpio_keys_button *p;
int err;

p = kmalloc(nbuttons * sizeof(*p), GFP_KERNEL);
if (!p)
return;

memcpy(p, buttons, nbuttons * sizeof(*p));

pdev = platform_device_alloc("gpio-keys-polled", id);
if (!pdev)
goto err_free_buttons;

memset(&pdata, 0, sizeof(pdata));
pdata.poll_interval = poll_interval;
pdata.nbuttons = nbuttons;
pdata.buttons = p;

err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
if (err)
goto err_put_pdev;

err = platform_device_add(pdev);
if (err)
goto err_put_pdev;

return;

err_put_pdev:
platform_device_put(pdev);

err_free_buttons:
kfree(p);
}
23 changes: 23 additions & 0 deletions arch/mips/ath79/dev-gpio-buttons.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* Atheros AR71XX/AR724X/AR913X GPIO button support
*
* Copyright (C) 2008-2010 Gabor Juhos <[email protected]>
* Copyright (C) 2008 Imre Kaloz <[email protected]>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation.
*/

#ifndef _ATH79_DEV_GPIO_BUTTONS_H
#define _ATH79_DEV_GPIO_BUTTONS_H

#include <linux/input.h>
#include <linux/gpio_keys.h>

void ath79_register_gpio_keys_polled(int id,
unsigned poll_interval,
unsigned nbuttons,
struct gpio_keys_button *buttons);

#endif /* _ATH79_DEV_GPIO_BUTTONS_H */
27 changes: 27 additions & 0 deletions arch/mips/ath79/mach-pb44.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,21 @@
#include <linux/i2c/pcf857x.h>

#include "machtypes.h"
#include "dev-gpio-buttons.h"
#include "dev-leds-gpio.h"

#define PB44_GPIO_I2C_SCL 0
#define PB44_GPIO_I2C_SDA 1

#define PB44_GPIO_EXP_BASE 16
#define PB44_GPIO_SW_RESET (PB44_GPIO_EXP_BASE + 6)
#define PB44_GPIO_SW_JUMP (PB44_GPIO_EXP_BASE + 8)
#define PB44_GPIO_LED_JUMP1 (PB44_GPIO_EXP_BASE + 9)
#define PB44_GPIO_LED_JUMP2 (PB44_GPIO_EXP_BASE + 10)

#define PB44_KEYS_POLL_INTERVAL 20 /* msecs */
#define PB44_KEYS_DEBOUNCE_INTERVAL (3 * PB44_KEYS_POLL_INTERVAL)

static struct i2c_gpio_platform_data pb44_i2c_gpio_data = {
.sda_pin = PB44_GPIO_I2C_SDA,
.scl_pin = PB44_GPIO_I2C_SCL,
Expand Down Expand Up @@ -60,6 +66,24 @@ static struct gpio_led pb44_leds_gpio[] __initdata = {
},
};

static struct gpio_keys_button pb44_gpio_keys[] __initdata = {
{
.desc = "soft_reset",
.type = EV_KEY,
.code = KEY_RESTART,
.debounce_interval = PB44_KEYS_DEBOUNCE_INTERVAL,
.gpio = PB44_GPIO_SW_RESET,
.active_low = 1,
} , {
.desc = "jumpstart",
.type = EV_KEY,
.code = KEY_WPS_BUTTON,
.debounce_interval = PB44_KEYS_DEBOUNCE_INTERVAL,
.gpio = PB44_GPIO_SW_JUMP,
.active_low = 1,
}
};

static void __init pb44_init(void)
{
i2c_register_board_info(0, pb44_i2c_board_info,
Expand All @@ -68,6 +92,9 @@ static void __init pb44_init(void)

ath79_register_leds_gpio(-1, ARRAY_SIZE(pb44_leds_gpio),
pb44_leds_gpio);
ath79_register_gpio_keys_polled(-1, PB44_KEYS_POLL_INTERVAL,
ARRAY_SIZE(pb44_gpio_keys),
pb44_gpio_keys);
}

MIPS_MACHINE(ATH79_MACH_PB44, "PB44", "Atheros PB44 reference board",
Expand Down

0 comments on commit 3f348c5

Please sign in to comment.