On Tue, Feb 5, 2013 at 4:42 PM, Stephen Warren <swarren@xxxxxxxxxxxxx> wrote:On 02/05/2013 05:37 PM, Sean Paul wrote:All devices that use this driver are compatible, at some level, withOn Tue, Feb 5, 2013 at 4:22 PM, Stephen Warren <swarren@xxxxxxxxxxxxx> wrote:The DT nodes should include only the compatible values that the HW isn 02/05/2013 04:42 PM, Sean Paul wrote:At the moment, all DTs have to be compatible with exynos4-hdmi sinceUse the compatible string in the device tree to determine whichBinding looks sane to me.
registers/functions to use in the HDMI driver. Also changes the
references from v13 to 4210 and v14 to 4212 to reflect the IP
block version instead of the HDMI version.
diff --git a/Documentation/devicetree/bindings/drm/exynos/hdmi.txt b/Documentation/devicetree/bindings/drm/exynos/hdmi.txt
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.cWhy not fill in all the "base" compatible values there (I think you need
#ifdef CONFIG_OF
static struct of_device_id hdmi_match_types[] = {
{
- .compatible = "samsung,exynos5-hdmi",
- .data = (void *)HDMI_TYPE14,
+ .compatible = "samsung,exynos4-hdmi",
}, {
/* end node */
}
this anyway so that DTs don't all have to be compatible with
samsung,exynos4-hdmi), with .data containing the HDMI_VER_EXYNOS*
values, then ...
it provides the base for the current driver. The driver uses 4210 and
4212 to differentiate between different register addresses and
features, but most things are just exynos4-hdmi compatible.
actually compatible with. If the HW isn't compatible with exynos4-hdmi,
that value shouldn't be in the compatible property, but instead whatever
the "base" value that the HW really is compatible with. The driver can
support multiple "base" compatible values from this table.
exynos4-hdmi, so I think its usage is correct here.
@@ -2218,17 +2217,18 @@ static int hdmi_probe(struct platform_device *pdev)
+
+ if (of_device_is_compatible(dev->of_node, "samsung,exynos4210-hdmi"))
+ hdata->version |= HDMI_VER_EXYNOS4210;
+ if (of_device_is_compatible(dev->of_node, "samsung,exynos4212-hdmi"))
+ hdata->version |= HDMI_VER_EXYNOS4212;
+ if (of_device_is_compatible(dev->of_node, "samsung,exynos5250-hdmi"))
+ hdata->version |= HDMI_VER_EXYNOS5250;
I think the only way that works is if you hardcode the compatibleYou shouldn't have to iterate over multiple matches. of_match_device()Instead of that, do roughly:I don't think it's that easy. of_match_device returns the first match
match = of_match_device(hdmi_match_types, &pdev->dev);
if (match)
hdata->version |= (int)match->data;
That way, it's all table-based. Any future additions to
hdmi_match_types[] won't require another if statement to be added to
probe().
from the device table, so I'd still need to iterate through the
matches. I could still break this out into a table, but I don't think
of_match_device is the right way to probe it.
is supposed to return the match for the first entry in the compatible
property, then if there was no match, move on to looking at the next
entry in the compatible property, etc. In practice, I think it's still
not implemented quite correctly for this, but you can make it work by
putting the newest compatible value first in the match table.
versions in the driver, like this:
static struct of_device_id hdmi_match_types[] = {
{
.compatible = "samsung,exynos5250-hdmi",
.data = (void *)(HDMI_VER_EXYNOS5250 | HDMI_VER_EXYNOS4212);
}, {
.compatible = "samsung,exynos4212-hdmi",
.data = (void *)HDMI_VER_EXYNOS4212;
}, {
.compatible = "samsung,exynos4210-hdmi",
.data = (void *)HDMI_VER_EXYNOS4210;
}, {
/* end node */
}
};
In that case, it eliminates the benefit of using device tree to
determine the compatible bits. I hope I'm just being thick and missing
something.
Sean
_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/dri-devel