Skip to content

Commit

Permalink
sony-laptop: Fix event reading in sony-laptop
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Mattia Dongili authored and Len Brown committed Jul 22, 2007
1 parent 89892d1 commit 22a1778
Showing 1 changed file with 22 additions and 8 deletions.
30 changes: 22 additions & 8 deletions drivers/misc/sony-laptop.c
Original file line number Diff line number Diff line change
Expand Up @@ -1142,7 +1142,9 @@ static struct acpi_driver sony_nc_driver = {
#define SONYPI_DEVICE_TYPE2 0x00000002
#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 acpi_resource_io io;
Expand All @@ -1156,6 +1158,7 @@ struct sony_pic_irq {

struct sony_pic_dev {
int model;
u16 evport_offset;
u8 camera_power;
u8 bluetooth_power;
u8 wwan_power;
Expand Down Expand Up @@ -2233,20 +2236,17 @@ static int sony_pic_enable(struct acpi_device *device,
static irqreturn_t sony_pic_irq(int irq, void *dev_id)
{
int i, j;
u32 port_val = 0;
u8 ev = 0;
u8 data_mask = 0;
u8 device_event = 0;

struct sony_pic_dev *dev = (struct sony_pic_dev *) dev_id;

acpi_os_read_port(dev->cur_ioport->io.minimum, &port_val,
dev->cur_ioport->io.address_length);
ev = port_val & SONY_PIC_EV_MASK;
data_mask = 0xff & (port_val >> (dev->cur_ioport->io.address_length - 8));
ev = inb_p(dev->cur_ioport->io.minimum);
data_mask = inb_p(dev->cur_ioport->io.minimum + dev->evport_offset);

dprintk("event (0x%.8x [%.2x] [%.2x]) at port 0x%.4x\n",
port_val, ev, data_mask, dev->cur_ioport->io.minimum);
dprintk("event ([%.2x] [%.2x]) at port 0x%.4x(+0x%.2x)\n",
ev, data_mask, dev->cur_ioport->io.minimum, dev->evport_offset);

if (ev == 0x00 || ev == 0xff)
return IRQ_HANDLED;
Expand Down Expand Up @@ -2337,6 +2337,20 @@ static int sony_pic_add(struct acpi_device *device)
spic_dev.model = sony_pic_detect_device_type();
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 */
result = sony_pic_possible_resources(device);
if (result) {
Expand Down

0 comments on commit 22a1778

Please sign in to comment.