Re: [PATCHv4 1/6] input/cma3000_d0x: Support devices without pdata
From: Grant Likely
Date: Mon Oct 24 2011 - 17:31:14 EST
On Mon, Oct 24, 2011 at 10:21:11PM +0200, Ricardo Ribalda Delgado wrote:
> Architectures based on device-tree does not have platform data
> associated to the spi/i2c devices. Instead they can have some of
> the options embedded in the device tree.
>
> This patch allows the cma3000 driver to get the configuration
> from the platform_data, the device tree, or in the wort case,
> just use a default configuration.
>
> ---
Drop this line, git cuts everything below a '---' line from the commit text.
>
> v3: Fixes suggested by Jonathan Cameron
> -Code style
>
> v3: Fixes suggested by Jonathan Cameron
> -Add support for the device tree
>
> v2: Fixes suggested by Jonathan Cameron
> -Spelling
> -Simplify pdata!=NULL check
>
> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@xxxxxxxxx>
> ---
> drivers/input/misc/cma3000_d0x.c | 86 +++++++++++++++++++++++++++++++++-----
> 1 files changed, 75 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/input/misc/cma3000_d0x.c b/drivers/input/misc/cma3000_d0x.c
> index 1633b63..e66036d 100644
> --- a/drivers/input/misc/cma3000_d0x.c
> +++ b/drivers/input/misc/cma3000_d0x.c
> @@ -23,6 +23,7 @@
> #include <linux/slab.h>
> #include <linux/input.h>
> #include <linux/input/cma3000.h>
> +#include <linux/of.h>
>
> #include "cma3000_d0x.h"
>
> @@ -62,9 +63,21 @@
> #define BIT_TO_2G 18
> #define BIT_TO_8G 71
>
> +static struct cma3000_platform_data cma3000_default_pdata = {
> + .mdthr = 0x8,
> + .mdfftmr = 0x33,
> + .ffthr = 0x8,
> + .mode = CMAMODE_MEAS400,
> + .g_range = CMARANGE_2G,
> + .fuzz_x = BIT_TO_2G,
> + .fuzz_y = BIT_TO_2G,
> + .fuzz_z = BIT_TO_2G,
> + .irqflags = 0,
> +};
> +
> struct cma3000_accl_data {
> const struct cma3000_bus_ops *bus_ops;
> - const struct cma3000_platform_data *pdata;
> + struct cma3000_platform_data pdata;
>
> struct device *dev;
> struct input_dev *input_dev;
> @@ -182,7 +195,7 @@ static int cma3000_reset(struct cma3000_accl_data *data)
>
> static int cma3000_poweron(struct cma3000_accl_data *data)
> {
> - const struct cma3000_platform_data *pdata = data->pdata;
> + struct cma3000_platform_data *pdata = &data->pdata;
> u8 ctrl = 0;
> int ret;
>
> @@ -280,22 +293,57 @@ void cma3000_resume(struct cma3000_accl_data *data)
> }
> EXPORT_SYMBOL(cma3000_resume);
>
> +#ifdef CONFIG_OF
> +void cma3000_get_pdata_of(struct device *dev, struct cma3000_accl_data *data)
> +{
> + const __be32 *property;
> + int len;
> +
> + property = of_get_property(dev->of_node, "vti,mdthr", &len);
> + if (property && len == sizeof(int))
> + data->pdata.mdthr = be32_to_cpup(property);
> +
> + property = of_get_property(dev->of_node, "vti,mdfftmr", &len);
> + if (property && len == sizeof(int))
> + data->pdata.mdfftmr = be32_to_cpup(property);
> +
> + property = of_get_property(dev->of_node, "vti,mode", &len);
> + if (property && len == sizeof(int))
> + data->pdata.mode = be32_to_cpup(property);
> +
> + property = of_get_property(dev->of_node, "vti,g_range", &len);
> + if (property && len == sizeof(int))
> + data->pdata.g_range = be32_to_cpup(property);
> +
> + property = of_get_property(dev->of_node, "vti,fuzz_x", &len);
> + if (property && len == sizeof(int))
> + data->pdata.fuzz_x = be32_to_cpup(property);
> +
> + property = of_get_property(dev->of_node, "vti,fuzz_y", &len);
> + if (property && len == sizeof(int))
> + data->pdata.fuzz_y = be32_to_cpup(property);
> +
> + property = of_get_property(dev->of_node, "vti,fuzz_z", &len);
> + if (property && len == sizeof(int))
> + data->pdata.fuzz_z = be32_to_cpup(property);
> +
> + property = of_get_property(dev->of_node, "vti,irqflags", &len);
> + if (property && len == sizeof(int))
> + data->pdata.irqflags = be32_to_cpup(property);
This binding needs documentation before it can be merged.
> +
> + return;
> +}
> +#endif
No of_device_id match table to match against compatible values?
> +
> struct cma3000_accl_data *cma3000_init(struct device *dev, int irq,
> const struct cma3000_bus_ops *bops)
> {
> - const struct cma3000_platform_data *pdata = dev->platform_data;
> + struct cma3000_platform_data *pdata;
> struct cma3000_accl_data *data;
> struct input_dev *input_dev;
> int rev;
> int error;
>
> - if (!pdata) {
> - dev_err(dev, "platform data not found\n");
> - error = -EINVAL;
> - goto err_out;
> - }
> -
> -
> /* if no IRQ return error */
> if (irq == 0) {
> error = -EINVAL;
> @@ -309,10 +357,26 @@ struct cma3000_accl_data *cma3000_init(struct device *dev, int irq,
> goto err_free_mem;
> }
>
> + /*Init platform data*/
> + if (dev->platform_data != NULL) {
> + memcpy(&data->pdata, dev->platform_data, sizeof(data->pdata));
> + } else {
> + memcpy(&data->pdata, &cma3000_default_pdata,
> + sizeof(data->pdata));
> + #ifdef CONFIG_OF
> + if (dev->of_node != NULL)
> + cma3000_get_pdata_of(dev, data);
> + else
> + dev_info(dev, "platform data not found, using default\n");
> + #else
> + dev_info(dev, "platform data not found, using default\n");
> + #endif
> + }
> + pdata = &data->pdata;
> +
> data->dev = dev;
> data->input_dev = input_dev;
> data->bus_ops = bops;
> - data->pdata = pdata;
> data->irq = irq;
> mutex_init(&data->mutex);
>
> --
> 1.7.7
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/