summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Vogt <fvogt@suse.com>2016-09-26 14:26:49 +0200
committerTom Rini <trini@konsulko.com>2016-11-28 20:09:50 -0500
commitcb97ad47bfa365128927438b94065fa900838770 (patch)
treed3d5011661ae6b1c798eacc64bdd9d5a50168d38
parentff5d7ae713ac6de37f3a93f3a4fed13ab4ffd154 (diff)
serial: bcm283x_mu: support disabling after initialization
For the Raspberry Pi 3 it needs to be possible to disable the serial device after initialization happens, as only after the GPIO device is available it is known whether the mini uart is usable. Signed-off-by: Fabian Vogt <fvogt@suse.com> Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r--drivers/serial/serial_bcm283x_mu.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/serial/serial_bcm283x_mu.c b/drivers/serial/serial_bcm283x_mu.c
index e361909013..3884f744cd 100644
--- a/drivers/serial/serial_bcm283x_mu.c
+++ b/drivers/serial/serial_bcm283x_mu.c
@@ -59,7 +59,7 @@ static int bcm283x_mu_serial_setbrg(struct udevice *dev, int baudrate)
struct bcm283x_mu_regs *regs = priv->regs;
u32 divider;
- if (plat->skip_init)
+ if (plat->disabled || plat->skip_init)
return 0;
divider = plat->clock / (baudrate * 8);
@@ -85,10 +85,14 @@ static int bcm283x_mu_serial_probe(struct udevice *dev)
static int bcm283x_mu_serial_getc(struct udevice *dev)
{
+ struct bcm283x_mu_serial_platdata *plat = dev_get_platdata(dev);
struct bcm283x_mu_priv *priv = dev_get_priv(dev);
struct bcm283x_mu_regs *regs = priv->regs;
u32 data;
+ if (plat->disabled)
+ return -EAGAIN;
+
/* Wait until there is data in the FIFO */
if (!(readl(&regs->lsr) & BCM283X_MU_LSR_RX_READY))
return -EAGAIN;
@@ -100,9 +104,13 @@ static int bcm283x_mu_serial_getc(struct udevice *dev)
static int bcm283x_mu_serial_putc(struct udevice *dev, const char data)
{
+ struct bcm283x_mu_serial_platdata *plat = dev_get_platdata(dev);
struct bcm283x_mu_priv *priv = dev_get_priv(dev);
struct bcm283x_mu_regs *regs = priv->regs;
+ if (plat->disabled)
+ return 0;
+
/* Wait until there is space in the FIFO */
if (!(readl(&regs->lsr) & BCM283X_MU_LSR_TX_EMPTY))
return -EAGAIN;
@@ -115,9 +123,15 @@ static int bcm283x_mu_serial_putc(struct udevice *dev, const char data)
static int bcm283x_mu_serial_pending(struct udevice *dev, bool input)
{
+ struct bcm283x_mu_serial_platdata *plat = dev_get_platdata(dev);
struct bcm283x_mu_priv *priv = dev_get_priv(dev);
struct bcm283x_mu_regs *regs = priv->regs;
- unsigned int lsr = readl(&regs->lsr);
+ unsigned int lsr;
+
+ if (plat->disabled)
+ return 0;
+
+ lsr = readl(&regs->lsr);
if (input) {
WATCHDOG_RESET();