Blame view

common/iomux.c 3.09 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
16a28ef21   Gary Jennejohn   IOMUX: Add consol...
2
3
4
  /*
   * (C) Copyright 2008
   * Gary Jennejohn, DENX Software Engineering GmbH, garyj@denx.de.
16a28ef21   Gary Jennejohn   IOMUX: Add consol...
5
6
7
   */
  
  #include <common.h>
24b852a7a   Simon Glass   Move console defi...
8
  #include <console.h>
16a28ef21   Gary Jennejohn   IOMUX: Add consol...
9
10
  #include <serial.h>
  #include <malloc.h>
b02654294   Simon Glass   console: Don't en...
11
  #if CONFIG_IS_ENABLED(CONSOLE_MUX)
16a28ef21   Gary Jennejohn   IOMUX: Add consol...
12
13
14
  void iomux_printdevs(const int console)
  {
  	int i;
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
15
  	struct stdio_dev *dev;
16a28ef21   Gary Jennejohn   IOMUX: Add consol...
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  
  	for (i = 0; i < cd_count[console]; i++) {
  		dev = console_devices[console][i];
  		printf("%s ", dev->name);
  	}
  	printf("
  ");
  }
  
  /* This tries to preserve the old list if an error occurs. */
  int iomux_doenv(const int console, const char *arg)
  {
  	char *console_args, *temp, **start;
  	int i, j, k, io_flag, cs_idx, repeat;
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
30
31
  	struct stdio_dev *dev;
  	struct stdio_dev **cons_set;
16a28ef21   Gary Jennejohn   IOMUX: Add consol...
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  
  	console_args = strdup(arg);
  	if (console_args == NULL)
  		return 1;
  	/*
  	 * Check whether a comma separated list of devices was
  	 * entered and count how many devices were entered.
  	 * The array start[] has pointers to the beginning of
  	 * each device name (up to MAX_CONSARGS devices).
  	 *
  	 * Have to do this twice - once to count the number of
  	 * commas and then again to populate start.
  	 */
  	i = 0;
  	temp = console_args;
  	for (;;) {
  		temp = strchr(temp, ',');
  		if (temp != NULL) {
  			i++;
  			temp++;
  			continue;
  		}
  		/* There's always one entry more than the number of commas. */
  		i++;
  		break;
  	}
  	start = (char **)malloc(i * sizeof(char *));
  	if (start == NULL) {
  		free(console_args);
  		return 1;
  	}
  	i = 0;
  	start[0] = console_args;
  	for (;;) {
  		temp = strchr(start[i++], ',');
  		if (temp == NULL)
  			break;
  		*temp = '\0';
  		start[i] = temp + 1;
  	}
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
72
  	cons_set = (struct stdio_dev **)calloc(i, sizeof(struct stdio_dev *));
16a28ef21   Gary Jennejohn   IOMUX: Add consol...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
  	if (cons_set == NULL) {
  		free(start);
  		free(console_args);
  		return 1;
  	}
  
  	switch (console) {
  	case stdin:
  		io_flag = DEV_FLAGS_INPUT;
  		break;
  	case stdout:
  	case stderr:
  		io_flag = DEV_FLAGS_OUTPUT;
  		break;
  	default:
  		free(start);
  		free(console_args);
  		free(cons_set);
  		return 1;
  	}
  
  	cs_idx = 0;
  	for (j = 0; j < i; j++) {
  		/*
  		 * Check whether the device exists and is valid.
  		 * console_assign() also calls search_device(),
  		 * but I need the pointer to the device.
  		 */
  		dev = search_device(io_flag, start[j]);
  		if (dev == NULL)
  			continue;
  		/*
  		 * Prevent multiple entries for a device.
  		 */
  		 repeat = 0;
  		 for (k = 0; k < cs_idx; k++) {
  			if (dev == cons_set[k]) {
  				repeat++;
  				break;
  			}
  		 }
  		 if (repeat)
  			continue;
  		/*
  		 * Try assigning the specified device.
  		 * This could screw up the console settings for apps.
  		 */
  		if (console_assign(console, start[j]) < 0)
  			continue;
16a28ef21   Gary Jennejohn   IOMUX: Add consol...
122
123
124
125
126
127
128
129
130
131
132
  		cons_set[cs_idx++] = dev;
  	}
  	free(console_args);
  	free(start);
  	/* failed to set any console */
  	if (cs_idx == 0) {
  		free(cons_set);
  		return 1;
  	} else {
  		/* Works even if console_devices[console] is NULL. */
  		console_devices[console] =
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
133
134
  			(struct stdio_dev **)realloc(console_devices[console],
  			cs_idx * sizeof(struct stdio_dev *));
16a28ef21   Gary Jennejohn   IOMUX: Add consol...
135
136
137
138
139
  		if (console_devices[console] == NULL) {
  			free(cons_set);
  			return 1;
  		}
  		memcpy(console_devices[console], cons_set, cs_idx *
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
140
  			sizeof(struct stdio_dev *));
16a28ef21   Gary Jennejohn   IOMUX: Add consol...
141
142
143
144
145
146
  
  		cd_count[console] = cs_idx;
  	}
  	free(cons_set);
  	return 0;
  }
b02654294   Simon Glass   console: Don't en...
147
  #endif /* CONSOLE_MUX */