FAILED: patch "[PATCH] [media] ir-spi: Fix issues with lirc API" failed to apply to 4.12-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.12-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
cc20ba4ed8576abfa10a17e81cb4521f474624f0Mon Sep 17 00:00:00 2001
From: Anton Blanchard <[email protected]>
Date: Sat, 6 May 2017 22:00:11 -0300
Subject: [PATCH] [media] ir-spi: Fix issues with lirc API
The ir-spi driver has 2 issues which prevents it from working with lirc:
1. The ir-spi driver uses 16 bits of SPI data to create one cycle of the waveform. As such our SPI clock needs to be 16x faster than the carrier frequency.
The driver is inconsistent in how it currently handles this. It initializes it to the carrier frequency:
But the commit message has some example code which initialises it to 16x the carrier frequency:
val = 608000; ret = ioctl(fd, LIRC_SET_SEND_CARRIER, &val);
To maintain compatibility with lirc, always do the frequency adjustment in the driver.
2. lirc presents pulses in microseconds, but the ir-spi driver treats them as cycles of the carrier. Similar to other lirc drivers, do the conversion with DIV_ROUND_CLOSEST().
drivers/media/rc/ir-spi.c +6 -3
@@ -57,10 +57,13 @@ static int ir_spi_tx(struct rc_dev *dev,/* convert the pulse/space signal to raw binary signal */ for (i =0 ; i < count; i++) { +unsigned int periods;int j;u16 val; -if (len + buffer[i] >=IR_SPI_MAX_BUFSIZE ) + periods =DIV_ROUND_CLOSEST (buffer[i] * idata->freq,1000000 ); + +if (len + periods >=IR_SPI_MAX_BUFSIZE )return -EINVAL ;/*
@@ -69,13 +72,13 @@ static int ir_spi_tx(struct rc_dev *dev,* contain a space duration. */ val = (i %2 ) ? idata->space : idata->pulse; -for (j =0 ; j < buffer[i]; j++) +for (j =0 ; j < periods; j++) idata->tx_buf[len++] = val; }memset (&xfer,0 ,sizeof (xfer)); - xfer.speed_hz = idata->freq; + xfer.speed_hz = idata->freq *16 ; xfer.len = len *sizeof (*idata->tx_buf); xfer.tx_buf = idata->tx_buf;
Sean Young
maintainerFrom: Anton Blanchard <[email protected]>
Subject: [PATCH] [media] ir-spi: Fix issues with lirc API
The ir-spi driver has 2 issues which prevents it from working with lirc:
1. The ir-spi driver uses 16 bits of SPI data to create one cycle of the waveform. As such our SPI clock needs to be 16x faster than the carrier frequency.
The driver is inconsistent in how it currently handles this. It initializes it to the carrier frequency:
But the commit message has some example code which initialises it to 16x the carrier frequency:
val = 608000; ret = ioctl(fd, LIRC_SET_SEND_CARRIER, &val);
To maintain compatibility with lirc, always do the frequency adjustment in the driver.
2. lirc presents pulses in microseconds, but the ir-spi driver treats them as cycles of the carrier. Similar to other lirc drivers, do the conversion with DIV_ROUND_CLOSEST().
--- drivers/media/rc/ir-spi.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/media/rc/ir-spi.c +6 -3
@@ -57,10 +57,13 @@ static int ir_spi_tx(struct rc_dev *dev,/* convert the pulse/space signal to raw binary signal */ for (i =0 ; i < count; i++) { +unsigned int periods;int j;u16 val = ((i +1 ) %2 ) ? idata->pulse : idata->space; -if (len + buffer[i] >=IR_SPI_MAX_BUFSIZE ) + periods =DIV_ROUND_CLOSEST (buffer[i] * idata->freq,1000000 ); + +if (len + periods >=IR_SPI_MAX_BUFSIZE )return -EINVAL ;/*
@@ -69,13 +72,13 @@ static int ir_spi_tx(struct rc_dev *dev,* contain a space duration. */ val = (i %2 ) ? idata->space : idata->pulse; -for (j =0 ; j < buffer[i]; j++) +for (j =0 ; j < periods; j++) idata->tx_buf[len++] = val; }memset (&xfer,0 ,sizeof (xfer)); - xfer.speed_hz = idata->freq; + xfer.speed_hz = idata->freq *16 ; xfer.len = len *sizeof (*idata->tx_buf); xfer.tx_buf = idata->tx_buf;
Signature · 1 line
2.11.0
Quoted 82 lines · On Sat, Jul 22, 2017 at 03:22:02PM +0200, [email protected] wrote:
The patch below does not apply to the 4.12-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
cc20ba4ed8576abfa10a17e81cb4521f474624f0Mon Sep 17 00:00:00 2001From: Anton Blanchard <[email protected]>
Date: Sat, 6 May 2017 22:00:11 -0300
Subject: [PATCH] [media] ir-spi: Fix issues with lirc APIThe ir-spi driver has 2 issues which prevents it from working with lirc:
1. The ir-spi driver uses 16 bits of SPI data to create one cycle of the waveform. As such our SPI clock needs to be 16x faster than the carrier frequency.
The driver is inconsistent in how it currently handles this. It initializes it to the carrier frequency:
But the commit message has some example code which initialises it to 16x the carrier frequency:
val = 608000; ret = ioctl(fd, LIRC_SET_SEND_CARRIER, &val);To maintain compatibility with lirc, always do the frequency adjustment in the driver.
2. lirc presents pulses in microseconds, but the ir-spi driver treats them as cycles of the carrier. Similar to other lirc drivers, do the conversion with
DIV_ROUND_CLOSEST().Fixes fe052da49201 ("[media] rc: add support for IR LEDs driven through SPI")Signed-off-by Anton Blanchard <[email protected]>Signed-off-by Sean Young <[email protected]>Signed-off-by Mauro Carvalho Chehab <[email protected]>drivers/media/rc/ir-spi.c +6
-3@@ -57,10 +57,13 @@ static int ir_spi_tx(struct rc_dev *dev,/* convert the pulse/space signal to raw binary signal */ for (i =0 ; i < count; i++) { +unsigned int periods;int j;u16 val; -if (len + buffer[i] >=IR_SPI_MAX_BUFSIZE ) + periods =DIV_ROUND_CLOSEST (buffer[i] * idata->freq,1000000 ); + +if (len + periods >=IR_SPI_MAX_BUFSIZE )return -EINVAL ;/* @@ -69,13 +72,13 @@ static int ir_spi_tx(struct rc_dev *dev,* contain a space duration. */ val = (i %2 ) ? idata->space : idata->pulse; -for (j =0 ; j < buffer[i]; j++) +for (j =0 ; j < periods; j++) idata->tx_buf[len++] = val; }memset (&xfer,0 ,sizeof (xfer)); - xfer.speed_hz = idata->freq; + xfer.speed_hz = idata->freq *16 ; xfer.len = len *sizeof (*idata->tx_buf); xfer.tx_buf = idata->tx_buf;
Greg KH
maintainerQuoted 29 lines · Sean Young
From: Anton Blanchard <[email protected]>
Subject: [PATCH] [media] ir-spi: Fix issues with lirc APIThe ir-spi driver has 2 issues which prevents it from working with lirc:
1. The ir-spi driver uses 16 bits of SPI data to create one cycle of the waveform. As such our SPI clock needs to be 16x faster than the carrier frequency.
The driver is inconsistent in how it currently handles this. It initializes it to the carrier frequency:
But the commit message has some example code which initialises it to 16x the carrier frequency:
val = 608000; ret = ioctl(fd, LIRC_SET_SEND_CARRIER, &val);To maintain compatibility with lirc, always do the frequency adjustment in the driver.
2. lirc presents pulses in microseconds, but the ir-spi driver treats them as cycles of the carrier. Similar to other lirc drivers, do the conversion with
DIV_ROUND_CLOSEST().Fixes fe052da49201 ("[media] rc: add support for IR LEDs driven through SPI")
Quoted 7 lines
Signed-off-by Anton Blanchard <[email protected]>Signed-off-by Sean Young <[email protected]>Signed-off-by Mauro Carvalho Chehab <[email protected]>--- drivers/media/rc/ir-spi.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
Thanks for the backport.
greg k-h