Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 22a17780 authored by Mattia Dongili's avatar Mattia Dongili Committed by Len Brown
Browse files

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: default avatarMattia Dongili <malattia@linux.it>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 89892d15
Loading
Loading
Loading
Loading
+22 −8
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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) {