Merge branch 'master' of git://git.denx.de/u-boot-samsung
[platform/kernel/u-boot.git] / drivers / serial / serial.c
index fd61a5e..f2bd0e4 100644 (file)
@@ -109,54 +109,51 @@ U_BOOT_ENV_CALLBACK(baudrate, on_baudrate);
        void name(void)                                         \
                __attribute__((weak, alias("serial_null")));
 
-serial_initfunc(mpc8xx_serial_initialize);
-serial_initfunc(ns16550_serial_initialize);
-serial_initfunc(pxa_serial_initialize);
-serial_initfunc(s3c24xx_serial_initialize);
-serial_initfunc(s5p_serial_initialize);
-serial_initfunc(zynq_serial_initialize);
-serial_initfunc(bfin_serial_initialize);
-serial_initfunc(bfin_jtag_initialize);
-serial_initfunc(mpc512x_serial_initialize);
-serial_initfunc(uartlite_serial_initialize);
-serial_initfunc(au1x00_serial_initialize);
-serial_initfunc(asc_serial_initialize);
-serial_initfunc(jz_serial_initialize);
-serial_initfunc(mpc5xx_serial_initialize);
-serial_initfunc(mpc8260_scc_serial_initialize);
-serial_initfunc(mpc8260_smc_serial_initialize);
-serial_initfunc(mpc85xx_serial_initialize);
-serial_initfunc(iop480_serial_initialize);
-serial_initfunc(leon2_serial_initialize);
-serial_initfunc(leon3_serial_initialize);
-serial_initfunc(marvell_serial_initialize);
 serial_initfunc(amirix_serial_initialize);
+serial_initfunc(arc_serial_initialize);
+serial_initfunc(arm_dcc_initialize);
+serial_initfunc(asc_serial_initialize);
+serial_initfunc(atmel_serial_initialize);
+serial_initfunc(au1x00_serial_initialize);
+serial_initfunc(bfin_jtag_initialize);
+serial_initfunc(bfin_serial_initialize);
 serial_initfunc(bmw_serial_initialize);
+serial_initfunc(clps7111_serial_initialize);
 serial_initfunc(cogent_serial_initialize);
 serial_initfunc(cpci750_serial_initialize);
 serial_initfunc(evb64260_serial_initialize);
-serial_initfunc(ml2_serial_initialize);
-serial_initfunc(sconsole_serial_initialize);
-serial_initfunc(p3mx_serial_initialize);
-serial_initfunc(altera_jtag_serial_initialize);
-serial_initfunc(altera_serial_initialize);
-serial_initfunc(atmel_serial_initialize);
-serial_initfunc(lpc32xx_serial_initialize);
-serial_initfunc(mcf_serial_initialize);
-serial_initfunc(oc_serial_initialize);
-serial_initfunc(sandbox_serial_initialize);
-serial_initfunc(clps7111_serial_initialize);
 serial_initfunc(imx_serial_initialize);
-serial_initfunc(ks8695_serial_initialize);
+serial_initfunc(iop480_serial_initialize);
+serial_initfunc(jz_serial_initialize);
+serial_initfunc(leon2_serial_initialize);
+serial_initfunc(leon3_serial_initialize);
 serial_initfunc(lh7a40x_serial_initialize);
+serial_initfunc(lpc32xx_serial_initialize);
+serial_initfunc(marvell_serial_initialize);
 serial_initfunc(max3100_serial_initialize);
+serial_initfunc(mcf_serial_initialize);
+serial_initfunc(ml2_serial_initialize);
+serial_initfunc(mpc5xx_serial_initialize);
+serial_initfunc(mpc8260_scc_serial_initialize);
+serial_initfunc(mpc8260_smc_serial_initialize);
+serial_initfunc(mpc85xx_serial_initialize);
+serial_initfunc(mpc8xx_serial_initialize);
 serial_initfunc(mxc_serial_initialize);
+serial_initfunc(mxs_auart_initialize);
+serial_initfunc(ns16550_serial_initialize);
+serial_initfunc(oc_serial_initialize);
+serial_initfunc(p3mx_serial_initialize);
 serial_initfunc(pl01x_serial_initialize);
+serial_initfunc(pxa_serial_initialize);
+serial_initfunc(s3c24xx_serial_initialize);
+serial_initfunc(s5p_serial_initialize);
 serial_initfunc(sa1100_serial_initialize);
+serial_initfunc(sandbox_serial_initialize);
+serial_initfunc(sconsole_serial_initialize);
 serial_initfunc(sh_serial_initialize);
-serial_initfunc(arm_dcc_initialize);
-serial_initfunc(mxs_auart_initialize);
-serial_initfunc(arc_serial_initialize);
+serial_initfunc(stm32_serial_initialize);
+serial_initfunc(uartlite_serial_initialize);
+serial_initfunc(zynq_serial_initialize);
 
 /**
  * serial_register() - Register serial driver with serial driver core
@@ -202,58 +199,94 @@ void serial_register(struct serial_device *dev)
  */
 void serial_initialize(void)
 {
-       mpc8xx_serial_initialize();
-       ns16550_serial_initialize();
-       pxa_serial_initialize();
-       s3c24xx_serial_initialize();
-       s5p_serial_initialize();
-       mpc512x_serial_initialize();
-       bfin_serial_initialize();
-       bfin_jtag_initialize();
-       uartlite_serial_initialize();
-       zynq_serial_initialize();
-       au1x00_serial_initialize();
-       asc_serial_initialize();
-       jz_serial_initialize();
-       mpc5xx_serial_initialize();
-       mpc8260_scc_serial_initialize();
-       mpc8260_smc_serial_initialize();
-       mpc85xx_serial_initialize();
-       iop480_serial_initialize();
-       leon2_serial_initialize();
-       leon3_serial_initialize();
-       marvell_serial_initialize();
        amirix_serial_initialize();
+       arc_serial_initialize();
+       arm_dcc_initialize();
+       asc_serial_initialize();
+       atmel_serial_initialize();
+       au1x00_serial_initialize();
+       bfin_jtag_initialize();
+       bfin_serial_initialize();
        bmw_serial_initialize();
+       clps7111_serial_initialize();
        cogent_serial_initialize();
        cpci750_serial_initialize();
        evb64260_serial_initialize();
-       ml2_serial_initialize();
-       sconsole_serial_initialize();
-       p3mx_serial_initialize();
-       altera_jtag_serial_initialize();
-       altera_serial_initialize();
-       atmel_serial_initialize();
-       lpc32xx_serial_initialize();
-       mcf_serial_initialize();
-       oc_serial_initialize();
-       sandbox_serial_initialize();
-       clps7111_serial_initialize();
        imx_serial_initialize();
-       ks8695_serial_initialize();
+       iop480_serial_initialize();
+       jz_serial_initialize();
+       leon2_serial_initialize();
+       leon3_serial_initialize();
        lh7a40x_serial_initialize();
+       lpc32xx_serial_initialize();
+       marvell_serial_initialize();
        max3100_serial_initialize();
+       mcf_serial_initialize();
+       ml2_serial_initialize();
+       mpc85xx_serial_initialize();
+       mpc8xx_serial_initialize();
        mxc_serial_initialize();
+       mxs_auart_initialize();
+       ns16550_serial_initialize();
+       oc_serial_initialize();
+       p3mx_serial_initialize();
        pl01x_serial_initialize();
+       pxa_serial_initialize();
+       s3c24xx_serial_initialize();
+       s5p_serial_initialize();
        sa1100_serial_initialize();
+       sandbox_serial_initialize();
+       sconsole_serial_initialize();
        sh_serial_initialize();
-       arm_dcc_initialize();
-       mxs_auart_initialize();
-       arc_serial_initialize();
+       stm32_serial_initialize();
+       uartlite_serial_initialize();
+       zynq_serial_initialize();
 
        serial_assign(default_serial_console()->name);
 }
 
+static int serial_stub_start(struct stdio_dev *sdev)
+{
+       struct serial_device *dev = sdev->priv;
+
+       return dev->start();
+}
+
+static int serial_stub_stop(struct stdio_dev *sdev)
+{
+       struct serial_device *dev = sdev->priv;
+
+       return dev->stop();
+}
+
+static void serial_stub_putc(struct stdio_dev *sdev, const char ch)
+{
+       struct serial_device *dev = sdev->priv;
+
+       dev->putc(ch);
+}
+
+static void serial_stub_puts(struct stdio_dev *sdev, const char *str)
+{
+       struct serial_device *dev = sdev->priv;
+
+       dev->puts(str);
+}
+
+int serial_stub_getc(struct stdio_dev *sdev)
+{
+       struct serial_device *dev = sdev->priv;
+
+       return dev->getc();
+}
+
+int serial_stub_tstc(struct stdio_dev *sdev)
+{
+       struct serial_device *dev = sdev->priv;
+
+       return dev->tstc();
+}
+
 /**
  * serial_stdio_init() - Register serial ports with STDIO core
  *
@@ -272,12 +305,13 @@ void serial_stdio_init(void)
                strcpy(dev.name, s->name);
                dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT;
 
-               dev.start = s->start;
-               dev.stop = s->stop;
-               dev.putc = s->putc;
-               dev.puts = s->puts;
-               dev.getc = s->getc;
-               dev.tstc = s->tstc;
+               dev.start = serial_stub_start;
+               dev.stop = serial_stub_stop;
+               dev.putc = serial_stub_putc;
+               dev.puts = serial_stub_puts;
+               dev.getc = serial_stub_getc;
+               dev.tstc = serial_stub_tstc;
+               dev.priv = s;
 
                stdio_register(&dev);
 
@@ -376,6 +410,7 @@ static struct serial_device *get_current(void)
  */
 int serial_init(void)
 {
+       gd->flags |= GD_FLG_SERIAL_READY;
        return get_current()->start();
 }
 
@@ -487,7 +522,7 @@ static const int bauds[] = CONFIG_SYS_BAUDRATE_TABLE;
  *
  * Do a loopback test of the currently selected serial port. This
  * function is only useful in the context of the POST testing framwork.
- * The serial port is firstly configured into loopback mode and then
+ * The serial port is first configured into loopback mode and then
  * characters are sent through it.
  *
  * Returns 0 on success, value otherwise.