Commit 35d136c8 authored by Jarod Wilson's avatar Jarod Wilson Committed by Mauro Carvalho Chehab

[media] ite-cir: 8709 needs to use pnp resource 2

Thanks to the intrepid testing and debugging of Matthijs van Drunen, it
was uncovered that at least some variants of the ITE8709 need to use pnp
resource 2, rather than 0, for things to function properly. Resource 0
has a length of only 1, and if you try to bypass the pnp_port_len check
and use it anyway (with either a length of 1 or 2), the system in
question's trackpad ceased to function.

The circa lirc 0.8.7 lirc_ite8709 driver used resource 2, but the value
was (amusingly) changed to 0 by way of a patch from ITE themselves, so I
don't know if there may be variants where 0 actually *is* correct, but
at least in this case and in the original lirc_ite8709 driver author's
case, it sure looks like 2 is the right value.

This fix should probably be applied to all stable kernels with the
ite-cir driver, lest we nuke more people's trackpads.

Tested-by: Matthijs van Drunen
CC: Juan Jesús García de Soria <skandalfo@gmail.com>
CC: stable@kernel.org
Signed-off-by: default avatarJarod Wilson <jarod@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 258c0563
...@@ -1347,6 +1347,7 @@ static const struct ite_dev_params ite_dev_descs[] = { ...@@ -1347,6 +1347,7 @@ static const struct ite_dev_params ite_dev_descs[] = {
{ /* 0: ITE8704 */ { /* 0: ITE8704 */
.model = "ITE8704 CIR transceiver", .model = "ITE8704 CIR transceiver",
.io_region_size = IT87_IOREG_LENGTH, .io_region_size = IT87_IOREG_LENGTH,
.io_rsrc_no = 0,
.hw_tx_capable = true, .hw_tx_capable = true,
.sample_period = (u32) (1000000000ULL / 115200), .sample_period = (u32) (1000000000ULL / 115200),
.tx_carrier_freq = 38000, .tx_carrier_freq = 38000,
...@@ -1371,6 +1372,7 @@ static const struct ite_dev_params ite_dev_descs[] = { ...@@ -1371,6 +1372,7 @@ static const struct ite_dev_params ite_dev_descs[] = {
{ /* 1: ITE8713 */ { /* 1: ITE8713 */
.model = "ITE8713 CIR transceiver", .model = "ITE8713 CIR transceiver",
.io_region_size = IT87_IOREG_LENGTH, .io_region_size = IT87_IOREG_LENGTH,
.io_rsrc_no = 0,
.hw_tx_capable = true, .hw_tx_capable = true,
.sample_period = (u32) (1000000000ULL / 115200), .sample_period = (u32) (1000000000ULL / 115200),
.tx_carrier_freq = 38000, .tx_carrier_freq = 38000,
...@@ -1395,6 +1397,7 @@ static const struct ite_dev_params ite_dev_descs[] = { ...@@ -1395,6 +1397,7 @@ static const struct ite_dev_params ite_dev_descs[] = {
{ /* 2: ITE8708 */ { /* 2: ITE8708 */
.model = "ITE8708 CIR transceiver", .model = "ITE8708 CIR transceiver",
.io_region_size = IT8708_IOREG_LENGTH, .io_region_size = IT8708_IOREG_LENGTH,
.io_rsrc_no = 0,
.hw_tx_capable = true, .hw_tx_capable = true,
.sample_period = (u32) (1000000000ULL / 115200), .sample_period = (u32) (1000000000ULL / 115200),
.tx_carrier_freq = 38000, .tx_carrier_freq = 38000,
...@@ -1420,6 +1423,7 @@ static const struct ite_dev_params ite_dev_descs[] = { ...@@ -1420,6 +1423,7 @@ static const struct ite_dev_params ite_dev_descs[] = {
{ /* 3: ITE8709 */ { /* 3: ITE8709 */
.model = "ITE8709 CIR transceiver", .model = "ITE8709 CIR transceiver",
.io_region_size = IT8709_IOREG_LENGTH, .io_region_size = IT8709_IOREG_LENGTH,
.io_rsrc_no = 2,
.hw_tx_capable = true, .hw_tx_capable = true,
.sample_period = (u32) (1000000000ULL / 115200), .sample_period = (u32) (1000000000ULL / 115200),
.tx_carrier_freq = 38000, .tx_carrier_freq = 38000,
...@@ -1461,6 +1465,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id ...@@ -1461,6 +1465,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id
struct rc_dev *rdev = NULL; struct rc_dev *rdev = NULL;
int ret = -ENOMEM; int ret = -ENOMEM;
int model_no; int model_no;
int io_rsrc_no;
ite_dbg("%s called", __func__); ite_dbg("%s called", __func__);
...@@ -1490,10 +1495,11 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id ...@@ -1490,10 +1495,11 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id
/* get the description for the device */ /* get the description for the device */
dev_desc = &ite_dev_descs[model_no]; dev_desc = &ite_dev_descs[model_no];
io_rsrc_no = dev_desc->io_rsrc_no;
/* validate pnp resources */ /* validate pnp resources */
if (!pnp_port_valid(pdev, 0) || if (!pnp_port_valid(pdev, io_rsrc_no) ||
pnp_port_len(pdev, 0) != dev_desc->io_region_size) { pnp_port_len(pdev, io_rsrc_no) != dev_desc->io_region_size) {
dev_err(&pdev->dev, "IR PNP Port not valid!\n"); dev_err(&pdev->dev, "IR PNP Port not valid!\n");
goto failure; goto failure;
} }
...@@ -1504,7 +1510,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id ...@@ -1504,7 +1510,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id
} }
/* store resource values */ /* store resource values */
itdev->cir_addr = pnp_port_start(pdev, 0); itdev->cir_addr = pnp_port_start(pdev, io_rsrc_no);
itdev->cir_irq = pnp_irq(pdev, 0); itdev->cir_irq = pnp_irq(pdev, 0);
/* initialize spinlocks */ /* initialize spinlocks */
......
...@@ -57,6 +57,9 @@ struct ite_dev_params { ...@@ -57,6 +57,9 @@ struct ite_dev_params {
/* size of the I/O region */ /* size of the I/O region */
int io_region_size; int io_region_size;
/* IR pnp I/O resource number */
int io_rsrc_no;
/* true if the hardware supports transmission */ /* true if the hardware supports transmission */
bool hw_tx_capable; bool hw_tx_capable;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment