summaryrefslogtreecommitdiffstats
path: root/cpu
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2007-07-05 18:01:54 +0200
committerSascha Hauer <sha@octopus.labnet.pengutronix.de>2007-07-05 18:01:54 +0200
commit8819276961a48513ae530598f72c33aa89f79f96 (patch)
treeff6f9c5c97b92d000d34e120c1589616f761a961 /cpu
parent5335912a97fce052b84bf58513d4ba119aab7ec6 (diff)
downloadbarebox-8819276961a48513ae530598f72c33aa89f79f96.tar.gz
barebox-8819276961a48513ae530598f72c33aa89f79f96.tar.xz
svn_rev_442
make it a driver
Diffstat (limited to 'cpu')
-rw-r--r--cpu/arm920t/imx/serial.c93
1 files changed, 49 insertions, 44 deletions
diff --git a/cpu/arm920t/imx/serial.c b/cpu/arm920t/imx/serial.c
index 339458fef5..278030cbfa 100644
--- a/cpu/arm920t/imx/serial.c
+++ b/cpu/arm920t/imx/serial.c
@@ -19,14 +19,9 @@
#include <common.h>
#include <asm/arch/imx-regs.h>
-
-#if defined CONFIG_IMX_SERIAL1
-#define IMX_UART_BASE IMX_UART1_BASE
-#elif defined CONFIG_IMX_SERIAL2
-#define IMX_UART_BASE IMX_UART2_BASE
-#else
-#error "define CONFIG_IMX_SERIAL1, CONFIG_IMX_SERIAL2 or CONFIG_IMX_SERIAL_NONE"
-#endif
+#include <driver.h>
+#include <init.h>
+#include <malloc.h>
#define URXD0(base) __REG( 0x0 +(base)) /* Receiver Register */
#define URTX0(base) __REG( 0x40 +(base)) /* Transmitter Register */
@@ -63,7 +58,7 @@ extern void imx_gpio_mode(int gpio_mode);
* are always 8 data bits, no parity, 1 stop bit, no start bits.
*
*/
-int serial_init (void)
+static int imx_serial_init_port(struct console_device *cdev)
{
#if 0
volatile struct imx_serial* base = (struct imx_serial *)UART_BASE;
@@ -137,58 +132,68 @@ int serial_init (void)
return 0;
}
-void serial_setbrg (void)
+static void imx_serial_putc(struct console_device *cdev, char c)
{
- serial_init();
+ struct device_d *dev = cdev->dev;
+
+ /* Wait for Tx FIFO not full */
+ while (UTS(dev->map_base) & UTS_TXFULL);
+
+ URTX0(dev->map_base) = c;
}
-/*
- * Read a single byte from the serial port. Returns 1 on success, 0
- * otherwise. When the function is successful, the character read is
- * written into its argument c.
- */
-int serial_getc (void)
+static int imx_serial_tstc(struct console_device *cdev)
+{
+ struct device_d *dev = cdev->dev;
+
+ /* If receive fifo is empty, return false */
+ if (UTS(dev->map_base) & UTS_RXEMPTY)
+ return 0;
+ return 1;
+}
+
+static int imx_serial_getc(struct console_device *cdev)
{
+ struct device_d *dev = cdev->dev;
+
unsigned char ch;
- while(UTS(IMX_UART_BASE) & UTS_RXEMPTY);
+ while(UTS(dev->map_base) & UTS_RXEMPTY);
- ch = URXD0(IMX_UART_BASE);
+ ch = URXD0(dev->map_base);
return ch;
}
-/*
- * Output a single byte to the serial port.
- */
-void serial_putc (const char c)
+static int imx_serial_probe(struct device_d *dev)
{
- /* Wait for Tx FIFO not full */
- while (UTS(IMX_UART_BASE) & UTS_TXFULL);
+ struct console_device *cdev;
- URTX0(IMX_UART_BASE) = c;
+ cdev = malloc(sizeof(struct console_device));
+ dev->type_data = cdev;
+ cdev->dev = dev;
+ cdev->flags = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
+ cdev->tstc = imx_serial_tstc;
+ cdev->putc = imx_serial_putc;
+ cdev->getc = imx_serial_getc;
- /* If \n, also do \r */
- if (c == '\n')
- serial_putc ('\r');
-}
+ imx_serial_init_port(cdev);
-/*
- * Test whether a character is in the RX buffer
- */
-int serial_tstc (void)
-{
- /* If receive fifo is empty, return false */
- if (UTS(IMX_UART_BASE) & UTS_RXEMPTY)
- return 0;
- return 1;
+ console_register(cdev);
+
+ return 0;
}
-void
-serial_puts (const char *s)
+static struct driver_d imx_serial_driver = {
+ .name = "imx_serial",
+ .probe = imx_serial_probe,
+ .type = DEVICE_TYPE_CONSOLE,
+};
+
+static int imx_serial_init(void)
{
- while (*s) {
- serial_putc (*s++);
- }
+ register_driver(&imx_serial_driver);
+ return 0;
}
+console_initcall(imx_serial_init);