Title: [7338] trunk/drivers/serial/bfin_5xx.c: Task[#5518] Move most bfin uart platform info into board file
Revision
7338
Author
sonicz
Date
2009-09-15 04:39:54 -0400 (Tue, 15 Sep 2009)

Log Message

Task[#5518] Move most bfin uart platform info into board file

Free peripheral resources when module exits.

Modified Paths

Diff

Modified: trunk/drivers/serial/bfin_5xx.c (7337 => 7338)


--- trunk/drivers/serial/bfin_5xx.c	2009-09-15 06:52:54 UTC (rev 7337)
+++ trunk/drivers/serial/bfin_5xx.c	2009-09-15 08:39:54 UTC (rev 7338)
@@ -1082,39 +1082,57 @@
 #endif
 };
 
-static void __init bfin_serial_hw_init(void)
-{
 #ifdef CONFIG_SERIAL_BFIN_UART0
-	peripheral_request(P_UART0_TX, DRIVER_NAME);
-	peripheral_request(P_UART0_RX, DRIVER_NAME);
+unsigned short bfin_uart0_pin_req[] = {P_UART0_TX, P_UART0_RX, 0};
 #endif
-
 #ifdef CONFIG_SERIAL_BFIN_UART1
-	peripheral_request(P_UART1_TX, DRIVER_NAME);
-	peripheral_request(P_UART1_RX, DRIVER_NAME);
+unsigned short bfin_uart1_pin_req[] = {P_UART1_TX, P_UART1_RX, 0};
 #endif
-
 #ifdef CONFIG_SERIAL_BFIN_UART2
-	peripheral_request(P_UART2_TX, DRIVER_NAME);
-	peripheral_request(P_UART2_RX, DRIVER_NAME);
+unsigned short bfin_uart2_pin_req[] = {P_UART2_TX, P_UART2_RX, 0};
 #endif
-
 #ifdef CONFIG_SERIAL_BFIN_UART3
-	peripheral_request(P_UART3_TX, DRIVER_NAME);
-	peripheral_request(P_UART3_RX, DRIVER_NAME);
+unsigned short bfin_uart3_pin_req[] = {P_UART3_TX, P_UART3_RX, 0};
 #endif
-}
 
-static void __init bfin_serial_init_ports(void)
+static int __init bfin_serial_init_ports(void)
 {
 	static int first = 1;
 	int i;
+	int ret;
 
 	if (!first)
-		return;
+		return 0;
 	first = 0;
 
-	bfin_serial_hw_init();
+#ifdef CONFIG_SERIAL_BFIN_UART0
+	ret = peripheral_request_list(bfin_uart0_pin_req, DRIVER_NAME);
+	if (ret) {
+		pr_err("requesting UART0 peripherals failed\n");
+		goto err_out0;
+	}
+#endif
+#ifdef CONFIG_SERIAL_BFIN_UART1
+	ret = peripheral_request_list(bfin_uart1_pin_req, DRIVER_NAME);
+	if (ret) {
+		pr_err("requesting UART1 peripherals failed\n");
+		goto err_out1;
+	}
+#endif
+#ifdef CONFIG_SERIAL_BFIN_UART2
+	ret = peripheral_request_list(bfin_uart2_pin_req, DRIVER_NAME);
+	if (ret) {
+		pr_err("requesting UART2 peripherals failed\n");
+		goto err_out2;
+	}
+#endif
+#ifdef CONFIG_SERIAL_BFIN_UART3
+	ret = peripheral_request_list(bfin_uart3_pin_req, DRIVER_NAME);
+	if (ret) {
+		pr_err("requesting UART3 peripherals failed\n");
+		goto err_out3;
+	}
+#endif
 
 	for (i = 0; i < nr_active_ports; i++) {
 		spin_lock_init(&bfin_serial_ports[i].port.lock);
@@ -1127,6 +1145,25 @@
 		bfin_serial_ports[i].port.membase   =
 			(void __iomem *)bfin_serial_console_base_addr[i];
 	}
+
+	return 0;
+#ifdef CONFIG_SERIAL_BFIN_UART3
+err_out3:
+#endif
+#ifdef CONFIG_SERIAL_BFIN_UART2
+	peripheral_free_list(bfin_uart2_pin_req);
+err_out2:
+#endif
+#ifdef CONFIG_SERIAL_BFIN_UART1
+err_out1:
+	peripheral_free_list(bfin_uart1_pin_req);
+#endif
+#ifdef CONFIG_SERIAL_BFIN_UART0
+err_out0:
+	peripheral_free_list(bfin_uart0_pin_req);
+#endif
+
+	return ret;
 }
 
 #if defined(CONFIG_SERIAL_BFIN_CONSOLE) || defined(CONFIG_EARLY_PRINTK)
@@ -1246,7 +1283,11 @@
 
 static int __init bfin_serial_rs_console_init(void)
 {
-	bfin_serial_init_ports();
+	int ret;
+
+	ret = bfin_serial_init_ports();
+	if (ret)
+		return ret;
 	register_console(&bfin_serial_console);
 
 	return 0;
@@ -1280,6 +1321,7 @@
 {
 	struct bfin_serial_port *uart;
 	struct ktermios t;
+	int ret;
 
 #ifdef CONFIG_SERIAL_BFIN_CONSOLE
 	/*
@@ -1291,7 +1333,10 @@
 
 	if (port == -1 || port >= nr_active_ports)
 		port = 0;
-	bfin_serial_init_ports();
+	ret = bfin_serial_init_ports();
+	if (ret)
+		return ret;
+
 	bfin_early_serial_console.index = port;
 	uart = &bfin_serial_ports[port];
 	t.c_cflag = cflag;
@@ -1451,7 +1496,9 @@
 
 	pr_info("Serial: Blackfin serial driver\n");
 
-	bfin_serial_init_ports();
+	ret = bfin_serial_init_ports();
+	if (ret)
+		return ret;
 
 	ret = uart_register_driver(&bfin_serial_reg);
 	if (ret == 0) {
@@ -1468,6 +1515,20 @@
 {
 	platform_driver_unregister(&bfin_serial_driver);
 	uart_unregister_driver(&bfin_serial_reg);
+
+#ifdef CONFIG_SERIAL_BFIN_UART0
+	peripheral_free_list(bfin_uart0_pin_req);
+#endif
+#ifdef CONFIG_SERIAL_BFIN_UART1
+	peripheral_free_list(bfin_uart1_pin_req);
+#endif
+#ifdef CONFIG_SERIAL_BFIN_UART2
+	peripheral_free_list(bfin_uart2_pin_req);
+#endif
+#ifdef CONFIG_SERIAL_BFIN_UART3
+	peripheral_free_list(bfin_uart3_pin_req);
+#endif
+
 }
 
 
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to