[U-Boot] [PATCH] serial: ns16550: Add support for the BayTrail internal HS UART
Simon Glass
sjg at chromium.org
Mon Jul 18 13:24:54 CEST 2016
Hi,
On 18 July 2016 at 02:17, Stefan Roese <sr at denx.de> wrote:
> Hi Bin,
>
>
> On 14.07.2016 02:52, Bin Meng wrote:
>>
>> On Wed, Jul 13, 2016 at 2:03 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 a compatible DT node is 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>
>>> ---
>>> drivers/serial/ns16550.c | 26 ++++++++++++++++++++++++++
>>> 1 file changed, 26 insertions(+)
>>>
>>> diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
>>> index c6cb3eb..12499ec 100644
>>> --- a/drivers/serial/ns16550.c
>>> +++ b/drivers/serial/ns16550.c
>>> @@ -94,6 +94,13 @@ static inline int serial_in_shift(void *addr, int
>>> shift)
>>> #define CONFIG_SYS_NS16550_CLK 0
>>> #endif
>>>
>>> +/* Intel BayTrail defines */
>>> +#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)
>>> +
>>> static void ns16550_writeb(NS16550_t port, int offset, int value)
>>> {
>>> struct ns16550_platdata *plat = port->plat;
>>> @@ -381,6 +388,25 @@ int ns16550_serial_ofdata_to_platdata(struct udevice
>>> *dev)
>>> return ret;
>>>
>>> addr = bar;
>>> +
>>> + /* Setup BayTrail UART clock */
>>> + ret = fdt_node_check_compatible(gd->fdt_blob,
>>> dev->of_offset,
>>> + "baytrail-hs-uart");
>>> + if (ret == 0) {
>>> + 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, bar + BYT_PRV_CLK);
>>> + reg |= BYT_PRV_CLK_EN | BYT_PRV_CLK_UPDATE;
>>> + writel(reg, bar + BYT_PRV_CLK);
>>> + }
>>> }
>>> #endif
>>
>>
>> I prefer moving these clock setup codes to the SoC codes
>> (arch/x86/cpu/baytrail/). Is that possible?
>
>
> It is possible, but I'm not so sure if this is "better". First, I can't
> find a file in arch/x86/cpu/baytrail/ that is really fitting for such
> a UART clock setup. Sure, I could create a new one, but I'm not so sure
> if its worth it. Also, in the Linux 8250 serial driver, the clock setup
> is also done in this driver. It would be cleaner to move this clock
> setup into a separate function in this file. But this would mean
> additional #ifdef's for this function, which I'm hesitant to add.
>
> So what do you think? Can this code stay in this file? Or where
> exactly do you want me to move it into?
Perhaps arch_cpu_init_dm()? That's where ivybridge puts it. This
function is called immediately after driver model is inited.
Regards,
Simon
More information about the U-Boot
mailing list