> 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 > >