On 10/18/11 16:48, 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. > Looks good to me but you'll need an ack from someone more familiar with DT. > --- > > 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 | 84 +++++++++++++++++++++++++++++++++----- > 1 files changed, 73 insertions(+), 11 deletions(-) > > diff --git a/drivers/input/misc/cma3000_d0x.c b/drivers/input/misc/cma3000_d0x.c > index 1633b63..604a32f 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); > + > + return; > +} > +#endif > + > 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,24 @@ 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 Alignment is a little strange here, + for consistency of formatting I'd just double the next line and use a #else > + #endif > + dev_info(dev, "platform data not found, using default\n"); > + } > + 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); > -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html