lkml.org 
[lkml]   [2011]   [Oct]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCHv3 1/7] input/cma3000_d0x: Support devices without pdata
    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@gmail.com>
    > ---
    > 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);
    >



    \
     
     \ /
      Last update: 2011-10-18 18:01    [W:0.049 / U:0.008 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site