/** * of_parse_display_timing - parse display_timing entry from device_node * @np: device_node with the properties **/ static int of_parse_display_timing(const struct 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; if (of_property_read_bool(np, "interlaced")) dt->flags |= DISPLAY_FLAGS_INTERLACED; if (of_property_read_bool(np, "doublescan")) dt->flags |= DISPLAY_FLAGS_DOUBLESCAN; if (of_property_read_bool(np, "doubleclk")) dt->flags |= DISPLAY_FLAGS_DOUBLECLK; if (ret) { pr_err("%s: error reading timing properties\n", of_node_full_name(np)); return -EINVAL; } return 0; }
/** * of_get_display_timing - parse display_timing entry from device_node * @np: device_node with the properties **/ static struct display_timing *of_get_display_timing(struct device_node *np) { struct display_timing *dt; u32 val = 0; int ret = 0; #if defined(CONFIG_FB_ROCKCHIP) || defined(CONFIG_DRM_ROCKCHIP) struct property *prop; int length; #endif dt = kzalloc(sizeof(*dt), GFP_KERNEL); if (!dt) { pr_err("%s: could not allocate display_timing struct\n", of_node_full_name(np)); return NULL; } 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; if (of_property_read_bool(np, "interlaced")) dt->flags |= DISPLAY_FLAGS_INTERLACED; if (of_property_read_bool(np, "doublescan")) dt->flags |= DISPLAY_FLAGS_DOUBLESCAN; #if defined(CONFIG_FB_ROCKCHIP) || defined(CONFIG_DRM_ROCKCHIP) if (!of_property_read_u32(np, "swap-rg", &val)) dt->flags |= val ? DISPLAY_FLAGS_SWAP_RG : 0; if (!of_property_read_u32(np, "swap-gb", &val)) dt->flags |= val ? DISPLAY_FLAGS_SWAP_GB : 0; if (!of_property_read_u32(np, "swap-rb", &val)) dt->flags |= val ? DISPLAY_FLAGS_SWAP_RB : 0; if (!of_property_read_u32(np, "screen-type", &val)) dt->screen_type = val; if (!of_property_read_u32(np, "lvds-format", &val)) dt->lvds_format = val; if (!of_property_read_u32(np, "out-face", &val)) dt->face = val; if (!of_property_read_u32(np, "color-mode", &val)) dt->color_mode = val; prop = of_find_property(np, "dsp-lut", &length); if (prop) { dt->dsp_lut = kzalloc(length, GFP_KERNEL); if (dt->dsp_lut) ret = of_property_read_u32_array(np, "dsp-lut",dt->dsp_lut, length >> 2); } #endif if (ret) { pr_err("%s: error reading timing properties\n", of_node_full_name(np)); kfree(dt); return NULL; } return dt; }