diff --git a/drivers/media/rc/Kconfig b/drivers/media/rc/Kconfig index ddfab256b9a5..60a61d97078e 100644 --- a/drivers/media/rc/Kconfig +++ b/drivers/media/rc/Kconfig @@ -367,6 +367,16 @@ config IR_GPIO_CIR To compile this driver as a module, choose M here: the module will be called gpio-ir-recv. +config IR_GPIOPLUG_CIR + tristate "GPIOPLUG IR remote control" + depends on RC_CORE + select IR_GPIO_CIR + ---help--- + Say Y if you want to use GPIOPLUG based IR Receiver. + + To compile this driver as a module, choose M here: the module will + be called gpio-ir-recv. + config RC_ST tristate "ST remote control receiver" depends on RC_CORE diff --git a/drivers/media/rc/Makefile b/drivers/media/rc/Makefile index 379a5c0f1379..61939e44ad99 100644 --- a/drivers/media/rc/Makefile +++ b/drivers/media/rc/Makefile @@ -31,6 +31,7 @@ obj-$(CONFIG_IR_STREAMZAP) += streamzap.o obj-$(CONFIG_IR_WINBOND_CIR) += winbond-cir.o obj-$(CONFIG_RC_LOOPBACK) += rc-loopback.o obj-$(CONFIG_IR_GPIO_CIR) += gpio-ir-recv.o +obj-$(CONFIG_IR_GPIOPLUG_CIR) += gpioplug-ir-recv.o obj-$(CONFIG_IR_IGORPLUGUSB) += igorplugusb.o obj-$(CONFIG_IR_IGUANA) += iguanair.o obj-$(CONFIG_IR_TTUSBIR) += ttusbir.o diff --git a/drivers/media/rc/gpio-ir-recv.c b/drivers/media/rc/gpio-ir-recv.c index 7dbc9ca6d885..df77f2358a2a 100644 --- a/drivers/media/rc/gpio-ir-recv.c +++ b/drivers/media/rc/gpio-ir-recv.c @@ -23,9 +23,6 @@ #include #include -#define GPIO_IR_DRIVER_NAME "gpio-rc-recv" -#define GPIO_IR_DEVICE_NAME "gpio_ir_recv" - struct gpio_rc_dev { struct rc_dev *rcdev; int gpio_nr; diff --git a/drivers/media/rc/gpioplug-ir-recv.c b/drivers/media/rc/gpioplug-ir-recv.c new file mode 100644 index 000000000000..8c4020a5ee28 --- /dev/null +++ b/drivers/media/rc/gpioplug-ir-recv.c @@ -0,0 +1,93 @@ +/* + * Pluggable GPIO IR receiver + * + * Copyright (c) 2015 Dongjin Kim (tobetter@gmail.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +static unsigned gpio_nr = -1; +module_param(gpio_nr, uint, 0); +MODULE_PARM_DESC(gpio_nr, "GPIO number to receive IR pulse"); + +static bool active_low = 0; +module_param(active_low, bool, 0); +MODULE_PARM_DESC(active_low, + "IR pulse trigger level, (1=low active, 0=high active"); + +static struct platform_device *pdev; +static struct gpio_ir_recv_platform_data *pdata; + +static int __init gpio_init(void) +{ + int rc = -ENOMEM; + + if (gpio_nr == -1) { + pr_err("gpioplug-ir-recv: missing module parameter: 'gpio_nr'\n"); + return -EINVAL; + } + + pdev = platform_device_alloc(GPIO_IR_DRIVER_NAME, -1); + if (!pdev) + return rc; + + pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + goto err_free_platform_data; + + pdev->dev.platform_data = pdata; + + pdata->gpio_nr = gpio_nr; + pdata->active_low = active_low; + pdata->allowed_protos = 0; + pdata->map_name = NULL; + + rc = platform_device_add(pdev); + if (rc < 0) + goto err_free_device; + + dev_info (&pdev->dev, "IR driver is initialized (gpio=%d, pulse level=%s)\n", + pdata->gpio_nr, pdata->active_low ? "low" : "high"); + + return 0; + +err_free_platform_data: + kfree(pdata); + +err_free_device: + platform_device_put(pdev); + + return rc; +} + +static void __exit gpio_exit(void) +{ + dev_info(&pdev->dev, "gpioplug-ir-recv: IR driver is removed\n"); + platform_device_unregister(pdev); +} + +MODULE_DESCRIPTION("GPIO IR Receiver driver"); +MODULE_LICENSE("GPL v2"); + +module_init(gpio_init); +module_exit(gpio_exit); diff --git a/include/media/gpio-ir-recv.h b/include/media/gpio-ir-recv.h index 0142736a59db..6342d5ebf323 100644 --- a/include/media/gpio-ir-recv.h +++ b/include/media/gpio-ir-recv.h @@ -13,6 +13,9 @@ #ifndef __GPIO_IR_RECV_H__ #define __GPIO_IR_RECV_H__ +#define GPIO_IR_DRIVER_NAME "gpio-rc-recv" +#define GPIO_IR_DEVICE_NAME "gpio_ir_recv" + struct gpio_ir_recv_platform_data { int gpio_nr; bool active_low;