mirror of
https://github.com/torvalds/linux.git
synced 2024-11-06 03:51:48 +00:00
1269277a5e
Some people report that we die on some Macs when we are expecting to catch machine checks after poking at some random I/O address. I'd seen it happen on my dual G4 with serial ports until we fixed those to use OF, but now other users are reporting it with i8042. This expands the use of check_legacy_ioport() to avoid that situation even on 32-bit kernels. Signed-off-by: David Woodhouse <dwmw2@infradead.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
94 lines
1.9 KiB
C
94 lines
1.9 KiB
C
#ifndef _I8042_IO_H
|
|
#define _I8042_IO_H
|
|
|
|
/*
|
|
* 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.
|
|
*/
|
|
|
|
/*
|
|
* Names.
|
|
*/
|
|
|
|
#define I8042_KBD_PHYS_DESC "isa0060/serio0"
|
|
#define I8042_AUX_PHYS_DESC "isa0060/serio1"
|
|
#define I8042_MUX_PHYS_DESC "isa0060/serio%d"
|
|
|
|
/*
|
|
* IRQs.
|
|
*/
|
|
|
|
#ifdef __alpha__
|
|
# define I8042_KBD_IRQ 1
|
|
# define I8042_AUX_IRQ (RTC_PORT(0) == 0x170 ? 9 : 12) /* Jensen is special */
|
|
#elif defined(__arm__)
|
|
/* defined in include/asm-arm/arch-xxx/irqs.h */
|
|
#include <asm/irq.h>
|
|
#elif defined(CONFIG_SUPERH64)
|
|
#include <asm/irq.h>
|
|
#else
|
|
# define I8042_KBD_IRQ 1
|
|
# define I8042_AUX_IRQ 12
|
|
#endif
|
|
|
|
|
|
/*
|
|
* Register numbers.
|
|
*/
|
|
|
|
#define I8042_COMMAND_REG 0x64
|
|
#define I8042_STATUS_REG 0x64
|
|
#define I8042_DATA_REG 0x60
|
|
|
|
static inline int i8042_read_data(void)
|
|
{
|
|
return inb(I8042_DATA_REG);
|
|
}
|
|
|
|
static inline int i8042_read_status(void)
|
|
{
|
|
return inb(I8042_STATUS_REG);
|
|
}
|
|
|
|
static inline void i8042_write_data(int val)
|
|
{
|
|
outb(val, I8042_DATA_REG);
|
|
}
|
|
|
|
static inline void i8042_write_command(int val)
|
|
{
|
|
outb(val, I8042_COMMAND_REG);
|
|
}
|
|
|
|
static inline int i8042_platform_init(void)
|
|
{
|
|
/*
|
|
* On some platforms touching the i8042 data register region can do really
|
|
* bad things. Because of this the region is always reserved on such boxes.
|
|
*/
|
|
#if !defined(__sh__) && !defined(__alpha__) && !defined(__mips__) && !defined(CONFIG_PPC_MERGE)
|
|
if (!request_region(I8042_DATA_REG, 16, "i8042"))
|
|
return -EBUSY;
|
|
#endif
|
|
|
|
i8042_reset = 1;
|
|
|
|
#if defined(CONFIG_PPC_MERGE)
|
|
if (check_legacy_ioport(I8042_DATA_REG))
|
|
return -EBUSY;
|
|
if (!request_region(I8042_DATA_REG, 16, "i8042"))
|
|
return -EBUSY;
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
static inline void i8042_platform_exit(void)
|
|
{
|
|
#if !defined(__sh__) && !defined(__alpha__) && !defined(CONFIG_PPC64)
|
|
release_region(I8042_DATA_REG, 16);
|
|
#endif
|
|
}
|
|
|
|
#endif /* _I8042_IO_H */
|