Message ID | 1367222401-26649-1-git-send-email-prabhakar.csengg@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Apr 29, 2013 at 01:30:01PM +0530, Prabhakar Lad wrote: > From: Lad, Prabhakar <prabhakar.csengg@gmail.com> > > add OF support for the mt9p031 sensor driver. > > Signed-off-by: Lad, Prabhakar <prabhakar.csengg@gmail.com> > Cc: Hans Verkuil <hans.verkuil@cisco.com> > Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > Cc: Mauro Carvalho Chehab <mchehab@redhat.com> > Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de> > Cc: Sylwester Nawrocki <s.nawrocki@samsung.com> > Cc: Sakari Ailus <sakari.ailus@iki.fi> > Cc: Grant Likely <grant.likely@secretlab.ca> > Cc: Rob Herring <rob.herring@calxeda.com> > Cc: Rob Landley <rob@landley.net> > Cc: devicetree-discuss@lists.ozlabs.org > Cc: linux-doc@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > --- > .../devicetree/bindings/media/i2c/mt9p031.txt | 43 ++++++++++++++ > drivers/media/i2c/mt9p031.c | 61 +++++++++++++++++++- > 2 files changed, 103 insertions(+), 1 deletions(-) > create mode 100644 Documentation/devicetree/bindings/media/i2c/mt9p031.txt > > diff --git a/Documentation/devicetree/bindings/media/i2c/mt9p031.txt b/Documentation/devicetree/bindings/media/i2c/mt9p031.txt > new file mode 100644 > index 0000000..b985e63 > --- /dev/null > +++ b/Documentation/devicetree/bindings/media/i2c/mt9p031.txt > @@ -0,0 +1,43 @@ > +* Aptina 1/2.5-Inch 5Mp CMOS Digital Image Sensor > + > +The Aptina MT9P031 is a 1/2.5-inch CMOS active pixel digital image sensor with > +an active imaging pixel array of 2592H x 1944V. It incorporates sophisticated > +camera functions on-chip such as windowing, column and row skip mode, and > +snapshot mode. It is programmable through a simple two-wire serial interface. > + > +The MT9P031 is a progressive-scan sensor that generates a stream of pixel data > +at a constant frame rate. It uses an on-chip, phase-locked loop (PLL) to > +generate all internal clocks from a single master input clock running between 6 > +and 27 MHz. The maximum pixel rate is 96 Mp/s, corresponding to a clock rate of > +96 MHz. > + > +Required Properties : > +- compatible : value should be either one among the following > + (a) "aptina,mt9p031-sensor" for mt9p031 sensor > + (b) "aptina,mt9p031m-sensor" for mt9p031m sensor > + > +- ext_freq: Input clock frequency. > + > +- target_freq: Pixel clock frequency. For devicetree properties '-' is preferred over '_'. Most devicetree bindings we already have suggest that we shoud use 'frequency' and no abbreviation. probably 'clock-frequency' should be used. > + > +Optional Properties : > +-reset: Chip reset GPIO (If not specified defaults to -1) gpios must be specified as phandles, see of_get_named_gpio(). > + > +Example: > + > +i2c0@1c22000 { > + ... > + ... > + mt9p031@5d { > + compatible = "aptina,mt9p031-sensor"; > + reg = <0x5d>; > + > + port { > + mt9p031_1: endpoint { > + ext_freq = <6000000>; > + target_freq = <96000000>; > + }; > + }; > + }; > + ... > +}; > \ No newline at end of file > diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c > index 28cf95b..66078a6 100644 > --- a/drivers/media/i2c/mt9p031.c > +++ b/drivers/media/i2c/mt9p031.c > @@ -23,11 +23,13 @@ > #include <linux/regulator/consumer.h> > #include <linux/slab.h> > #include <linux/videodev2.h> > +#include <linux/of_device.h> > > #include <media/mt9p031.h> > #include <media/v4l2-chip-ident.h> > #include <media/v4l2-ctrls.h> > #include <media/v4l2-device.h> > +#include <media/v4l2-of.h> > #include <media/v4l2-subdev.h> > > #include "aptina-pll.h" > @@ -928,10 +930,66 @@ static const struct v4l2_subdev_internal_ops mt9p031_subdev_internal_ops = { > * Driver initialization and probing > */ > > +#if defined(CONFIG_OF) > +static const struct of_device_id mt9p031_of_match[] = { > + {.compatible = "aptina,mt9p031-sensor", }, > + {.compatible = "aptina,mt9p031m-sensor", }, > + {}, > +}; > +MODULE_DEVICE_TABLE(of, mt9p031_of_match); > + > +static struct mt9p031_platform_data > + *mt9p031_get_pdata(struct i2c_client *client) > + > +{ > + if (!client->dev.platform_data && client->dev.of_node) { Just because the Kernel is compiled with devicetree support does not necessarily mean you actually boot from devicetree. You must still handle platform data properly. > + struct device_node *np; > + struct mt9p031_platform_data *pdata; > + int ret; > + > + np = v4l2_of_get_next_endpoint(client->dev.of_node, NULL); > + if (!np) > + return NULL; > + > + pdata = devm_kzalloc(&client->dev, > + sizeof(struct mt9p031_platform_data), > + GFP_KERNEL); > + if (!pdata) { > + pr_warn("mt9p031 failed allocate memeory\n"); Use dev_* for messages inside drivers. > + return NULL; > + } > + ret = of_property_read_u32(np, "reset", &pdata->reset); > + if (ret == -EINVAL) > + pdata->reset = -1; > + else if (ret == -ENODATA) > + return NULL; > + > + if (of_property_read_u32(np, "ext_freq", &pdata->ext_freq)) > + return NULL; > + > + if (of_property_read_u32(np, "target_freq", > + &pdata->target_freq)) > + return NULL; > + > + return pdata; > + } > + > + return NULL; > +} > +#else > +#define mt9p031_of_match NULL > + > +static struct mt9p031_platform_data > + *mt9p031_get_pdata(struct i2c_client *client) > +{ > + return client->dev.platform_data; > +} > +#endif > + > static int mt9p031_probe(struct i2c_client *client, > const struct i2c_device_id *did) > { > - struct mt9p031_platform_data *pdata = client->dev.platform_data; > + struct mt9p031_platform_data *pdata = mt9p031_get_pdata(client); > struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); > struct mt9p031 *mt9p031; > unsigned int i; > @@ -1072,6 +1130,7 @@ MODULE_DEVICE_TABLE(i2c, mt9p031_id); > > static struct i2c_driver mt9p031_i2c_driver = { > .driver = { > + .of_match_table = mt9p031_of_match, > .name = "mt9p031", > }, > .probe = mt9p031_probe, > -- > 1.7.4.1 > > _______________________________________________ > devicetree-discuss mailing list > devicetree-discuss@lists.ozlabs.org > https://lists.ozlabs.org/listinfo/devicetree-discuss >
Hi Sascha, Thanks for the quick review. On Mon, Apr 29, 2013 at 1:51 PM, Sascha Hauer <s.hauer@pengutronix.de> wrote: <Snip> >> +Required Properties : >> +- compatible : value should be either one among the following >> + (a) "aptina,mt9p031-sensor" for mt9p031 sensor >> + (b) "aptina,mt9p031m-sensor" for mt9p031m sensor >> + >> +- ext_freq: Input clock frequency. >> + >> +- target_freq: Pixel clock frequency. > > For devicetree properties '-' is preferred over '_'. Most devicetree > bindings we already have suggest that we shoud use 'frequency' and no > abbreviation. probably 'clock-frequency' should be used. > Yeah i missed it.. following is the proposed bindings, let me know if something is wrong with it. Required Properties : - compatible : value should be either one among the following (a) "aptina,mt9p031-sensor" for mt9p031 sensor (b) "aptina,mt9p031m-sensor" for mt9p031m sensor - input-clock-frequency: Input clock frequency. - pixel-clock-frequency: Pixel clock frequency. Optional Properties : -gpio-reset: Chip reset GPIO (If not specified defaults to -1) Example: i2c0@1c22000 { ... ... mt9p031@5d { compatible = "aptina,mt9p031-sensor"; reg = <0x5d>; port { mt9p031_1: endpoint { input-clock-frequency = <6000000>; pixel-clock-frequency = <96000000>; gpio-reset = <&gpio3 30 0>; }; }; }; ... }; >> + >> +Optional Properties : >> +-reset: Chip reset GPIO (If not specified defaults to -1) > > gpios must be specified as phandles, see of_get_named_gpio(). > Fixed it. >> + >> +Example: >> + >> +i2c0@1c22000 { >> + ... >> + ... >> + mt9p031@5d { >> + compatible = "aptina,mt9p031-sensor"; >> + reg = <0x5d>; >> + >> + port { >> + mt9p031_1: endpoint { >> + ext_freq = <6000000>; >> + target_freq = <96000000>; >> + }; >> + }; >> + }; >> + ... >> +}; >> \ No newline at end of file >> diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c >> index 28cf95b..66078a6 100644 >> --- a/drivers/media/i2c/mt9p031.c >> +++ b/drivers/media/i2c/mt9p031.c >> @@ -23,11 +23,13 @@ >> #include <linux/regulator/consumer.h> >> #include <linux/slab.h> >> #include <linux/videodev2.h> >> +#include <linux/of_device.h> >> >> #include <media/mt9p031.h> >> #include <media/v4l2-chip-ident.h> >> #include <media/v4l2-ctrls.h> >> #include <media/v4l2-device.h> >> +#include <media/v4l2-of.h> >> #include <media/v4l2-subdev.h> >> >> #include "aptina-pll.h" >> @@ -928,10 +930,66 @@ static const struct v4l2_subdev_internal_ops mt9p031_subdev_internal_ops = { >> * Driver initialization and probing >> */ >> >> +#if defined(CONFIG_OF) >> +static const struct of_device_id mt9p031_of_match[] = { >> + {.compatible = "aptina,mt9p031-sensor", }, >> + {.compatible = "aptina,mt9p031m-sensor", }, >> + {}, >> +}; >> +MODULE_DEVICE_TABLE(of, mt9p031_of_match); >> + >> +static struct mt9p031_platform_data >> + *mt9p031_get_pdata(struct i2c_client *client) >> + >> +{ >> + if (!client->dev.platform_data && client->dev.of_node) { > > Just because the Kernel is compiled with devicetree support does not > necessarily mean you actually boot from devicetree. You must still > handle platform data properly. > OK. which one should be given higher preference client->dev.of_node or the client->dev.platform_data ? >> + struct device_node *np; >> + struct mt9p031_platform_data *pdata; >> + int ret; >> + >> + np = v4l2_of_get_next_endpoint(client->dev.of_node, NULL); >> + if (!np) >> + return NULL; >> + >> + pdata = devm_kzalloc(&client->dev, >> + sizeof(struct mt9p031_platform_data), >> + GFP_KERNEL); >> + if (!pdata) { >> + pr_warn("mt9p031 failed allocate memeory\n"); > > Use dev_* for messages inside drivers. > Fixed it. Regards, --Prabhakar Lad -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Prabhakar, On Monday 29 April 2013 16:41:07 Prabhakar Lad wrote: > On Mon, Apr 29, 2013 at 1:51 PM, Sascha Hauer wrote: > <Snip> > > >> +Required Properties : > >> +- compatible : value should be either one among the following > >> + (a) "aptina,mt9p031-sensor" for mt9p031 sensor > >> + (b) "aptina,mt9p031m-sensor" for mt9p031m sensor > >> + > >> +- ext_freq: Input clock frequency. > >> + > >> +- target_freq: Pixel clock frequency. > > > > For devicetree properties '-' is preferred over '_'. Most devicetree > > bindings we already have suggest that we shoud use 'frequency' and no > > abbreviation. probably 'clock-frequency' should be used. > > Yeah i missed it.. following is the proposed bindings, > let me know if something is wrong with it. > > Required Properties : > - compatible : value should be either one among the following > (a) "aptina,mt9p031-sensor" for mt9p031 sensor > (b) "aptina,mt9p031m-sensor" for mt9p031m sensor What about just "aptina,mt9p031" and "aptina,mt9p031m" ? > - input-clock-frequency: Input clock frequency. > > - pixel-clock-frequency: Pixel clock frequency. > > Optional Properties : > -gpio-reset: Chip reset GPIO (If not specified defaults to -1) You can remove the "(If not specified defaults to -1)". > Example: > > i2c0@1c22000 { > ... > ... > mt9p031@5d { > compatible = "aptina,mt9p031-sensor"; > reg = <0x5d>; > > port { > mt9p031_1: endpoint { > input-clock-frequency = <6000000>; > pixel-clock-frequency = <96000000>; > gpio-reset = <&gpio3 30 0>; At least the reset GPIO should be a property of the mt9p031 node, not the endpoint. > }; > }; > }; > ... > }; > > >> + > >> +Optional Properties : > >> +-reset: Chip reset GPIO (If not specified defaults to -1) > > > > gpios must be specified as phandles, see of_get_named_gpio(). > > Fixed it. > > >> + > >> +Example: > >> + > >> +i2c0@1c22000 { > >> + ... > >> + ... > >> + mt9p031@5d { > >> + compatible = "aptina,mt9p031-sensor"; > >> + reg = <0x5d>; > >> + > >> + port { > >> + mt9p031_1: endpoint { > >> + ext_freq = <6000000>; > >> + target_freq = <96000000>; > >> + }; > >> + }; > >> + }; > >> + ... > >> +}; > >> \ No newline at end of file > >> diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c > >> index 28cf95b..66078a6 100644 > >> --- a/drivers/media/i2c/mt9p031.c > >> +++ b/drivers/media/i2c/mt9p031.c > >> @@ -23,11 +23,13 @@ > >> #include <linux/regulator/consumer.h> > >> #include <linux/slab.h> > >> #include <linux/videodev2.h> > >> +#include <linux/of_device.h> Please keep headers alphabetically sorted. > >> #include <media/mt9p031.h> > >> #include <media/v4l2-chip-ident.h> > >> #include <media/v4l2-ctrls.h> > >> #include <media/v4l2-device.h> > >> +#include <media/v4l2-of.h> > >> #include <media/v4l2-subdev.h> > >> > >> #include "aptina-pll.h" > >> > >> @@ -928,10 +930,66 @@ static const struct v4l2_subdev_internal_ops > >> mt9p031_subdev_internal_ops = {>> > >> * Driver initialization and probing > >> */ > >> > >> +#if defined(CONFIG_OF) > >> +static const struct of_device_id mt9p031_of_match[] = { > >> + {.compatible = "aptina,mt9p031-sensor", }, > >> + {.compatible = "aptina,mt9p031m-sensor", }, > >> + {}, > >> +}; > >> +MODULE_DEVICE_TABLE(of, mt9p031_of_match); > >> + > >> +static struct mt9p031_platform_data > >> + *mt9p031_get_pdata(struct i2c_client *client) Please split the line after the * and align the function name on the left: static struct mt9p031_platform_data * mt9p031_get_pdata(struct i2c_client *client) > >> + > >> +{ > >> + if (!client->dev.platform_data && client->dev.of_node) { > > > > Just because the Kernel is compiled with devicetree support does not > > necessarily mean you actually boot from devicetree. You must still > > handle platform data properly. > > OK. which one should be given higher preference client->dev.of_node > or the client->dev.platform_data ? of_node should have a higher priority.
Hi Prabhakar, Thank you for the patch. Please see below for a couple of comments in addition to the ones I've just sent (in reply to Sascha's e-mail). On Monday 29 April 2013 13:30:01 Prabhakar Lad wrote: > From: Lad, Prabhakar <prabhakar.csengg@gmail.com> > > add OF support for the mt9p031 sensor driver. > > Signed-off-by: Lad, Prabhakar <prabhakar.csengg@gmail.com> > Cc: Hans Verkuil <hans.verkuil@cisco.com> > Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > Cc: Mauro Carvalho Chehab <mchehab@redhat.com> > Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de> > Cc: Sylwester Nawrocki <s.nawrocki@samsung.com> > Cc: Sakari Ailus <sakari.ailus@iki.fi> > Cc: Grant Likely <grant.likely@secretlab.ca> > Cc: Rob Herring <rob.herring@calxeda.com> > Cc: Rob Landley <rob@landley.net> > Cc: devicetree-discuss@lists.ozlabs.org > Cc: linux-doc@vger.kernel.org > Cc: linux-kernel@vger.kernel.org [snip] > --- > .../devicetree/bindings/media/i2c/mt9p031.txt | 43 ++++++++++++++ > drivers/media/i2c/mt9p031.c | 61 ++++++++++++++++- > 2 files changed, 103 insertions(+), 1 deletions(-) > create mode 100644 Documentation/devicetree/bindings/media/i2c/mt9p031.txt > > diff --git a/Documentation/devicetree/bindings/media/i2c/mt9p031.txt > b/Documentation/devicetree/bindings/media/i2c/mt9p031.txt new file mode > 100644 > index 0000000..b985e63 > --- /dev/null > +++ b/Documentation/devicetree/bindings/media/i2c/mt9p031.txt > @@ -0,0 +1,43 @@ > +* Aptina 1/2.5-Inch 5Mp CMOS Digital Image Sensor > + > +The Aptina MT9P031 is a 1/2.5-inch CMOS active pixel digital image sensor > +with an active imaging pixel array of 2592H x 1944V. It incorporates > +sophisticated camera functions on-chip such as windowing, column and row > +skip mode, and snapshot mode. It is programmable through a simple two-wire > +serial interface. > +The MT9P031 is a progressive-scan sensor that generates a stream of pixel > +data at a constant frame rate. It uses an on-chip, phase-locked loop (PLL) > +to generate all internal clocks from a single master input clock running > +between 6 and 27 MHz. The maximum pixel rate is 96 Mp/s, corresponding to > +a clock rate of 96 MHz. Isn't this text (directly copied from the datasheet) under Aptina's copyright ? > +Required Properties : > +- compatible : value should be either one among the following > + (a) "aptina,mt9p031-sensor" for mt9p031 sensor > + (b) "aptina,mt9p031m-sensor" for mt9p031m sensor > + > +- ext_freq: Input clock frequency. > + > +- target_freq: Pixel clock frequency. > + > +Optional Properties : > +-reset: Chip reset GPIO (If not specified defaults to -1) > + > +Example: > + > +i2c0@1c22000 { > + ... > + ... > + mt9p031@5d { > + compatible = "aptina,mt9p031-sensor"; > + reg = <0x5d>; > + > + port { > + mt9p031_1: endpoint { > + ext_freq = <6000000>; > + target_freq = <96000000>; > + }; > + }; > + }; > + ... > +}; > \ No newline at end of file > diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c > index 28cf95b..66078a6 100644 > --- a/drivers/media/i2c/mt9p031.c > +++ b/drivers/media/i2c/mt9p031.c > @@ -23,11 +23,13 @@ > #include <linux/regulator/consumer.h> > #include <linux/slab.h> > #include <linux/videodev2.h> > +#include <linux/of_device.h> > > #include <media/mt9p031.h> > #include <media/v4l2-chip-ident.h> > #include <media/v4l2-ctrls.h> > #include <media/v4l2-device.h> > +#include <media/v4l2-of.h> > #include <media/v4l2-subdev.h> > > #include "aptina-pll.h" > @@ -928,10 +930,66 @@ static const struct v4l2_subdev_internal_ops > mt9p031_subdev_internal_ops = { * Driver initialization and probing > */ > > +#if defined(CONFIG_OF) > +static const struct of_device_id mt9p031_of_match[] = { > + {.compatible = "aptina,mt9p031-sensor", }, > + {.compatible = "aptina,mt9p031m-sensor", }, As you'll need to resubmit anyway, please add a space between '{' and '.' > + {}, > +}; > +MODULE_DEVICE_TABLE(of, mt9p031_of_match); > + > +static struct mt9p031_platform_data > + *mt9p031_get_pdata(struct i2c_client *client) > + > +{ > + if (!client->dev.platform_data && client->dev.of_node) { > + struct device_node *np; > + struct mt9p031_platform_data *pdata; > + int ret; > + > + np = v4l2_of_get_next_endpoint(client->dev.of_node, NULL); > + if (!np) > + return NULL; > + > + pdata = devm_kzalloc(&client->dev, > + sizeof(struct mt9p031_platform_data), > + GFP_KERNEL); > + if (!pdata) { > + pr_warn("mt9p031 failed allocate memeory\n"); > + return NULL; > + } > + ret = of_property_read_u32(np, "reset", &pdata->reset); > + if (ret == -EINVAL) > + pdata->reset = -1; > + else if (ret == -ENODATA) > + return NULL; > + > + if (of_property_read_u32(np, "ext_freq", &pdata->ext_freq)) > + return NULL; > + > + if (of_property_read_u32(np, "target_freq", > + &pdata->target_freq)) > + return NULL; > + > + return pdata; > + } > + > + return NULL; > +} > +#else > +#define mt9p031_of_match NULL > + > +static struct mt9p031_platform_data > + *mt9p031_get_pdata(struct i2c_client *client) > +{ > + return client->dev.platform_data; > +} > +#endif > + > static int mt9p031_probe(struct i2c_client *client, > const struct i2c_device_id *did) > { > - struct mt9p031_platform_data *pdata = client->dev.platform_data; > + struct mt9p031_platform_data *pdata = mt9p031_get_pdata(client); > struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); > struct mt9p031 *mt9p031; > unsigned int i; > @@ -1072,6 +1130,7 @@ MODULE_DEVICE_TABLE(i2c, mt9p031_id); > > static struct i2c_driver mt9p031_i2c_driver = { > .driver = { > + .of_match_table = mt9p031_of_match, You can use the of_match_ptr() macro instead of defining mt9p031_of_match as NULL above. > .name = "mt9p031", > }, > .probe = mt9p031_probe,
Hi Laurent, On Mon, Apr 29, 2013 at 5:05 PM, Laurent Pinchart <laurent.pinchart@ideasonboard.com> wrote: > Hi Prabhakar, > > Thank you for the patch. Please see below for a couple of comments in addition > to the ones I've just sent (in reply to Sascha's e-mail). > Yep fixed them all. [snip] > >> --- >> .../devicetree/bindings/media/i2c/mt9p031.txt | 43 ++++++++++++++ >> drivers/media/i2c/mt9p031.c | 61 ++++++++++++++++- >> 2 files changed, 103 insertions(+), 1 deletions(-) >> create mode 100644 Documentation/devicetree/bindings/media/i2c/mt9p031.txt >> >> diff --git a/Documentation/devicetree/bindings/media/i2c/mt9p031.txt >> b/Documentation/devicetree/bindings/media/i2c/mt9p031.txt new file mode >> 100644 >> index 0000000..b985e63 >> --- /dev/null >> +++ b/Documentation/devicetree/bindings/media/i2c/mt9p031.txt >> @@ -0,0 +1,43 @@ >> +* Aptina 1/2.5-Inch 5Mp CMOS Digital Image Sensor >> + >> +The Aptina MT9P031 is a 1/2.5-inch CMOS active pixel digital image sensor >> +with an active imaging pixel array of 2592H x 1944V. It incorporates >> +sophisticated camera functions on-chip such as windowing, column and row >> +skip mode, and snapshot mode. It is programmable through a simple two-wire >> +serial interface. >> +The MT9P031 is a progressive-scan sensor that generates a stream of pixel >> +data at a constant frame rate. It uses an on-chip, phase-locked loop (PLL) >> +to generate all internal clocks from a single master input clock running >> +between 6 and 27 MHz. The maximum pixel rate is 96 Mp/s, corresponding to >> +a clock rate of 96 MHz. > > Isn't this text (directly copied from the datasheet) under Aptina's copyright > ? > hmm :) do you want me change it ? >> +Required Properties : >> +- compatible : value should be either one among the following >> + (a) "aptina,mt9p031-sensor" for mt9p031 sensor >> + (b) "aptina,mt9p031m-sensor" for mt9p031m sensor >> + >> +- ext_freq: Input clock frequency. >> + >> +- target_freq: Pixel clock frequency. >> + >> +Optional Properties : >> +-reset: Chip reset GPIO (If not specified defaults to -1) >> + >> +Example: >> + >> +i2c0@1c22000 { >> + ... >> + ... >> + mt9p031@5d { >> + compatible = "aptina,mt9p031-sensor"; >> + reg = <0x5d>; >> + >> + port { >> + mt9p031_1: endpoint { >> + ext_freq = <6000000>; >> + target_freq = <96000000>; >> + }; >> + }; >> + }; >> + ... >> +}; >> \ No newline at end of file >> diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c >> index 28cf95b..66078a6 100644 >> --- a/drivers/media/i2c/mt9p031.c >> +++ b/drivers/media/i2c/mt9p031.c >> @@ -23,11 +23,13 @@ >> #include <linux/regulator/consumer.h> >> #include <linux/slab.h> >> #include <linux/videodev2.h> >> +#include <linux/of_device.h> >> >> #include <media/mt9p031.h> >> #include <media/v4l2-chip-ident.h> >> #include <media/v4l2-ctrls.h> >> #include <media/v4l2-device.h> >> +#include <media/v4l2-of.h> >> #include <media/v4l2-subdev.h> >> >> #include "aptina-pll.h" >> @@ -928,10 +930,66 @@ static const struct v4l2_subdev_internal_ops >> mt9p031_subdev_internal_ops = { * Driver initialization and probing >> */ >> >> +#if defined(CONFIG_OF) >> +static const struct of_device_id mt9p031_of_match[] = { >> + {.compatible = "aptina,mt9p031-sensor", }, >> + {.compatible = "aptina,mt9p031m-sensor", }, > > As you'll need to resubmit anyway, please add a space between '{' and '.' > OK >> + {}, >> +}; >> +MODULE_DEVICE_TABLE(of, mt9p031_of_match); >> + [Snip] >> - struct mt9p031_platform_data *pdata = client->dev.platform_data; >> + struct mt9p031_platform_data *pdata = mt9p031_get_pdata(client); >> struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); >> struct mt9p031 *mt9p031; >> unsigned int i; >> @@ -1072,6 +1130,7 @@ MODULE_DEVICE_TABLE(i2c, mt9p031_id); >> >> static struct i2c_driver mt9p031_i2c_driver = { >> .driver = { >> + .of_match_table = mt9p031_of_match, > > You can use the of_match_ptr() macro instead of defining mt9p031_of_match as > NULL above. > Ok Regards, --Prabhakar Lad -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Monday 29 April 2013 17:18:02 Prabhakar Lad wrote: > On Mon, Apr 29, 2013 at 5:05 PM, Laurent Pinchart wrote: > > Hi Prabhakar, > > > > Thank you for the patch. Please see below for a couple of comments in > > addition to the ones I've just sent (in reply to Sascha's e-mail). > > Yep fixed them all. > > [snip] > > >> --- > >> > >> .../devicetree/bindings/media/i2c/mt9p031.txt | 43 ++++++++++++++ > >> drivers/media/i2c/mt9p031.c | 61 +++++++++++++- > >> 2 files changed, 103 insertions(+), 1 deletions(-) > >> create mode 100644 > >> Documentation/devicetree/bindings/media/i2c/mt9p031.txt > >> > >> diff --git a/Documentation/devicetree/bindings/media/i2c/mt9p031.txt > >> b/Documentation/devicetree/bindings/media/i2c/mt9p031.txt new file mode > >> 100644 > >> index 0000000..b985e63 > >> --- /dev/null > >> +++ b/Documentation/devicetree/bindings/media/i2c/mt9p031.txt > >> @@ -0,0 +1,43 @@ > >> +* Aptina 1/2.5-Inch 5Mp CMOS Digital Image Sensor > >> + > >> +The Aptina MT9P031 is a 1/2.5-inch CMOS active pixel digital image > >> +sensor with an active imaging pixel array of 2592H x 1944V. It > >> +incorporates sophisticated camera functions on-chip such as windowing, > >> +column and row skip mode, and snapshot mode. It is programmable through > >> +a simple two-wire serial interface. > >> +The MT9P031 is a progressive-scan sensor that generates a stream of > >> +pixel data at a constant frame rate. It uses an on-chip, phase-locked > >> +loop (PLL) to generate all internal clocks from a single master input > >> +clock running between 6 and 27 MHz. The maximum pixel rate is 96 Mp/s, > >> +corresponding to a clock rate of 96 MHz. > > > > Isn't this text (directly copied from the datasheet) under Aptina's > > copyright ? > > hmm :) do you want me change it ? From a personal point of view I don't care much, and I don't think Aptina would either, but I'd rather be safe than sorry on such matters, so it would probably be a good idea to change the text. One or two sentences should be enough.
Hi, One more point for your devicetree conversions, On Mon, Apr 29, 2013 at 01:30:01PM +0530, Prabhakar Lad wrote: > From: Lad, Prabhakar <prabhakar.csengg@gmail.com> > > add OF support for the mt9p031 sensor driver. > > +static struct mt9p031_platform_data > + *mt9p031_get_pdata(struct i2c_client *client) > + > +{ > + if (!client->dev.platform_data && client->dev.of_node) { > + struct device_node *np; > + struct mt9p031_platform_data *pdata; > + int ret; > + > + np = v4l2_of_get_next_endpoint(client->dev.of_node, NULL); > + if (!np) > + return NULL; > + > + pdata = devm_kzalloc(&client->dev, > + sizeof(struct mt9p031_platform_data), > + GFP_KERNEL); > + if (!pdata) { > + pr_warn("mt9p031 failed allocate memeory\n"); > + return NULL; > + } > + ret = of_property_read_u32(np, "reset", &pdata->reset); > + if (ret == -EINVAL) > + pdata->reset = -1; > + else if (ret == -ENODATA) > + return NULL; > + > + if (of_property_read_u32(np, "ext_freq", &pdata->ext_freq)) > + return NULL; > + > + if (of_property_read_u32(np, "target_freq", > + &pdata->target_freq)) > + return NULL; > + > + return pdata; > + } I don't know how the others see this, but IMO it would be cleaner to first add a duplicate of the members of pdata in struct mt9p031 and then initialize them either from pdata or from devicetree data. The (artificial) creation of platform_data for the devicetree case adds a new level of indirection. This may not be a problem here, but there are cases where there is no 1:1 transcription between pdata and devicetree possible. Sascha
Hi Sascha, On Tuesday 30 April 2013 08:16:25 Sascha Hauer wrote: > On Mon, Apr 29, 2013 at 01:30:01PM +0530, Prabhakar Lad wrote: > > From: Lad, Prabhakar <prabhakar.csengg@gmail.com> > > > > add OF support for the mt9p031 sensor driver. > > > > +static struct mt9p031_platform_data > > + *mt9p031_get_pdata(struct i2c_client *client) > > + > > +{ > > + if (!client->dev.platform_data && client->dev.of_node) { > > + struct device_node *np; > > + struct mt9p031_platform_data *pdata; > > + int ret; > > + > > + np = v4l2_of_get_next_endpoint(client->dev.of_node, NULL); > > + if (!np) > > + return NULL; > > + > > + pdata = devm_kzalloc(&client->dev, > > + sizeof(struct mt9p031_platform_data), > > + GFP_KERNEL); > > + if (!pdata) { > > + pr_warn("mt9p031 failed allocate memeory\n"); > > + return NULL; > > + } > > + ret = of_property_read_u32(np, "reset", &pdata->reset); > > + if (ret == -EINVAL) > > + pdata->reset = -1; > > + else if (ret == -ENODATA) > > + return NULL; > > + > > + if (of_property_read_u32(np, "ext_freq", &pdata->ext_freq)) > > + return NULL; > > + > > + if (of_property_read_u32(np, "target_freq", > > + &pdata->target_freq)) > > + return NULL; > > + > > + return pdata; > > + } > > I don't know how the others see this, but IMO it would be cleaner to > first add a duplicate of the members of pdata in struct mt9p031 and then > initialize them either from pdata or from devicetree data. The > (artificial) creation of platform_data for the devicetree case adds a > new level of indirection. This may not be a problem here, but there are > cases where there is no 1:1 transcription between pdata and devicetree > possible. I have no strong opinion on this. In the mt9p031 case it won't matter much, but it's probably a good idea in general.
diff --git a/Documentation/devicetree/bindings/media/i2c/mt9p031.txt b/Documentation/devicetree/bindings/media/i2c/mt9p031.txt new file mode 100644 index 0000000..b985e63 --- /dev/null +++ b/Documentation/devicetree/bindings/media/i2c/mt9p031.txt @@ -0,0 +1,43 @@ +* Aptina 1/2.5-Inch 5Mp CMOS Digital Image Sensor + +The Aptina MT9P031 is a 1/2.5-inch CMOS active pixel digital image sensor with +an active imaging pixel array of 2592H x 1944V. It incorporates sophisticated +camera functions on-chip such as windowing, column and row skip mode, and +snapshot mode. It is programmable through a simple two-wire serial interface. + +The MT9P031 is a progressive-scan sensor that generates a stream of pixel data +at a constant frame rate. It uses an on-chip, phase-locked loop (PLL) to +generate all internal clocks from a single master input clock running between 6 +and 27 MHz. The maximum pixel rate is 96 Mp/s, corresponding to a clock rate of +96 MHz. + +Required Properties : +- compatible : value should be either one among the following + (a) "aptina,mt9p031-sensor" for mt9p031 sensor + (b) "aptina,mt9p031m-sensor" for mt9p031m sensor + +- ext_freq: Input clock frequency. + +- target_freq: Pixel clock frequency. + +Optional Properties : +-reset: Chip reset GPIO (If not specified defaults to -1) + +Example: + +i2c0@1c22000 { + ... + ... + mt9p031@5d { + compatible = "aptina,mt9p031-sensor"; + reg = <0x5d>; + + port { + mt9p031_1: endpoint { + ext_freq = <6000000>; + target_freq = <96000000>; + }; + }; + }; + ... +}; \ No newline at end of file diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c index 28cf95b..66078a6 100644 --- a/drivers/media/i2c/mt9p031.c +++ b/drivers/media/i2c/mt9p031.c @@ -23,11 +23,13 @@ #include <linux/regulator/consumer.h> #include <linux/slab.h> #include <linux/videodev2.h> +#include <linux/of_device.h> #include <media/mt9p031.h> #include <media/v4l2-chip-ident.h> #include <media/v4l2-ctrls.h> #include <media/v4l2-device.h> +#include <media/v4l2-of.h> #include <media/v4l2-subdev.h> #include "aptina-pll.h" @@ -928,10 +930,66 @@ static const struct v4l2_subdev_internal_ops mt9p031_subdev_internal_ops = { * Driver initialization and probing */ +#if defined(CONFIG_OF) +static const struct of_device_id mt9p031_of_match[] = { + {.compatible = "aptina,mt9p031-sensor", }, + {.compatible = "aptina,mt9p031m-sensor", }, + {}, +}; +MODULE_DEVICE_TABLE(of, mt9p031_of_match); + +static struct mt9p031_platform_data + *mt9p031_get_pdata(struct i2c_client *client) + +{ + if (!client->dev.platform_data && client->dev.of_node) { + struct device_node *np; + struct mt9p031_platform_data *pdata; + int ret; + + np = v4l2_of_get_next_endpoint(client->dev.of_node, NULL); + if (!np) + return NULL; + + pdata = devm_kzalloc(&client->dev, + sizeof(struct mt9p031_platform_data), + GFP_KERNEL); + if (!pdata) { + pr_warn("mt9p031 failed allocate memeory\n"); + return NULL; + } + ret = of_property_read_u32(np, "reset", &pdata->reset); + if (ret == -EINVAL) + pdata->reset = -1; + else if (ret == -ENODATA) + return NULL; + + if (of_property_read_u32(np, "ext_freq", &pdata->ext_freq)) + return NULL; + + if (of_property_read_u32(np, "target_freq", + &pdata->target_freq)) + return NULL; + + return pdata; + } + + return NULL; +} +#else +#define mt9p031_of_match NULL + +static struct mt9p031_platform_data + *mt9p031_get_pdata(struct i2c_client *client) +{ + return client->dev.platform_data; +} +#endif + static int mt9p031_probe(struct i2c_client *client, const struct i2c_device_id *did) { - struct mt9p031_platform_data *pdata = client->dev.platform_data; + struct mt9p031_platform_data *pdata = mt9p031_get_pdata(client); struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); struct mt9p031 *mt9p031; unsigned int i; @@ -1072,6 +1130,7 @@ MODULE_DEVICE_TABLE(i2c, mt9p031_id); static struct i2c_driver mt9p031_i2c_driver = { .driver = { + .of_match_table = mt9p031_of_match, .name = "mt9p031", }, .probe = mt9p031_probe,