serial: pl01x: Add support for devices with the rate pre-configured.

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>
This commit is contained in:
Eric Anholt 2016-03-13 18:16:54 -07:00 committed by Tom Rini
parent 9a6598daaf
commit cd0fa5bff8
3 changed files with 12 additions and 3 deletions

View file

@ -37,7 +37,7 @@ static const struct pl01x_serial_platdata serial_platdata = {
.base = 0x20201000, .base = 0x20201000,
#endif #endif
.type = TYPE_PL011, .type = TYPE_PL011,
.clock = 3000000, .skip_init = true,
}; };
U_BOOT_DEVICE(bcm2835_serials) = { U_BOOT_DEVICE(bcm2835_serials) = {

View file

@ -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_serial_platdata *plat = dev_get_platdata(dev);
struct pl01x_priv *priv = dev_get_priv(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; return 0;
} }
@ -296,7 +299,10 @@ static int pl01x_serial_probe(struct udevice *dev)
priv->regs = (struct pl01x_regs *)plat->base; priv->regs = (struct pl01x_regs *)plat->base;
priv->type = plat->type; 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) static int pl01x_serial_getc(struct udevice *dev)

View file

@ -17,11 +17,14 @@ enum pl01x_type {
* @base: Register base address * @base: Register base address
* @type: Port type * @type: Port type
* @clock: Input clock rate, used for calculating the baud rate divisor * @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 { struct pl01x_serial_platdata {
unsigned long base; unsigned long base;
enum pl01x_type type; enum pl01x_type type;
unsigned int clock; unsigned int clock;
bool skip_init;
}; };
#endif #endif