ARM: OMAP2+: DT 'compatible' tweak for displays
As there is no common panel framework in the kernel, we have OMAP specific panel drivers. However, the DT data should be generic. This brings the issue that some other platform could use the same panels, and would need to create a driver with the same 'compatible' string as the OMAP driver. In the long run, we have to get a common panel framework. For the time being, this patch solves the issue: At early boot time, we go through the DT nodes looking for the panels the kernel supports for OMAP. For each found node, the 'compatible' string is prepended with "omapdss,", i.e. "sony,acx565akm" becomes "omapdss,sony,acx565akm". The OMAP display drivers all have "omapdss," at the beginning of their compatible field. This allows us to have generic DT data, but OMAP specific display drivers. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Reviewed-by: Archit Taneja <archit@ti.com> Acked-by: Tony Lindgren <tony@atomide.com>
This commit is contained in:
parent
dcdf407b9d
commit
6a0e6b3872
|
@ -35,6 +35,8 @@ static struct of_device_id omap_dt_match_table[] __initdata = {
|
|||
|
||||
static void __init omap_generic_init(void)
|
||||
{
|
||||
omapdss_early_init_of();
|
||||
|
||||
pdata_quirks_init(omap_dt_match_table);
|
||||
|
||||
omapdss_init_of();
|
||||
|
|
|
@ -316,6 +316,7 @@ extern int omap_dss_reset(struct omap_hwmod *);
|
|||
int omap_clk_init(void);
|
||||
|
||||
int __init omapdss_init_of(void);
|
||||
void __init omapdss_early_init_of(void);
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <video/omapdss.h>
|
||||
#include "omap_hwmod.h"
|
||||
|
@ -555,6 +556,67 @@ int omap_dss_reset(struct omap_hwmod *oh)
|
|||
return r;
|
||||
}
|
||||
|
||||
/* list of 'compatible' nodes to convert to omapdss specific */
|
||||
static const char * const dss_compat_conv_list[] __initconst = {
|
||||
"composite-connector",
|
||||
"dvi-connector",
|
||||
"hdmi-connector",
|
||||
"panel-dpi",
|
||||
"panel-dsi-cm",
|
||||
"sony,acx565akm",
|
||||
"svideo-connector",
|
||||
"ti,tfp410",
|
||||
"ti,tpd12s015",
|
||||
};
|
||||
|
||||
/* prepend compatible string with "omapdss," */
|
||||
static __init void omapdss_omapify_node(struct device_node *node,
|
||||
const char *compat)
|
||||
{
|
||||
char *new_compat;
|
||||
struct property *prop;
|
||||
|
||||
new_compat = kasprintf(GFP_KERNEL, "omapdss,%s", compat);
|
||||
|
||||
prop = kzalloc(sizeof(*prop), GFP_KERNEL);
|
||||
|
||||
if (!prop) {
|
||||
pr_err("omapdss_omapify_node: kzalloc failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
prop->name = "compatible";
|
||||
prop->value = new_compat;
|
||||
prop->length = strlen(new_compat) + 1;
|
||||
|
||||
of_update_property(node, prop);
|
||||
}
|
||||
|
||||
/*
|
||||
* As omapdss panel drivers are omapdss specific, but we want to define the
|
||||
* DT-data in generic manner, we convert the compatible strings of the panel
|
||||
* nodes from "panel-foo" to "omapdss,panel-foo". This way we can have both
|
||||
* correct DT data and omapdss specific drivers.
|
||||
*
|
||||
* When we get generic panel drivers to the kernel, this will be removed.
|
||||
*/
|
||||
void __init omapdss_early_init_of(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(dss_compat_conv_list); ++i) {
|
||||
const char *compat = dss_compat_conv_list[i];
|
||||
struct device_node *node = NULL;
|
||||
|
||||
while ((node = of_find_compatible_node(node, NULL, compat))) {
|
||||
if (!of_device_is_available(node))
|
||||
continue;
|
||||
|
||||
omapdss_omapify_node(node, compat);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct device_node * __init omapdss_find_dss_of_node(void)
|
||||
{
|
||||
struct device_node *node;
|
||||
|
|
Loading…
Reference in New Issue