[PATCH v3] of: Add videomode helper
Steffen Trumtrar
s.trumtrar at pengutronix.de
Mon Sep 17 13:14:39 PDT 2012
On Mon, Sep 17, 2012 at 06:35:43PM +0000, Tabi Timur-B04825 wrote:
> On Fri, Sep 14, 2012 at 11:24 AM, Steffen Trumtrar
> <s.trumtrar at pengutronix.de> wrote:
>
> > +/* FIXME */
> > +static u32 of_video_get_value(struct mode_property *prop)
> > +{
> > + return (prop->min >= prop->typ) ? prop->min : prop->typ;
> > +}
> > +
> > +/* read property into new mode_property */
> > +static int of_video_parse_property(struct device_node *np, char *name,
> > + struct mode_property *result)
> > +{
> > + struct property *prop;
> > + int length;
> > + int cells;
> > + int ret;
> > +
> > + prop = of_find_property(np, name, &length);
> > + if (!prop)
> > + return -EINVAL;
> > +
> > + cells = length / sizeof(u32);
> > +
> > + memset(result, 0, sizeof(*result));
> > +
> > + ret = of_property_read_u32_array(np, name, &result->min, cells);
> > + of_video_get_value(result);
>
> What's the point of calling of_video_get_value() here? It doesn't do anything.
>
You're right. That definitely does not belong there.
> > + return ret;
> > +}
> > +
> > +int videomode_to_display_mode(struct display *disp, struct drm_display_mode *dmode, int index)
> > +{
> > + struct videomode *vm;
> > +
> > + memset(dmode, 0, sizeof(*dmode));
>
> Indentation problem.
>
Okay.
> > +int of_get_video_mode(struct device_node *np, struct display *disp)
> > +{
> > + struct device_node *display_np;
> > + struct device_node *mode_np;
> > + struct device_node *modes_np;
> > + char *default_mode;
> > +
> > + int ret = 0;
> > +
> > + memset(disp, 0, sizeof(*disp));
> > + disp->modes = kmalloc(sizeof(struct videomode*), GFP_KERNEL);
> > + if (!np)
> > + return -EINVAL;
> > +
> > + display_np = of_parse_phandle(np, "display", 0);
> > +
> > + if (!display_np)
> > + return -EINVAL;
> > +
> > + of_property_read_u32(display_np, "width-mm", &disp->width_mm);
> > + of_property_read_u32(display_np, "height-mm", &disp->height_mm);
> > +
> > + mode_np = of_parse_phandle(np, "default-mode", 0);
> > +
> > + if (!mode_np)
> > + mode_np = of_find_node_by_name(np, "mode");
> > +
> > + if (!mode_np)
> > + return -EINVAL;
> > +
> > + default_mode = (char *)mode_np->full_name;
> > +
> > + modes_np = of_find_node_by_name(np, "modes");
> > + for_each_child_of_node(modes_np, mode_np) {
> > + struct videomode *vm;
>
> Blank line after variable declarations, please.
>
> > + vm = kmalloc(sizeof(struct videomode), GFP_KERNEL);
> > + disp->modes[disp->num_modes] = kmalloc(sizeof(struct videomode*), GFP_KERNEL);
>
> Are you sure this is right?
>
I implemented disp->modes as "struct videomode** modes". So I guess the first
kmalloc is wrong. Right?!
> > + ret |= of_video_parse_property(mode_np, "hback-porch", &vm->hback_porch);
> > + ret |= of_video_parse_property(mode_np, "hfront-porch", &vm->hfront_porch);
> > + ret |= of_video_parse_property(mode_np, "hactive", &vm->hactive);
> > + ret |= of_video_parse_property(mode_np, "hsync-len", &vm->hsync_len);
> > + ret |= of_video_parse_property(mode_np, "vback-porch", &vm->vback_porch);
> > + ret |= of_video_parse_property(mode_np, "vfront-porch", &vm->vfront_porch);
> > + ret |= of_video_parse_property(mode_np, "vactive", &vm->vactive);
> > + ret |= of_video_parse_property(mode_np, "vsync-len", &vm->vsync_len);
> > + ret |= of_video_parse_property(mode_np, "clock", &vm->clock);
> > +
> > + if (ret)
> > + return -EINVAL;
> > +
> > + vm->hah = of_property_read_bool(mode_np, "hsync-active-high");
> > + vm->vah = of_property_read_bool(mode_np, "vsync-active-high");
> > + vm->interlaced = of_property_read_bool(mode_np, "interlaced");
> > + vm->doublescan = of_property_read_bool(mode_np, "doublescan");
> > +
> > + if (strcmp(default_mode,mode_np->full_name) == 0) {
> > + printk("%s: default_node = %d\n", __func__, disp->num_modes);
>
> Please use a KERN_ macro here, or a pr_xxx function. Even better
> would be to use a dev_xxx function.
>
> In general, I'd like to see more error reporting of bad device tree
> properties, to help debugging.
>
Okay. Actually, the printk also was not supposed to be in the final patch.
I can fix that and add some dev_xxx.
> > + disp->default_mode = disp->num_modes;
> > + }
> > +
> > + disp->modes[disp->num_modes] = vm;
>
> Isn't this a memory leak?
>
I think I get you. I will fix that.
> > + disp->num_modes++;
> > + }
> > + of_node_put(display_np);
> > +
> > + return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(of_get_video_mode);
>
Thank you for your review.
Regards,
Steffen
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the dri-devel
mailing list