All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Janusz Użycki" <j.uzycki@elproma.com.pl>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-serial@vger.kernel.org, devicetree@vger.kernel.org
Subject: Re: [PATCH 1/4] serial: mxs-auart: use mctrl_gpio helpers for handling modem signals (v2.2c)
Date: Fri, 19 Sep 2014 20:13:30 +0200	[thread overview]
Message-ID: <541C724A.8030207@elproma.com.pl> (raw)
In-Reply-To: <1411150136-30791-1-git-send-email-j.uzycki@elproma.com.pl>

Please discard this and before resend. Sorry.
I've used bad domain for linux-arm-kernel list...
The next one is ok.

best regards
Janusz

W dniu 2014-09-19 20:08, Janusz Uzycki pisze:
> Dedicated CTS and RTS pins are unusable together with a lot of other
> peripherals because they share the same line. Pinctrl is limited.
>
> Moreover, the AUART controller doesn't handle DTR/DSR/DCD/RI signals,
> so we have to control them via GPIO.
>
> This patch permits to use GPIOs to control the CTS/RTS/DTR/DSR/DCD/RI
> signals.
>
> Signed-off-by: Janusz Uzycki <j.uzycki@elproma.com.pl>
> ---
>   .../devicetree/bindings/serial/fsl-mxs-auart.txt   | 10 ++-
>   drivers/tty/serial/Kconfig           |  1 +
>   drivers/tty/serial/mxs-auart.c       | 77 +++++++++++++++++++++-
>   3 files changed, 84 insertions(+), 4 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/serial/fsl-mxs-auart.txt b/Documentation/devicetree/bindings/serial/fsl-mxs-auart.txt
> index 59a40f1..7c408c8 100644
> --- a/Documentation/devicetree/bindings/serial/fsl-mxs-auart.txt
> +++ b/Documentation/devicetree/bindings/serial/fsl-mxs-auart.txt
> @@ -11,8 +11,13 @@ Required properties:
>   - dma-names: "rx" for RX channel, "tx" for TX channel.
>   
>   Optional properties:
> -- fsl,uart-has-rtscts : Indicate the UART has RTS and CTS lines,
> +- fsl,uart-has-rtscts : Indicate the UART has RTS and CTS lines
> +  for hardware flow control,
>   	it also means you enable the DMA support for this UART.
> +- {rts,cts,dtr,dsr,rng,dcd}-gpios: specify a GPIO for RTS/CTS/DTR/DSR/RI/DCD
> +  line respectively. It will use specified PIO instead of the peripheral
> +  function pin for the USART feature.
> +  If unsure, don't specify this property.
>   
>   Example:
>   auart0: serial@8006a000 {
> @@ -21,6 +26,9 @@ auart0: serial@8006a000 {
>   	interrupts = <112>;
>   	dmas = <&dma_apbx 8>, <&dma_apbx 9>;
>   	dma-names = "rx", "tx";
> +	cts-gpios = <&gpio1 15 GPIO_ACTIVE_LOW>;
> +	dsr-gpios = <&gpio1 16 GPIO_ACTIVE_LOW>;
> +	dcd-gpios = <&gpio1 17 GPIO_ACTIVE_LOW>;
>   };
>   
>   Note: Each auart port should have an alias correctly numbered in "aliases"
> diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
> index 4fe8ca1..90e8516 100644
> --- a/drivers/tty/serial/Kconfig
> +++ b/drivers/tty/serial/Kconfig
> @@ -1357,6 +1357,7 @@ config SERIAL_MXS_AUART
>   	depends on ARCH_MXS
>   	tristate "MXS AUART support"
>   	select SERIAL_CORE
> +	select SERIAL_MCTRL_GPIO if GPIOLIB
>   	help
>   	  This driver supports the MXS Application UART (AUART) port.
>   
> diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
> index 52d14e3..4690200 100644
> --- a/drivers/tty/serial/mxs-auart.c
> +++ b/drivers/tty/serial/mxs-auart.c
> @@ -38,6 +38,9 @@
>   
>   #include <asm/cacheflush.h>
>   
> +#include <linux/err.h>
> +#include "serial_mctrl_gpio.h"
> +
>   #define MXS_AUART_MAJOR 242
>   #define MXS_AUART_PORTS 5
>   #define MXS_AUART_FIFO_SIZE		16
> @@ -156,6 +159,8 @@ struct mxs_auart_port {
>   	struct scatterlist rx_sgl;
>   	struct dma_chan	*rx_dma_chan;
>   	void *rx_dma_buf;
> +
> +	struct mctrl_gpios	*gpios;
>   };
>   
>   static struct platform_device_id mxs_auart_devtype[] = {
> @@ -415,8 +420,43 @@ static void mxs_auart_set_mctrl(struct uart_port *u, unsigned mctrl)
>   			ctrl |= AUART_CTRL2_RTS;
>   	}
>   
> +	/* Does tty layer modify mctrl for input lines
> +	 * and the code below is required? */
> +#if 0
>   	s->ctrl = mctrl;
> +#else
> +	s->ctrl &= ~(TIOCM_RTS | TIOCM_DTR);
> +	s->ctrl |= mctrl & (TIOCM_RTS | TIOCM_DTR);
> +#endif
>   	writel(ctrl, u->membase + AUART_CTRL2);
> +
> +	mctrl_gpio_set(s->gpios, mctrl);
> +}
> +
> +/* mxs_auart_modem_status() based on 8250.c,
> + * similar function could be as serial's helper... */
> +#define MCTRL_ANY_DELTA        (TIOCM_RI | TIOCM_DSR | TIOCM_CD | TIOCM_CTS)
> +static u32 mxs_auart_modem_status(struct mxs_auart_port *s, u32 mctrl)
> +{
> +	u32 mctrl_diff;
> +
> +	mctrl_diff = mctrl ^ s->ctrl;
> +	s->ctrl = mctrl;
> +	if (mctrl_diff & MCTRL_ANY_DELTA &&
> +			/*interrupt_enabled &&*/
> +			s->port.state != NULL) {
> +		if (mctrl_diff & TIOCM_RI)
> +			s->port.icount.rng++;
> +		if (mctrl_diff & TIOCM_DSR)
> +			s->port.icount.dsr++;
> +		if (mctrl_diff & TIOCM_CD)
> +			uart_handle_dcd_change(&s->port, mctrl & TIOCM_CD);
> +		if (mctrl_diff & TIOCM_CTS)
> +			uart_handle_cts_change(&s->port, mctrl & TIOCM_CTS);
> +
> +		wake_up_interruptible(&s->port.state->port.delta_msr_wait);
> +	}
> +	return mctrl;
>   }
>   
>   static u32 mxs_auart_get_mctrl(struct uart_port *u)
> @@ -433,7 +473,9 @@ static u32 mxs_auart_get_mctrl(struct uart_port *u)
>   	if (ctrl2 & AUART_CTRL2_RTS)
>   		mctrl |= TIOCM_RTS;
>   
> -	return mctrl;
> +	/* should mxs_auart_modem_status() be in interrupt only? */
> +	return mxs_auart_modem_status(s,
> +			mctrl_gpio_get(s->gpios, &mctrl));
>   }
>   
>   static int mxs_auart_dma_prep_rx(struct mxs_auart_port *s);
> @@ -637,7 +679,12 @@ static void mxs_auart_settermios(struct uart_port *u,
>   		ctrl |= AUART_LINECTRL_STP2;
>   
>   	/* figure out the hardware flow control settings */
> -	if (cflag & CRTSCTS) {
> +	/*FIXME: DMA for hardware flow control only? */
> +	if (cflag & CRTSCTS &&
> +			(IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(s->gpios,
> +					 UART_GPIO_RTS)) ||
> +			 IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(s->gpios,
> +					 UART_GPIO_CTS)))) {
>   		/*
>   		 * The DMA has a bug(see errata:2836) in mx23.
>   		 * So we can not implement the DMA for auart in mx23,
> @@ -696,8 +743,14 @@ static irqreturn_t mxs_auart_irq_handle(int irq, void *context)
>   		| AUART_INTR_CTSMIS),
>   			s->port.membase + AUART_INTR_CLR);
>   
> +	mxs_auart_modem_status(s,
> +			mctrl_gpio_get(s->gpios, &s->ctrl));
> +
>   	if (istat & AUART_INTR_CTSMIS) {
> -		uart_handle_cts_change(&s->port, stat & AUART_STAT_CTS);
> +		if (IS_ERR_OR_NULL(mctrl_gpio_to_gpiod(s->gpios,
> +						UART_GPIO_CTS)))
> +			uart_handle_cts_change(&s->port,
> +					stat & AUART_STAT_CTS);
>   		writel(AUART_INTR_CTSMIS,
>   				s->port.membase + AUART_INTR_CLR);
>   		istat &= ~AUART_INTR_CTSMIS;
> @@ -758,6 +811,8 @@ static int mxs_auart_startup(struct uart_port *u)
>   	 */
>   	writel(AUART_LINECTRL_FEN, u->membase + AUART_LINECTRL_SET);
>   
> +	/* get initial status of modem lines */
> +	mctrl_gpio_get(s->gpios, &s->ctrl);
>   	return 0;
>   }
>   
> @@ -1021,6 +1076,14 @@ static int serial_mxs_probe_dt(struct mxs_auart_port *s,
>   	return 0;
>   }
>   
> +static int mxs_auart_init_gpios(struct mxs_auart_port *s, struct device *dev)
> +{
> +	s->gpios = mctrl_gpio_init(dev, 0);
> +	if (IS_ERR_OR_NULL(s->gpios))
> +		return -1;
> +	return 0;
> +}
> +
>   static int mxs_auart_probe(struct platform_device *pdev)
>   {
>   	const struct of_device_id *of_id =
> @@ -1078,6 +1141,11 @@ static int mxs_auart_probe(struct platform_device *pdev)
>   
>   	platform_set_drvdata(pdev, s);
>   
> +	ret = mxs_auart_init_gpios(s, &pdev->dev);
> +	if (ret < 0)
> +		dev_err(&pdev->dev, "%s",
> +			"Failed to initialize GPIOs. The serial port may not work as expected");
> +
>   	auart_port[s->port.line] = s;
>   
>   	mxs_auart_reset(&s->port);
> @@ -1094,6 +1162,7 @@ static int mxs_auart_probe(struct platform_device *pdev)
>   	return 0;
>   
>   out_free_irq:
> +	mctrl_gpio_free(&pdev->dev, s->gpios);	/*useless?*/
>   	auart_port[pdev->id] = NULL;
>   	free_irq(s->irq, s);
>   out_free_clk:
> @@ -1112,6 +1181,8 @@ static int mxs_auart_remove(struct platform_device *pdev)
>   
>   	auart_port[pdev->id] = NULL;
>   
> +	mctrl_gpio_free(&pdev->dev, s->gpios);	/*useless?*/
> +
>   	clk_put(s->clk);
>   	free_irq(s->irq, s);
>   	kfree(s);


  parent reply	other threads:[~2014-09-19 18:13 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-19 18:08 [PATCH 1/4] serial: mxs-auart: use mctrl_gpio helpers for handling modem signals (v2.2c) Janusz Uzycki
2014-09-19 18:08 ` [PATCH 2/4] serial: mxs-auart: add interrupts for modem control lines Janusz Uzycki
2014-09-19 18:08 ` [PATCH 3/4] serial: mxs-auart: enable PPS support Janusz Uzycki
2014-09-19 18:08 ` [PATCH 4/4] serial: mxs-auart: add sysrq support Janusz Uzycki
2014-09-19 18:13 ` Janusz Użycki [this message]
  -- strict thread matches above, loose matches on Subject: below --
2014-09-19 18:13 [PATCH 1/4] serial: mxs-auart: use mctrl_gpio helpers for handling modem signals (v2.2c) Janusz Uzycki
2014-09-19 18:13 ` Janusz Uzycki
2014-09-23 16:18 ` Janusz Użycki
2014-09-23 16:18   ` Janusz Użycki
2014-09-26 12:59 ` Janusz Użycki
2014-09-26 12:59   ` Janusz Użycki
2014-09-26 13:11   ` Russell King - ARM Linux
2014-09-26 13:11     ` Russell King - ARM Linux
2014-09-26 13:23     ` Janusz Użycki
2014-09-26 13:23       ` Janusz Użycki
2014-09-19 18:06 Janusz Uzycki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=541C724A.8030207@elproma.com.pl \
    --to=j.uzycki@elproma.com.pl \
    --cc=devicetree@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-serial@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.