/** *of_parse_display_timing-parsedisplay_timingentryfromdevice_node *@np:device_nodewiththeproperties *@dt:display_timingthatcontainstheresult.Imaybepartiallywrittenincaseoferrors
**/ staticint of_parse_display_timing(conststruct device_node *np, struct display_timing *dt)
{
u32 val = 0; int ret = 0;
memset(dt, 0, sizeof(*dt));
ret |= parse_timing_property(np, "hback-porch", &dt->hback_porch);
ret |= parse_timing_property(np, "hfront-porch", &dt->hfront_porch);
ret |= parse_timing_property(np, "hactive", &dt->hactive);
ret |= parse_timing_property(np, "hsync-len", &dt->hsync_len);
ret |= parse_timing_property(np, "vback-porch", &dt->vback_porch);
ret |= parse_timing_property(np, "vfront-porch", &dt->vfront_porch);
ret |= parse_timing_property(np, "vactive", &dt->vactive);
ret |= parse_timing_property(np, "vsync-len", &dt->vsync_len);
ret |= parse_timing_property(np, "clock-frequency", &dt->pixelclock);
dt->flags = 0; if (!of_property_read_u32(np, "vsync-active", &val))
dt->flags |= val ? DISPLAY_FLAGS_VSYNC_HIGH :
DISPLAY_FLAGS_VSYNC_LOW; if (!of_property_read_u32(np, "hsync-active", &val))
dt->flags |= val ? DISPLAY_FLAGS_HSYNC_HIGH :
DISPLAY_FLAGS_HSYNC_LOW; if (!of_property_read_u32(np, "de-active", &val))
dt->flags |= val ? DISPLAY_FLAGS_DE_HIGH :
DISPLAY_FLAGS_DE_LOW; if (!of_property_read_u32(np, "pixelclk-active", &val))
dt->flags |= val ? DISPLAY_FLAGS_PIXDATA_POSEDGE :
DISPLAY_FLAGS_PIXDATA_NEGEDGE;
timings_np = of_get_child_by_name(np, "display-timings"); if (!timings_np) {
pr_err("%pOF: could not find display-timings node\n", np); return NULL;
}
disp = kzalloc(sizeof(*disp), GFP_KERNEL); if (!disp) {
pr_err("%pOF: could not allocate struct disp'\n", np); goto dispfail;
}
entry = of_parse_phandle(timings_np, "native-mode", 0); /* assume first child as native mode if none provided */ if (!entry)
entry = of_get_next_child(timings_np, NULL); /* if there is no child, it is useless to go on */ if (!entry) {
pr_err("%pOF: no timing specifications given\n", np); goto entryfail;
}
pr_debug("%pOF: using %pOFn as default timing\n", np, entry);
native_mode = entry;
disp->num_timings = of_get_child_count(timings_np); if (disp->num_timings == 0) { /* should never happen, as entry was already found above */
pr_err("%pOF: no timings specified\n", np); goto entryfail;
}
disp->timings = kcalloc(disp->num_timings, sizeof(struct display_timing *),
GFP_KERNEL); if (!disp->timings) {
pr_err("%pOF: could not allocate timings array\n", np); goto entryfail;
}
disp->num_timings = 0;
disp->native_mode = 0;
for_each_child_of_node(timings_np, entry) { struct display_timing *dt; int r;
dt = kmalloc(sizeof(*dt), GFP_KERNEL); if (!dt) {
pr_err("%pOF: could not allocate display_timing struct\n",
np); goto timingfail;
}
r = of_parse_display_timing(entry, dt); if (r) { /* *tonotencouragewrongdevicetrees,failincaseof *anerror
*/
pr_err("%pOF: error in timing %d\n",
np, disp->num_timings + 1);
kfree(dt); goto timingfail;
}
if (native_mode == entry)
disp->native_mode = disp->num_timings;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.