diff mbox

[U-Boot,1/2] console: Squelch pre-console output in console functions

Message ID 1314620046-26187-2-git-send-email-graeme.russ@gmail.com
State Accepted
Commit e3e454cd72f319908355427b1a3ae54b3dd53356
Delegated to: Wolfgang Denk
Headers show

Commit Message

Graeme Russ Aug. 29, 2011, 12:14 p.m. UTC
There are some locations in the code which anticipate printf() being called
before the console is ready by squelching printf() on gd->have_console.
Move this squelching into printf(), vprintf(), puts() and putc(). Also
make tstc() and getc() return 0 if console is not yet initialised

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/powerpc/cpu/mpc5xxx/i2c.c |   30 ++++++++++--------------------
 arch/powerpc/cpu/mpc8xx/i2c.c  |   18 ++++++------------
 common/console.c               |   18 ++++++++++++++++++
 drivers/i2c/ppc4xx_i2c.c       |    5 +----
 drivers/i2c/soft_i2c.c         |    1 -
 5 files changed, 35 insertions(+), 37 deletions(-)

Comments

Mike Frysinger Aug. 30, 2011, 5:16 p.m. UTC | #1
On Monday, August 29, 2011 08:14:05 Graeme Russ wrote:
> --- a/drivers/i2c/soft_i2c.c
> +++ b/drivers/i2c/soft_i2c.c
> 
>  #ifdef DEBUG_I2C
>  #define PRINTD(fmt,args...)	do {	\
> -	if (gd->have_console)		\
>  		printf (fmt ,##args);	\
>  	} while (0)
>  #else

the "do {} while (0)" can go away now
-mike
Wolfgang Denk Aug. 30, 2011, 7:01 p.m. UTC | #2
Dear Mike Frysinger,

In message <201108301316.56595.vapier@gentoo.org> you wrote:
>
> On Monday, August 29, 2011 08:14:05 Graeme Russ wrote:
> > --- a/drivers/i2c/soft_i2c.c
> > +++ b/drivers/i2c/soft_i2c.c
> >=20
> >  #ifdef DEBUG_I2C
> >  #define PRINTD(fmt,args...)	do {	\
> > -	if (gd->have_console)		\
> >  		printf (fmt ,##args);	\
> >  	} while (0)
> >  #else
> 
> the "do {} while (0)" can go away now

It is safer to keep it, especially with the if construct.

Best regards,

Wolfgang Denk
Simon Glass Sept. 21, 2011, 11:21 p.m. UTC | #3
Hi Graeme,

On Mon, Aug 29, 2011 at 5:14 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> There are some locations in the code which anticipate printf() being called
> before the console is ready by squelching printf() on gd->have_console.
> Move this squelching into printf(), vprintf(), puts() and putc(). Also
> make tstc() and getc() return 0 if console is not yet initialised
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

This stops U-Boot from hanging if I add a printf() prior to console
init in board_init_f. Great!

Tested-by: Simon Glass <sjg@chromium.org>

Regards,
Simon

> ---
>  arch/powerpc/cpu/mpc5xxx/i2c.c |   30 ++++++++++--------------------
>  arch/powerpc/cpu/mpc8xx/i2c.c  |   18 ++++++------------
>  common/console.c               |   18 ++++++++++++++++++
>  drivers/i2c/ppc4xx_i2c.c       |    5 +----
>  drivers/i2c/soft_i2c.c         |    1 -
>  5 files changed, 35 insertions(+), 37 deletions(-)
>
> diff --git a/arch/powerpc/cpu/mpc5xxx/i2c.c b/arch/powerpc/cpu/mpc5xxx/i2c.c
> index 9fb330f..f9d293b 100644
> --- a/arch/powerpc/cpu/mpc5xxx/i2c.c
> +++ b/arch/powerpc/cpu/mpc5xxx/i2c.c
[snip]
Wolfgang Denk Oct. 1, 2011, 7:54 p.m. UTC | #4
Dear Graeme Russ,

In message <1314620046-26187-2-git-send-email-graeme.russ@gmail.com> you wrote:
> There are some locations in the code which anticipate printf() being called
> before the console is ready by squelching printf() on gd->have_console.
> Move this squelching into printf(), vprintf(), puts() and putc(). Also
> make tstc() and getc() return 0 if console is not yet initialised
> 
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
>  arch/powerpc/cpu/mpc5xxx/i2c.c |   30 ++++++++++--------------------
>  arch/powerpc/cpu/mpc8xx/i2c.c  |   18 ++++++------------
>  common/console.c               |   18 ++++++++++++++++++
>  drivers/i2c/ppc4xx_i2c.c       |    5 +----
>  drivers/i2c/soft_i2c.c         |    1 -
>  5 files changed, 35 insertions(+), 37 deletions(-)

Applied, thanks.

Best regards,

Wolfgang Denk
diff mbox

Patch

diff --git a/arch/powerpc/cpu/mpc5xxx/i2c.c b/arch/powerpc/cpu/mpc5xxx/i2c.c
index 9fb330f..f9d293b 100644
--- a/arch/powerpc/cpu/mpc5xxx/i2c.c
+++ b/arch/powerpc/cpu/mpc5xxx/i2c.c
@@ -332,8 +332,7 @@  static int mpc_get_fdr(int speed)
 		if (gd->flags & GD_FLG_RELOC) {
 			fdr = divider;
 		} else {
-			if (gd->have_console)
-				printf("%ld kHz, ", best_speed / 1000);
+			printf("%ld kHz, ", best_speed / 1000);
 			return divider;
 		}
 	}
@@ -374,34 +373,29 @@  int i2c_read(uchar chip, uint addr, int alen, uchar *buf, int len)
 	xaddr[3] =  addr	& 0xFF;
 
 	if (wait_for_bb()) {
-		if (gd->have_console)
-			printf("i2c_read: bus is busy\n");
+		printf("i2c_read: bus is busy\n");
 		goto Done;
 	}
 
 	mpc_reg_out(&regs->mcr, I2C_STA, I2C_STA);
 	if (do_address(chip, 0)) {
-		if (gd->have_console)
-			printf("i2c_read: failed to address chip\n");
+		printf("i2c_read: failed to address chip\n");
 		goto Done;
 	}
 
 	if (send_bytes(chip, &xaddr[4-alen], alen)) {
-		if (gd->have_console)
-			printf("i2c_read: send_bytes failed\n");
+		printf("i2c_read: send_bytes failed\n");
 		goto Done;
 	}
 
 	mpc_reg_out(&regs->mcr, I2C_RSTA, I2C_RSTA);
 	if (do_address(chip, 1)) {
-		if (gd->have_console)
-			printf("i2c_read: failed to address chip\n");
+		printf("i2c_read: failed to address chip\n");
 		goto Done;
 	}
 
 	if (receive_bytes(chip, (char *)buf, len)) {
-		if (gd->have_console)
-			printf("i2c_read: receive_bytes failed\n");
+		printf("i2c_read: receive_bytes failed\n");
 		goto Done;
 	}
 
@@ -423,27 +417,23 @@  int i2c_write(uchar chip, uint addr, int alen, uchar *buf, int len)
 	xaddr[3] =  addr	& 0xFF;
 
 	if (wait_for_bb()) {
-		if (gd->have_console)
-			printf("i2c_write: bus is busy\n");
+		printf("i2c_write: bus is busy\n");
 		goto Done;
 	}
 
 	mpc_reg_out(&regs->mcr, I2C_STA, I2C_STA);
 	if (do_address(chip, 0)) {
-		if (gd->have_console)
-			printf("i2c_write: failed to address chip\n");
+		printf("i2c_write: failed to address chip\n");
 		goto Done;
 	}
 
 	if (send_bytes(chip, &xaddr[4-alen], alen)) {
-		if (gd->have_console)
-			printf("i2c_write: send_bytes failed\n");
+		printf("i2c_write: send_bytes failed\n");
 		goto Done;
 	}
 
 	if (send_bytes(chip, (char *)buf, len)) {
-		if (gd->have_console)
-			printf("i2c_write: send_bytes failed\n");
+		printf("i2c_write: send_bytes failed\n");
 		goto Done;
 	}
 
diff --git a/arch/powerpc/cpu/mpc8xx/i2c.c b/arch/powerpc/cpu/mpc8xx/i2c.c
index 338caba..1ca51fd 100644
--- a/arch/powerpc/cpu/mpc8xx/i2c.c
+++ b/arch/powerpc/cpu/mpc8xx/i2c.c
@@ -633,22 +633,19 @@  int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
 
 	rc = i2c_send(&state, chip, 0, I2CF_START_COND, alen, &xaddr[4-alen]);
 	if (rc != 0) {
-		if (gd->have_console)
-			printf("i2c_read: i2c_send failed (%d)\n", rc);
+		printf("i2c_read: i2c_send failed (%d)\n", rc);
 		return 1;
 	}
 
 	rc = i2c_receive(&state, chip, 0, I2CF_STOP_COND, len, buffer);
 	if (rc != 0) {
-		if (gd->have_console)
-			printf("i2c_read: i2c_receive failed (%d)\n", rc);
+		printf("i2c_read: i2c_receive failed (%d)\n", rc);
 		return 1;
 	}
 
 	rc = i2c_doio(&state);
 	if (rc != 0) {
-		if (gd->have_console)
-			printf("i2c_read: i2c_doio failed (%d)\n", rc);
+		printf("i2c_read: i2c_doio failed (%d)\n", rc);
 		return 1;
 	}
 	return 0;
@@ -683,22 +680,19 @@  int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)
 
 	rc = i2c_send(&state, chip, 0, I2CF_START_COND, alen, &xaddr[4-alen]);
 	if (rc != 0) {
-		if (gd->have_console)
-			printf("i2c_write: first i2c_send failed (%d)\n", rc);
+		printf("i2c_write: first i2c_send failed (%d)\n", rc);
 		return 1;
 	}
 
 	rc = i2c_send(&state, 0, 0, I2CF_STOP_COND, len, buffer);
 	if (rc != 0) {
-		if (gd->have_console)
-			printf("i2c_write: second i2c_send failed (%d)\n", rc);
+		printf("i2c_write: second i2c_send failed (%d)\n", rc);
 		return 1;
 	}
 
 	rc = i2c_doio(&state);
 	if (rc != 0) {
-		if (gd->have_console)
-			printf("i2c_write: i2c_doio failed (%d)\n", rc);
+		printf("i2c_write: i2c_doio failed (%d)\n", rc);
 		return 1;
 	}
 	return 0;
diff --git a/common/console.c b/common/console.c
index 8c650e0..b23d933 100644
--- a/common/console.c
+++ b/common/console.c
@@ -298,6 +298,9 @@  int getc(void)
 		return 0;
 #endif
 
+	if (!gd->have_console)
+		return 0;
+
 	if (gd->flags & GD_FLG_DEVINIT) {
 		/* Get from the standard input */
 		return fgetc(stdin);
@@ -314,6 +317,9 @@  int tstc(void)
 		return 0;
 #endif
 
+	if (!gd->have_console)
+		return 0;
+
 	if (gd->flags & GD_FLG_DEVINIT) {
 		/* Test the standard input */
 		return ftstc(stdin);
@@ -335,6 +341,9 @@  void putc(const char c)
 		return;
 #endif
 
+	if (!gd->have_console)
+		return;
+
 	if (gd->flags & GD_FLG_DEVINIT) {
 		/* Send to the standard output */
 		fputc(stdout, c);
@@ -356,6 +365,9 @@  void puts(const char *s)
 		return;
 #endif
 
+	if (!gd->have_console)
+		return;
+
 	if (gd->flags & GD_FLG_DEVINIT) {
 		/* Send to the standard output */
 		fputs(stdout, s);
@@ -371,6 +383,9 @@  int printf(const char *fmt, ...)
 	uint i;
 	char printbuffer[CONFIG_SYS_PBSIZE];
 
+	if (!gd->have_console)
+		return 0;
+
 	va_start(args, fmt);
 
 	/* For this to work, printbuffer must be larger than
@@ -389,6 +404,9 @@  int vprintf(const char *fmt, va_list args)
 	uint i;
 	char printbuffer[CONFIG_SYS_PBSIZE];
 
+	if (!gd->have_console)
+		return 0;
+
 	/* For this to work, printbuffer must be larger than
 	 * anything we ever want to print.
 	 */
diff --git a/drivers/i2c/ppc4xx_i2c.c b/drivers/i2c/ppc4xx_i2c.c
index c1cbe55..53fedd5 100644
--- a/drivers/i2c/ppc4xx_i2c.c
+++ b/drivers/i2c/ppc4xx_i2c.c
@@ -396,10 +396,7 @@  static int ppc4xx_i2c_transfer(uchar chip, uint addr, int alen, uchar *buffer,
 #endif
 	if ((ret = i2c_transfer(read, chip << 1, &xaddr[4 - alen], alen,
 				buffer, len)) != 0) {
-		if (gd->have_console) {
-			printf("I2C %s: failed %d\n",
-			       read ? "read" : "write", ret);
-		}
+		printf("I2C %s: failed %d\n", read ? "read" : "write", ret);
 
 		return 1;
 	}
diff --git a/drivers/i2c/soft_i2c.c b/drivers/i2c/soft_i2c.c
index 9b02e89..36c6114 100644
--- a/drivers/i2c/soft_i2c.c
+++ b/drivers/i2c/soft_i2c.c
@@ -119,7 +119,6 @@  DECLARE_GLOBAL_DATA_PTR;
 
 #ifdef DEBUG_I2C
 #define PRINTD(fmt,args...)	do {	\
-	if (gd->have_console)		\
 		printf (fmt ,##args);	\
 	} while (0)
 #else