Skip to content

Commit 18dfef9

Browse files
Uwe Kleine-Königgregkh
authored andcommitted
serial: atmel: convert to irq handling provided mctrl-gpio
Tested-by: Nicolas Ferre <nicolas.ferre@atmel.com> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 456ad4a commit 18dfef9

File tree

1 file changed

+18
-122
lines changed

1 file changed

+18
-122
lines changed

drivers/tty/serial/atmel_serial.c

Lines changed: 18 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,6 @@ struct atmel_uart_port {
155155
struct circ_buf rx_ring;
156156

157157
struct mctrl_gpios *gpios;
158-
int gpio_irq[UART_GPIO_MAX];
159158
unsigned int tx_done_mask;
160159
u32 fifo_size;
161160
u32 rts_high;
@@ -550,27 +549,21 @@ static void atmel_enable_ms(struct uart_port *port)
550549

551550
atmel_port->ms_irq_enabled = true;
552551

553-
if (atmel_port->gpio_irq[UART_GPIO_CTS] >= 0)
554-
enable_irq(atmel_port->gpio_irq[UART_GPIO_CTS]);
555-
else
552+
if (!mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_CTS))
556553
ier |= ATMEL_US_CTSIC;
557554

558-
if (atmel_port->gpio_irq[UART_GPIO_DSR] >= 0)
559-
enable_irq(atmel_port->gpio_irq[UART_GPIO_DSR]);
560-
else
555+
if (!mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_DSR))
561556
ier |= ATMEL_US_DSRIC;
562557

563-
if (atmel_port->gpio_irq[UART_GPIO_RI] >= 0)
564-
enable_irq(atmel_port->gpio_irq[UART_GPIO_RI]);
565-
else
558+
if (!mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_RI))
566559
ier |= ATMEL_US_RIIC;
567560

568-
if (atmel_port->gpio_irq[UART_GPIO_DCD] >= 0)
569-
enable_irq(atmel_port->gpio_irq[UART_GPIO_DCD]);
570-
else
561+
if (!mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_DCD))
571562
ier |= ATMEL_US_DCDIC;
572563

573564
atmel_uart_writel(port, ATMEL_US_IER, ier);
565+
566+
mctrl_gpio_enable_ms(atmel_port->gpios);
574567
}
575568

576569
/*
@@ -589,24 +582,18 @@ static void atmel_disable_ms(struct uart_port *port)
589582

590583
atmel_port->ms_irq_enabled = false;
591584

592-
if (atmel_port->gpio_irq[UART_GPIO_CTS] >= 0)
593-
disable_irq(atmel_port->gpio_irq[UART_GPIO_CTS]);
594-
else
585+
mctrl_gpio_disable_ms(atmel_port->gpios);
586+
587+
if (!mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_CTS))
595588
idr |= ATMEL_US_CTSIC;
596589

597-
if (atmel_port->gpio_irq[UART_GPIO_DSR] >= 0)
598-
disable_irq(atmel_port->gpio_irq[UART_GPIO_DSR]);
599-
else
590+
if (!mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_DSR))
600591
idr |= ATMEL_US_DSRIC;
601592

602-
if (atmel_port->gpio_irq[UART_GPIO_RI] >= 0)
603-
disable_irq(atmel_port->gpio_irq[UART_GPIO_RI]);
604-
else
593+
if (!mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_RI))
605594
idr |= ATMEL_US_RIIC;
606595

607-
if (atmel_port->gpio_irq[UART_GPIO_DCD] >= 0)
608-
disable_irq(atmel_port->gpio_irq[UART_GPIO_DCD]);
609-
else
596+
if (!mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_DCD))
610597
idr |= ATMEL_US_DCDIC;
611598

612599
atmel_uart_writel(port, ATMEL_US_IDR, idr);
@@ -1264,32 +1251,13 @@ static irqreturn_t atmel_interrupt(int irq, void *dev_id)
12641251
struct uart_port *port = dev_id;
12651252
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
12661253
unsigned int status, pending, mask, pass_counter = 0;
1267-
bool gpio_handled = false;
12681254

12691255
spin_lock(&atmel_port->lock_suspended);
12701256

12711257
do {
12721258
status = atmel_get_lines_status(port);
12731259
mask = atmel_uart_readl(port, ATMEL_US_IMR);
12741260
pending = status & mask;
1275-
if (!gpio_handled) {
1276-
/*
1277-
* Dealing with GPIO interrupt
1278-
*/
1279-
if (irq == atmel_port->gpio_irq[UART_GPIO_CTS])
1280-
pending |= ATMEL_US_CTSIC;
1281-
1282-
if (irq == atmel_port->gpio_irq[UART_GPIO_DSR])
1283-
pending |= ATMEL_US_DSRIC;
1284-
1285-
if (irq == atmel_port->gpio_irq[UART_GPIO_RI])
1286-
pending |= ATMEL_US_RIIC;
1287-
1288-
if (irq == atmel_port->gpio_irq[UART_GPIO_DCD])
1289-
pending |= ATMEL_US_DCDIC;
1290-
1291-
gpio_handled = true;
1292-
}
12931261
if (!pending)
12941262
break;
12951263

@@ -1778,45 +1746,6 @@ static void atmel_get_ip_name(struct uart_port *port)
17781746
}
17791747
}
17801748

1781-
static void atmel_free_gpio_irq(struct uart_port *port)
1782-
{
1783-
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
1784-
enum mctrl_gpio_idx i;
1785-
1786-
for (i = 0; i < UART_GPIO_MAX; i++)
1787-
if (atmel_port->gpio_irq[i] >= 0)
1788-
free_irq(atmel_port->gpio_irq[i], port);
1789-
}
1790-
1791-
static int atmel_request_gpio_irq(struct uart_port *port)
1792-
{
1793-
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
1794-
int *irq = atmel_port->gpio_irq;
1795-
enum mctrl_gpio_idx i;
1796-
int err = 0;
1797-
1798-
for (i = 0; (i < UART_GPIO_MAX) && !err; i++) {
1799-
if (irq[i] < 0)
1800-
continue;
1801-
1802-
irq_set_status_flags(irq[i], IRQ_NOAUTOEN);
1803-
err = request_irq(irq[i], atmel_interrupt, IRQ_TYPE_EDGE_BOTH,
1804-
"atmel_serial", port);
1805-
if (err)
1806-
dev_err(port->dev, "atmel_startup - Can't get %d irq\n",
1807-
irq[i]);
1808-
}
1809-
1810-
/*
1811-
* If something went wrong, rollback.
1812-
*/
1813-
while (err && (--i >= 0))
1814-
if (irq[i] >= 0)
1815-
free_irq(irq[i], port);
1816-
1817-
return err;
1818-
}
1819-
18201749
/*
18211750
* Perform initialization and enable port for reception
18221751
*/
@@ -1846,13 +1775,6 @@ static int atmel_startup(struct uart_port *port)
18461775
return retval;
18471776
}
18481777

1849-
/*
1850-
* Get the GPIO lines IRQ
1851-
*/
1852-
retval = atmel_request_gpio_irq(port);
1853-
if (retval)
1854-
goto free_irq;
1855-
18561778
tasklet_enable(&atmel_port->tasklet);
18571779

18581780
/*
@@ -1948,11 +1870,6 @@ static int atmel_startup(struct uart_port *port)
19481870
}
19491871

19501872
return 0;
1951-
1952-
free_irq:
1953-
free_irq(port->irq, port);
1954-
1955-
return retval;
19561873
}
19571874

19581875
/*
@@ -2018,7 +1935,6 @@ static void atmel_shutdown(struct uart_port *port)
20181935
* Free the interrupts
20191936
*/
20201937
free_irq(port->irq, port);
2021-
atmel_free_gpio_irq(port);
20221938

20231939
atmel_port->ms_irq_enabled = false;
20241940

@@ -2686,26 +2602,6 @@ static int atmel_serial_resume(struct platform_device *pdev)
26862602
#define atmel_serial_resume NULL
26872603
#endif
26882604

2689-
static int atmel_init_gpios(struct atmel_uart_port *p, struct device *dev)
2690-
{
2691-
enum mctrl_gpio_idx i;
2692-
struct gpio_desc *gpiod;
2693-
2694-
p->gpios = mctrl_gpio_init_noauto(dev, 0);
2695-
if (IS_ERR(p->gpios))
2696-
return PTR_ERR(p->gpios);
2697-
2698-
for (i = 0; i < UART_GPIO_MAX; i++) {
2699-
gpiod = mctrl_gpio_to_gpiod(p->gpios, i);
2700-
if (gpiod && (gpiod_get_direction(gpiod) == GPIOF_DIR_IN))
2701-
p->gpio_irq[i] = gpiod_to_irq(gpiod);
2702-
else
2703-
p->gpio_irq[i] = -EINVAL;
2704-
}
2705-
2706-
return 0;
2707-
}
2708-
27092605
static void atmel_serial_probe_fifos(struct atmel_uart_port *port,
27102606
struct platform_device *pdev)
27112607
{
@@ -2788,16 +2684,16 @@ static int atmel_serial_probe(struct platform_device *pdev)
27882684

27892685
spin_lock_init(&port->lock_suspended);
27902686

2791-
ret = atmel_init_gpios(port, &pdev->dev);
2792-
if (ret < 0) {
2793-
dev_err(&pdev->dev, "Failed to initialize GPIOs.");
2794-
goto err_clear_bit;
2795-
}
2796-
27972687
ret = atmel_init_port(port, pdev);
27982688
if (ret)
27992689
goto err_clear_bit;
28002690

2691+
port->gpios = mctrl_gpio_init(&port->uart, 0);
2692+
if (IS_ERR(port->gpios)) {
2693+
ret = PTR_ERR(port->gpios);
2694+
goto err_clear_bit;
2695+
}
2696+
28012697
if (!atmel_use_pdc_rx(&port->uart)) {
28022698
ret = -ENOMEM;
28032699
data = kmalloc(sizeof(struct atmel_uart_char)

0 commit comments

Comments
 (0)