From 7658d764c1e8f56108c5327cab1e85c6d083fa91 Mon Sep 17 00:00:00 2001 From: Andrea Adami Date: Mon, 13 Apr 2015 23:31:01 +0200 Subject: linux-handheld: initial commit of kernel v. 4.0 Build tested for Zaurus and Ipaq h3600, hx4700 Signed-off-by: Andrea Adami --- ...-port-LoCoMo-gpio-support-from-old-driver.patch | 226 +++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 recipes-kernel/linux/linux-handheld-4.0/locomo/0008-GPIO-port-LoCoMo-gpio-support-from-old-driver.patch (limited to 'recipes-kernel/linux/linux-handheld-4.0/locomo/0008-GPIO-port-LoCoMo-gpio-support-from-old-driver.patch') diff --git a/recipes-kernel/linux/linux-handheld-4.0/locomo/0008-GPIO-port-LoCoMo-gpio-support-from-old-driver.patch b/recipes-kernel/linux/linux-handheld-4.0/locomo/0008-GPIO-port-LoCoMo-gpio-support-from-old-driver.patch new file mode 100644 index 0000000..3f72520 --- /dev/null +++ b/recipes-kernel/linux/linux-handheld-4.0/locomo/0008-GPIO-port-LoCoMo-gpio-support-from-old-driver.patch @@ -0,0 +1,226 @@ +From d9847bd340045c31bfdde1fa91f319b3cfb196c0 Mon Sep 17 00:00:00 2001 +From: Dmitry Eremin-Solenikov +Date: Mon, 11 Nov 2013 03:03:21 +0400 +Subject: [PATCH 08/20] GPIO: port LoCoMo gpio support from old driver + +Add gpiolib driver for gpio pins placed on the LoCoMo GA. + +Signed-off-by: Dmitry Eremin-Solenikov +--- + drivers/gpio/Kconfig | 9 +++ + drivers/gpio/Makefile | 1 + + drivers/gpio/gpio-locomo.c | 170 +++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 180 insertions(+) + create mode 100644 drivers/gpio/gpio-locomo.c + +diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig +index c1e2ca3..9b1c2e6 100644 +--- a/drivers/gpio/Kconfig ++++ b/drivers/gpio/Kconfig +@@ -504,6 +504,15 @@ config GPIO_TB10X + select GENERIC_IRQ_CHIP + select OF_GPIO + ++config GPIO_LOCOMO ++ bool "Sharp LoCoMo GPIO support" ++ depends on MFD_LOCOMO ++ help ++ Select this to support GPIO pins on Sharp LoCoMo Grid Array found ++ in Sharp Zaurus collie and poodle models. ++ ++ Sat Yes if you have such PDA, say No otherwise. ++ + comment "I2C GPIO expanders:" + + config GPIO_ARIZONA +diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile +index bdda6a9..0a97e98 100644 +--- a/drivers/gpio/Makefile ++++ b/drivers/gpio/Makefile +@@ -41,6 +41,7 @@ obj-$(CONFIG_GPIO_JANZ_TTL) += gpio-janz-ttl.o + obj-$(CONFIG_GPIO_KEMPLD) += gpio-kempld.o + obj-$(CONFIG_ARCH_KS8695) += gpio-ks8695.o + obj-$(CONFIG_GPIO_INTEL_MID) += gpio-intel-mid.o ++obj-$(CONFIG_GPIO_LOCOMO) += gpio-locomo.o + obj-$(CONFIG_GPIO_LP3943) += gpio-lp3943.o + obj-$(CONFIG_ARCH_LPC32XX) += gpio-lpc32xx.o + obj-$(CONFIG_GPIO_LYNXPOINT) += gpio-lynxpoint.o +diff --git a/drivers/gpio/gpio-locomo.c b/drivers/gpio/gpio-locomo.c +new file mode 100644 +index 0000000..dd9a1ca +--- /dev/null ++++ b/drivers/gpio/gpio-locomo.c +@@ -0,0 +1,170 @@ ++/* ++ * Sharp LoCoMo support for GPIO ++ * ++ * 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. ++ * ++ * This file contains all generic LoCoMo support. ++ * ++ * All initialization functions provided here are intended to be called ++ * from machine specific code with proper arguments when required. ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++struct locomo_gpio { ++ struct regmap *regmap; ++ ++ struct gpio_chip gpio; ++ ++ u16 rising_edge; ++ u16 falling_edge; ++ ++ unsigned int save_gpo; ++ unsigned int save_gpe; ++}; ++ ++static int locomo_gpio_get(struct gpio_chip *chip, ++ unsigned offset) ++{ ++ struct locomo_gpio *lg = container_of(chip, struct locomo_gpio, gpio); ++ unsigned int gpl; ++ ++ regmap_read(lg->regmap, LOCOMO_GPL, &gpl); ++ ++ return gpl & BIT(offset); ++} ++ ++static void locomo_gpio_set(struct gpio_chip *chip, ++ unsigned offset, int value) ++{ ++ struct locomo_gpio *lg = container_of(chip, struct locomo_gpio, gpio); ++ ++ regmap_update_bits(lg->regmap, LOCOMO_GPO, ++ BIT(offset), ++ value ? BIT(offset) : 0); ++} ++ ++static int locomo_gpio_direction_input(struct gpio_chip *chip, ++ unsigned offset) ++{ ++ struct locomo_gpio *lg = container_of(chip, struct locomo_gpio, gpio); ++ ++ regmap_update_bits(lg->regmap, LOCOMO_GPD, BIT(offset), BIT(offset)); ++ regmap_update_bits(lg->regmap, LOCOMO_GPE, BIT(offset), BIT(offset)); ++ ++ return 0; ++} ++ ++static int locomo_gpio_direction_output(struct gpio_chip *chip, ++ unsigned offset, int value) ++{ ++ struct locomo_gpio *lg = container_of(chip, struct locomo_gpio, gpio); ++ ++ regmap_update_bits(lg->regmap, LOCOMO_GPO, ++ BIT(offset), ++ value ? BIT(offset) : 0); ++ regmap_update_bits(lg->regmap, LOCOMO_GPD, BIT(offset), 0); ++ regmap_update_bits(lg->regmap, LOCOMO_GPE, BIT(offset), 0); ++ ++ return 0; ++} ++ ++#ifdef CONFIG_PM_SLEEP ++static int locomo_gpio_suspend(struct device *dev) ++{ ++ struct locomo_gpio *lg = dev_get_drvdata(dev); ++ ++ regmap_read(lg->regmap, LOCOMO_GPO, &lg->save_gpo); ++ regmap_write(lg->regmap, LOCOMO_GPO, 0x00); ++ regmap_read(lg->regmap, LOCOMO_GPE, &lg->save_gpe); ++ regmap_write(lg->regmap, LOCOMO_GPE, 0x00); ++ ++ return 0; ++} ++ ++static int locomo_gpio_resume(struct device *dev) ++{ ++ struct locomo_gpio *lg = dev_get_drvdata(dev); ++ ++ regmap_write(lg->regmap, LOCOMO_GPO, lg->save_gpo); ++ regmap_write(lg->regmap, LOCOMO_GPE, lg->save_gpe); ++ ++ return 0; ++} ++static SIMPLE_DEV_PM_OPS(locomo_gpio_pm, ++ locomo_gpio_suspend, locomo_gpio_resume); ++#define LOCOMO_GPIO_PM (&locomo_gpio_pm) ++#else ++#define LOCOMO_GPIO_PM NULL ++#endif ++ ++static int locomo_gpio_probe(struct platform_device *pdev) ++{ ++ struct locomo_gpio *lg; ++ int ret; ++ struct locomo_gpio_platform_data *pdata = dev_get_platdata(&pdev->dev); ++ ++ lg = devm_kzalloc(&pdev->dev, sizeof(struct locomo_gpio), ++ GFP_KERNEL); ++ if (!lg) ++ return -ENOMEM; ++ ++ lg->regmap = dev_get_regmap(pdev->dev.parent, NULL); ++ if (!lg->regmap) ++ return -EINVAL; ++ ++ platform_set_drvdata(pdev, lg); ++ ++ regmap_write(lg->regmap, LOCOMO_GPO, 0x00); ++ regmap_write(lg->regmap, LOCOMO_GPE, 0x00); ++ regmap_write(lg->regmap, LOCOMO_GPD, 0x00); ++ regmap_write(lg->regmap, LOCOMO_GIE, 0x00); ++ ++ lg->gpio.base = pdata ? pdata->gpio_base : -1; ++ lg->gpio.label = "locomo-gpio"; ++ lg->gpio.ngpio = 16; ++ lg->gpio.set = locomo_gpio_set; ++ lg->gpio.get = locomo_gpio_get; ++ lg->gpio.direction_input = locomo_gpio_direction_input; ++ lg->gpio.direction_output = locomo_gpio_direction_output; ++ ++ ret = gpiochip_add(&lg->gpio); ++ if (ret) ++ return ret; ++ ++ return 0; ++} ++ ++static int locomo_gpio_remove(struct platform_device *pdev) ++{ ++ struct locomo_gpio *lg = platform_get_drvdata(pdev); ++ ++ gpiochip_remove(&lg->gpio); ++ ++ return 0; ++} ++ ++static struct platform_driver locomo_gpio_driver = { ++ .probe = locomo_gpio_probe, ++ .remove = locomo_gpio_remove, ++ .driver = { ++ .name = "locomo-gpio", ++ .pm = LOCOMO_GPIO_PM, ++ }, ++}; ++module_platform_driver(locomo_gpio_driver); ++ ++MODULE_DESCRIPTION("Sharp LoCoMo GPIO driver"); ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("John Lenz "); ++MODULE_ALIAS("platform:locomo-gpio"); +-- +1.9.1 + -- cgit 1.2.3-korg