diff mbox

[U-Boot,v2] serial: pl01x: Add support for devices with the rate pre-configured.

Message ID 1457918214-14152-1-git-send-email-eric@anholt.net
State Accepted
Commit cd0fa5bff8052b19bde6967c2734f323c9848568
Delegated to: Tom Rini
Headers show

Commit Message

Eric Anholt March 14, 2016, 1:16 a.m. UTC
For Raspberry Pi, we had the input clock rate to the pl011 fixed in
the rpi.c file, but it may be changed by firmware due to user changes
to config.txt.  Since the firmware always sets up the uart (default
115200 output unless the user changes it), we can just skip our own
uart init to simplify the boot process and more reliably get serial
output.

Signed-off-by: Eric Anholt <eric@anholt.net>
---
 board/raspberrypi/rpi/rpi.c             |  2 +-
 drivers/serial/serial_pl01x.c           | 10 ++++++++--
 include/dm/platform_data/serial_pl01x.h |  3 +++
 3 files changed, 12 insertions(+), 3 deletions(-)

Comments

Tom Rini March 14, 2016, 3:25 p.m. UTC | #1
On Sun, Mar 13, 2016 at 06:16:54PM -0700, Eric Anholt wrote:

> For Raspberry Pi, we had the input clock rate to the pl011 fixed in
> the rpi.c file, but it may be changed by firmware due to user changes
> to config.txt.  Since the firmware always sets up the uart (default
> 115200 output unless the user changes it), we can just skip our own
> uart init to simplify the boot process and more reliably get serial
> output.
> 
> Signed-off-by: Eric Anholt <eric@anholt.net>

Reviewed-by: Tom Rini <trini@konsulko.com>
Stephen Warren March 16, 2016, 2:36 a.m. UTC | #2
On 03/13/2016 07:16 PM, Eric Anholt wrote:
> For Raspberry Pi, we had the input clock rate to the pl011 fixed in
> the rpi.c file, but it may be changed by firmware due to user changes
> to config.txt.  Since the firmware always sets up the uart (default
> 115200 output unless the user changes it), we can just skip our own
> uart init to simplify the boot process and more reliably get serial
> output.

Tested-by: Stephen Warren <swarren@wwwdotorg.org>
# on RPi B+ and RPi 2
Stephen Warren March 20, 2016, 6:06 a.m. UTC | #3
On 03/15/2016 08:36 PM, Stephen Warren wrote:
> On 03/13/2016 07:16 PM, Eric Anholt wrote:
>> For Raspberry Pi, we had the input clock rate to the pl011 fixed in
>> the rpi.c file, but it may be changed by firmware due to user changes
>> to config.txt.  Since the firmware always sets up the uart (default
>> 115200 output unless the user changes it), we can just skip our own
>> uart init to simplify the boot process and more reliably get serial
>> output.
>
> Tested-by: Stephen Warren <swarren@wwwdotorg.org>
> # on RPi B+ and RPi 2

Sorry, I take this Tested-by back. With the latest firmware (which has 
some modifications intended to initialize either the PL01x or the mini 
UART depending on which the kernel will actually use), this patch causes 
U-Boot not to boot at all. I'm pretty sure this is a FW bug (since even 
without this patch the UART doesn't work, but U-Boot does at least boot 
and can be used over HDMI/usbkbd), but I'd still prefer not to apply 
this until the FW is working again and we can double-check everything.

Hopefully this will be resolved in 
https://github.com/raspberrypi/firmware/issues/553 soon.
Stephen Warren March 22, 2016, 2:11 a.m. UTC | #4
On 03/20/2016 12:06 AM, Stephen Warren wrote:
> On 03/15/2016 08:36 PM, Stephen Warren wrote:
>> On 03/13/2016 07:16 PM, Eric Anholt wrote:
>>> For Raspberry Pi, we had the input clock rate to the pl011 fixed in
>>> the rpi.c file, but it may be changed by firmware due to user changes
>>> to config.txt.  Since the firmware always sets up the uart (default
>>> 115200 output unless the user changes it), we can just skip our own
>>> uart init to simplify the boot process and more reliably get serial
>>> output.
>>
>> Tested-by: Stephen Warren <swarren@wwwdotorg.org>
>> # on RPi B+ and RPi 2
>
> Sorry, I take this Tested-by back. With the latest firmware (which has
> some modifications intended to initialize either the PL01x or the mini
> UART depending on which the kernel will actually use), this patch causes
> U-Boot not to boot at all. I'm pretty sure this is a FW bug (since even
> without this patch the UART doesn't work, but U-Boot does at least boot
> and can be used over HDMI/usbkbd), but I'd still prefer not to apply
> this until the FW is working again and we can double-check everything.
>
> Hopefully this will be resolved in
> https://github.com/raspberrypi/firmware/issues/553 soon.

We can go ahead with this patch now; the FW behaviour has been accepted 
as a bug, and fixed in a new FW release.
Tom Rini March 23, 2016, 1:59 a.m. UTC | #5
On Sun, Mar 13, 2016 at 06:16:54PM -0700, Eric Anholt wrote:

> For Raspberry Pi, we had the input clock rate to the pl011 fixed in
> the rpi.c file, but it may be changed by firmware due to user changes
> to config.txt.  Since the firmware always sets up the uart (default
> 115200 output unless the user changes it), we can just skip our own
> uart init to simplify the boot process and more reliably get serial
> output.
> 
> Signed-off-by: Eric Anholt <eric@anholt.net>
> Reviewed-by: Tom Rini <trini@konsulko.com>
> Tested-by: Stephen Warren <swarren@wwwdotorg.org>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
index 7f4fe64..bb640b1 100644
--- a/board/raspberrypi/rpi/rpi.c
+++ b/board/raspberrypi/rpi/rpi.c
@@ -36,7 +36,7 @@  static const struct pl01x_serial_platdata serial_platdata = {
 	.base = 0x20201000,
 #endif
 	.type = TYPE_PL011,
-	.clock = 3000000,
+	.skip_init = true,
 };
 
 U_BOOT_DEVICE(bcm2835_serials) = {
diff --git a/drivers/serial/serial_pl01x.c b/drivers/serial/serial_pl01x.c
index 552c945..6f83835 100644
--- a/drivers/serial/serial_pl01x.c
+++ b/drivers/serial/serial_pl01x.c
@@ -284,7 +284,10 @@  static int pl01x_serial_setbrg(struct udevice *dev, int baudrate)
 	struct pl01x_serial_platdata *plat = dev_get_platdata(dev);
 	struct pl01x_priv *priv = dev_get_priv(dev);
 
-	pl01x_generic_setbrg(priv->regs, priv->type, plat->clock, baudrate);
+	if (!plat->skip_init) {
+		pl01x_generic_setbrg(priv->regs, priv->type, plat->clock,
+				     baudrate);
+	}
 
 	return 0;
 }
@@ -296,7 +299,10 @@  static int pl01x_serial_probe(struct udevice *dev)
 
 	priv->regs = (struct pl01x_regs *)plat->base;
 	priv->type = plat->type;
-	return pl01x_generic_serial_init(priv->regs, priv->type);
+	if (!plat->skip_init)
+		return pl01x_generic_serial_init(priv->regs, priv->type);
+	else
+		return 0;
 }
 
 static int pl01x_serial_getc(struct udevice *dev)
diff --git a/include/dm/platform_data/serial_pl01x.h b/include/dm/platform_data/serial_pl01x.h
index 5e068f3..ccfa808 100644
--- a/include/dm/platform_data/serial_pl01x.h
+++ b/include/dm/platform_data/serial_pl01x.h
@@ -17,11 +17,14 @@  enum pl01x_type {
  * @base: Register base address
  * @type: Port type
  * @clock: Input clock rate, used for calculating the baud rate divisor
+ * @skip_init: Don't attempt to change port configuration (also means @clock
+ * is ignored)
  */
 struct pl01x_serial_platdata {
 	unsigned long base;
 	enum pl01x_type type;
 	unsigned int clock;
+	bool skip_init;
 };
 
 #endif