diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-01-16 06:16:13 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-01-16 06:16:13 -0800 |
commit | e3b61b8a0c857b466df50da251adb7e02092fe9e (patch) | |
tree | 9a3f878f11bbc952ec46d786a3980a87cc3c6254 | |
parent | f725a9a9a45d8f50912f7c4db87c62a5c1c4b9db (diff) | |
download | ltsi-kernel-e3b61b8a0c857b466df50da251adb7e02092fe9e.tar.gz |
actually add the minnowboard final patches.
doh.
4 files changed, 750 insertions, 0 deletions
diff --git a/patches.minnowboard/0001-gpio-sch-Add-sch_gpio_resume_set_enable.patch b/patches.minnowboard/0001-gpio-sch-Add-sch_gpio_resume_set_enable.patch new file mode 100644 index 00000000000000..3bee0794667dc2 --- /dev/null +++ b/patches.minnowboard/0001-gpio-sch-Add-sch_gpio_resume_set_enable.patch @@ -0,0 +1,63 @@ +From c018204ed1246c0c2129cc2d48f444d89e926034 Mon Sep 17 00:00:00 2001 +Message-Id: <c018204ed1246c0c2129cc2d48f444d89e926034.1383605156.git.darren@dvhart.com> +From: Darren Hart <dvhart@linux.intel.com> +Date: Sat, 18 May 2013 14:45:54 -0700 +Subject: [PATCH 1/4] gpio-sch: Add sch_gpio_resume_set_enable() + +Allow for enabling and disabling of the resume well GPIOs. The E6xx Atom +CPUs multiplex the resume GPIO 2:0 lines with LVDS and individual board +drivers need to be able to enable or disable the lines appropriately. + +Unfortunately, the information regarding if the pins are being used for +LVDS or GPIO is board specific and may not be available to the gpio-sch +driver at probe time. + +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +--- + drivers/gpio/gpio-sch.c | 24 ++++++++++++++++++++++++ + include/linux/gpio-sch.h | 6 ++++++ + 2 files changed, 30 insertions(+) + create mode 100644 include/linux/gpio-sch.h + +--- a/drivers/gpio/gpio-sch.c ++++ b/drivers/gpio/gpio-sch.c +@@ -41,6 +41,30 @@ static DEFINE_SPINLOCK(gpio_lock); + + static unsigned short gpio_ba; + ++void sch_gpio_resume_set_enable(unsigned gpio_num, int val) ++{ ++ u8 curr_en; ++ unsigned short offset, bit; ++ ++ spin_lock(&gpio_lock); ++ ++ offset = RGEN + gpio_num / 8; ++ bit = gpio_num % 8; ++ ++ curr_en = inb(gpio_ba + offset); ++ ++ if (val) { ++ if (!(curr_en & (1 << bit))) ++ outb(curr_en | (1 << bit), gpio_ba + offset); ++ } else { ++ if ((curr_en & (1 << bit))) ++ outb(curr_en & ~(1 << bit), gpio_ba + offset); ++ } ++ ++ spin_unlock(&gpio_lock); ++} ++EXPORT_SYMBOL_GPL(sch_gpio_resume_set_enable); ++ + static int sch_gpio_core_direction_in(struct gpio_chip *gc, unsigned gpio_num) + { + u8 curr_dirs; +--- /dev/null ++++ b/include/linux/gpio-sch.h +@@ -0,0 +1,6 @@ ++#ifndef _LINUX_GPIO_SCH_ ++#define _LINUX_GPIO_SCH_ ++ ++void sch_gpio_resume_set_enable(unsigned gpio_num, int val); ++ ++#endif /* _LINUX_GPIO_SCH_ */ diff --git a/patches.minnowboard/0002-minnowboard-Add-base-platform-driver-for-the-MinnowB.patch b/patches.minnowboard/0002-minnowboard-Add-base-platform-driver-for-the-MinnowB.patch new file mode 100644 index 00000000000000..9e824e8465e5b5 --- /dev/null +++ b/patches.minnowboard/0002-minnowboard-Add-base-platform-driver-for-the-MinnowB.patch @@ -0,0 +1,353 @@ +From de5425c806cb4ca81666097fe70ee39b8a53877a Mon Sep 17 00:00:00 2001 +Message-Id: <de5425c806cb4ca81666097fe70ee39b8a53877a.1383605156.git.darren@dvhart.com> +In-Reply-To: <c018204ed1246c0c2129cc2d48f444d89e926034.1383605156.git.darren@dvhart.com> +References: <c018204ed1246c0c2129cc2d48f444d89e926034.1383605156.git.darren@dvhart.com> +From: Darren Hart <dvhart@linux.intel.com> +Date: Sat, 18 May 2013 14:45:57 -0700 +Subject: [PATCH 2/4] minnowboard: Add base platform driver for the MinnowBoard + +The MinnowBoard (http://www.minnowboard.org) is an Intel Atom (E6xx) plus EG20T +PCH development board. It uses a few GPIO lines for specific purposes and +exposes the rest to the user. + +Request the dedicated GPIO lines: + HWID + LVDS_DETECT + LED0 + LED1 + +Setup platform drivers for the MinnowBoard LEDs using the leds-gpio +driver. Setup led0 and led1 with heartbeat and mmc0 default triggers +respectively. + +GPIO lines SUS[0-4] are dual purpose, either for LVDS signaling or as +user GPIO. Determine which via the LVDS_DETECT signal and enable or +disable them accordingly. + +Provide a minimal public interface: + minnow_detect() + minnow_lvds_detect() + minnow_hwid() + +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +--- + drivers/platform/x86/Kconfig | 20 +++ + drivers/platform/x86/Makefile | 1 + drivers/platform/x86/minnowboard-gpio.h | 58 +++++++++++ + drivers/platform/x86/minnowboard.c | 167 ++++++++++++++++++++++++++++++++ + include/linux/minnowboard.h | 37 +++++++ + 5 files changed, 283 insertions(+) + create mode 100644 drivers/platform/x86/minnowboard-gpio.h + create mode 100644 drivers/platform/x86/minnowboard.c + create mode 100644 include/linux/minnowboard.h + +--- a/drivers/platform/x86/Kconfig ++++ b/drivers/platform/x86/Kconfig +@@ -15,6 +15,26 @@ menuconfig X86_PLATFORM_DEVICES + + if X86_PLATFORM_DEVICES + ++config MINNOWBOARD ++ tristate "MinnowBoard GPIO and LVDS support" ++ depends on LPC_SCH ++ depends on GPIO_SCH ++ depends on GPIO_PCH ++ depends on LEDS_GPIO ++ default n ++ ---help--- ++ This driver configures the MinnowBoard fixed functionality GPIO lines. ++ ++ It ensures that the E6XX SUS GPIOs muxed with LVDS signals (SUS[0:2]) ++ are disabled if the LVDS_DETECT signal is asserted. ++ ++ If LED_TRIGGER* are enabled, LED0 will use the heartbeat trigger and ++ LED1 will use the mmc0 trigger. ++ ++ The Minnow Hardware ID is read from the GPIO HWID lines and logged. ++ ++ If you have a MinnowBoard, say Y or M here. ++ + config ACER_WMI + tristate "Acer WMI Laptop Extras" + depends on ACPI +--- a/drivers/platform/x86/Makefile ++++ b/drivers/platform/x86/Makefile +@@ -2,6 +2,7 @@ + # Makefile for linux/drivers/platform/x86 + # x86 Platform-Specific Drivers + # ++obj-$(CONFIG_MINNOWBOARD) += minnowboard.o + obj-$(CONFIG_ASUS_LAPTOP) += asus-laptop.o + obj-$(CONFIG_ASUS_WMI) += asus-wmi.o + obj-$(CONFIG_ASUS_NB_WMI) += asus-nb-wmi.o +--- /dev/null ++++ b/drivers/platform/x86/minnowboard-gpio.h +@@ -0,0 +1,58 @@ ++/* ++ * MinnowBoard Linux platform driver ++ * Copyright (c) 2013, Intel Corporation. ++ * All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Author: Darren Hart <dvhart@linux.intel.com> ++ */ ++ ++/* MinnowBoard GPIO definitions */ ++#define GPIO_BTN0 0 ++#define GPIO_BTN1 1 ++#define GPIO_BTN2 2 ++#define GPIO_BTN3 3 ++ ++#define GPIO_PROG_VOLTAGE 4 ++ ++/* ++ * If !LVDS_DETECT, the AUX lines are available as GPIO, ++ * otherwise they are used for LVDS signals. ++ */ ++#define GPIO_AUX0 5 ++#define GPIO_AUX1 6 ++#define GPIO_AUX2 7 ++#define GPIO_AUX3 8 ++#define GPIO_AUX4 9 ++ ++#define GPIO_LED0 10 ++#define GPIO_LED1 11 ++ ++#define GPIO_USB_VBUS_DETECT 12 ++ ++#define GPIO_PCH0 244 ++#define GPIO_PCH1 245 ++#define GPIO_PCH2 246 ++#define GPIO_PCH3 247 ++#define GPIO_PCH4 248 ++#define GPIO_PCH5 249 ++#define GPIO_PCH6 250 ++#define GPIO_PCH7 251 ++ ++#define GPIO_HWID0 252 ++#define GPIO_HWID1 253 ++#define GPIO_HWID2 254 ++ ++#define GPIO_LVDS_DETECT 255 +--- /dev/null ++++ b/drivers/platform/x86/minnowboard.c +@@ -0,0 +1,167 @@ ++/* ++ * MinnowBoard Linux platform driver ++ * Copyright (c) 2013, Intel Corporation. ++ * All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Author: Darren Hart <dvhart@linux.intel.com> ++ */ ++ ++#define pr_fmt(fmt) "MinnowBoard: " fmt ++ ++#include <linux/platform_device.h> ++#include <linux/module.h> ++#include <linux/dmi.h> ++#include <linux/input.h> ++#include <linux/gpio.h> ++#include <linux/leds.h> ++#include <linux/gpio-sch.h> ++#include <linux/delay.h> ++#include <linux/minnowboard.h> ++#include "minnowboard-gpio.h" ++ ++static int minnow_hwid_val = -1; ++ ++/* leds-gpio platform device structures */ ++static const struct gpio_led minnow_leds[] = { ++ { .name = "minnow_led0", .gpio = GPIO_LED0, .active_low = 0, ++ .retain_state_suspended = 1, .default_state = LEDS_GPIO_DEFSTATE_ON, ++ .default_trigger = "heartbeat"}, ++ { .name = "minnow_led1", .gpio = GPIO_LED1, .active_low = 0, ++ .retain_state_suspended = 1, .default_state = LEDS_GPIO_DEFSTATE_ON, ++ .default_trigger = "mmc0"}, ++}; ++ ++static struct gpio_led_platform_data minnow_leds_platform_data = { ++ .num_leds = ARRAY_SIZE(minnow_leds), ++ .leds = (void *) minnow_leds, ++}; ++ ++static struct platform_device minnow_gpio_leds = { ++ .name = "leds-gpio", ++ .id = -1, ++ .dev = { ++ .platform_data = &minnow_leds_platform_data, ++ }, ++}; ++ ++static struct gpio hwid_gpios[] = { ++ { GPIO_HWID0, GPIOF_DIR_IN | GPIOF_EXPORT, "minnow_gpio_hwid0" }, ++ { GPIO_HWID1, GPIOF_DIR_IN | GPIOF_EXPORT, "minnow_gpio_hwid1" }, ++ { GPIO_HWID2, GPIOF_DIR_IN | GPIOF_EXPORT, "minnow_gpio_hwid2" }, ++}; ++ ++int minnow_hwid(void) ++{ ++ /* This should never be called prior to minnow_init_module() */ ++ WARN_ON_ONCE(minnow_hwid_val == -1); ++ return minnow_hwid_val; ++} ++EXPORT_SYMBOL_GPL(minnow_hwid); ++ ++bool minnow_detect(void) ++{ ++ const char *cmp; ++ ++ cmp = dmi_get_system_info(DMI_BOARD_NAME); ++ if (cmp && strstr(cmp, "MinnowBoard")) ++ return true; ++ ++ return false; ++} ++EXPORT_SYMBOL_GPL(minnow_detect); ++ ++bool minnow_lvds_detect(void) ++{ ++ return !!gpio_get_value(GPIO_LVDS_DETECT); ++} ++EXPORT_SYMBOL_GPL(minnow_lvds_detect); ++ ++ ++static int __init minnow_module_init(void) ++{ ++ int err, val, i; ++ ++ err = -ENODEV; ++ if (!minnow_detect()) ++ goto out; ++ ++#ifdef MODULE ++/* Load any implicit dependencies that are not built-in */ ++#ifdef CONFIG_LPC_SCH_MODULE ++ if (request_module("lpc_sch")) ++ goto out; ++#endif ++#ifdef CONFIG_GPIO_SCH_MODULE ++ if (request_module("gpio-sch")) ++ goto out; ++#endif ++#ifdef CONFIG_GPIO_PCH_MODULE ++ if (request_module("gpio-pch")) ++ goto out; ++#endif ++#endif ++ ++ /* HWID GPIOs */ ++ err = gpio_request_array(hwid_gpios, ARRAY_SIZE(hwid_gpios)); ++ if (err) { ++ pr_err("Failed to request hwid GPIO lines\n"); ++ goto out; ++ } ++ minnow_hwid_val = (!!gpio_get_value(GPIO_HWID0)) | ++ (!!gpio_get_value(GPIO_HWID1) << 1) | ++ (!!gpio_get_value(GPIO_HWID2) << 2); ++ ++ pr_info("Hardware ID: %d\n", minnow_hwid_val); ++ ++ err = gpio_request_one(GPIO_LVDS_DETECT, GPIOF_DIR_IN | GPIOF_EXPORT, ++ "minnow_lvds_detect"); ++ if (err) { ++ pr_err("Failed to request LVDS_DETECT GPIO line (%d)\n", ++ GPIO_LVDS_DETECT); ++ goto out; ++ } ++ ++ /* Disable the GPIO lines if LVDS is detected */ ++ val = minnow_lvds_detect() ? 1 : 0; ++ pr_info("Aux GPIO lines %s\n", val ? "Disabled" : "Enabled"); ++ for (i = 0; i < 5; i++) ++ sch_gpio_resume_set_enable(i, !val); ++ ++ /* GPIO LEDs */ ++ err = platform_device_register(&minnow_gpio_leds); ++ if (err) { ++ pr_err("Failed to register leds-gpio platform device\n"); ++ goto out_lvds; ++ } ++ goto out; ++ ++ out_lvds: ++ gpio_free(GPIO_LVDS_DETECT); ++ ++ out: ++ return err; ++} ++ ++static void __exit minnow_module_exit(void) ++{ ++ gpio_free(GPIO_LVDS_DETECT); ++ platform_device_unregister(&minnow_gpio_leds); ++} ++ ++module_init(minnow_module_init); ++module_exit(minnow_module_exit); ++ ++MODULE_LICENSE("GPL"); +--- /dev/null ++++ b/include/linux/minnowboard.h +@@ -0,0 +1,37 @@ ++/* ++ * MinnowBoard Linux platform driver ++ * Copyright (c) 2013, Intel Corporation. ++ * All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Author: Darren Hart <dvhart@linux.intel.com> ++ */ ++ ++#ifndef _LINUX_MINNOWBOARD_H ++#define _LINUX_MINNOWBOARD_H ++ ++#if defined(CONFIG_MINNOWBOARD) || defined(CONFIG_MINNOWBOARD_MODULE) ++bool minnow_detect(void); ++bool minnow_lvds_detect(void); ++int minnow_hwid(void); ++void minnow_phy_reset(void); ++#else ++#define minnow_detect() (false) ++#define minnow_lvds_detect() (false) ++#define minnow_hwid() (-1) ++#define minnow_phy_reset() do { } while (0) ++#endif /* MINNOWBOARD */ ++ ++#endif /* _LINUX_MINNOWBOARD_H */ diff --git a/patches.minnowboard/0003-minnowboard-gpio-Export-MinnowBoard-expansion-GPIO.patch b/patches.minnowboard/0003-minnowboard-gpio-Export-MinnowBoard-expansion-GPIO.patch new file mode 100644 index 00000000000000..6a1b34d2b51bf9 --- /dev/null +++ b/patches.minnowboard/0003-minnowboard-gpio-Export-MinnowBoard-expansion-GPIO.patch @@ -0,0 +1,172 @@ +From 5d8dc9ea4644423ea4b8c57495ccf93efc1c51e1 Mon Sep 17 00:00:00 2001 +Message-Id: <5d8dc9ea4644423ea4b8c57495ccf93efc1c51e1.1383605156.git.darren@dvhart.com> +In-Reply-To: <c018204ed1246c0c2129cc2d48f444d89e926034.1383605156.git.darren@dvhart.com> +References: <c018204ed1246c0c2129cc2d48f444d89e926034.1383605156.git.darren@dvhart.com> +From: Darren Hart <dvhart@linux.intel.com> +Date: Sat, 18 May 2013 14:45:58 -0700 +Subject: [PATCH 3/4] minnowboard-gpio: Export MinnowBoard expansion GPIO + +Request and export the user-configurable GPIO lines to sysfs. This provides a +label readable in /debugfs/gpio and a simple interface for experimenting with +GPIO on the MinnowBoard. + +This is separate from the minnowboard driver to provide users with the +flexibility to write kernel drivers for their own devices using these GPIO +lines. + +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +--- + drivers/platform/x86/Kconfig | 18 +++++ + drivers/platform/x86/Makefile | 1 + drivers/platform/x86/minnowboard-gpio.c | 108 ++++++++++++++++++++++++++++++++ + 3 files changed, 127 insertions(+) + create mode 100644 drivers/platform/x86/minnowboard-gpio.c + +--- a/drivers/platform/x86/Kconfig ++++ b/drivers/platform/x86/Kconfig +@@ -35,6 +35,24 @@ config MINNOWBOARD + + If you have a MinnowBoard, say Y or M here. + ++if MINNOWBOARD ++config MINNOWBOARD_GPIO ++ tristate "MinnowBoard Expansion GPIO" ++ depends on MINNOWBOARD ++ default n ++ ---help--- ++ Export the EG20T (gpio-pch) lines on the expansion connector to sysfs ++ for easy manipulation from userspace. These will be named ++ "minnow_gpio_pch[0-7]". If LVDS is not in use, export the E6XX ++ (gpio-sch) lines on the expansion connector to sysfs, these will be ++ named "minnow_gpio_aux[0-4]". ++ ++ If you have a MinnowBoard, and want to experiment with the GPIO, ++ say Y or M here. ++ ++endif # MINNOWBOARD ++ ++ + config ACER_WMI + tristate "Acer WMI Laptop Extras" + depends on ACPI +--- a/drivers/platform/x86/Makefile ++++ b/drivers/platform/x86/Makefile +@@ -3,6 +3,7 @@ + # x86 Platform-Specific Drivers + # + obj-$(CONFIG_MINNOWBOARD) += minnowboard.o ++obj-$(CONFIG_MINNOWBOARD_GPIO) += minnowboard-gpio.o + obj-$(CONFIG_ASUS_LAPTOP) += asus-laptop.o + obj-$(CONFIG_ASUS_WMI) += asus-wmi.o + obj-$(CONFIG_ASUS_NB_WMI) += asus-nb-wmi.o +--- /dev/null ++++ b/drivers/platform/x86/minnowboard-gpio.c +@@ -0,0 +1,108 @@ ++/* ++ * MinnowBoard Linux platform driver ++ * Copyright (c) 2013, Intel Corporation. ++ * All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Author: Darren Hart <dvhart@linux.intel.com> ++ */ ++ ++#include <linux/platform_device.h> ++#include <linux/module.h> ++#include <linux/gpio.h> ++#include <linux/gpio_keys.h> ++#include <linux/input.h> ++#include <linux/minnowboard.h> ++#include "minnowboard-gpio.h" ++ ++static struct gpio expansion_gpios[] = { ++ { GPIO_PCH0, GPIOF_DIR_IN | GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE, ++ "minnow_gpio_pch0" }, ++ { GPIO_PCH1, GPIOF_DIR_IN | GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE, ++ "minnow_gpio_pch1" }, ++ { GPIO_PCH2, GPIOF_DIR_IN | GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE, ++ "minnow_gpio_pch2" }, ++ { GPIO_PCH3, GPIOF_DIR_IN | GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE, ++ "minnow_gpio_pch3" }, ++ { GPIO_PCH4, GPIOF_DIR_IN | GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE, ++ "minnow_gpio_pch4" }, ++ { GPIO_PCH5, GPIOF_DIR_IN | GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE, ++ "minnow_gpio_pch5" }, ++ { GPIO_PCH6, GPIOF_DIR_IN | GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE, ++ "minnow_gpio_pch6" }, ++ { GPIO_PCH7, GPIOF_DIR_IN | GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE, ++ "minnow_gpio_pch7" }, ++}; ++ ++static struct gpio expansion_aux_gpios[] = { ++ { GPIO_AUX0, GPIOF_DIR_IN | GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE, ++ "minnow_gpio_aux0" }, ++ { GPIO_AUX1, GPIOF_DIR_IN | GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE, ++ "minnow_gpio_aux1" }, ++ { GPIO_AUX2, GPIOF_DIR_IN | GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE, ++ "minnow_gpio_aux2" }, ++ { GPIO_AUX3, GPIOF_DIR_IN | GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE, ++ "minnow_gpio_aux3" }, ++ { GPIO_AUX4, GPIOF_DIR_IN | GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE, ++ "minnow_gpio_aux4" }, ++}; ++ ++static int __init minnow_gpio_module_init(void) ++{ ++ int err; ++ ++ err = -ENODEV; ++ if (!minnow_detect()) ++ goto out; ++ ++ /* Auxillary Expansion GPIOs */ ++ if (!minnow_lvds_detect()) { ++ pr_debug("LVDS_DETECT not asserted, configuring Aux GPIO lines\n"); ++ err = gpio_request_array(expansion_aux_gpios, ++ ARRAY_SIZE(expansion_aux_gpios)); ++ if (err) { ++ pr_err("Failed to request expansion aux GPIO lines\n"); ++ goto out; ++ } ++ } else { ++ pr_debug("LVDS_DETECT asserted, ignoring aux GPIO lines\n"); ++ } ++ ++ /* Expansion GPIOs */ ++ err = gpio_request_array(expansion_gpios, ARRAY_SIZE(expansion_gpios)); ++ if (err) { ++ pr_err("Failed to request expansion GPIO lines\n"); ++ if (minnow_lvds_detect()) ++ gpio_free_array(expansion_aux_gpios, ++ ARRAY_SIZE(expansion_aux_gpios)); ++ goto out; ++ } ++ ++ out: ++ return err; ++} ++ ++static void __exit minnow_gpio_module_exit(void) ++{ ++ if (minnow_lvds_detect()) ++ gpio_free_array(expansion_aux_gpios, ++ ARRAY_SIZE(expansion_aux_gpios)); ++ gpio_free_array(expansion_gpios, ARRAY_SIZE(expansion_gpios)); ++} ++ ++module_init(minnow_gpio_module_init); ++module_exit(minnow_gpio_module_exit); ++ ++MODULE_LICENSE("GPL"); diff --git a/patches.minnowboard/0004-minnowboard-keys-Bind-MinnowBoard-buttons-to-arrow-k.patch b/patches.minnowboard/0004-minnowboard-keys-Bind-MinnowBoard-buttons-to-arrow-k.patch new file mode 100644 index 00000000000000..b328cb19e155e5 --- /dev/null +++ b/patches.minnowboard/0004-minnowboard-keys-Bind-MinnowBoard-buttons-to-arrow-k.patch @@ -0,0 +1,162 @@ +From f2e8f76ba6fdf47967d6dd0edc3332b0de3f488d Mon Sep 17 00:00:00 2001 +Message-Id: <f2e8f76ba6fdf47967d6dd0edc3332b0de3f488d.1383605156.git.darren@dvhart.com> +In-Reply-To: <c018204ed1246c0c2129cc2d48f444d89e926034.1383605156.git.darren@dvhart.com> +References: <c018204ed1246c0c2129cc2d48f444d89e926034.1383605156.git.darren@dvhart.com> +From: Darren Hart <dvhart@linux.intel.com> +Date: Sat, 18 May 2013 14:45:59 -0700 +Subject: [PATCH 4/4] minnowboard-keys: Bind MinnowBoard buttons to arrow keys + +Configure the four buttons tied to the E6XX GPIO lines on the +MinnowBoard as keys using the gpio-keys-polled platform driver. From +left to right, bind them to LEFT, DOWN, UP, RIGHT, similar to the VI +directional keys. + +This is separate from the minnowboard driver to provide users with the +flexibility to write kernel drivers for their own devices using these GPIO +lines. + +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +--- + drivers/platform/x86/Kconfig | 14 ++++ + drivers/platform/x86/Makefile | 1 + drivers/platform/x86/minnowboard-keys.c | 101 ++++++++++++++++++++++++++++++++ + 3 files changed, 116 insertions(+) + create mode 100644 drivers/platform/x86/minnowboard-keys.c + +--- a/drivers/platform/x86/Kconfig ++++ b/drivers/platform/x86/Kconfig +@@ -50,6 +50,20 @@ config MINNOWBOARD_GPIO + If you have a MinnowBoard, and want to experiment with the GPIO, + say Y or M here. + ++config MINNOWBOARD_KEYS ++ tristate "MinnowBoard GPIO Keys" ++ depends on MINNOWBOARD ++ depends on KEYBOARD_GPIO_POLLED ++ default n ++ ---help--- ++ Configure the four buttons tied to the E6XX GPIO lines on the ++ MinnowBoard as keys using the gpio-keys-polled platform driver. From ++ left to right, bind them to LEFT, DOWN, UP, RIGHT, similar to the VI ++ directional keys. ++ ++ If you have a MinnowBoard and want to use the buttons as arrow keys, ++ say Y or M here. ++ + endif # MINNOWBOARD + + +--- a/drivers/platform/x86/Makefile ++++ b/drivers/platform/x86/Makefile +@@ -4,6 +4,7 @@ + # + obj-$(CONFIG_MINNOWBOARD) += minnowboard.o + obj-$(CONFIG_MINNOWBOARD_GPIO) += minnowboard-gpio.o ++obj-$(CONFIG_MINNOWBOARD_KEYS) += minnowboard-keys.o + obj-$(CONFIG_ASUS_LAPTOP) += asus-laptop.o + obj-$(CONFIG_ASUS_WMI) += asus-wmi.o + obj-$(CONFIG_ASUS_NB_WMI) += asus-nb-wmi.o +--- /dev/null ++++ b/drivers/platform/x86/minnowboard-keys.c +@@ -0,0 +1,101 @@ ++/* ++ * MinnowBoard Linux platform driver ++ * Copyright (c) 2013, Intel Corporation. ++ * All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Author: Darren Hart <dvhart@linux.intel.com> ++ */ ++ ++#include <linux/platform_device.h> ++#include <linux/module.h> ++#include <linux/gpio.h> ++#include <linux/gpio_keys.h> ++#include <linux/input.h> ++#include <linux/minnowboard.h> ++#include "minnowboard-gpio.h" ++ ++/* VI-style direction keys seem like as good as anything */ ++#define GPIO_BTN0_KEY KEY_LEFT ++#define GPIO_BTN1_KEY KEY_DOWN ++#define GPIO_BTN2_KEY KEY_UP ++#define GPIO_BTN3_KEY KEY_RIGHT ++ ++/* Timing in milliseconds */ ++#define GPIO_DEBOUNCE 1 ++#define BUTTON_POLL_INTERVAL 300 ++ ++/* gpio-keys platform device structures */ ++static struct gpio_keys_button minnow_buttons[] = { ++ { .code = GPIO_BTN0_KEY, .gpio = GPIO_BTN0, .active_low = 1, ++ .desc = "minnow_btn0", .type = EV_KEY, .wakeup = 0, ++ .debounce_interval = GPIO_DEBOUNCE, .can_disable = true }, ++ { .code = GPIO_BTN1_KEY, .gpio = GPIO_BTN1, .active_low = 1, ++ .desc = "minnow_btn1", .type = EV_KEY, .wakeup = 0, ++ .debounce_interval = GPIO_DEBOUNCE, .can_disable = true }, ++ { .code = GPIO_BTN2_KEY, .gpio = GPIO_BTN2, .active_low = 1, ++ .desc = "minnow_btn2", .type = EV_KEY, .wakeup = 0, ++ .debounce_interval = GPIO_DEBOUNCE, .can_disable = true }, ++ { .code = GPIO_BTN3_KEY, .gpio = GPIO_BTN3, .active_low = 1, ++ .desc = "minnow_btn3", .type = EV_KEY, .wakeup = 0, ++ .debounce_interval = GPIO_DEBOUNCE, .can_disable = true }, ++}; ++ ++static const struct gpio_keys_platform_data minnow_buttons_platform_data = { ++ .buttons = minnow_buttons, ++ .nbuttons = ARRAY_SIZE(minnow_buttons), ++ .poll_interval = BUTTON_POLL_INTERVAL, ++ .rep = 1, ++ .enable = NULL, ++ .disable = NULL, ++ .name = "minnow_buttons", ++}; ++ ++static struct platform_device minnow_gpio_buttons = { ++ .name = "gpio-keys-polled", ++ .id = -1, ++ .dev = { ++ .platform_data = (void *) &minnow_buttons_platform_data, ++ }, ++}; ++ ++static int __init minnow_keys_module_init(void) ++{ ++ int err; ++ ++ err = -ENODEV; ++ if (!minnow_detect()) ++ goto out; ++ ++ /* Export GPIO buttons to sysfs */ ++ err = platform_device_register(&minnow_gpio_buttons); ++ if (err) { ++ pr_err("Failed to register gpio-keys-polled platform device\n"); ++ goto out; ++ } ++ ++ out: ++ return err; ++} ++ ++static void __exit minnow_keys_module_exit(void) ++{ ++ platform_device_unregister(&minnow_gpio_buttons); ++} ++ ++module_init(minnow_keys_module_init); ++module_exit(minnow_keys_module_exit); ++ ++MODULE_LICENSE("GPL"); |