Message ID | 1359992448-22229-4-git-send-email-haojian.zhuang@linaro.org |
---|---|
State | Accepted |
Commit | 47ec340cb8e232671e7c4a4689ff32c3bdf329da |
Headers | show |
On Monday 04 February 2013, Haojian Zhuang wrote: > From: Qing Xu <qingx@marvell.com> > > Add device tree support in max8925 backlight. > > Signed-off-by: Qing Xu <qingx@marvell.com> > Signed-off-by: Haojian Zhuang <haojian.zhuang@gmail.com> Sorry, but after finding a build warning in this patch, I looked closer and found more issues. I would recommend reverting this patch. > diff --git a/drivers/video/backlight/max8925_bl.c b/drivers/video/backlight/max8925_bl.c > index 2c9bce0..5ca11b0 100644 > --- a/drivers/video/backlight/max8925_bl.c > +++ b/drivers/video/backlight/max8925_bl.c > @@ -101,6 +101,29 @@ static const struct backlight_ops max8925_backlight_ops = { > .get_brightness = max8925_backlight_get_brightness, > }; > > +#ifdef CONFIG_OF > +static int max8925_backlight_dt_init(struct platform_device *pdev, > + struct max8925_backlight_pdata *pdata) > +{ > + struct device_node *nproot = pdev->dev.parent->of_node, *np; > + int dual_string; > + > + if (!nproot) > + return -ENODEV; > + np = of_find_node_by_name(nproot, "backlight"); > + if (!np) { > + dev_err(&pdev->dev, "failed to find backlight node\n"); > + return -ENODEV; > + } It is nonsense to look at the device node for the parent and then find the child by using of_find_node_by_name(). What you should do instead is ensure that the backlight platform device gets connected to the DT device node by the MFD core. I did not think I'd use the ab8500 driver as a positive example, but it gets this right by using the of_compatible member for the mfd_cell. > + > + of_property_read_u32(np, "maxim,max8925-dual-string", &dual_string); > + pdata->dual_string = dual_string; For boolean values, we should use of_property_read_bool, which checks the presence of the property and returns "true" if it exists and false otherwise. There is no need to assign a value to the property that way, and it's more consistent with other drivers. > + return 0; > +} > +#else > +#define max8925_backlight_dt_init(x, y) (-1) > +#endif As I suggested in my earlier patch, the #ifdef is not necessary. I suggested using "if (IS_ENABLED(CONFIG_OF))" earlier, but it's actually simpler to just return from this function if no node was found. of_find_node_by_name is already defined to an empty function returning NULL when CONFIG_OF is turned off. > static int max8925_backlight_probe(struct platform_device *pdev) > { > struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); > @@ -147,6 +170,13 @@ static int max8925_backlight_probe(struct platform_device *pdev) > platform_set_drvdata(pdev, bl); > > value = 0; > + if (pdev->dev.parent->of_node && !pdata) { > + pdata = devm_kzalloc(&pdev->dev, > + sizeof(struct max8925_backlight_pdata), > + GFP_KERNEL); Using a dynamic allocation for pdata is way overkill here, since the data is only used in one place below and then never again. A proper method to do this would be if (of_property_read_bool(pdev->dev.of_node, "maxim,max8925-dual-string")) value |= 2; No need to have a separate function or complex parsing at all, and if CONFIG_OF is disabled, the code goes away entirely. > + max8925_backlight_dt_init(pdev, pdata); > + } Note that when you have a function whose return value is never checked, it should not return errors but just "void". > @@ -158,7 +188,6 @@ static int max8925_backlight_probe(struct platform_device *pdev) > ret = max8925_set_bits(chip->i2c, data->reg_mode_cntl, 0xfe, value); > if (ret < 0) > goto out_brt; > - > backlight_update_status(bl); > return 0; > out_brt: Finally, there is no reason to remove the empty line. If it was a good idea to remove it, that should probably be a separate patch to clean up the coding style. Arnd
diff --git a/drivers/video/backlight/max8925_bl.c b/drivers/video/backlight/max8925_bl.c index 2c9bce0..5ca11b0 100644 --- a/drivers/video/backlight/max8925_bl.c +++ b/drivers/video/backlight/max8925_bl.c @@ -101,6 +101,29 @@ static const struct backlight_ops max8925_backlight_ops = { .get_brightness = max8925_backlight_get_brightness, }; +#ifdef CONFIG_OF +static int max8925_backlight_dt_init(struct platform_device *pdev, + struct max8925_backlight_pdata *pdata) +{ + struct device_node *nproot = pdev->dev.parent->of_node, *np; + int dual_string; + + if (!nproot) + return -ENODEV; + np = of_find_node_by_name(nproot, "backlight"); + if (!np) { + dev_err(&pdev->dev, "failed to find backlight node\n"); + return -ENODEV; + } + + of_property_read_u32(np, "maxim,max8925-dual-string", &dual_string); + pdata->dual_string = dual_string; + return 0; +} +#else +#define max8925_backlight_dt_init(x, y) (-1) +#endif + static int max8925_backlight_probe(struct platform_device *pdev) { struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); @@ -147,6 +170,13 @@ static int max8925_backlight_probe(struct platform_device *pdev) platform_set_drvdata(pdev, bl); value = 0; + if (pdev->dev.parent->of_node && !pdata) { + pdata = devm_kzalloc(&pdev->dev, + sizeof(struct max8925_backlight_pdata), + GFP_KERNEL); + max8925_backlight_dt_init(pdev, pdata); + } + if (pdata) { if (pdata->lxw_scl) value |= (1 << 7); @@ -158,7 +188,6 @@ static int max8925_backlight_probe(struct platform_device *pdev) ret = max8925_set_bits(chip->i2c, data->reg_mode_cntl, 0xfe, value); if (ret < 0) goto out_brt; - backlight_update_status(bl); return 0; out_brt: