[U-Boot] [PATCH] x86: baytrail: Add SIO HS-UART clock setup
Bin Meng
bmeng.cn at gmail.com
Tue Jul 19 06:03:03 CEST 2016
Hi Stefan,
On Mon, Jul 18, 2016 at 8:25 PM, Stefan Roese <sr at denx.de> wrote:
> To support the BayTrail internal SIO HS UART, the internal UART clock
> needs to get configured. This patch adds support for this clock
> configuration which will be done, if the PCI device(s) are found.
>
> Signed-off-by: Stefan Roese <sr at denx.de>
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Bin Meng <bmeng.cn at gmail.com>
Looks good to me.
Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
One comments below:
> ---
> arch/x86/cpu/baytrail/cpu.c | 52 +++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 52 insertions(+)
>
> diff --git a/arch/x86/cpu/baytrail/cpu.c b/arch/x86/cpu/baytrail/cpu.c
> index b1faf8c..87e0382 100644
> --- a/arch/x86/cpu/baytrail/cpu.c
> +++ b/arch/x86/cpu/baytrail/cpu.c
> @@ -9,12 +9,64 @@
> #include <common.h>
> #include <cpu.h>
> #include <dm.h>
> +#include <pci.h>
> #include <asm/cpu.h>
> #include <asm/cpu_x86.h>
> +#include <asm/io.h>
> #include <asm/lapic.h>
> #include <asm/msr.h>
> #include <asm/turbo.h>
>
> +#define BYT_PRV_CLK 0x800
> +#define BYT_PRV_CLK_EN (1 << 0)
> +#define BYT_PRV_CLK_M_VAL_SHIFT 1
> +#define BYT_PRV_CLK_N_VAL_SHIFT 16
> +#define BYT_PRV_CLK_UPDATE (1 << 31)
> +
> +#define BYT_HSUART0 PCI_BDF(0, 0x1e, 0x3)
> +#define BYT_HSUART1 PCI_BDF(0, 0x1e, 0x4)
> +
> +static void hsuart_clock_set(void *base)
> +{
> + u32 m, n, reg;
> +
> + /*
> + * Configure the BayTrail UART clock for the internal HS UARTs
> + * (PCI devices) to 58982400 Hz
> + */
> + m = 0x2400;
> + n = 0x3d09;
> + reg = (m << BYT_PRV_CLK_M_VAL_SHIFT) | (n << BYT_PRV_CLK_N_VAL_SHIFT);
> + writel(reg, base + BYT_PRV_CLK);
> + reg |= BYT_PRV_CLK_EN | BYT_PRV_CLK_UPDATE;
> + writel(reg, base + BYT_PRV_CLK);
> +}
> +
> +/*
> + * Configure the internal clock of both SIO HS-UARTs, if they are enabled
> + * via FSP
> + */
> +int arch_cpu_init_dm(void)
> +{
> + struct udevice *dev;
> + void *base;
> + int ret;
> +
> + ret = dm_pci_bus_find_bdf(BYT_HSUART0, &dev);
> + if (!ret) {
> + base = dm_pci_map_bar(dev, PCI_BASE_ADDRESS_0, PCI_REGION_MEM);
> + hsuart_clock_set(base);
> + }
> +
> + ret = dm_pci_bus_find_bdf(BYT_HSUART1, &dev);
> + if (!ret) {
> + base = dm_pci_map_bar(dev, PCI_BASE_ADDRESS_0, PCI_REGION_MEM);
> + hsuart_clock_set(base);
> + }
Maybe we can just use a loop to save some duplication? like:
for (i =0; i < 2; i++) {
ret = dm_pci_bus_find_bdf(PCI_BDF(0, 0x1e, 3 + i), &dev);
if (!ret) {
base = dm_pci_map_bar(dev, PCI_BASE_ADDRESS_0, PCI_REGION_MEM);
hsuart_clock_set(base);
}
}
> +
> + return 0;
> +}
> +
> static void set_max_freq(void)
> {
> msr_t perf_ctl;
> --
Regards,
Bin
More information about the U-Boot
mailing list