[PATCH] ARM/serial: at91: specify RTS in DT using gpio
From: Jean-Christophe PLAGNIOL-VILLARD <hidden>
Date: 2013-11-05 15:59:38
Also in:
linux-gpio
On Nov 5, 2013, at 11:29 PM, Nicolas Ferre [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Signed-off-by: Nicolas Ferre <redacted> --- Documentation/devicetree/bindings/serial/atmel-usart.txt | 3 +++ drivers/tty/serial/atmel_serial.c | 13 ++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-)diff --git a/Documentation/devicetree/bindings/serial/atmel-usart.txt b/Documentation/devicetree/bindings/serial/atmel-usart.txt index 2191dcb..3adc61c 100644 --- a/Documentation/devicetree/bindings/serial/atmel-usart.txt +++ b/Documentation/devicetree/bindings/serial/atmel-usart.txt@@ -10,6 +10,8 @@ Required properties:Optional properties: - atmel,use-dma-rx: use of PDC or DMA for receiving data - atmel,use-dma-tx: use of PDC or DMA for transmitting data +- rts-gpios: specify a GPIO for RTS line. It will use specified PIO instead of the peripheral + function pin for the USART RTS feature. If unsure, don't specify this property. - add dma bindings for dma transfer: - dmas: DMA specifier, consisting of a phandle to DMA controller node, memory peripheral interface and USART DMA channel ID, FIFO configuration.@@ -28,6 +30,7 @@ Example:interrupts = <7>; atmel,use-dma-rx; atmel,use-dma-tx; + rts-gpios = <&pioD 15 0>; };
gpios means 2 gpio I?ll rts-gpio as we can only use one anyway
quoted hunk ↗ jump to hunk
- use DMA:diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index b4e0794..71f8ea9 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c@@ -35,6 +35,7 @@#include <linux/platform_device.h> #include <linux/of.h> #include <linux/of_device.h> +#include <linux/of_gpio.h> #include <linux/dma-mapping.h> #include <linux/atmel_pdc.h> #include <linux/atmel_serial.h>@@ -2327,6 +2328,7 @@ static int atmel_serial_probe(struct platform_device *pdev)struct device_node *np = pdev->dev.of_node; struct atmel_uart_data *pdata = dev_get_platdata(&pdev->dev); void *data; + int rts_pin = -EINVAL; int ret = -ENODEV; BUILD_BUG_ON(ATMEL_SERIAL_RINGSIZE & (ATMEL_SERIAL_RINGSIZE - 1));@@ -2364,13 +2366,18 @@ static int atmel_serial_probe(struct platform_device *pdev)* structs to indicate "no RTS GPIO" instead of open-coding some * invalid value everywhere. */ - if (pdata->rts_gpio > 0) { - ret = devm_gpio_request(&pdev->dev, pdata->rts_gpio, "RTS"); + if (pdata && pdata->rts_gpio > 0) + rts_pin = pdata->rts_gpio; + else if (np) + rts_pin = of_get_named_gpio(np, "rts-gpios", 0); +
use directly port->rts_gpio so we can drop the assign after if the gpio is invalid the port->rts_gpio need to be < 0 too Best Regards, J.
+ if (gpio_is_valid(rts_pin)) {
+ ret = devm_gpio_request(&pdev->dev, rts_pin, "RTS");
if (ret) {
dev_err(&pdev->dev, "error requesting RTS GPIO\n");
goto err;
}
- port->rts_gpio = pdata->rts_gpio;
+ port->rts_gpio = rts_pin;
ret = gpio_direction_output(port->rts_gpio, 0);
if (ret) {
dev_err(&pdev->dev, "error setting up RTS GPIO\n");
--
1.8.2.2