From de698980f33e6f4f457e38a0b77494de4752feae Mon Sep 17 00:00:00 2001 From: Rouven Czerwinski Date: Tue, 15 Jan 2019 06:44:04 +0100 Subject: serial_ns16550: handle default reg-io-width According to the device tree bindings for 8250, width is an optional property. Default to 1 which is the same default value as used by the kernel. Before this change the driver would not work for device trees which do not include the optional binding. Signed-off-by: Rouven Czerwinski Signed-off-by: Sascha Hauer --- drivers/serial/serial_ns16550.c | 46 ++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) (limited to 'drivers') diff --git a/drivers/serial/serial_ns16550.c b/drivers/serial/serial_ns16550.c index 4d73ea8b87..8ddcfdbefc 100644 --- a/drivers/serial/serial_ns16550.c +++ b/drivers/serial/serial_ns16550.c @@ -297,36 +297,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 = { -- cgit v1.2.3 From 77de547cd179b910cdcb8530df15d77a0fc66a3c Mon Sep 17 00:00:00 2001 From: Rouven Czerwinski Date: Tue, 15 Jan 2019 06:44:05 +0100 Subject: serial_ns16550: add raspberry pi compatible and init Add the compatible for the Raspberry Pi AUX UART and an init function which enables it via the aux register and configures the correct shift value. Signed-off-by: Rouven Czerwinski Signed-off-by: Sascha Hauer --- drivers/serial/serial_ns16550.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'drivers') diff --git a/drivers/serial/serial_ns16550.c b/drivers/serial/serial_ns16550.c index 8ddcfdbefc..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 **********************************/ /** @@ -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; @@ -527,6 +549,12 @@ static struct of_device_id ns16550_serial_dt_ids[] = { .compatible = "ingenic,jz4740-uart", .data = &jz_drvdata, }, +#endif +#if IS_ENABLED(CONFIG_MACH_RPI_COMMON) + { + .compatible = "brcm,bcm2835-aux-uart", + .data = &rpi_drvdata, + }, #endif { /* sentinel */ -- cgit v1.2.3 From b7392e27e0103db18a93c6ae004d12ca5e400ec5 Mon Sep 17 00:00:00 2001 From: Roland Hieber Date: Tue, 15 Jan 2019 11:34:22 +0100 Subject: mci: bcm2835: make locally used functions static The mci-bcm2835 driver registers itself as an MCI driver on probing, and is thereby used through the MCI interface, so these functions are not meant to act as a public interface and only used internally in this compilation unit. This fixes the following build warnings: .../drivers/mci/mci-bcm2835.c:56:6: warning: no previous prototype for 'bcm2835_mci_write' [-Wmissing-prototypes] void bcm2835_mci_write(struct bcm2835_mci_host *host, u32 reg, u32 val) ^~~~~~~~~~~~~~~~~ .../drivers/mci/mci-bcm2835.c:74:5: warning: no previous prototype for 'bcm2835_mci_read' [-Wmissing-prototypes] u32 bcm2835_mci_read(struct bcm2835_mci_host *host, u32 reg) ^~~~~~~~~~~~~~~~ .../drivers/mci/mci-bcm2835.c:83:6: warning: no previous prototype for 'bcm2835_mci_write_data' [-Wmissing-prototypes] void bcm2835_mci_write_data(struct bcm2835_mci_host *host, u32 *p) ^~~~~~~~~~~~~~~~~~~~~~ .../drivers/mci/mci-bcm2835.c:89:6: warning: no previous prototype for 'bcm2835_mci_read_data' [-Wmissing-prototypes] void bcm2835_mci_read_data(struct bcm2835_mci_host *host, u32 *p) ^~~~~~~~~~~~~~~~~~~~~ CC common/date.o .../drivers/mci/mci-bcm2835.c:419:5: warning: no previous prototype for 'bcm2835_mci_reset' [-Wmissing-prototypes] int bcm2835_mci_reset(struct mci_host *mci, struct device_d *mci_dev) Signed-off-by: Roland Hieber Signed-off-by: Sascha Hauer --- drivers/mci/mci-bcm2835.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'drivers') 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; -- cgit v1.2.3