[U-Boot] [PATCH v3 14/16] tegra: dts: Add serial port details

Stephen Warren swarren at wwwdotorg.org
Fri Aug 1 01:06:15 CEST 2014


On 07/31/2014 04:10 PM, Simon Glass wrote:
> Hi Stephen,
>
> On 31 July 2014 21:16, Stephen Warren <swarren at wwwdotorg.org> wrote:
>> On 07/30/2014 03:49 AM, Simon Glass wrote:
>>>
>>> Some Tegra device tree files do not include information about the serial
>>> ports. Add this and also add information about the input clock speed.
>>>
>>> The console alias needs to be set up to indicate which port is used for
>>> the console.
>>>
>>> Also add a binding file since this is missing.
>>
>>
>>> diff --git a/arch/arm/dts/tegra114-dalmore.dts
>>> b/arch/arm/dts/tegra114-dalmore.dts
>>> index 435c01e..e2426ef 100644
>>> --- a/arch/arm/dts/tegra114-dalmore.dts
>>> +++ b/arch/arm/dts/tegra114-dalmore.dts
>>> @@ -7,6 +7,7 @@
>>>          compatible = "nvidia,dalmore", "nvidia,tegra114";
>>>
>>>          aliases {
>>> +               console = &uart_d;
>>
>>
>> I don't think that's a standard alias name. There was some recent discussion
>> in the devicetree mailing list re: using some property in /chosen for this
>> purpose instead. U-Boot and the kernel should use the same representation
>> here.
>
> This is U-Boot's approach at present,

That's not the U-Boot approach on Tegra boards before this patch. I do 
not want Tegra U-Boot do adopt any more U-Boot-specific 
not-really-DT-but-pretending-to-be bindings.

 > if we change it then we should
> change it everywhere. I worry that 'chosen' is for Linux rather than
> U-Boot and we might get very confused about what chosen is for?

That discussion should be had on the devicetree mailing list.

>>> diff --git a/arch/arm/dts/tegra114.dtsi b/arch/arm/dts/tegra114.dtsi
>>
>>
>>> +       uart_a: serial at 70006000 {
>>> +               compatible = "nvidia,tegra20-uart";
>>
>>
>> This property needs to include both the specific HW (i.e. Tegra114) and any
>> HW it's compatible with (i.e. Tegra20).
>
> So something like this?
>
> compatible = "nvidia,tegra114-uart", "nvidia,tegra20-uart";

Yes.

>>> +               reg = <0x70006000 0x40>;
>>> +               reg-shift = <2>;
>>> +               clock-frequency = <408000000>;
>>
>>
>> This isn't a property that's defined by the Tegra serial binding. This
>> information should be obtained by looking up the relevant clock, and
>> querying its rate.
>
> We can't do that in the ns16550 driver as yet since there is no
> generic U-Boot clock infrastructure. I suspect that will come with
> time.

The solution here is to put the clock infra-structure in place first. 
One thing I've learned from the kernel DT experience is that a lot of 
time would have been saved by putting the correct infra-structure in 
place first, then using it, rather than hacking around things the wrong 
way, then putting the infra-structure in place, then converting to it. 
That's a lot more work, and rather painful. Equally, if we don't just do 
the infra-structure right, there's really little guarantee that we'll 
ever convert to the correct approach. Just look at all the DT content in 
use in U-Boot that don't match the real DT bindings, even after it's 
been around years.

>> For reference, here's the DT node for this UART in the kernel DT, which
>> complies with the relevant binding document:
>>
>>          uarta: serial at 70006000 {
>>                  compatible = "nvidia,tegra114-uart", "nvidia,tegra20-uart";
>>
>>                  reg = <0x70006000 0x40>;
>>                  reg-shift = <2>;
>>                  interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
>>                  clocks = <&tegra_car TEGRA114_CLK_UARTA>;
>>                  resets = <&tegra_car 6>;
>>                  reset-names = "serial";
>>                  dmas = <&apbdma 8>, <&apbdma 8>;
>>                  dma-names = "rx", "tx";
>>                  status = "disabled";
>>          };
>>
>> All the comment above apply to all the files in this patch.
>
> My intent was to make this work with a more generic binding for now -
> ns16550 is a pretty standard thing and I thought I could avoid making
> the driver Tegra-specific. Then we could allow many SoCs to use it.
> Why does Tegra have its own binding in the kernel for this standard
> UART?

The HW is not a PC-style UART where all you care about is the 16550 
registers, and clocks/resets/DMA/... can be ignored or deferred to 
firmware to set up before DT-driven SW runs.

As an aside, /almost/ all reviewed DT bindings use DT properties of the 
form:

clocks = <&provider parameters>;

rather than:

clock-rate = <number>;

So, that aspect of the Tegra UART binding isn't anything remotely 
unusual/non-standard.


More information about the U-Boot mailing list