|
@@ -56,18 +56,13 @@ static int parse_timing_property(struct device_node *np, const char *name,
|
|
|
* 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)
|
|
|
+static int of_get_display_timing(struct device_node *np,
|
|
|
+ struct display_timing *dt)
|
|
|
{
|
|
|
- struct display_timing *dt;
|
|
|
u32 val = 0;
|
|
|
int ret = 0;
|
|
|
|
|
|
- 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;
|
|
|
- }
|
|
|
+ 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);
|
|
@@ -101,11 +96,10 @@ static struct display_timing *of_get_display_timing(struct device_node *np)
|
|
|
if (ret) {
|
|
|
pr_err("%s: error reading timing properties\n",
|
|
|
of_node_full_name(np));
|
|
|
- kfree(dt);
|
|
|
- return NULL;
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- return dt;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -174,9 +168,17 @@ struct display_timings *of_get_display_timings(struct device_node *np)
|
|
|
|
|
|
for_each_child_of_node(timings_np, entry) {
|
|
|
struct display_timing *dt;
|
|
|
+ int r;
|
|
|
|
|
|
- dt = of_get_display_timing(entry);
|
|
|
+ dt = kzalloc(sizeof(*dt), GFP_KERNEL);
|
|
|
if (!dt) {
|
|
|
+ pr_err("%s: could not allocate display_timing struct\n",
|
|
|
+ of_node_full_name(np));
|
|
|
+ goto timingfail;
|
|
|
+ }
|
|
|
+
|
|
|
+ r = of_get_display_timing(entry, dt);
|
|
|
+ if (r) {
|
|
|
/*
|
|
|
* to not encourage wrong devicetrees, fail in case of
|
|
|
* an error
|