From patchwork Fri Feb 6 16:55:34 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: j.uzycki@elproma.com.pl X-Patchwork-Id: 5793301 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id B18CABF440 for ; Fri, 6 Feb 2015 16:56:26 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8677F20165 for ; Fri, 6 Feb 2015 16:56:25 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C21112010B for ; Fri, 6 Feb 2015 16:56:23 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1YJmAf-0005B0-TK; Fri, 06 Feb 2015 16:54:21 +0000 Received: from v032797.home.net.pl ([89.161.177.31]) by bombadil.infradead.org with smtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1YJmAW-0004zF-JU for linux-arm-kernel@lists.infradead.org; Fri, 06 Feb 2015 16:54:14 +0000 Received: from 5-226-98-186.static.ip.netia.com.pl (5.226.98.186) (HELO ip165.elproma.lan) by elproma.home.pl (89.161.177.31) with SMTP (IdeaSmtpServer v0.80) id 00bfc46b5c178174; Fri, 6 Feb 2015 17:53:45 +0100 From: Janusz Uzycki To: Greg Kroah-Hartman , Linus Walleij , Uwe =?iso-8859-1?Q?Kleine-K=F6nig?= , =?UTF-8?B?QWxleGFuZGVyIFNoaXlhbg==?= Subject: [PATCH v3 3/4] serial: at91: Use helpers for gpio irqs Date: Fri, 6 Feb 2015 17:55:34 +0100 Message-Id: <1423241735-30387-3-git-send-email-j.uzycki@elproma.com.pl> X-Mailer: git-send-email 1.7.11.3 In-Reply-To: <1423241735-30387-1-git-send-email-j.uzycki@elproma.com.pl> References: <1423241735-30387-1-git-send-email-j.uzycki@elproma.com.pl> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150206_085412_848908_08055997 X-CRM114-Status: GOOD ( 14.81 ) X-Spam-Score: 0.0 (/) Cc: fabio.estevam@freescale.com, Alexandre Courbot , Richard Genoud , linux-gpio@vger.kernel.org, Janusz Uzycki , linux-serial@vger.kernel.org, Fabio Estevam , linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The patch updates atmel_serial driver to use new mctrl_gpio helpers for gpio irqs. The code is simpler now. Signed-off-by: Janusz Uzycki --- There is no changes since v2. --- drivers/tty/serial/atmel_serial.c | 123 +++++++------------------------------- 1 file changed, 20 insertions(+), 103 deletions(-) diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index 846552b..6bcb181 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c @@ -168,7 +168,6 @@ struct atmel_uart_port { struct circ_buf rx_ring; struct mctrl_gpios *gpios; - int gpio_irq[UART_GPIO_MAX]; unsigned int tx_done_mask; bool ms_irq_enabled; bool is_usart; /* usart or uart */ @@ -512,24 +511,18 @@ static void atmel_enable_ms(struct uart_port *port) atmel_port->ms_irq_enabled = true; - if (atmel_port->gpio_irq[UART_GPIO_CTS] >= 0) - enable_irq(atmel_port->gpio_irq[UART_GPIO_CTS]); - else + mctrl_gpio_enable_ms(atmel_port->gpios); + + if (!mctrl_gpio_is_gpio(atmel_port->gpios, UART_GPIO_CTS)) ier |= ATMEL_US_CTSIC; - if (atmel_port->gpio_irq[UART_GPIO_DSR] >= 0) - enable_irq(atmel_port->gpio_irq[UART_GPIO_DSR]); - else + if (!mctrl_gpio_is_gpio(atmel_port->gpios, UART_GPIO_DSR)) ier |= ATMEL_US_DSRIC; - if (atmel_port->gpio_irq[UART_GPIO_RI] >= 0) - enable_irq(atmel_port->gpio_irq[UART_GPIO_RI]); - else + if (!mctrl_gpio_is_gpio(atmel_port->gpios, UART_GPIO_RI)) ier |= ATMEL_US_RIIC; - if (atmel_port->gpio_irq[UART_GPIO_DCD] >= 0) - enable_irq(atmel_port->gpio_irq[UART_GPIO_DCD]); - else + if (!mctrl_gpio_is_gpio(atmel_port->gpios, UART_GPIO_DCD)) ier |= ATMEL_US_DCDIC; UART_PUT_IER(port, ier); @@ -551,24 +544,18 @@ static void atmel_disable_ms(struct uart_port *port) atmel_port->ms_irq_enabled = false; - if (atmel_port->gpio_irq[UART_GPIO_CTS] >= 0) - disable_irq(atmel_port->gpio_irq[UART_GPIO_CTS]); - else + mctrl_gpio_disable_ms(atmel_port->gpios); + + if (!mctrl_gpio_is_gpio(atmel_port->gpios, UART_GPIO_CTS)) idr |= ATMEL_US_CTSIC; - if (atmel_port->gpio_irq[UART_GPIO_DSR] >= 0) - disable_irq(atmel_port->gpio_irq[UART_GPIO_DSR]); - else + if (!mctrl_gpio_is_gpio(atmel_port->gpios, UART_GPIO_DSR)) idr |= ATMEL_US_DSRIC; - if (atmel_port->gpio_irq[UART_GPIO_RI] >= 0) - disable_irq(atmel_port->gpio_irq[UART_GPIO_RI]); - else + if (!mctrl_gpio_is_gpio(atmel_port->gpios, UART_GPIO_RI)) idr |= ATMEL_US_RIIC; - if (atmel_port->gpio_irq[UART_GPIO_DCD] >= 0) - disable_irq(atmel_port->gpio_irq[UART_GPIO_DCD]); - else + if (!mctrl_gpio_is_gpio(atmel_port->gpios, UART_GPIO_DCD)) idr |= ATMEL_US_DCDIC; UART_PUT_IDR(port, idr); @@ -1178,31 +1165,11 @@ atmel_handle_status(struct uart_port *port, unsigned int pending, static irqreturn_t atmel_interrupt(int irq, void *dev_id) { struct uart_port *port = dev_id; - struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); unsigned int status, pending, pass_counter = 0; - bool gpio_handled = false; do { status = atmel_get_lines_status(port); pending = status & UART_GET_IMR(port); - if (!gpio_handled) { - /* - * Dealing with GPIO interrupt - */ - if (irq == atmel_port->gpio_irq[UART_GPIO_CTS]) - pending |= ATMEL_US_CTSIC; - - if (irq == atmel_port->gpio_irq[UART_GPIO_DSR]) - pending |= ATMEL_US_DSRIC; - - if (irq == atmel_port->gpio_irq[UART_GPIO_RI]) - pending |= ATMEL_US_RIIC; - - if (irq == atmel_port->gpio_irq[UART_GPIO_DCD]) - pending |= ATMEL_US_DCDIC; - - gpio_handled = true; - } if (!pending) break; @@ -1682,45 +1649,6 @@ static void atmel_get_ip_name(struct uart_port *port) } } -static void atmel_free_gpio_irq(struct uart_port *port) -{ - struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); - enum mctrl_gpio_idx i; - - for (i = 0; i < UART_GPIO_MAX; i++) - if (atmel_port->gpio_irq[i] >= 0) - free_irq(atmel_port->gpio_irq[i], port); -} - -static int atmel_request_gpio_irq(struct uart_port *port) -{ - struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); - int *irq = atmel_port->gpio_irq; - enum mctrl_gpio_idx i; - int err = 0; - - for (i = 0; (i < UART_GPIO_MAX) && !err; i++) { - if (irq[i] < 0) - continue; - - irq_set_status_flags(irq[i], IRQ_NOAUTOEN); - err = request_irq(irq[i], atmel_interrupt, IRQ_TYPE_EDGE_BOTH, - "atmel_serial", port); - if (err) - dev_err(port->dev, "atmel_startup - Can't get %d irq\n", - irq[i]); - } - - /* - * If something went wrong, rollback. - */ - while (err && (--i >= 0)) - if (irq[i] >= 0) - free_irq(irq[i], port); - - return err; -} - /* * Perform initialization and enable port for reception */ @@ -1752,7 +1680,7 @@ static int atmel_startup(struct uart_port *port) /* * Get the GPIO lines IRQ */ - retval = atmel_request_gpio_irq(port); + retval = mctrl_gpio_request_irqs(atmel_port->gpios); if (retval) goto free_irq; @@ -1889,7 +1817,7 @@ static void atmel_shutdown(struct uart_port *port) * Free the interrupts */ free_irq(port->irq, port); - atmel_free_gpio_irq(port); + mctrl_gpio_free_irqs(atmel_port->gpios); atmel_port->ms_irq_enabled = false; @@ -2536,24 +2464,13 @@ static int atmel_serial_resume(struct platform_device *pdev) #define atmel_serial_resume NULL #endif -static int atmel_init_gpios(struct atmel_uart_port *p, struct device *dev) +static bool atmel_init_gpios(struct atmel_uart_port *p) { - enum mctrl_gpio_idx i; - struct gpio_desc *gpiod; - - p->gpios = mctrl_gpio_init(dev, 0); + p->gpios = mctrl_gpio_init_dt(&p->uart, 0); if (IS_ERR_OR_NULL(p->gpios)) - return -1; + return false; - for (i = 0; i < UART_GPIO_MAX; i++) { - gpiod = mctrl_gpio_to_gpiod(p->gpios, i); - if (gpiod && (gpiod_get_direction(gpiod) == GPIOF_DIR_IN)) - p->gpio_irq[i] = gpiod_to_irq(gpiod); - else - p->gpio_irq[i] = -EINVAL; - } - - return 0; + return true; } static int atmel_serial_probe(struct platform_device *pdev) @@ -2593,8 +2510,8 @@ static int atmel_serial_probe(struct platform_device *pdev) port->backup_imr = 0; port->uart.line = ret; - ret = atmel_init_gpios(port, &pdev->dev); - if (ret < 0) + port->uart.dev = &pdev->dev; + if (!atmel_init_gpios(port)) dev_err(&pdev->dev, "%s", "Failed to initialize GPIOs. The serial port may not work as expected");