On 01/14/2014 07:45 AM, Thierry Reding wrote:
> The head number of a given display controller is fixed in hardware and
> required to program outputs appropriately. Relying on the driver probe
> order to determine this number will not work, since that could yield a
> situation where the second head was probed first and would be assigned
> head number 0 instead of 1.
> 
> By explicitly specifying the head number in the device tree, it is no
> longer necessary to rely on these assumptions. As a fallback, if the
> property isn't available, derive the head number from the display
> controller node's position in the device tree. That's somewhat more
> reliable than the previous default but not a proper solution.

The series,
Tested-by: Stephen Warren <swarren at nvidia.com>

This patch should really have been sent to the DT maintainers and list
since it changes a DT binding...

> diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c

> +static int tegra_dc_parse_dt(struct tegra_dc *dc)
> +{
> +     struct device_node *np;
> +     u32 value = 0;
> +     int err;
> +
> +     err = of_property_read_u32(dc->dev->of_node, "nvidia,head", &value);

If of_property_read_u32() returns an error, does it guarantee that value
is left unchanged? I suspect it'd be safer to add ...

> +     if (err < 0) {
> +             dev_err(dc->dev, "missing \"nvidia,head\" property\n");
> +
> +             /*
> +              * If the nvidia,head property isn't present, try to find the
> +              * correct head number by looking up the position of this
> +              * display controller's node within the device tree. Assuming
> +              * that the nodes are ordered properly in the DTS file and
> +              * that the translation into a flattened device tree blob
> +              * preserves that ordering this will actually yield the right
> +              * head number.
> +              *
> +              * If those assumptions don't hold, this will still work for
> +              * cases where only a single display controller is used.
> +              */

... "value = 0;" here?

> +             for_each_matching_node(np, tegra_dc_of_match) {
> +                     if (np == dc->dev->of_node)
> +                             break;
> +
> +                     value++;
> +             }
> +     }
> +
> +     dc->pipe = value;

Reply via email to