sony-laptop: Fix event reading in sony-laptop
The rewritten event reading code from sonypi was absolutely wrong, this patche makes things functional for type2 and type1 models. Cc: Andrei Paskevich <andrei@capet.iut-fbleau.fr> Signed-off-by: Mattia Dongili <malattia@linux.it> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
89892d153d
commit
22a1778058
1 changed files with 22 additions and 8 deletions
|
@ -1142,7 +1142,9 @@ static struct acpi_driver sony_nc_driver = {
|
||||||
#define SONYPI_DEVICE_TYPE2 0x00000002
|
#define SONYPI_DEVICE_TYPE2 0x00000002
|
||||||
#define SONYPI_DEVICE_TYPE3 0x00000004
|
#define SONYPI_DEVICE_TYPE3 0x00000004
|
||||||
|
|
||||||
#define SONY_PIC_EV_MASK 0xff
|
#define SONYPI_TYPE1_OFFSET 0x04
|
||||||
|
#define SONYPI_TYPE2_OFFSET 0x12
|
||||||
|
#define SONYPI_TYPE3_OFFSET 0x12
|
||||||
|
|
||||||
struct sony_pic_ioport {
|
struct sony_pic_ioport {
|
||||||
struct acpi_resource_io io;
|
struct acpi_resource_io io;
|
||||||
|
@ -1156,6 +1158,7 @@ struct sony_pic_irq {
|
||||||
|
|
||||||
struct sony_pic_dev {
|
struct sony_pic_dev {
|
||||||
int model;
|
int model;
|
||||||
|
u16 evport_offset;
|
||||||
u8 camera_power;
|
u8 camera_power;
|
||||||
u8 bluetooth_power;
|
u8 bluetooth_power;
|
||||||
u8 wwan_power;
|
u8 wwan_power;
|
||||||
|
@ -2233,20 +2236,17 @@ static int sony_pic_enable(struct acpi_device *device,
|
||||||
static irqreturn_t sony_pic_irq(int irq, void *dev_id)
|
static irqreturn_t sony_pic_irq(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
u32 port_val = 0;
|
|
||||||
u8 ev = 0;
|
u8 ev = 0;
|
||||||
u8 data_mask = 0;
|
u8 data_mask = 0;
|
||||||
u8 device_event = 0;
|
u8 device_event = 0;
|
||||||
|
|
||||||
struct sony_pic_dev *dev = (struct sony_pic_dev *) dev_id;
|
struct sony_pic_dev *dev = (struct sony_pic_dev *) dev_id;
|
||||||
|
|
||||||
acpi_os_read_port(dev->cur_ioport->io.minimum, &port_val,
|
ev = inb_p(dev->cur_ioport->io.minimum);
|
||||||
dev->cur_ioport->io.address_length);
|
data_mask = inb_p(dev->cur_ioport->io.minimum + dev->evport_offset);
|
||||||
ev = port_val & SONY_PIC_EV_MASK;
|
|
||||||
data_mask = 0xff & (port_val >> (dev->cur_ioport->io.address_length - 8));
|
|
||||||
|
|
||||||
dprintk("event (0x%.8x [%.2x] [%.2x]) at port 0x%.4x\n",
|
dprintk("event ([%.2x] [%.2x]) at port 0x%.4x(+0x%.2x)\n",
|
||||||
port_val, ev, data_mask, dev->cur_ioport->io.minimum);
|
ev, data_mask, dev->cur_ioport->io.minimum, dev->evport_offset);
|
||||||
|
|
||||||
if (ev == 0x00 || ev == 0xff)
|
if (ev == 0x00 || ev == 0xff)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
|
@ -2337,6 +2337,20 @@ static int sony_pic_add(struct acpi_device *device)
|
||||||
spic_dev.model = sony_pic_detect_device_type();
|
spic_dev.model = sony_pic_detect_device_type();
|
||||||
mutex_init(&spic_dev.lock);
|
mutex_init(&spic_dev.lock);
|
||||||
|
|
||||||
|
/* model specific characteristics */
|
||||||
|
switch(spic_dev.model) {
|
||||||
|
case SONYPI_DEVICE_TYPE1:
|
||||||
|
spic_dev.evport_offset = SONYPI_TYPE1_OFFSET;
|
||||||
|
break;
|
||||||
|
case SONYPI_DEVICE_TYPE3:
|
||||||
|
spic_dev.evport_offset = SONYPI_TYPE3_OFFSET;
|
||||||
|
break;
|
||||||
|
case SONYPI_DEVICE_TYPE2:
|
||||||
|
default:
|
||||||
|
spic_dev.evport_offset = SONYPI_TYPE2_OFFSET;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* read _PRS resources */
|
/* read _PRS resources */
|
||||||
result = sony_pic_possible_resources(device);
|
result = sony_pic_possible_resources(device);
|
||||||
if (result) {
|
if (result) {
|
||||||
|
|
Loading…
Reference in a new issue