Re: [PATCH 1/2] INPUT: remove IP22-specific code from sgi_btns

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> The Indy front panel gets its own interrupt-based driver, so
> all Indy-specific code needs to be removed from the common
> Indy/O2 volume button driver. Additionally, the driver name
> is changed to emphasize that it is now SGI O2-specific.
>
> Build-tested for IP22 and IP32 targets.

Hi Ralf,

Any news about this patch and the next one? I just checked, it still
applies and builds beautifully :)

Thanks,
Dmitri

>
> Signed-off-by: Dmitri Vorobiev <dmitri.vorobiev@xxxxxxxxx>
> ---
>  drivers/input/misc/Kconfig    |   12 ++--
>  drivers/input/misc/Makefile   |    2 +-
>  drivers/input/misc/o2_btns.c  |  165
> +++++++++++++++++++++++++++++++++++++
>  drivers/input/misc/sgi_btns.c |  179
> -----------------------------------------
>  4 files changed, 172 insertions(+), 186 deletions(-)
>  create mode 100644 drivers/input/misc/o2_btns.c
>  delete mode 100644 drivers/input/misc/sgi_btns.c
>
> diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
> index 199055d..1f93202 100644
> --- a/drivers/input/misc/Kconfig
> +++ b/drivers/input/misc/Kconfig
> @@ -202,15 +202,15 @@ config INPUT_UINPUT
>  	  To compile this driver as a module, choose M here: the
>  	  module will be called uinput.
>
> -config INPUT_SGI_BTNS
> -	tristate "SGI Indy/O2 volume button interface"
> -	depends on SGI_IP22 || SGI_IP32
> +config INPUT_SGI_O2_BTNS
> +	tristate "SGI O2 volume button interface"
> +	depends on SGI_IP32
>  	select INPUT_POLLDEV
>  	help
> -	  Say Y here if you want to support SGI Indy/O2 volume button interface.
> +	  Say Y here if you want to support SGI O2 volume button interface.
>
> -	  To compile this driver as a module, choose M here: the
> -	  module will be called sgi_btns.
> +	  To compile this driver as a module, choose M here: the module will
> +	  be called o2_btns.
>
>  config HP_SDC_RTC
>  	tristate "HP SDC Real Time Clock"
> diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
> index d7db2ae..2b18c92 100644
> --- a/drivers/input/misc/Makefile
> +++ b/drivers/input/misc/Makefile
> @@ -20,4 +20,4 @@ obj-$(CONFIG_INPUT_CM109)		+= cm109.o
>  obj-$(CONFIG_HP_SDC_RTC)		+= hp_sdc_rtc.o
>  obj-$(CONFIG_INPUT_UINPUT)		+= uinput.o
>  obj-$(CONFIG_INPUT_APANEL)		+= apanel.o
> -obj-$(CONFIG_INPUT_SGI_BTNS)		+= sgi_btns.o
> +obj-$(CONFIG_INPUT_SGI_O2_BTNS)		+= o2_btns.o
> diff --git a/drivers/input/misc/o2_btns.c b/drivers/input/misc/o2_btns.c
> new file mode 100644
> index 0000000..7adadc5
> --- /dev/null
> +++ b/drivers/input/misc/o2_btns.c
> @@ -0,0 +1,165 @@
> +/*
> + *  SGI Volume Button interface driver
> + *
> + *  Copyright (C) 2008  Thomas Bogendoerfer <tsbogend@xxxxxxxxxxxxxxxx>
> + *
> + *  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., 51 Franklin Street, Fifth Floor, Boston, MA
> 02110-1301 USA
> + */
> +#include <linux/init.h>
> +#include <linux/input-polldev.h>
> +#include <linux/ioport.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +
> +#include <asm/ip32/mace.h>
> +
> +static inline u8 button_status(void)
> +{
> +	u64 status;
> +
> +	status = readq(&mace->perif.audio.control);
> +	writeq(status & ~(3U << 23), &mace->perif.audio.control);
> +
> +	return (status >> 23) & 3;
> +}
> +
> +#define BUTTONS_POLL_INTERVAL	30	/* msec */
> +#define BUTTONS_COUNT_THRESHOLD	3
> +
> +static const unsigned short sgi_map[] = {
> +	KEY_VOLUMEDOWN,
> +	KEY_VOLUMEUP
> +};
> +
> +struct buttons_dev {
> +	struct input_polled_dev *poll_dev;
> +	unsigned short keymap[ARRAY_SIZE(sgi_map)];
> +	int count[ARRAY_SIZE(sgi_map)];
> +};
> +
> +static void handle_buttons(struct input_polled_dev *dev)
> +{
> +	struct buttons_dev *bdev = dev->private;
> +	struct input_dev *input = dev->input;
> +	u8 status;
> +	int i;
> +
> +	status = button_status();
> +
> +	for (i = 0; i < ARRAY_SIZE(bdev->keymap); i++) {
> +		if (status & (1U << i)) {
> +			if (++bdev->count[i] == BUTTONS_COUNT_THRESHOLD) {
> +				input_event(input, EV_MSC, MSC_SCAN, i);
> +				input_report_key(input, bdev->keymap[i], 1);
> +				input_sync(input);
> +			}
> +		} else {
> +			if (bdev->count[i] >= BUTTONS_COUNT_THRESHOLD) {
> +				input_event(input, EV_MSC, MSC_SCAN, i);
> +				input_report_key(input, bdev->keymap[i], 0);
> +				input_sync(input);
> +			}
> +			bdev->count[i] = 0;
> +		}
> +	}
> +}
> +
> +static int __devinit sgi_buttons_probe(struct platform_device *pdev)
> +{
> +	struct buttons_dev *bdev;
> +	struct input_polled_dev *poll_dev;
> +	struct input_dev *input;
> +	int error, i;
> +
> +	bdev = kzalloc(sizeof(struct buttons_dev), GFP_KERNEL);
> +	poll_dev = input_allocate_polled_device();
> +	if (!bdev || !poll_dev) {
> +		error = -ENOMEM;
> +		goto err_free_mem;
> +	}
> +
> +	memcpy(bdev->keymap, sgi_map, sizeof(bdev->keymap));
> +
> +	poll_dev->private = bdev;
> +	poll_dev->poll = handle_buttons;
> +	poll_dev->poll_interval = BUTTONS_POLL_INTERVAL;
> +
> +	input = poll_dev->input;
> +	input->name = "SGI buttons";
> +	input->phys = "sgi/input0";
> +	input->id.bustype = BUS_HOST;
> +	input->dev.parent = &pdev->dev;
> +
> +	input->keycode = bdev->keymap;
> +	input->keycodemax = ARRAY_SIZE(bdev->keymap);
> +	input->keycodesize = sizeof(unsigned short);
> +
> +	input_set_capability(input, EV_MSC, MSC_SCAN);
> +	__set_bit(EV_KEY, input->evbit);
> +	for (i = 0; i < ARRAY_SIZE(sgi_map); i++)
> +		__set_bit(bdev->keymap[i], input->keybit);
> +	__clear_bit(KEY_RESERVED, input->keybit);
> +
> +	bdev->poll_dev = poll_dev;
> +	dev_set_drvdata(&pdev->dev, bdev);
> +
> +	error = input_register_polled_device(poll_dev);
> +	if (error)
> +		goto err_free_mem;
> +
> +	return 0;
> +
> + err_free_mem:
> +	input_free_polled_device(poll_dev);
> +	kfree(bdev);
> +	dev_set_drvdata(&pdev->dev, NULL);
> +	return error;
> +}
> +
> +static int __devexit sgi_buttons_remove(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct buttons_dev *bdev = dev_get_drvdata(dev);
> +
> +	input_unregister_polled_device(bdev->poll_dev);
> +	input_free_polled_device(bdev->poll_dev);
> +	kfree(bdev);
> +	dev_set_drvdata(dev, NULL);
> +
> +	return 0;
> +}
> +
> +static struct platform_driver sgi_buttons_driver = {
> +	.probe	= sgi_buttons_probe,
> +	.remove	= __devexit_p(sgi_buttons_remove),
> +	.driver	= {
> +		.name	= "sgibtns",
> +		.owner	= THIS_MODULE,
> +	},
> +};
> +
> +static int __init sgi_buttons_init(void)
> +{
> +	return platform_driver_register(&sgi_buttons_driver);
> +}
> +
> +static void __exit sgi_buttons_exit(void)
> +{
> +	platform_driver_unregister(&sgi_buttons_driver);
> +}
> +
> +MODULE_LICENSE("GPL");
> +module_init(sgi_buttons_init);
> +module_exit(sgi_buttons_exit);
> diff --git a/drivers/input/misc/sgi_btns.c b/drivers/input/misc/sgi_btns.c
> deleted file mode 100644
> index be3a15f..0000000
> --- a/drivers/input/misc/sgi_btns.c
> +++ /dev/null
> @@ -1,179 +0,0 @@
> -/*
> - *  SGI Volume Button interface driver
> - *
> - *  Copyright (C) 2008  Thomas Bogendoerfer <tsbogend@xxxxxxxxxxxxxxxx>
> - *
> - *  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., 51 Franklin Street, Fifth Floor, Boston, MA
> 02110-1301 USA
> - */
> -#include <linux/init.h>
> -#include <linux/input-polldev.h>
> -#include <linux/ioport.h>
> -#include <linux/module.h>
> -#include <linux/platform_device.h>
> -
> -#ifdef CONFIG_SGI_IP22
> -#include <asm/sgi/ioc.h>
> -
> -static inline u8 button_status(void)
> -{
> -	u8 status;
> -
> -	status = readb(&sgioc->panel) ^ 0xa0;
> -	return ((status & 0x80) >> 6) | ((status & 0x20) >> 5);
> -}
> -#endif
> -
> -#ifdef CONFIG_SGI_IP32
> -#include <asm/ip32/mace.h>
> -
> -static inline u8 button_status(void)
> -{
> -	u64 status;
> -
> -	status = readq(&mace->perif.audio.control);
> -	writeq(status & ~(3U << 23), &mace->perif.audio.control);
> -
> -	return (status >> 23) & 3;
> -}
> -#endif
> -
> -#define BUTTONS_POLL_INTERVAL	30	/* msec */
> -#define BUTTONS_COUNT_THRESHOLD	3
> -
> -static const unsigned short sgi_map[] = {
> -	KEY_VOLUMEDOWN,
> -	KEY_VOLUMEUP
> -};
> -
> -struct buttons_dev {
> -	struct input_polled_dev *poll_dev;
> -	unsigned short keymap[ARRAY_SIZE(sgi_map)];
> -	int count[ARRAY_SIZE(sgi_map)];
> -};
> -
> -static void handle_buttons(struct input_polled_dev *dev)
> -{
> -	struct buttons_dev *bdev = dev->private;
> -	struct input_dev *input = dev->input;
> -	u8 status;
> -	int i;
> -
> -	status = button_status();
> -
> -	for (i = 0; i < ARRAY_SIZE(bdev->keymap); i++) {
> -		if (status & (1U << i)) {
> -			if (++bdev->count[i] == BUTTONS_COUNT_THRESHOLD) {
> -				input_event(input, EV_MSC, MSC_SCAN, i);
> -				input_report_key(input, bdev->keymap[i], 1);
> -				input_sync(input);
> -			}
> -		} else {
> -			if (bdev->count[i] >= BUTTONS_COUNT_THRESHOLD) {
> -				input_event(input, EV_MSC, MSC_SCAN, i);
> -				input_report_key(input, bdev->keymap[i], 0);
> -				input_sync(input);
> -			}
> -			bdev->count[i] = 0;
> -		}
> -	}
> -}
> -
> -static int __devinit sgi_buttons_probe(struct platform_device *pdev)
> -{
> -	struct buttons_dev *bdev;
> -	struct input_polled_dev *poll_dev;
> -	struct input_dev *input;
> -	int error, i;
> -
> -	bdev = kzalloc(sizeof(struct buttons_dev), GFP_KERNEL);
> -	poll_dev = input_allocate_polled_device();
> -	if (!bdev || !poll_dev) {
> -		error = -ENOMEM;
> -		goto err_free_mem;
> -	}
> -
> -	memcpy(bdev->keymap, sgi_map, sizeof(bdev->keymap));
> -
> -	poll_dev->private = bdev;
> -	poll_dev->poll = handle_buttons;
> -	poll_dev->poll_interval = BUTTONS_POLL_INTERVAL;
> -
> -	input = poll_dev->input;
> -	input->name = "SGI buttons";
> -	input->phys = "sgi/input0";
> -	input->id.bustype = BUS_HOST;
> -	input->dev.parent = &pdev->dev;
> -
> -	input->keycode = bdev->keymap;
> -	input->keycodemax = ARRAY_SIZE(bdev->keymap);
> -	input->keycodesize = sizeof(unsigned short);
> -
> -	input_set_capability(input, EV_MSC, MSC_SCAN);
> -	__set_bit(EV_KEY, input->evbit);
> -	for (i = 0; i < ARRAY_SIZE(sgi_map); i++)
> -		__set_bit(bdev->keymap[i], input->keybit);
> -	__clear_bit(KEY_RESERVED, input->keybit);
> -
> -	bdev->poll_dev = poll_dev;
> -	dev_set_drvdata(&pdev->dev, bdev);
> -
> -	error = input_register_polled_device(poll_dev);
> -	if (error)
> -		goto err_free_mem;
> -
> -	return 0;
> -
> - err_free_mem:
> -	input_free_polled_device(poll_dev);
> -	kfree(bdev);
> -	dev_set_drvdata(&pdev->dev, NULL);
> -	return error;
> -}
> -
> -static int __devexit sgi_buttons_remove(struct platform_device *pdev)
> -{
> -	struct device *dev = &pdev->dev;
> -	struct buttons_dev *bdev = dev_get_drvdata(dev);
> -
> -	input_unregister_polled_device(bdev->poll_dev);
> -	input_free_polled_device(bdev->poll_dev);
> -	kfree(bdev);
> -	dev_set_drvdata(dev, NULL);
> -
> -	return 0;
> -}
> -
> -static struct platform_driver sgi_buttons_driver = {
> -	.probe	= sgi_buttons_probe,
> -	.remove	= __devexit_p(sgi_buttons_remove),
> -	.driver	= {
> -		.name	= "sgibtns",
> -		.owner	= THIS_MODULE,
> -	},
> -};
> -
> -static int __init sgi_buttons_init(void)
> -{
> -	return platform_driver_register(&sgi_buttons_driver);
> -}
> -
> -static void __exit sgi_buttons_exit(void)
> -{
> -	platform_driver_unregister(&sgi_buttons_driver);
> -}
> -
> -MODULE_LICENSE("GPL");
> -module_init(sgi_buttons_init);
> -module_exit(sgi_buttons_exit);
> --
> 1.5.4.3
>
>



[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux