* [stable 4.19][PATCH 0/3] stable: Candidates for 4.19.y
@ 2020-02-10 17:18 Mathieu Poirier
2020-02-10 17:18 ` [stable 4.19][PATCH 1/3] serial: uartps: Add a timeout to the tx empty wait Mathieu Poirier
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Mathieu Poirier @ 2020-02-10 17:18 UTC (permalink / raw)
To: stable; +Cc: linux-kernel
Please consider for 4.19.y - applies cleanly on 4.19.102.
All three patches are already in 5.4.y so no need to apply them there as well.
Thanks,
Mathieu
Boris Brezillon (1):
spi: spi-mem: Add extra sanity checks on the op param
Brandon Maier (1):
gpio: zynq: Report gpio direction at boot
Shubhrajyoti Datta (1):
serial: uartps: Add a timeout to the tx empty wait
drivers/gpio/gpio-zynq.c | 23 +++++++++++++
drivers/spi/spi-mem.c | 54 ++++++++++++++++++++++++++----
drivers/tty/serial/xilinx_uartps.c | 14 +++++---
3 files changed, 81 insertions(+), 10 deletions(-)
--
2.20.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [stable 4.19][PATCH 1/3] serial: uartps: Add a timeout to the tx empty wait
2020-02-10 17:18 [stable 4.19][PATCH 0/3] stable: Candidates for 4.19.y Mathieu Poirier
@ 2020-02-10 17:18 ` Mathieu Poirier
2020-02-10 17:18 ` [stable 4.19][PATCH 2/3] gpio: zynq: Report gpio direction at boot Mathieu Poirier
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Mathieu Poirier @ 2020-02-10 17:18 UTC (permalink / raw)
To: stable; +Cc: linux-kernel
From: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
commit 277375b864e8147975b064b513f491e2a910e66a upstream
In case the cable is not connected then the target gets into
an infinite wait for tx empty.
Add a timeout to the tx empty wait.
Reported-by: Jean-Francois Dagenais <jeff.dagenais@gmail.com>
Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: stable <stable@vger.kernel.org> # 4.19
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
drivers/tty/serial/xilinx_uartps.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index 66d49d511885..7cbee19ea93d 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -26,6 +26,7 @@
#include <linux/of.h>
#include <linux/module.h>
#include <linux/pm_runtime.h>
+#include <linux/iopoll.h>
#define CDNS_UART_TTY_NAME "ttyPS"
#define CDNS_UART_NAME "xuartps"
@@ -34,6 +35,7 @@
#define CDNS_UART_NR_PORTS 2
#define CDNS_UART_FIFO_SIZE 64 /* FIFO size */
#define CDNS_UART_REGISTER_SPACE 0x1000
+#define TX_TIMEOUT 500000
/* Rx Trigger level */
static int rx_trigger_level = 56;
@@ -681,16 +683,20 @@ static void cdns_uart_set_termios(struct uart_port *port,
unsigned int cval = 0;
unsigned int baud, minbaud, maxbaud;
unsigned long flags;
- unsigned int ctrl_reg, mode_reg;
+ unsigned int ctrl_reg, mode_reg, val;
+ int err;
spin_lock_irqsave(&port->lock, flags);
/* Wait for the transmit FIFO to empty before making changes */
if (!(readl(port->membase + CDNS_UART_CR) &
CDNS_UART_CR_TX_DIS)) {
- while (!(readl(port->membase + CDNS_UART_SR) &
- CDNS_UART_SR_TXEMPTY)) {
- cpu_relax();
+ err = readl_poll_timeout(port->membase + CDNS_UART_SR,
+ val, (val & CDNS_UART_SR_TXEMPTY),
+ 1000, TX_TIMEOUT);
+ if (err) {
+ dev_err(port->dev, "timed out waiting for tx empty");
+ return;
}
}
--
2.20.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [stable 4.19][PATCH 2/3] gpio: zynq: Report gpio direction at boot
2020-02-10 17:18 [stable 4.19][PATCH 0/3] stable: Candidates for 4.19.y Mathieu Poirier
2020-02-10 17:18 ` [stable 4.19][PATCH 1/3] serial: uartps: Add a timeout to the tx empty wait Mathieu Poirier
@ 2020-02-10 17:18 ` Mathieu Poirier
2020-02-10 17:18 ` [stable 4.19][PATCH 3/3] spi: spi-mem: Add extra sanity checks on the op param Mathieu Poirier
2020-02-12 13:12 ` [stable 4.19][PATCH 0/3] stable: Candidates for 4.19.y Sasha Levin
3 siblings, 0 replies; 5+ messages in thread
From: Mathieu Poirier @ 2020-02-10 17:18 UTC (permalink / raw)
To: stable; +Cc: linux-kernel
From: Brandon Maier <Brandon.Maier@collins.com>
commit 6169005ceb8c715582eca70df3912cd2b351ede2 upstream
The Zynq's gpios can be configured by the bootloader. But Linux will
erroneously report all gpios as inputs unless we implement
get_direction().
Signed-off-by: Brandon Maier <Brandon.Maier@collins.com>
Tested-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Cc: stable <stable@vger.kernel.org> # 4.19
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
drivers/gpio/gpio-zynq.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c
index a9238fb15013..5dec96155814 100644
--- a/drivers/gpio/gpio-zynq.c
+++ b/drivers/gpio/gpio-zynq.c
@@ -357,6 +357,28 @@ static int zynq_gpio_dir_out(struct gpio_chip *chip, unsigned int pin,
return 0;
}
+/**
+ * zynq_gpio_get_direction - Read the direction of the specified GPIO pin
+ * @chip: gpio_chip instance to be worked on
+ * @pin: gpio pin number within the device
+ *
+ * This function returns the direction of the specified GPIO.
+ *
+ * Return: 0 for output, 1 for input
+ */
+static int zynq_gpio_get_direction(struct gpio_chip *chip, unsigned int pin)
+{
+ u32 reg;
+ unsigned int bank_num, bank_pin_num;
+ struct zynq_gpio *gpio = gpiochip_get_data(chip);
+
+ zynq_gpio_get_bank_pin(pin, &bank_num, &bank_pin_num, gpio);
+
+ reg = readl_relaxed(gpio->base_addr + ZYNQ_GPIO_DIRM_OFFSET(bank_num));
+
+ return !(reg & BIT(bank_pin_num));
+}
+
/**
* zynq_gpio_irq_mask - Disable the interrupts for a gpio pin
* @irq_data: per irq and chip data passed down to chip functions
@@ -829,6 +851,7 @@ static int zynq_gpio_probe(struct platform_device *pdev)
chip->free = zynq_gpio_free;
chip->direction_input = zynq_gpio_dir_in;
chip->direction_output = zynq_gpio_dir_out;
+ chip->get_direction = zynq_gpio_get_direction;
chip->base = of_alias_get_id(pdev->dev.of_node, "gpio");
chip->ngpio = gpio->p_data->ngpio;
--
2.20.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [stable 4.19][PATCH 3/3] spi: spi-mem: Add extra sanity checks on the op param
2020-02-10 17:18 [stable 4.19][PATCH 0/3] stable: Candidates for 4.19.y Mathieu Poirier
2020-02-10 17:18 ` [stable 4.19][PATCH 1/3] serial: uartps: Add a timeout to the tx empty wait Mathieu Poirier
2020-02-10 17:18 ` [stable 4.19][PATCH 2/3] gpio: zynq: Report gpio direction at boot Mathieu Poirier
@ 2020-02-10 17:18 ` Mathieu Poirier
2020-02-12 13:12 ` [stable 4.19][PATCH 0/3] stable: Candidates for 4.19.y Sasha Levin
3 siblings, 0 replies; 5+ messages in thread
From: Mathieu Poirier @ 2020-02-10 17:18 UTC (permalink / raw)
To: stable; +Cc: linux-kernel
From: Boris Brezillon <boris.brezillon@bootlin.com>
commit 380583227c0c7f52383b0cd5c0e2de93ed31d553 upstream
Some combinations are simply not valid and should be rejected before
the op is passed to the SPI controller driver.
Add an spi_mem_check_op() helper and use it in spi_mem_exec_op() and
spi_mem_supports_op() to make sure the spi-mem operation is valid.
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Cc: stable <stable@vger.kernel.org> # 4.19
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
drivers/spi/spi-mem.c | 54 ++++++++++++++++++++++++++++++++++++++-----
1 file changed, 48 insertions(+), 6 deletions(-)
diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c
index eb72dba71d83..cc3d425aae56 100644
--- a/drivers/spi/spi-mem.c
+++ b/drivers/spi/spi-mem.c
@@ -12,6 +12,8 @@
#include "internals.h"
+#define SPI_MEM_MAX_BUSWIDTH 4
+
/**
* spi_controller_dma_map_mem_op_data() - DMA-map the buffer attached to a
* memory operation
@@ -149,6 +151,44 @@ static bool spi_mem_default_supports_op(struct spi_mem *mem,
}
EXPORT_SYMBOL_GPL(spi_mem_default_supports_op);
+static bool spi_mem_buswidth_is_valid(u8 buswidth)
+{
+ if (hweight8(buswidth) > 1 || buswidth > SPI_MEM_MAX_BUSWIDTH)
+ return false;
+
+ return true;
+}
+
+static int spi_mem_check_op(const struct spi_mem_op *op)
+{
+ if (!op->cmd.buswidth)
+ return -EINVAL;
+
+ if ((op->addr.nbytes && !op->addr.buswidth) ||
+ (op->dummy.nbytes && !op->dummy.buswidth) ||
+ (op->data.nbytes && !op->data.buswidth))
+ return -EINVAL;
+
+ if (spi_mem_buswidth_is_valid(op->cmd.buswidth) ||
+ spi_mem_buswidth_is_valid(op->addr.buswidth) ||
+ spi_mem_buswidth_is_valid(op->dummy.buswidth) ||
+ spi_mem_buswidth_is_valid(op->data.buswidth))
+ return -EINVAL;
+
+ return 0;
+}
+
+static bool spi_mem_internal_supports_op(struct spi_mem *mem,
+ const struct spi_mem_op *op)
+{
+ struct spi_controller *ctlr = mem->spi->controller;
+
+ if (ctlr->mem_ops && ctlr->mem_ops->supports_op)
+ return ctlr->mem_ops->supports_op(mem, op);
+
+ return spi_mem_default_supports_op(mem, op);
+}
+
/**
* spi_mem_supports_op() - Check if a memory device and the controller it is
* connected to support a specific memory operation
@@ -166,12 +206,10 @@ EXPORT_SYMBOL_GPL(spi_mem_default_supports_op);
*/
bool spi_mem_supports_op(struct spi_mem *mem, const struct spi_mem_op *op)
{
- struct spi_controller *ctlr = mem->spi->controller;
-
- if (ctlr->mem_ops && ctlr->mem_ops->supports_op)
- return ctlr->mem_ops->supports_op(mem, op);
+ if (spi_mem_check_op(op))
+ return false;
- return spi_mem_default_supports_op(mem, op);
+ return spi_mem_internal_supports_op(mem, op);
}
EXPORT_SYMBOL_GPL(spi_mem_supports_op);
@@ -196,7 +234,11 @@ int spi_mem_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
u8 *tmpbuf;
int ret;
- if (!spi_mem_supports_op(mem, op))
+ ret = spi_mem_check_op(op);
+ if (ret)
+ return ret;
+
+ if (!spi_mem_internal_supports_op(mem, op))
return -ENOTSUPP;
if (ctlr->mem_ops) {
--
2.20.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [stable 4.19][PATCH 0/3] stable: Candidates for 4.19.y
2020-02-10 17:18 [stable 4.19][PATCH 0/3] stable: Candidates for 4.19.y Mathieu Poirier
` (2 preceding siblings ...)
2020-02-10 17:18 ` [stable 4.19][PATCH 3/3] spi: spi-mem: Add extra sanity checks on the op param Mathieu Poirier
@ 2020-02-12 13:12 ` Sasha Levin
3 siblings, 0 replies; 5+ messages in thread
From: Sasha Levin @ 2020-02-12 13:12 UTC (permalink / raw)
To: Mathieu Poirier; +Cc: stable, linux-kernel
On Mon, Feb 10, 2020 at 10:18:24AM -0700, Mathieu Poirier wrote:
>Please consider for 4.19.y - applies cleanly on 4.19.102.
>
>All three patches are already in 5.4.y so no need to apply them there as well.
>
>Thanks,
>Mathieu
>
>Boris Brezillon (1):
> spi: spi-mem: Add extra sanity checks on the op param
>
>Brandon Maier (1):
> gpio: zynq: Report gpio direction at boot
>
>Shubhrajyoti Datta (1):
> serial: uartps: Add a timeout to the tx empty wait
>
> drivers/gpio/gpio-zynq.c | 23 +++++++++++++
> drivers/spi/spi-mem.c | 54 ++++++++++++++++++++++++++----
> drivers/tty/serial/xilinx_uartps.c | 14 +++++---
> 3 files changed, 81 insertions(+), 10 deletions(-)
I've queued them up, thank you.
--
Thanks,
Sasha
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-02-12 13:12 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-10 17:18 [stable 4.19][PATCH 0/3] stable: Candidates for 4.19.y Mathieu Poirier
2020-02-10 17:18 ` [stable 4.19][PATCH 1/3] serial: uartps: Add a timeout to the tx empty wait Mathieu Poirier
2020-02-10 17:18 ` [stable 4.19][PATCH 2/3] gpio: zynq: Report gpio direction at boot Mathieu Poirier
2020-02-10 17:18 ` [stable 4.19][PATCH 3/3] spi: spi-mem: Add extra sanity checks on the op param Mathieu Poirier
2020-02-12 13:12 ` [stable 4.19][PATCH 0/3] stable: Candidates for 4.19.y Sasha Levin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).