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

Commit 1b376dac authored by Stefan Ringel's avatar Stefan Ringel Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB: tm6000: bugfix data handling

parent 04d174e9
Loading
Loading
Loading
Loading
+39 −22
Original line number Original line Diff line number Diff line
@@ -46,7 +46,7 @@ MODULE_PARM_DESC(enable_ir, "enable ir (default is enable");
	}
	}


struct tm6000_ir_poll_result {
struct tm6000_ir_poll_result {
	u8 rc_data[4];
	u16 rc_data;
};
};


struct tm6000_IR {
struct tm6000_IR {
@@ -60,9 +60,9 @@ struct tm6000_IR {
	int			polling;
	int			polling;
	struct delayed_work	work;
	struct delayed_work	work;
	u8			wait:1;
	u8			wait:1;
	u8			key:1;
	struct urb		*int_urb;
	struct urb		*int_urb;
	u8			*urb_data;
	u8			*urb_data;
	u8			key:1;


	int (*get_key) (struct tm6000_IR *, struct tm6000_ir_poll_result *);
	int (*get_key) (struct tm6000_IR *, struct tm6000_ir_poll_result *);


@@ -122,13 +122,14 @@ static void tm6000_ir_urb_received(struct urb *urb)


	if (urb->status != 0)
	if (urb->status != 0)
		printk(KERN_INFO "not ready\n");
		printk(KERN_INFO "not ready\n");
	else if (urb->actual_length > 0)
	else if (urb->actual_length > 0) {
		memcpy(ir->urb_data, urb->transfer_buffer, urb->actual_length);
		memcpy(ir->urb_data, urb->transfer_buffer, urb->actual_length);


		dprintk("data %02x %02x %02x %02x\n", ir->urb_data[0],
		dprintk("data %02x %02x %02x %02x\n", ir->urb_data[0],
			ir->urb_data[1], ir->urb_data[2], ir->urb_data[3]);
			ir->urb_data[1], ir->urb_data[2], ir->urb_data[3]);


		ir->key = 1;
		ir->key = 1;
	}


	rc = usb_submit_urb(urb, GFP_ATOMIC);
	rc = usb_submit_urb(urb, GFP_ATOMIC);
}
}
@@ -140,22 +141,24 @@ static int default_polling_getkey(struct tm6000_IR *ir,
	int rc;
	int rc;
	u8 buf[2];
	u8 buf[2];


	if (ir->wait && !&dev->int_in) {
	if (ir->wait && !&dev->int_in)
		poll_result->rc_data[0] = 0xff;
		return 0;
		return 0;
	}


	if (&dev->int_in) {
	if (&dev->int_in) {
		poll_result->rc_data[0] = ir->urb_data[0];
		if (ir->ir.ir_type == IR_TYPE_RC5)
		poll_result->rc_data[1] = ir->urb_data[1];
			poll_result->rc_data = ir->urb_data[0];
		else
			poll_result->rc_data = ir->urb_data[0] | ir->urb_data[1] << 8;
	} else {
	} else {
		tm6000_set_reg(dev, REQ_04_EN_DISABLE_MCU_INT, 2, 0);
		tm6000_set_reg(dev, REQ_04_EN_DISABLE_MCU_INT, 2, 0);
		msleep(10);
		msleep(10);
		tm6000_set_reg(dev, REQ_04_EN_DISABLE_MCU_INT, 2, 1);
		tm6000_set_reg(dev, REQ_04_EN_DISABLE_MCU_INT, 2, 1);
		msleep(10);
		msleep(10);


		rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
		if (ir->ir.ir_type == IR_TYPE_RC5) {
		 USB_RECIP_DEVICE, REQ_02_GET_IR_CODE, 0, 0, buf, 1);
			rc = tm6000_read_write_usb(dev, USB_DIR_IN |
				USB_TYPE_VENDOR | USB_RECIP_DEVICE,
				REQ_02_GET_IR_CODE, 0, 0, buf, 1);


			msleep(10);
			msleep(10);


@@ -163,7 +166,22 @@ static int default_polling_getkey(struct tm6000_IR *ir,
			if (rc < 0)
			if (rc < 0)
				return rc;
				return rc;


		poll_result->rc_data[0] = buf[0];
			poll_result->rc_data = buf[0];
		} else {
			rc = tm6000_read_write_usb(dev, USB_DIR_IN |
				USB_TYPE_VENDOR | USB_RECIP_DEVICE,
				REQ_02_GET_IR_CODE, 0, 0, buf, 2);

			msleep(10);

			dprintk("read data=%04x\n", buf[0] | buf[1] << 8);
			if (rc < 0)
				return rc;

			poll_result->rc_data = buf[0] | buf[1] << 8;
		}
		if ((poll_result->rc_data & 0x00ff) != 0xff)
			ir->key = 1;
	}
	}
	return 0;
	return 0;
}
}
@@ -180,12 +198,11 @@ static void tm6000_ir_handle_key(struct tm6000_IR *ir)
		return;
		return;
	}
	}


	dprintk("ir->get_key result data=%02x %02x\n",
	dprintk("ir->get_key result data=%04x\n", poll_result.rc_data);
		poll_result.rc_data[0], poll_result.rc_data[1]);


	if (poll_result.rc_data[0] != 0xff && ir->key == 1) {
	if (ir->key) {
		ir_input_keydown(ir->input->input_dev, &ir->ir,
		ir_input_keydown(ir->input->input_dev, &ir->ir,
			poll_result.rc_data[0] | poll_result.rc_data[1] << 8);
				(u32)poll_result.rc_data);


		ir_input_nokey(ir->input->input_dev, &ir->ir);
		ir_input_nokey(ir->input->input_dev, &ir->ir);
		ir->key = 0;
		ir->key = 0;