diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2007-07-05 18:02:00 +0200 |
---|---|---|
committer | Sascha Hauer <sha@octopus.labnet.pengutronix.de> | 2007-07-05 18:02:00 +0200 |
commit | 737bf296b5a91bca74862dc15a8d3d0a8b039060 (patch) | |
tree | 36e20f41d1b1b3aac3c221b814f0a1e82b8fd573 /drivers | |
parent | 998a23e50dd1676ba866fb56229e45056b1f31d7 (diff) | |
download | barebox-737bf296b5a91bca74862dc15a8d3d0a8b039060.tar.gz barebox-737bf296b5a91bca74862dc15a8d3d0a8b039060.tar.xz |
svn_rev_509
make console driver for mpc5xxx work
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/serial/Kconfig | 5 | ||||
-rw-r--r-- | drivers/serial/Makefile | 3 | ||||
-rw-r--r-- | drivers/serial/serial_mpc5xxx.c | 322 |
3 files changed, 63 insertions, 267 deletions
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index c7cc6b63f3..a07dde431f 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -10,4 +10,9 @@ config DRIVER_SERIAL_LINUX_COMSOLE default y bool "linux console driver" +config DRIVER_SERIAL_MPC5XXX + depends on MPC5200 + default y + bool "MPC5200 serial driver" + endmenu diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile index 56c75c4b97..1a7817a3f3 100644 --- a/drivers/serial/Makefile +++ b/drivers/serial/Makefile @@ -6,4 +6,5 @@ # serial_pl011.o # serial_xuartlite.o obj-$(CONFIG_DRIVER_SERIAL_IMX) += serial_imx.o -obj-$(CONFIG_DRIVER_SERIAL_LINUX_COMSOLE) += linux_console.o
\ No newline at end of file +obj-$(CONFIG_DRIVER_SERIAL_LINUX_COMSOLE) += linux_console. +obj-$(CONFIG_DRIVER_SERIAL_MPC5XXX) += serial_mpc5xxx.o diff --git a/drivers/serial/serial_mpc5xxx.c b/drivers/serial/serial_mpc5xxx.c index a9a5767ac3..84ca77dafb 100644 --- a/drivers/serial/serial_mpc5xxx.c +++ b/drivers/serial/serial_mpc5xxx.c @@ -35,70 +35,42 @@ #include <common.h> #include <mpc5xxx.h> - -#if defined (CONFIG_SERIAL_MULTI) -#include <serial.h> -#endif +#include <driver.h> +#include <init.h> +#include <console.h> +#include <xfuncs.h> DECLARE_GLOBAL_DATA_PTR; -#if defined(CONFIG_PSC_CONSOLE) - -#if CONFIG_PSC_CONSOLE == 1 -#define PSC_BASE MPC5XXX_PSC1 -#elif CONFIG_PSC_CONSOLE == 2 -#define PSC_BASE MPC5XXX_PSC2 -#elif CONFIG_PSC_CONSOLE == 3 -#define PSC_BASE MPC5XXX_PSC3 -#elif defined(CONFIG_MGT5100) -#error CONFIG_PSC_CONSOLE must be in 1, 2 or 3 -#elif CONFIG_PSC_CONSOLE == 4 -#define PSC_BASE MPC5XXX_PSC4 -#elif CONFIG_PSC_CONSOLE == 5 -#define PSC_BASE MPC5XXX_PSC5 -#elif CONFIG_PSC_CONSOLE == 6 -#define PSC_BASE MPC5XXX_PSC6 -#else -#error CONFIG_PSC_CONSOLE must be in 1 ... 6 -#endif +static void mpc5xxx_serial_setbrg(struct console_device *cdev) +{ + struct device_d *dev = cdev->dev; + volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev->map_base; + unsigned long baseclk; + int div; -#if defined(CONFIG_SERIAL_MULTI) && !defined(CONFIG_PSC_CONSOLE2) -#error you must define CONFIG_PSC_CONSOLE2 if CONFIG_SERIAL_MULTI is set +#if defined(CONFIG_MGT5100) + baseclk = (CFG_MPC5XXX_CLKIN + 16) / 32; +#elif defined(CONFIG_MPC5200) + baseclk = (gd->ipb_clk + 16) / 32; #endif -#if defined(CONFIG_SERIAL_MULTI) -#if CONFIG_PSC_CONSOLE2 == 1 -#define PSC_BASE2 MPC5XXX_PSC1 -#elif CONFIG_PSC_CONSOLE2 == 2 -#define PSC_BASE2 MPC5XXX_PSC2 -#elif CONFIG_PSC_CONSOLE2 == 3 -#define PSC_BASE2 MPC5XXX_PSC3 -#elif defined(CONFIG_MGT5100) -#error CONFIG_PSC_CONSOLE2 must be in 1, 2 or 3 -#elif CONFIG_PSC_CONSOLE2 == 4 -#define PSC_BASE2 MPC5XXX_PSC4 -#elif CONFIG_PSC_CONSOLE2 == 5 -#define PSC_BASE2 MPC5XXX_PSC5 -#elif CONFIG_PSC_CONSOLE2 == 6 -#define PSC_BASE2 MPC5XXX_PSC6 + /* set up UART divisor */ +#if 0 + div = (baseclk + (gd->baudrate/2)) / gd->baudrate; #else -#error CONFIG_PSC_CONSOLE2 must be in 1 ... 6 +#warning mpc5200 serial: temporary baudrate hack + div = (baseclk + (115200 / 2)) / 115200; #endif -#endif /* CONFIG_SERIAL_MULTI */ + psc->ctur = (div >> 8) & 0xFF; + psc->ctlr = div & 0xff; +} -#if defined(CONFIG_SERIAL_MULTI) -int serial_init_dev (unsigned long dev_base) -#else -int serial_init (void) -#endif +static int mpc5xxx_serial_init(struct console_device *cdev) { -#if defined(CONFIG_SERIAL_MULTI) - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev_base; -#else - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)PSC_BASE; -#endif + struct device_d *dev = cdev->dev; + volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev->map_base; unsigned long baseclk; - int div; /* reset PSC */ psc->command = PSC_SEL_MODE_REG_1; @@ -123,15 +95,7 @@ int serial_init (void) #endif psc->mode = PSC_MODE_ONE_STOP; - /* set up UART divisor */ -#if 0 - div = (baseclk + (gd->baudrate/2)) / gd->baudrate; -#else -#warning mpc5200 serial: temporary baudrate hack - div = (baseclk + (115200/2)) / 115200; -#endif - psc->ctur = (div >> 8) & 0xff; - psc->ctlr = div & 0xff; + mpc5xxx_serial_setbrg(cdev); /* disable all interrupts */ psc->psc_imr = 0; @@ -144,24 +108,10 @@ int serial_init (void) return (0); } -#if defined(CONFIG_SERIAL_MULTI) -void serial_putc_dev (unsigned long dev_base, const char c) -#else -void serial_putc(const char c) -#endif +static void mpc5xxx_serial_putc (struct console_device *cdev, const char c) { -#if defined(CONFIG_SERIAL_MULTI) - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev_base; -#else - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)PSC_BASE; -#endif - - if (c == '\n') -#if defined(CONFIG_SERIAL_MULTI) - serial_putc_dev (dev_base, '\r'); -#else - serial_putc('\r'); -#endif + struct device_d *dev = cdev->dev; + volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev->map_base; /* Wait for last character to go. */ while (!(psc->psc_status & PSC_SR_TXEMP)) @@ -170,51 +120,10 @@ void serial_putc(const char c) psc->psc_buffer_8 = c; } -#if defined(CONFIG_SERIAL_MULTI) -void serial_putc_raw_dev(unsigned long dev_base, const char c) -#else -void serial_putc_raw(const char c) -#endif +static int mpc5xxx_serial_getc (struct console_device *cdev) { -#if defined(CONFIG_SERIAL_MULTI) - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev_base; -#else - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)PSC_BASE; -#endif - /* Wait for last character to go. */ - while (!(psc->psc_status & PSC_SR_TXEMP)) - ; - - psc->psc_buffer_8 = c; -} - - -#if defined(CONFIG_SERIAL_MULTI) -void serial_puts_dev (unsigned long dev_base, const char *s) -#else -void serial_puts (const char *s) -#endif -{ - while (*s) { -#if defined(CONFIG_SERIAL_MULTI) - serial_putc_dev (dev_base, *s++); -#else - serial_putc (*s++); -#endif - } -} - -#if defined(CONFIG_SERIAL_MULTI) -int serial_getc_dev (unsigned long dev_base) -#else -int serial_getc(void) -#endif -{ -#if defined(CONFIG_SERIAL_MULTI) - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev_base; -#else - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)PSC_BASE; -#endif + struct device_d *dev = cdev->dev; + volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev->map_base; /* Wait for a character to arrive. */ while (!(psc->psc_status & PSC_SR_RXRDY)) @@ -223,163 +132,44 @@ int serial_getc(void) return psc->psc_buffer_8; } -#if defined(CONFIG_SERIAL_MULTI) -int serial_tstc_dev (unsigned long dev_base) -#else -int serial_tstc(void) -#endif +static int mpc5xxx_serial_tstc (struct console_device *cdev) { -#if defined(CONFIG_SERIAL_MULTI) - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev_base; -#else - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)PSC_BASE; -#endif + struct device_d *dev = cdev->dev; + volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev->map_base; return (psc->psc_status & PSC_SR_RXRDY); } -#if defined(CONFIG_SERIAL_MULTI) -void serial_setbrg_dev (unsigned long dev_base) -#else -void serial_setbrg(void) -#endif -{ -#if defined(CONFIG_SERIAL_MULTI) - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev_base; -#else - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)PSC_BASE; -#endif - unsigned long baseclk, div; - -#if defined(CONFIG_MGT5100) - baseclk = (CFG_MPC5XXX_CLKIN + 16) / 32; -#elif defined(CONFIG_MPC5200) - baseclk = (gd->ipb_clk + 16) / 32; -#endif - - /* set up UART divisor */ - div = (baseclk + (gd->baudrate/2)) / gd->baudrate; - psc->ctur = (div >> 8) & 0xFF; - psc->ctlr = div & 0xff; -} - -#if defined(CONFIG_SERIAL_MULTI) -void serial_setrts_dev (unsigned long dev_base, int s) -#else -void serial_setrts(int s) -#endif -{ -#if defined(CONFIG_SERIAL_MULTI) - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev_base; -#else - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)PSC_BASE; -#endif - - if (s) { - /* Assert RTS (become LOW) */ - psc->op1 = 0x1; - } - else { - /* Negate RTS (become HIGH) */ - psc->op0 = 0x1; - } -} - -#if defined(CONFIG_SERIAL_MULTI) -int serial_getcts_dev (unsigned long dev_base) -#else -int serial_getcts(void) -#endif -{ -#if defined(CONFIG_SERIAL_MULTI) - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev_base; -#else - volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)PSC_BASE; -#endif - - return (psc->ip & 0x1) ? 0 : 1; -} - -#if defined(CONFIG_SERIAL_MULTI) -int serial0_init(void) +static int mpc5xxx_serial_probe(struct device_d *dev) { - return (serial_init_dev(PSC_BASE)); -} + struct console_device *cdev; -int serial1_init(void) -{ - return (serial_init_dev(PSC_BASE2)); -} -void serial0_setbrg (void) -{ - serial_setbrg_dev(PSC_BASE); -} -void serial1_setbrg (void) -{ - serial_setbrg_dev(PSC_BASE2); -} + cdev = xzalloc(sizeof(struct console_device)); + dev->type_data = cdev; + cdev->dev = dev; + cdev->f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR; + cdev->tstc = mpc5xxx_serial_tstc; + cdev->putc = mpc5xxx_serial_putc; + cdev->getc = mpc5xxx_serial_getc; -void serial0_putc(const char c) -{ - serial_putc_dev(PSC_BASE,c); -} + mpc5xxx_serial_init(cdev); -void serial1_putc(const char c) -{ - serial_putc_dev(PSC_BASE2, c); -} -void serial0_puts(const char *s) -{ - serial_puts_dev(PSC_BASE, s); -} - -void serial1_puts(const char *s) -{ - serial_puts_dev(PSC_BASE2, s); -} + console_register(cdev); -int serial0_getc(void) -{ - return(serial_getc_dev(PSC_BASE)); + return 0; } -int serial1_getc(void) -{ - return(serial_getc_dev(PSC_BASE2)); -} -int serial0_tstc(void) -{ - return (serial_tstc_dev(PSC_BASE)); -} +static struct driver_d mpc5xxx_serial_driver = { + .name = "mpc5xxx_serial", + .probe = mpc5xxx_serial_probe, + .type = DEVICE_TYPE_CONSOLE, +}; -int serial1_tstc(void) +static int mpc5xxx_serial_register(void) { - return (serial_tstc_dev(PSC_BASE2)); + register_driver(&mpc5xxx_serial_driver); + return 0; } -struct serial_device serial0_device = -{ - "serial0", - "UART0", - serial0_init, - serial0_setbrg, - serial0_getc, - serial0_tstc, - serial0_putc, - serial0_puts, -}; - -struct serial_device serial1_device = -{ - "serial1", - "UART1", - serial1_init, - serial1_setbrg, - serial1_getc, - serial1_tstc, - serial1_putc, - serial1_puts, -}; -#endif /* CONFIG_SERIAL_MULTI */ +console_initcall(mpc5xxx_serial_register); -#endif /* CONFIG_PSC_CONSOLE */ |