Re: [RFC 0/4] of: introduce of_dev_get_platdata()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Fri, Aug 28, 2015 at 4:12 AM, Milo Kim <milo.kim@xxxxxx> wrote:
> New function, 'of_dev_get_platdata()'
>  - provides unified handling of getting device platform data
>  - supports DT and non-DT(legacy) cases
>  - removes duplicated code from each driver
>  - keeps driver specific code simple in each driver

This works in cases where DT data and platform_data are aligned. In
many cases they are not. A common binding problem is people blindly
copying platform_data fields to DT properties for things that are not
h/w properties. I worry that this would encourage this behavior.

We already have a generalized method for retrieving properties
independent of DT or ACPI. There's no reason this couldn't be extended
to retrieve properties out of platform_data using the same interface.

Also, perhaps in some drivers we can remove platform_data now if all
users are converted to DT.

Rob

>
> Issues
> ------
> On loading a driver, the driver tries to get the platform data.
> * Check conditions prior to parsing the DT
>   You can see various/not general way of checking the platform data.
>
>   case 1) driver checks whether the platform data is null or not.
>
>         foo_platform_data *pdata = dev_get_platdata(dev);
>         if (!pdata) {
>                 pdata = foo_parse_dt();
>                 if (IS_ERR(pdata))
>                         return PTR_ERR(pdata);
>         }
>
>   case 2) driver checks whether 'of_node' exists or not.
>
>         if (dev.of_node) {
>                 pdata = foo_parse_dt();
>                 if (IS_ERR(pdata))
>                         return PTR_ERR(pdata);
>         }
>
>   case 3) check both
>
>         if (pdata) {
>                 copy pdata into driver private data
>         } else if (dev.of_node) {
>                 pdata = foo_parse_dt();
>         }
>
>   Check conditions are very depend on the driver, but it can be unified.
>   of_dev_get_platdata() provides unified handling. So the driver can reduce
>   if-condition statements.
>
> * Memory allocation in each parser
>   In most cases, driver allocates the platform data inside its DT parser.
>
>   static struct foo_platform_data *foo_parse_dt()
>   {
>         allocates memory for generating platform data.
>         parsing DT properties and copy them into the platform data.
>   }
>
>   of_dev_get_platdata() allocates the platform data internally.
>   And it calls back to the driver specific parser function. It removes
>   memory allocation code in each driver.
>
> * Two types of parser definition
>   Many drivers implement DT parser in two cases, '#ifdef CONFIG_OF' and
>   '#else'.
>
>   #ifdef CONFIG_OF
>   static struct foo_platform_data *foo_parse_dt()
>   {
>         (snip)
>   }
>   #else
>   static struct foo_platform_data *foo_parse_dt()
>   {
>         return NULL;
>   }
>   #endif
>
>   of_dev_get_platdata() supports both cases. It removes few lines of code
>   in each driver.
>
> What of_dev_get_platdata() does
> -------------------------------
>   if CONFIG_OF is not defined, return legacy code, 'dev_get_platdata()'.
>   if platform data exists, just return it.
>   if platform data is null, check the 'of node'.
>     if of_node is null, then return NULL.
>     Otherwise, allocates memory for platform data.
>     Call back to the driver(caller) with allocated platform data and
>     private data if needed.
>     Then, driver will parse the DT internally and handle errors.
>
> Examples
> --------
>   Following patches are examples.
>
>   drivers/input/touchscreen/mms114.c
>   drivers/mfd/tps65910.c
>   drivers/usb/musb/ux500.c
>
> Driver list
> -----------
> of_dev_get_platdata() can be applied into files below. You may find more
> if you're interested in this. :)
>
>   drivers/dma/ste_dma40.c
>   drivers/gpio/gpio-rcar.c
>   drivers/gpu/drm/exynos/exynos_dp_core.c
>   drivers/gpu/drm/exynos/exynos_hdmi.c
>   drivers/hwmon/ntc_thermistor.c
>   drivers/i2c/busses/i2c-s3c2410.c
>   drivers/iio/frequency/adf4350.c
>   drivers/input/keyboard/matrix_keypad.c
>   drivers/input/keyboard/samsung-keypad.c
>   drivers/input/misc/drv260x.c
>   drivers/input/misc/regulator-haptic.c
>   drivers/input/misc/rotary_encoder.c
>   drivers/input/touchscreen/atmel_mxt_ts.c
>   drivers/input/touchscreen/auo-pixcir-ts.c
>   drivers/input/touchscreen/bu21013_ts.c
>   drivers/input/touchscreen/mms114.c
>   drivers/input/touchscreen/pixcir_i2c_ts.c
>   drivers/input/touchscreen/zforce_ts.c
>   drivers/leds/leds-lp5521.c
>   drivers/leds/leds-lp5523.c
>   drivers/leds/leds-lp5562.c
>   drivers/leds/leds-lp55xx-common.c
>   drivers/leds/leds-lp8501.c
>   drivers/leds/leds-mc13783.c
>   drivers/leds/leds-pca963x.c
>   drivers/leds/leds-tca6507.c
>   drivers/mfd/max8997.c
>   drivers/mfd/max8998.c
>   drivers/mfd/sec-core.c
>   drivers/mfd/tps6586x.c
>   drivers/mfd/tps65910.c
>   drivers/misc/lis3lv02d/lis3lv02d.c
>   drivers/mmc/host/davinci_mmc.c
>   drivers/mmc/host/dw_mmc.c
>   drivers/mmc/host/sdhci-s3c.c
>   drivers/mtd/devices/spear_smi.c
>   drivers/mtd/nand/fsmc_nand.c
>   drivers/mtd/nand/lpc32xx_mlc.c
>   drivers/mtd/nand/lpc32xx_slc.c
>   drivers/mtd/nand/sh_flctl.c
>   drivers/net/can/sja1000/sja1000_platform.c
>   drivers/net/ethernet/davicom/dm9000.c
>   drivers/net/ethernet/marvell/mv643xx_eth.c
>   drivers/net/ethernet/renesas/sh_eth.c
>   drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
>   drivers/power/bq24735-charger.c
>   drivers/power/gpio-charger.c
>   drivers/power/sbs-battery.c
>   drivers/power/tps65090-charger.c
>   drivers/power/twl4030_charger.c
>   drivers/pwm/pwm-lp3943.c
>   drivers/pwm/pwm-samsung.c
>   drivers/spi/spi-sh-msiof.c
>   drivers/spi/spi/spi-s3c64xx.c
>   drivers/thermal/db8500_thermal.c
>   drivers/usb/misc/usb3503.c
>   drivers/usb/musb/omap2430.c
>   drivers/usb/musb/ux500.c
>   drivers/usb/renesas_usbhs/common.c
>   drivers/video/fbdev/simplefb.c
>   drivers/video/backlight/lp855x_bl.c
>   drivers/video/backlight/pwm_bl.c
>   drivers/video/backlight/sky81452-backlight.c
>   drivers/video/backlight/tps65217_bl.c
>
> This is the RFC, so I would like to get some feedback prior to patching all
> drivers. Any comments are welcome.
>
> Cc: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx>
> Cc: Felipe Balbi <balbi@xxxxxx>
> Cc: Grant Likely <grant.likely@xxxxxxxxxx>
> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
> Cc: Lee Jones <lee.jones@xxxxxxxxxx>
> Cc: Rob Herring <robh+dt@xxxxxxxxxx>
> Cc: Samuel Ortiz <sameo@xxxxxxxxxxxxxxx>
> Cc: Tony Lindgren <tony@xxxxxxxxxxx>
> Cc: devicetree@xxxxxxxxxxxxxxx
> Cc: linux-kernel@xxxxxxxxxxxxxxx
>
> Milo Kim (4):
>   of: introduce of_dev_get_platdata()
>   input: touchscree: mms114: use of_dev_get_platdata()
>   mfd: tps65910: use of_dev_get_platdata()
>   usb: musb: use of_dev_get_platdata()
>
>  drivers/input/touchscreen/mms114.c | 34 ++++++++------------------
>  drivers/mfd/tps65910.c             | 49 +++++++++++++-------------------------
>  drivers/of/device.c                | 46 +++++++++++++++++++++++++++++++++++
>  drivers/usb/musb/ux500.c           | 40 +++++++++++++------------------
>  include/linux/of_device.h          | 12 ++++++++++
>  5 files changed, 100 insertions(+), 81 deletions(-)
>
> --
> 1.9.1
>
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]
  Powered by Linux