From: John Jacques <john.jacq...@lsi.com> Signed-off-by: John Jacques <john.jacq...@lsi.com> --- arch/arm/boot/dts/axm55xx.dts | 17 +++++++++++ arch/arm/mach-axxia/clock.c | 68 +++++++++++++++++++++++++++++------------ drivers/tty/serial/amba-pl011.c | 39 +++++++++++------------ 3 files changed, 83 insertions(+), 41 deletions(-)
diff --git a/arch/arm/boot/dts/axm55xx.dts b/arch/arm/boot/dts/axm55xx.dts index f6de156..b79c744 100644 --- a/arch/arm/boot/dts/axm55xx.dts +++ b/arch/arm/boot/dts/axm55xx.dts @@ -152,6 +152,23 @@ }; }; + clocks { + #address-cells = <1>; + #size-cells = <0>; + + cpu { + frequency = <0>; /* Filled in by the boot loader. */ + }; + + peripheral { + frequency = <0>; /* Filled in by the boot loader. */ + }; + + emmc { + frequency = <0>; /* Filled in by the boot loader. */ + }; + }; + memory@00000000 { device_type = "memory"; reg = <0 0x00000000 0 0x10000000>; diff --git a/arch/arm/mach-axxia/clock.c b/arch/arm/mach-axxia/clock.c index 27ace6f..4ad8cb9 100644 --- a/arch/arm/mach-axxia/clock.c +++ b/arch/arm/mach-axxia/clock.c @@ -13,6 +13,9 @@ #include <linux/clk.h> #include <linux/clkdev.h> #include <linux/clk-provider.h> +#include <linux/of_fdt.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h> #define AXXIA_CPU_CLOCK 1400000000 #define AXXIA_SYS_CLOCK 450000000 @@ -81,6 +84,11 @@ axxia_init_clocks(void) #else +static struct of_device_id cpu_pll[] __initconst = { + { .name = "/clocks/cpu", }, + {}, +}; + /* ------------------------------------------------------------------------------- axxia_init_clocks @@ -93,27 +101,29 @@ axxia_init_clocks(void) { struct clk *clk; int i; + struct device_node *np; + u32 frequency; - /* APB clock dummy */ - clk = clk_register_fixed_rate(NULL, "apb_pclk", NULL, - CLK_IS_ROOT, AXXIA_SYS_CLOCK/2); - clk_register_clkdev(clk, "apb_pclk", NULL); + np = of_find_node_by_path("/clocks/cpu"); + + if (np) { + if (of_property_read_u32(np, "frequency", &frequency)) + printk(KERN_ERR "%d - Error!", __LINE__); + } - /* CPU core clock (1400MHz) from CPU_PLL */ clk = clk_register_fixed_rate(NULL, "clk_cpu", NULL, - CLK_IS_ROOT, AXXIA_CPU_CLOCK); + CLK_IS_ROOT, frequency); - /* APB and System AXI clock from CPU_PLL */ - clk = clk_register_fixed_rate(NULL, "clk_pclk", NULL, - CLK_IS_ROOT, AXXIA_CPU_CLOCK/9); + np = of_find_node_by_path("/clocks/peripheral"); - /* DDR3 (interface 1) clock from SMEM1_PLL */ - clk = clk_register_fixed_rate(NULL, "clk_smem1_2x", NULL, - CLK_IS_ROOT, AXXIA_DDR_CLOCK); + if (np) { + if (of_property_read_u32(np, "frequency", &frequency)) + printk(KERN_ERR "%d - Error!", __LINE__); + } - /* AXIS slow peripheral clock from SMEM1_PLL. */ clk = clk_register_fixed_rate(NULL, "clk_per", NULL, - CLK_IS_ROOT, 2000000); + CLK_IS_ROOT, frequency); + /* PL011 UART0 */ clk_register_clkdev(clk, NULL, "2010080000.uart"); /* PL011 UART1 */ @@ -124,20 +134,38 @@ axxia_init_clocks(void) clk_register_clkdev(clk, NULL, "2010083000.uart"); /* PL022 SSP */ clk_register_clkdev(clk, NULL, "ssp"); - - /* Timers 1MHz clock */ - clk = clk_register_fixed_rate(NULL, "clk_1mhz", NULL, - CLK_IS_ROOT, 1000000); /* SP804 timers */ clk_register_clkdev(clk, NULL, "sp804"); for (i = 0; i < 8; i++) clk_register_clkdev(clk, NULL, "axxia-timer%d", i); - /* Dummy MMC clk */ + np = of_find_node_by_path("/clocks/emmc"); + + if (np) { + if (of_property_read_u32(np, "frequency", &frequency)) + printk(KERN_ERR "%d - Error!", __LINE__); + } + clk = clk_register_fixed_rate(NULL, "clk_mmci", NULL, - CLK_IS_ROOT, 25000000); + CLK_IS_ROOT, frequency); + /* PL180 MMCI */ clk_register_clkdev(clk, NULL, "mmci"); + + /* APB clock dummy */ + clk = clk_register_fixed_rate(NULL, "apb_pclk", NULL, + CLK_IS_ROOT, AXXIA_SYS_CLOCK/2); + clk_register_clkdev(clk, "apb_pclk", NULL); + + /* APB and System AXI clock from CPU_PLL */ + clk = clk_register_fixed_rate(NULL, "clk_pclk", NULL, + CLK_IS_ROOT, AXXIA_CPU_CLOCK/9); + + /* DDR3 (interface 1) clock from SMEM1_PLL */ + clk = clk_register_fixed_rate(NULL, "clk_smem1_2x", NULL, + CLK_IS_ROOT, AXXIA_DDR_CLOCK); + + return; } #endif diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 4587609..af7be44 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c @@ -64,7 +64,8 @@ #define AMBA_ISR_PASS_LIMIT 256 -#define UART_DR_ERROR (UART011_DR_OE|UART011_DR_BE|UART011_DR_PE|UART011_DR_FE) +#define UART_DR_ERROR (UART011_DR_OE|UART011_DR_BE| \ + UART011_DR_PE|UART011_DR_FE) #define UART_DUMMY_DR_RX (1 << 16) @@ -751,8 +752,9 @@ static void pl011_dma_rx_chars(struct uart_amba_port *uap, */ if (dma_count == pending && readfifo) { /* Clear any error flags */ - writew(UART011_OEIS | UART011_BEIS | UART011_PEIS | UART011_FEIS, - uap->port.membase + UART011_ICR); + writew(UART011_OEIS | UART011_BEIS | + UART011_PEIS | UART011_FEIS, + uap->port.membase + UART011_ICR); /* * If we read all the DMA'd characters, and we had an @@ -817,8 +819,8 @@ static void pl011_dma_rx_irq(struct uart_amba_port *uap) /* Switch buffer & re-trigger DMA job */ dmarx->use_buf_b = !dmarx->use_buf_b; if (pl011_dma_rx_trigger_dma(uap)) { - dev_dbg(uap->port.dev, "could not retrigger RX DMA job " - "fall back to interrupt mode\n"); + dev_dbg(uap->port.dev, + "could not retrigger RX DMA job fall back to interrupt mode\n"); uap->im |= UART011_RXIM; writew(uap->im, uap->port.membase + UART011_IMSC); } @@ -865,8 +867,8 @@ static void pl011_dma_rx_callback(void *data) * get some IRQ immediately from RX. */ if (ret) { - dev_dbg(uap->port.dev, "could not retrigger RX DMA job " - "fall back to interrupt mode\n"); + dev_dbg(uap->port.dev, + "could not retrigger RX DMA job fall back to interrupt mode\n"); uap->im |= UART011_RXIM; writew(uap->im, uap->port.membase + UART011_IMSC); } @@ -944,8 +946,8 @@ skip_rx: if (uap->using_rx_dma) { if (pl011_dma_rx_trigger_dma(uap)) - dev_dbg(uap->port.dev, "could not trigger initial " - "RX DMA job, fall back to interrupt mode\n"); + dev_dbg(uap->port.dev, + "could not trigger initial RX DMA job, fall back to interrupt mode\n"); } } @@ -1169,8 +1171,8 @@ static void pl011_rx_chars(struct uart_amba_port *uap) */ if (pl011_dma_rx_available(uap)) { if (pl011_dma_rx_trigger_dma(uap)) { - dev_dbg(uap->port.dev, "could not trigger RX DMA job " - "fall back to interrupt mode again\n"); + dev_dbg(uap->port.dev, + "could not trigger RX DMA job fall back to interrupt mode again\n"); uap->im |= UART011_RXIM; } else uap->im &= ~UART011_RXIM; @@ -1481,11 +1483,11 @@ static void pl010_put_poll_char(struct uart_port *port, static void pl011_shutdown_channel(struct uart_amba_port *uap, unsigned int lcrh) { - unsigned long val; + unsigned long val; - val = readw(uap->port.membase + lcrh); - val &= ~(UART01x_LCRH_BRK | UART01x_LCRH_FEN); - writew(val, uap->port.membase + lcrh); + val = readw(uap->port.membase + lcrh); + val &= ~(UART01x_LCRH_BRK | UART01x_LCRH_FEN); + writew(val, uap->port.membase + lcrh); } static void pl011_shutdown(struct uart_port *port) @@ -1580,7 +1582,7 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios, case CS7: lcr_h = UART01x_LCRH_WLEN_7; break; - default: // CS8 + default: /* CS8 */ lcr_h = UART01x_LCRH_WLEN_8; break; } @@ -1667,13 +1669,8 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios, quot -= 2; } /* Set baud rate */ -#if 0 writew(quot & 0x3f, port->membase + UART011_FBRD); writew(quot >> 6, port->membase + UART011_IBRD); -#else - writew(0x3, port->membase + UART011_FBRD); - writew(0x364, port->membase + UART011_IBRD); -#endif /* * ----------v----------v----------v----------v----- -- 1.8.4.3 _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto