* [PATCH] timbuart: Support for beeing probed more than once
@ 2009-08-19 13:45 Richard Röjfors
0 siblings, 0 replies; only message in thread
From: Richard Röjfors @ 2009-08-19 13:45 UTC (permalink / raw)
To: linux-serial
There was a problem in the current implementation where a global static
uart_driver struct was used. The same struct was reused every time the
driver got probed. Since the struct has a state within the serial core
it can not be reused.
A uart_driver struct is added to the timbuart_port struct which is
allocated per platform device.
The probe and remove functions are declared __devinit and __devexit.
Signed-off-by: Richard Röjfors <richard.rojfors.ext@mocean-labs.com>
---
diff --git a/drivers/serial/timbuart.c b/drivers/serial/timbuart.c
index 063a313..75a741b 100644
--- a/drivers/serial/timbuart.c
+++ b/drivers/serial/timbuart.c
@@ -31,6 +31,7 @@
struct timbuart_port {
struct uart_port port;
+ struct uart_driver uart_driver;
struct tasklet_struct tasklet;
int usedma;
u32 last_ier;
@@ -410,7 +411,7 @@ static struct uart_ops timbuart_ops = {
.verify_port = timbuart_verify_port
};
-static struct uart_driver timbuart_driver = {
+static const __devinitconst struct uart_driver timbuart_driver_template = {
.owner = THIS_MODULE,
.driver_name = "timberdale_uart",
.dev_name = "ttyTU",
@@ -419,7 +420,7 @@ static struct uart_driver timbuart_driver = {
.nr = 1
};
-static int timbuart_probe(struct platform_device *dev)
+static int __devinit timbuart_probe(struct platform_device *dev)
{
int err;
struct timbuart_port *uart;
@@ -433,6 +434,8 @@ static int timbuart_probe(struct platform_device *dev)
goto err_mem;
}
+ uart->uart_driver = timbuart_driver_template;
+
uart->usedma = 0;
uart->port.uartclk = 3250000 * 16;
@@ -461,11 +464,11 @@ static int timbuart_probe(struct platform_device *dev)
tasklet_init(&uart->tasklet, timbuart_tasklet, (unsigned long)uart);
- err = uart_register_driver(&timbuart_driver);
+ err = uart_register_driver(&uart->uart_driver);
if (err)
goto err_register;
- err = uart_add_one_port(&timbuart_driver, &uart->port);
+ err = uart_add_one_port(&uart->uart_driver, &uart->port);
if (err)
goto err_add_port;
@@ -474,7 +477,7 @@ static int timbuart_probe(struct platform_device *dev)
return 0;
err_add_port:
- uart_unregister_driver(&timbuart_driver);
+ uart_unregister_driver(&uart->uart_driver);
err_register:
kfree(uart);
err_mem:
@@ -484,13 +487,13 @@ err_mem:
return err;
}
-static int timbuart_remove(struct platform_device *dev)
+static int __devexit timbuart_remove(struct platform_device *dev)
{
struct timbuart_port *uart = platform_get_drvdata(dev);
tasklet_kill(&uart->tasklet);
- uart_remove_one_port(&timbuart_driver, &uart->port);
- uart_unregister_driver(&timbuart_driver);
+ uart_remove_one_port(&uart->uart_driver, &uart->port);
+ uart_unregister_driver(&uart->uart_driver);
kfree(uart);
return 0;
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2009-08-19 14:08 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-08-19 13:45 [PATCH] timbuart: Support for beeing probed more than once Richard Röjfors
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.