[PATCH 06/11] bcma: add serial console support

Jonas Gorski jonas.gorski at gmail.com
Wed Jul 13 16:56:16 EDT 2011


On 9 July 2011 13:05, Hauke Mehrtens <hauke at hauke-m.de> wrote:
> This adds support for serial console to bcma, when operating on an SoC.
>
> Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
> ---
>  drivers/bcma/bcma_private.h           |    6 +++
>  drivers/bcma/driver_chipcommon.c      |   64 +++++++++++++++++++++++++++++++++
>  drivers/bcma/driver_mips.c            |    9 +++++
>  include/linux/bcma/bcma_driver_mips.h |   11 ++++++
>  4 files changed, 90 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
> index 830386c..92ec671 100644
> --- a/drivers/bcma/bcma_private.h
> +++ b/drivers/bcma/bcma_private.h
> @@ -26,6 +26,12 @@ int __init bcma_bus_scan_early(struct bcma_bus *bus,
>                               struct bcma_device *core);
>  void bcma_init_bus(struct bcma_bus *bus);
>
> +/* driver_chipcommon.c */
> +#ifdef CONFIG_BCMA_DRIVER_MIPS
> +extern int bcma_chipco_serial_init(struct bcma_drv_cc *cc,
> +                                  struct bcma_drv_mips_serial_port *ports);
> +#endif /* CONFIG_BCMA_DRIVER_MIPS */
> +
>  #ifdef CONFIG_BCMA_HOST_PCI
>  /* host_pci.c */
>  extern int __init bcma_host_pci_init(void);
> diff --git a/drivers/bcma/driver_chipcommon.c b/drivers/bcma/driver_chipcommon.c
> index 70321c6..88533ca 100644
> --- a/drivers/bcma/driver_chipcommon.c
> +++ b/drivers/bcma/driver_chipcommon.c
> @@ -92,3 +92,67 @@ u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, u32 value)
>  {
>        return bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value);
>  }
> +
> +#ifdef CONFIG_BCMA_DRIVER_MIPS
> +int bcma_chipco_serial_init(struct bcma_drv_cc *cc,
> +                           struct bcma_drv_mips_serial_port *ports)
> +{
> +       int nr_ports = 0;
> +       u32 plltype;
> +       unsigned int irq;
> +       u32 baud_base, div;
> +       u32 i, n;
> +       unsigned int ccrev = cc->core->id.rev;
> +
> +       plltype = (cc->capabilities & BCMA_CC_CAP_PLLT);
> +       irq = bcma_core_mips_irq(cc->core);
> +
> +       if ((ccrev >= 11) && (ccrev != 15) && (ccrev != 20)) {
> +               /* Fixed ALP clock */
> +               baud_base = 20000000;
> +               if (cc->capabilities & BCMA_CC_CAP_PMU) {
> +                       /* FIXME: baud_base is different for devices with a PMU */
> +                       WARN_ON(1);
> +               }
> +               div = 1;
> +               if (ccrev >= 21) {
> +                       /* Turn off UART clock before switching clocksource. */
> +                       bcma_cc_write32(cc, BCMA_CC_CORECTL,
> +                                      bcma_cc_read32(cc, BCMA_CC_CORECTL)
> +                                      & ~BCMA_CC_CORECTL_UARTCLKEN);
> +               }
> +               /* Set the override bit so we don't divide it */
> +               bcma_cc_write32(cc, BCMA_CC_CORECTL,
> +                              bcma_cc_read32(cc, BCMA_CC_CORECTL)
> +                              | BCMA_CC_CORECTL_UARTCLK0);
> +               if (ccrev >= 21) {
> +                       /* Re-enable the UART clock. */
> +                       bcma_cc_write32(cc, BCMA_CC_CORECTL,
> +                                      bcma_cc_read32(cc, BCMA_CC_CORECTL)
> +                                      | BCMA_CC_CORECTL_UARTCLKEN);
> +               }
> +       } else
> +               pr_err("serial not supported on this device ccrev: 0x%x\n",
> +                      ccrev);

Documentation/CodingStyle and again ;-)

> +
> +       /* Determine the registers of the UARTs */
> +       n = (cc->capabilities & BCMA_CC_CAP_NRUART);
> +       for (i = 0; i < n; i++) {
> +               void __iomem *cc_mmio;
> +               void __iomem *uart_regs;
> +
> +               cc_mmio = cc->core->bus->mmio +
> +                         (cc->core->core_index * BCMA_CORE_SIZE);

cc_mmio is constant for all uarts, so you should move it out of the
loop and calculate it once.

> +               uart_regs = cc_mmio + BCMA_CC_UART0_DATA;
> +               uart_regs += (i * 256);

Same for the uart_regs base. If you don't modify it at all you could
drop the cc_mmio variable (since you only need it to calculate
uart_regs) and

> +
> +               nr_ports++;
> +               ports[i].regs = uart_regs;

use here
               ports[i].regs = uart_regs + (i * 256);

This would make the code a bit cleaner IMHO.

> +               ports[i].irq = irq;
> +               ports[i].baud_base = baud_base;
> +               ports[i].reg_shift = 0;
> +       }
> +
> +       return nr_ports;

Isn't n always the same as nr_ports? At least I don't see any case
where it could differ, so you should be safe when directly using
nr_ports instead of n.


More information about the b43-dev mailing list