Merge rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
@@ -82,7 +82,7 @@ static int evdev_fasync(int fd, struct file *file, int on)
|
||||
return retval < 0 ? retval : 0;
|
||||
}
|
||||
|
||||
static int evdev_flush(struct file * file)
|
||||
static int evdev_flush(struct file * file, fl_owner_t id)
|
||||
{
|
||||
struct evdev_list *list = file->private_data;
|
||||
if (!list->evdev->exist) return -ENODEV;
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include <linux/input.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/keyboard.h>
|
||||
|
||||
#include <asm/amigaints.h>
|
||||
#include <asm/amigahw.h>
|
||||
@@ -45,7 +46,7 @@ MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
|
||||
MODULE_DESCRIPTION("Amiga keyboard driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static unsigned char amikbd_keycode[0x78] = {
|
||||
static unsigned char amikbd_keycode[0x78] __initdata = {
|
||||
[0] = KEY_GRAVE,
|
||||
[1] = KEY_1,
|
||||
[2] = KEY_2,
|
||||
@@ -170,12 +171,9 @@ static irqreturn_t amikbd_interrupt(int irq, void *dummy, struct pt_regs *fp)
|
||||
scancode >>= 1;
|
||||
|
||||
if (scancode < 0x78) { /* scancodes < 0x78 are keys */
|
||||
|
||||
scancode = amikbd_keycode[scancode];
|
||||
|
||||
input_regs(amikbd_dev, fp);
|
||||
|
||||
if (scancode == KEY_CAPSLOCK) { /* CapsLock is a toggle switch key on Amiga */
|
||||
if (scancode == 98) { /* CapsLock is a toggle switch key on Amiga */
|
||||
input_report_key(amikbd_dev, scancode, 1);
|
||||
input_report_key(amikbd_dev, scancode, 0);
|
||||
} else {
|
||||
@@ -191,7 +189,7 @@ static irqreturn_t amikbd_interrupt(int irq, void *dummy, struct pt_regs *fp)
|
||||
|
||||
static int __init amikbd_init(void)
|
||||
{
|
||||
int i;
|
||||
int i, j;
|
||||
|
||||
if (!AMIGAHW_PRESENT(AMI_KEYBOARD))
|
||||
return -EIO;
|
||||
@@ -214,14 +212,26 @@ static int __init amikbd_init(void)
|
||||
amikbd_dev->id.version = 0x0100;
|
||||
|
||||
amikbd_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
|
||||
amikbd_dev->keycode = amikbd_keycode;
|
||||
amikbd_dev->keycodesize = sizeof(unsigned char);
|
||||
amikbd_dev->keycodemax = ARRAY_SIZE(amikbd_keycode);
|
||||
|
||||
for (i = 0; i < 0x78; i++)
|
||||
if (amikbd_keycode[i])
|
||||
set_bit(amikbd_keycode[i], amikbd_dev->keybit);
|
||||
set_bit(i, amikbd_dev->keybit);
|
||||
|
||||
for (i = 0; i < MAX_NR_KEYMAPS; i++) {
|
||||
static u_short temp_map[NR_KEYS] __initdata;
|
||||
if (!key_maps[i])
|
||||
continue;
|
||||
memset(temp_map, 0, sizeof(temp_map));
|
||||
for (j = 0; j < 0x78; j++) {
|
||||
if (!amikbd_keycode[j])
|
||||
continue;
|
||||
temp_map[j] = key_maps[i][amikbd_keycode[j]];
|
||||
}
|
||||
for (j = 0; j < NR_KEYS; j++) {
|
||||
if (!temp_map[j])
|
||||
temp_map[j] = 0xf200;
|
||||
}
|
||||
memcpy(key_maps[i], temp_map, sizeof(temp_map));
|
||||
}
|
||||
ciaa.cra &= ~0x41; /* serial data in, turn off TA */
|
||||
request_irq(IRQ_AMIGA_CIAA_SP, amikbd_interrupt, 0, "amikbd", amikbd_interrupt);
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ config INPUT_PCSPKR
|
||||
|
||||
config INPUT_SPARCSPKR
|
||||
tristate "SPARC Speaker support"
|
||||
depends on PCI && SPARC
|
||||
depends on PCI && SPARC64
|
||||
help
|
||||
Say Y here if you want the standard Speaker on Sparc PCI systems
|
||||
to be used for bells and whistles.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* Driver for PC-speaker like devices found on various Sparc systems.
|
||||
*
|
||||
* Copyright (c) 2002 Vojtech Pavlik
|
||||
* Copyright (c) 2002 David S. Miller (davem@redhat.com)
|
||||
* Copyright (c) 2002, 2006 David S. Miller (davem@davemloft.net)
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <linux/kernel.h>
|
||||
@@ -13,21 +13,23 @@
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/ebus.h>
|
||||
#ifdef CONFIG_SPARC64
|
||||
#include <asm/isa.h>
|
||||
#endif
|
||||
|
||||
MODULE_AUTHOR("David S. Miller <davem@redhat.com>");
|
||||
MODULE_AUTHOR("David S. Miller <davem@davemloft.net>");
|
||||
MODULE_DESCRIPTION("Sparc Speaker beeper driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
const char *beep_name;
|
||||
static unsigned long beep_iobase;
|
||||
static int (*beep_event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);
|
||||
static DEFINE_SPINLOCK(beep_lock);
|
||||
struct sparcspkr_state {
|
||||
const char *name;
|
||||
unsigned long iobase;
|
||||
int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);
|
||||
spinlock_t lock;
|
||||
struct input_dev *input_dev;
|
||||
};
|
||||
|
||||
static int ebus_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
|
||||
{
|
||||
struct sparcspkr_state *state = dev_get_drvdata(dev->cdev.dev);
|
||||
unsigned int count = 0;
|
||||
unsigned long flags;
|
||||
|
||||
@@ -43,24 +45,24 @@ static int ebus_spkr_event(struct input_dev *dev, unsigned int type, unsigned in
|
||||
if (value > 20 && value < 32767)
|
||||
count = 1193182 / value;
|
||||
|
||||
spin_lock_irqsave(&beep_lock, flags);
|
||||
spin_lock_irqsave(&state->lock, flags);
|
||||
|
||||
/* EBUS speaker only has on/off state, the frequency does not
|
||||
* appear to be programmable.
|
||||
*/
|
||||
if (beep_iobase & 0x2UL)
|
||||
outb(!!count, beep_iobase);
|
||||
if (state->iobase & 0x2UL)
|
||||
outb(!!count, state->iobase);
|
||||
else
|
||||
outl(!!count, beep_iobase);
|
||||
outl(!!count, state->iobase);
|
||||
|
||||
spin_unlock_irqrestore(&beep_lock, flags);
|
||||
spin_unlock_irqrestore(&state->lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPARC64
|
||||
static int isa_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
|
||||
{
|
||||
struct sparcspkr_state *state = dev_get_drvdata(dev->cdev.dev);
|
||||
unsigned int count = 0;
|
||||
unsigned long flags;
|
||||
|
||||
@@ -76,29 +78,29 @@ static int isa_spkr_event(struct input_dev *dev, unsigned int type, unsigned int
|
||||
if (value > 20 && value < 32767)
|
||||
count = 1193182 / value;
|
||||
|
||||
spin_lock_irqsave(&beep_lock, flags);
|
||||
spin_lock_irqsave(&state->lock, flags);
|
||||
|
||||
if (count) {
|
||||
/* enable counter 2 */
|
||||
outb(inb(beep_iobase + 0x61) | 3, beep_iobase + 0x61);
|
||||
outb(inb(state->iobase + 0x61) | 3, state->iobase + 0x61);
|
||||
/* set command for counter 2, 2 byte write */
|
||||
outb(0xB6, beep_iobase + 0x43);
|
||||
outb(0xB6, state->iobase + 0x43);
|
||||
/* select desired HZ */
|
||||
outb(count & 0xff, beep_iobase + 0x42);
|
||||
outb((count >> 8) & 0xff, beep_iobase + 0x42);
|
||||
outb(count & 0xff, state->iobase + 0x42);
|
||||
outb((count >> 8) & 0xff, state->iobase + 0x42);
|
||||
} else {
|
||||
/* disable counter 2 */
|
||||
outb(inb_p(beep_iobase + 0x61) & 0xFC, beep_iobase + 0x61);
|
||||
outb(inb_p(state->iobase + 0x61) & 0xFC, state->iobase + 0x61);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&beep_lock, flags);
|
||||
spin_unlock_irqrestore(&state->lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __devinit sparcspkr_probe(struct platform_device *dev)
|
||||
static int __devinit sparcspkr_probe(struct device *dev)
|
||||
{
|
||||
struct sparcspkr_state *state = dev_get_drvdata(dev);
|
||||
struct input_dev *input_dev;
|
||||
int error;
|
||||
|
||||
@@ -106,18 +108,18 @@ static int __devinit sparcspkr_probe(struct platform_device *dev)
|
||||
if (!input_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
input_dev->name = beep_name;
|
||||
input_dev->name = state->name;
|
||||
input_dev->phys = "sparc/input0";
|
||||
input_dev->id.bustype = BUS_ISA;
|
||||
input_dev->id.vendor = 0x001f;
|
||||
input_dev->id.product = 0x0001;
|
||||
input_dev->id.version = 0x0100;
|
||||
input_dev->cdev.dev = &dev->dev;
|
||||
input_dev->cdev.dev = dev;
|
||||
|
||||
input_dev->evbit[0] = BIT(EV_SND);
|
||||
input_dev->sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
|
||||
|
||||
input_dev->event = beep_event;
|
||||
input_dev->event = state->event;
|
||||
|
||||
error = input_register_device(input_dev);
|
||||
if (error) {
|
||||
@@ -125,111 +127,137 @@ static int __devinit sparcspkr_probe(struct platform_device *dev)
|
||||
return error;
|
||||
}
|
||||
|
||||
platform_set_drvdata(dev, input_dev);
|
||||
state->input_dev = input_dev;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit sparcspkr_remove(struct platform_device *dev)
|
||||
static int __devexit sparcspkr_remove(struct of_device *dev)
|
||||
{
|
||||
struct input_dev *input_dev = platform_get_drvdata(dev);
|
||||
struct sparcspkr_state *state = dev_get_drvdata(&dev->dev);
|
||||
struct input_dev *input_dev = state->input_dev;
|
||||
|
||||
/* turn off the speaker */
|
||||
state->event(input_dev, EV_SND, SND_BELL, 0);
|
||||
|
||||
input_unregister_device(input_dev);
|
||||
platform_set_drvdata(dev, NULL);
|
||||
/* turn off the speaker */
|
||||
beep_event(NULL, EV_SND, SND_BELL, 0);
|
||||
|
||||
dev_set_drvdata(&dev->dev, NULL);
|
||||
kfree(state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sparcspkr_shutdown(struct platform_device *dev)
|
||||
static int sparcspkr_shutdown(struct of_device *dev)
|
||||
{
|
||||
struct sparcspkr_state *state = dev_get_drvdata(&dev->dev);
|
||||
struct input_dev *input_dev = state->input_dev;
|
||||
|
||||
/* turn off the speaker */
|
||||
beep_event(NULL, EV_SND, SND_BELL, 0);
|
||||
state->event(input_dev, EV_SND, SND_BELL, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver sparcspkr_platform_driver = {
|
||||
.driver = {
|
||||
.name = "sparcspkr",
|
||||
.owner = THIS_MODULE,
|
||||
static int __devinit ebus_beep_probe(struct of_device *dev, const struct of_device_id *match)
|
||||
{
|
||||
struct linux_ebus_device *edev = to_ebus_device(&dev->dev);
|
||||
struct sparcspkr_state *state;
|
||||
int err;
|
||||
|
||||
state = kzalloc(sizeof(*state), GFP_KERNEL);
|
||||
if (!state)
|
||||
return -ENOMEM;
|
||||
|
||||
state->name = "Sparc EBUS Speaker";
|
||||
state->iobase = edev->resource[0].start;
|
||||
state->event = ebus_spkr_event;
|
||||
spin_lock_init(&state->lock);
|
||||
|
||||
dev_set_drvdata(&dev->dev, state);
|
||||
|
||||
err = sparcspkr_probe(&dev->dev);
|
||||
if (err) {
|
||||
dev_set_drvdata(&dev->dev, NULL);
|
||||
kfree(state);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct of_device_id ebus_beep_match[] = {
|
||||
{
|
||||
.name = "beep",
|
||||
},
|
||||
.probe = sparcspkr_probe,
|
||||
.remove = __devexit_p(sparcspkr_remove),
|
||||
{},
|
||||
};
|
||||
|
||||
static struct of_platform_driver ebus_beep_driver = {
|
||||
.name = "beep",
|
||||
.match_table = ebus_beep_match,
|
||||
.probe = ebus_beep_probe,
|
||||
.remove = sparcspkr_remove,
|
||||
.shutdown = sparcspkr_shutdown,
|
||||
};
|
||||
|
||||
static struct platform_device *sparcspkr_platform_device;
|
||||
|
||||
static int __init sparcspkr_drv_init(void)
|
||||
static int __devinit isa_beep_probe(struct of_device *dev, const struct of_device_id *match)
|
||||
{
|
||||
int error;
|
||||
struct sparc_isa_device *idev = to_isa_device(&dev->dev);
|
||||
struct sparcspkr_state *state;
|
||||
int err;
|
||||
|
||||
error = platform_driver_register(&sparcspkr_platform_driver);
|
||||
if (error)
|
||||
return error;
|
||||
state = kzalloc(sizeof(*state), GFP_KERNEL);
|
||||
if (!state)
|
||||
return -ENOMEM;
|
||||
|
||||
sparcspkr_platform_device = platform_device_alloc("sparcspkr", -1);
|
||||
if (!sparcspkr_platform_device) {
|
||||
error = -ENOMEM;
|
||||
goto err_unregister_driver;
|
||||
state->name = "Sparc ISA Speaker";
|
||||
state->iobase = idev->resource.start;
|
||||
state->event = isa_spkr_event;
|
||||
spin_lock_init(&state->lock);
|
||||
|
||||
dev_set_drvdata(&dev->dev, state);
|
||||
|
||||
err = sparcspkr_probe(&dev->dev);
|
||||
if (err) {
|
||||
dev_set_drvdata(&dev->dev, NULL);
|
||||
kfree(state);
|
||||
}
|
||||
|
||||
error = platform_device_add(sparcspkr_platform_device);
|
||||
if (error)
|
||||
goto err_free_device;
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_device:
|
||||
platform_device_put(sparcspkr_platform_device);
|
||||
err_unregister_driver:
|
||||
platform_driver_unregister(&sparcspkr_platform_driver);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static struct of_device_id isa_beep_match[] = {
|
||||
{
|
||||
.name = "dma",
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
static struct of_platform_driver isa_beep_driver = {
|
||||
.name = "beep",
|
||||
.match_table = isa_beep_match,
|
||||
.probe = isa_beep_probe,
|
||||
.remove = sparcspkr_remove,
|
||||
.shutdown = sparcspkr_shutdown,
|
||||
};
|
||||
|
||||
static int __init sparcspkr_init(void)
|
||||
{
|
||||
struct linux_ebus *ebus;
|
||||
struct linux_ebus_device *edev;
|
||||
#ifdef CONFIG_SPARC64
|
||||
struct sparc_isa_bridge *isa_br;
|
||||
struct sparc_isa_device *isa_dev;
|
||||
#endif
|
||||
int err = of_register_driver(&ebus_beep_driver, &ebus_bus_type);
|
||||
|
||||
for_each_ebus(ebus) {
|
||||
for_each_ebusdev(edev, ebus) {
|
||||
if (!strcmp(edev->prom_name, "beep")) {
|
||||
beep_name = "Sparc EBUS Speaker";
|
||||
beep_event = ebus_spkr_event;
|
||||
beep_iobase = edev->resource[0].start;
|
||||
return sparcspkr_drv_init();
|
||||
}
|
||||
}
|
||||
if (!err) {
|
||||
err = of_register_driver(&isa_beep_driver, &isa_bus_type);
|
||||
if (err)
|
||||
of_unregister_driver(&ebus_beep_driver);
|
||||
}
|
||||
#ifdef CONFIG_SPARC64
|
||||
for_each_isa(isa_br) {
|
||||
for_each_isadev(isa_dev, isa_br) {
|
||||
/* A hack, the beep device's base lives in
|
||||
* the DMA isa node.
|
||||
*/
|
||||
if (!strcmp(isa_dev->prom_name, "dma")) {
|
||||
beep_name = "Sparc ISA Speaker";
|
||||
beep_event = isa_spkr_event,
|
||||
beep_iobase = isa_dev->resource.start;
|
||||
return sparcspkr_drv_init();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return -ENODEV;
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __exit sparcspkr_exit(void)
|
||||
{
|
||||
platform_device_unregister(sparcspkr_platform_device);
|
||||
platform_driver_unregister(&sparcspkr_platform_driver);
|
||||
of_unregister_driver(&ebus_beep_driver);
|
||||
of_unregister_driver(&isa_beep_driver);
|
||||
}
|
||||
|
||||
module_init(sparcspkr_init);
|
||||
|
||||
@@ -74,7 +74,7 @@ static int __init i8042_platform_init(void)
|
||||
|
||||
for_each_ebus(ebus) {
|
||||
for_each_ebusdev(edev, ebus) {
|
||||
if (!strcmp(edev->prom_name, "8042"))
|
||||
if (!strcmp(edev->prom_node->name, "8042"))
|
||||
goto edev_found;
|
||||
}
|
||||
}
|
||||
@@ -82,14 +82,14 @@ static int __init i8042_platform_init(void)
|
||||
|
||||
edev_found:
|
||||
for_each_edevchild(edev, child) {
|
||||
if (!strcmp(child->prom_name, OBP_PS2KBD_NAME1) ||
|
||||
!strcmp(child->prom_name, OBP_PS2KBD_NAME2)) {
|
||||
if (!strcmp(child->prom_node->name, OBP_PS2KBD_NAME1) ||
|
||||
!strcmp(child->prom_node->name, OBP_PS2KBD_NAME2)) {
|
||||
i8042_kbd_irq = child->irqs[0];
|
||||
kbd_iobase =
|
||||
ioremap(child->resource[0].start, 8);
|
||||
}
|
||||
if (!strcmp(child->prom_name, OBP_PS2MS_NAME1) ||
|
||||
!strcmp(child->prom_name, OBP_PS2MS_NAME2))
|
||||
if (!strcmp(child->prom_node->name, OBP_PS2MS_NAME1) ||
|
||||
!strcmp(child->prom_node->name, OBP_PS2MS_NAME2))
|
||||
i8042_aux_irq = child->irqs[0];
|
||||
}
|
||||
if (i8042_kbd_irq == -1 ||
|
||||
|
||||
@@ -773,8 +773,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
|
||||
|
||||
ts->last_msg = m;
|
||||
|
||||
if (request_irq(spi->irq, ads7846_irq,
|
||||
SA_SAMPLE_RANDOM | SA_TRIGGER_FALLING,
|
||||
if (request_irq(spi->irq, ads7846_irq, SA_TRIGGER_FALLING,
|
||||
spi->dev.driver->name, ts)) {
|
||||
dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
|
||||
err = -EBUSY;
|
||||
|
||||
@@ -399,16 +399,14 @@ static int h3600ts_connect(struct serio *serio, struct serio_driver *drv)
|
||||
set_GPIO_IRQ_edge(GPIO_BITSY_NPOWER_BUTTON, GPIO_RISING_EDGE);
|
||||
|
||||
if (request_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, action_button_handler,
|
||||
SA_SHIRQ | SA_INTERRUPT | SA_SAMPLE_RANDOM,
|
||||
"h3600_action", &ts->dev)) {
|
||||
SA_SHIRQ | SA_INTERRUPT, "h3600_action", &ts->dev)) {
|
||||
printk(KERN_ERR "h3600ts.c: Could not allocate Action Button IRQ!\n");
|
||||
err = -EBUSY;
|
||||
goto fail2;
|
||||
}
|
||||
|
||||
if (request_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, npower_button_handler,
|
||||
SA_SHIRQ | SA_INTERRUPT | SA_SAMPLE_RANDOM,
|
||||
"h3600_suspend", &ts->dev)) {
|
||||
SA_SHIRQ | SA_INTERRUPT, "h3600_suspend", &ts->dev)) {
|
||||
printk(KERN_ERR "h3600ts.c: Could not allocate Power Button IRQ!\n");
|
||||
err = -EBUSY;
|
||||
goto fail3;
|
||||
|
||||
Reference in New Issue
Block a user