diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2019-02-13 20:31:48 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2019-02-13 20:31:48 +0100 |
commit | d1bebc03b3005b33da3d1541782bb037974d1486 (patch) | |
tree | 21054d080018a1925538cd6a399e45e98eb3a84d /drivers | |
parent | f5a25b2639e0889e02db5e86080559019c567a1f (diff) | |
parent | 1c7a67ba2fdf8f366127e9cf459c76835ca01004 (diff) | |
download | barebox-d1bebc03b3005b33da3d1541782bb037974d1486.tar.gz barebox-d1bebc03b3005b33da3d1541782bb037974d1486.tar.xz |
Merge branch 'for-next/rpi'
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mci/mci-bcm2835.c | 10 | ||||
-rw-r--r-- | drivers/serial/serial_ns16550.c | 74 |
2 files changed, 56 insertions, 28 deletions
diff --git a/drivers/mci/mci-bcm2835.c b/drivers/mci/mci-bcm2835.c index daf771934a..9438e66af0 100644 --- a/drivers/mci/mci-bcm2835.c +++ b/drivers/mci/mci-bcm2835.c @@ -53,7 +53,7 @@ struct bcm2835_mci_host { uint64_t last_write; }; -void bcm2835_mci_write(struct bcm2835_mci_host *host, u32 reg, u32 val) +static void bcm2835_mci_write(struct bcm2835_mci_host *host, u32 reg, u32 val) { /* * The Arasan has a bugette whereby it may lose the content of @@ -71,7 +71,7 @@ void bcm2835_mci_write(struct bcm2835_mci_host *host, u32 reg, u32 val) writel(val, host->regs + reg); } -u32 bcm2835_mci_read(struct bcm2835_mci_host *host, u32 reg) +static u32 bcm2835_mci_read(struct bcm2835_mci_host *host, u32 reg) { return readl(host->regs + reg); } @@ -80,13 +80,13 @@ u32 bcm2835_mci_read(struct bcm2835_mci_host *host, u32 reg) * register is not affected by the twoticks_delay bug * and we can thus get better speed here */ -void bcm2835_mci_write_data(struct bcm2835_mci_host *host, u32 *p) +static void bcm2835_mci_write_data(struct bcm2835_mci_host *host, u32 *p) { writel(*p, host->regs + SDHCI_BUFFER); } /* Make a read data functions as well just to keep structure */ -void bcm2835_mci_read_data(struct bcm2835_mci_host *host, u32 *p) +static void bcm2835_mci_read_data(struct bcm2835_mci_host *host, u32 *p) { *p = readl(host->regs + SDHCI_BUFFER); } @@ -416,7 +416,7 @@ static void bcm2835_mci_set_ios(struct mci_host *mci, struct mci_ios *ios) host->bus_width, host->clock); } -int bcm2835_mci_reset(struct mci_host *mci, struct device_d *mci_dev) +static int bcm2835_mci_reset(struct mci_host *mci, struct device_d *mci_dev) { struct bcm2835_mci_host *host; u32 ret = 0; diff --git a/drivers/serial/serial_ns16550.c b/drivers/serial/serial_ns16550.c index 4d73ea8b87..ccd082e495 100644 --- a/drivers/serial/serial_ns16550.c +++ b/drivers/serial/serial_ns16550.c @@ -253,6 +253,23 @@ static void ns16550_jz_init_port(struct console_device *cdev) ns16550_serial_init_port(cdev); } +#define BCM2836_AUX_CLOCK_ENB 0x3f215004 /* BCM2835 AUX Clock enable register */ +#define BCM2836_AUX_CLOCK_EN_UART BIT(0) /* Bit 0 enables the Miniuart */ + +static void rpi_init_port(struct console_device *cdev) +{ + struct ns16550_priv *priv = to_ns16550_priv(cdev); + + writeb(BCM2836_AUX_CLOCK_EN_UART, BCM2836_AUX_CLOCK_ENB); + priv->plat.shift = 2; + /* + * We double the clock rate since the 16550 will divide by 16 + * (instead of 8 required by the BCM2835 peripheral manual) + */ + priv->plat.clock = priv->plat.clock*2; + ns16550_serial_init_port(cdev); +} + /*********** Exposed Functions **********************************/ /** @@ -297,36 +314,36 @@ static int ns16550_tstc(struct console_device *cdev) static void ns16550_probe_dt(struct device_d *dev, struct ns16550_priv *priv) { struct device_node *np = dev->device_node; - u32 width; + u32 width = 1; if (!IS_ENABLED(CONFIG_OFDEVICE)) return; of_property_read_u32(np, "clock-frequency", &priv->plat.clock); of_property_read_u32(np, "reg-shift", &priv->plat.shift); - if (!of_property_read_u32(np, "reg-io-width", &width)) - switch (width) { - case 1: - priv->read_reg = ns16550_read_reg_mmio_8; - priv->write_reg = ns16550_write_reg_mmio_8; - break; - case 2: - priv->read_reg = ns16550_read_reg_mmio_16; - priv->write_reg = ns16550_write_reg_mmio_16; - break; - case 4: - if (of_device_is_big_endian(np)) { - priv->read_reg = ns16550_read_reg_mmio_32be; - priv->write_reg = ns16550_write_reg_mmio_32be; - } else { - priv->read_reg = ns16550_read_reg_mmio_32; - priv->write_reg = ns16550_write_reg_mmio_32; - } - break; - default: - dev_err(dev, "unsupported reg-io-width (%d)\n", - width); + of_property_read_u32(np, "reg-io-width", &width); + switch (width) { + case 1: + priv->read_reg = ns16550_read_reg_mmio_8; + priv->write_reg = ns16550_write_reg_mmio_8; + break; + case 2: + priv->read_reg = ns16550_read_reg_mmio_16; + priv->write_reg = ns16550_write_reg_mmio_16; + break; + case 4: + if (of_device_is_big_endian(np)) { + priv->read_reg = ns16550_read_reg_mmio_32be; + priv->write_reg = ns16550_write_reg_mmio_32be; + } else { + priv->read_reg = ns16550_read_reg_mmio_32; + priv->write_reg = ns16550_write_reg_mmio_32; } + break; + default: + dev_err(dev, "unsupported reg-io-width (%d)\n", + width); + } } static struct ns16550_drvdata ns16450_drvdata = { @@ -353,6 +370,11 @@ static __maybe_unused struct ns16550_drvdata tegra_drvdata = { .linux_console_name = "ttyS", }; +static __maybe_unused struct ns16550_drvdata rpi_drvdata = { + .init_port = rpi_init_port, + .linux_console_name = "ttyS", +}; + static int ns16550_init_iomem(struct device_d *dev, struct ns16550_priv *priv) { struct resource *iores; @@ -528,6 +550,12 @@ static struct of_device_id ns16550_serial_dt_ids[] = { .data = &jz_drvdata, }, #endif +#if IS_ENABLED(CONFIG_MACH_RPI_COMMON) + { + .compatible = "brcm,bcm2835-aux-uart", + .data = &rpi_drvdata, + }, +#endif { /* sentinel */ }, |