~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/powerpc/boot/serial.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0
  2 /*
  3  * Generic serial console support
  4  *
  5  * Author: Mark A. Greer <mgreer@mvista.com>
  6  *
  7  * Code in serial_edit_cmdline() copied from <file:arch/ppc/boot/simple/misc.c>
  8  * and was written by Matt Porter <mporter@kernel.crashing.org>.
  9  *
 10  * 2001,2006 (c) MontaVista Software, Inc.
 11  */
 12 #include <stdarg.h>
 13 #include <stddef.h>
 14 #include "types.h"
 15 #include "string.h"
 16 #include "stdio.h"
 17 #include "io.h"
 18 #include "ops.h"
 19 
 20 static int serial_open(void)
 21 {
 22         struct serial_console_data *scdp = console_ops.data;
 23         return scdp->open();
 24 }
 25 
 26 static void serial_write(const char *buf, int len)
 27 {
 28         struct serial_console_data *scdp = console_ops.data;
 29 
 30         while (*buf != '\0')
 31                 scdp->putc(*buf++);
 32 }
 33 
 34 static void serial_edit_cmdline(char *buf, int len, unsigned int timeout)
 35 {
 36         int timer = 0, count;
 37         char ch, *cp;
 38         struct serial_console_data *scdp = console_ops.data;
 39 
 40         cp = buf;
 41         count = strlen(buf);
 42         cp = &buf[count];
 43         count++;
 44 
 45         do {
 46                 if (scdp->tstc()) {
 47                         while (((ch = scdp->getc()) != '\n') && (ch != '\r')) {
 48                                 /* Test for backspace/delete */
 49                                 if ((ch == '\b') || (ch == '\177')) {
 50                                         if (cp != buf) {
 51                                                 cp--;
 52                                                 count--;
 53                                                 printf("\b \b");
 54                                         }
 55                                 /* Test for ^x/^u (and wipe the line) */
 56                                 } else if ((ch == '\030') || (ch == '\025')) {
 57                                         while (cp != buf) {
 58                                                 cp--;
 59                                                 count--;
 60                                                 printf("\b \b");
 61                                         }
 62                                 } else if (count < len) {
 63                                                 *cp++ = ch;
 64                                                 count++;
 65                                                 scdp->putc(ch);
 66                                 }
 67                         }
 68                         break;  /* Exit 'timer' loop */
 69                 }
 70                 udelay(1000);  /* 1 msec */
 71         } while (timer++ < timeout);
 72         *cp = 0;
 73 }
 74 
 75 static void serial_close(void)
 76 {
 77         struct serial_console_data *scdp = console_ops.data;
 78 
 79         if (scdp->close)
 80                 scdp->close();
 81 }
 82 
 83 static void *serial_get_stdout_devp(void)
 84 {
 85         void *devp;
 86         char devtype[MAX_PROP_LEN];
 87         char path[MAX_PATH_LEN];
 88 
 89         devp = finddevice("/chosen");
 90         if (devp == NULL)
 91                 goto err_out;
 92 
 93         if (getprop(devp, "linux,stdout-path", path, MAX_PATH_LEN) > 0 ||
 94                 getprop(devp, "stdout-path", path, MAX_PATH_LEN) > 0) {
 95                 devp = finddevice(path);
 96                 if (devp == NULL)
 97                         goto err_out;
 98 
 99                 if ((getprop(devp, "device_type", devtype, sizeof(devtype)) > 0)
100                                 && !strcmp(devtype, "serial"))
101                         return devp;
102         }
103 err_out:
104         return NULL;
105 }
106 
107 static struct serial_console_data serial_cd;
108 
109 /* Node's "compatible" property determines which serial driver to use */
110 int serial_console_init(void)
111 {
112         void *devp;
113         int rc = -1;
114 
115         devp = serial_get_stdout_devp();
116         if (devp == NULL)
117                 goto err_out;
118 
119         if (dt_is_compatible(devp, "ns16550") ||
120             dt_is_compatible(devp, "pnpPNP,501"))
121                 rc = ns16550_console_init(devp, &serial_cd);
122 #ifdef CONFIG_CPM
123         else if (dt_is_compatible(devp, "fsl,cpm1-scc-uart") ||
124                  dt_is_compatible(devp, "fsl,cpm1-smc-uart") ||
125                  dt_is_compatible(devp, "fsl,cpm2-scc-uart") ||
126                  dt_is_compatible(devp, "fsl,cpm2-smc-uart"))
127                 rc = cpm_console_init(devp, &serial_cd);
128 #endif
129 #ifdef CONFIG_PPC_MPC52xx
130         else if (dt_is_compatible(devp, "fsl,mpc5200-psc-uart"))
131                 rc = mpc5200_psc_console_init(devp, &serial_cd);
132 #endif
133 #ifdef CONFIG_PPC_POWERNV
134         else if (dt_is_compatible(devp, "ibm,opal-console-raw"))
135                 rc = opal_console_init(devp, &serial_cd);
136 #endif
137 
138         /* Add other serial console driver calls here */
139 
140         if (!rc) {
141                 console_ops.open = serial_open;
142                 console_ops.write = serial_write;
143                 console_ops.close = serial_close;
144                 console_ops.data = &serial_cd;
145 
146                 if (serial_cd.getc)
147                         console_ops.edit_cmdline = serial_edit_cmdline;
148 
149                 return 0;
150         }
151 err_out:
152         return -1;
153 }
154 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php