linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/6] media: mt9m111 features
@ 2018-10-29 18:24 Marco Felsch
  2018-10-29 18:24 ` [PATCH v2 1/6] media: mt9m111: add s_stream callback Marco Felsch
                   ` (5 more replies)
  0 siblings, 6 replies; 15+ messages in thread
From: Marco Felsch @ 2018-10-29 18:24 UTC (permalink / raw)
  To: mchehab, sakari.ailus, robh+dt, mark.rutland
  Cc: enrico.scholz, akinobu.mita, linux-media, devicetree, graphics

Hi,

this is the v2 of [1]. I fixed some issues I made during converting
Enrico's and Michael's patches and rebased it on top of
media-tree/master. Please see commit comments for further information.

The dt-bindings patches are new as result of Sakari's review [2].

[1] https://www.spinics.net/lists/linux-media/msg141975.html
[2] https://www.spinics.net/lists/linux-media/msg141987.html

Regards,
Marco

Enrico Scholz (1):
  media: mt9m111: allow to setup pixclk polarity

Marco Felsch (3):
  media: mt9m111: add s_stream callback
  dt-bindings: media: mt9m111: adapt documentation to be more clear
  dt-bindings: media: mt9m111: add pclk-sample property

Michael Grzeschik (2):
  media: mt9m111: add streaming check to set_fmt
  media: mt9m111: add support to select formats and fps for {Q,SXGA}

 .../devicetree/bindings/media/i2c/mt9m111.txt |  16 +-
 drivers/media/i2c/mt9m111.c                   | 222 +++++++++++++++++-
 2 files changed, 233 insertions(+), 5 deletions(-)

-- 
2.19.1

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 1/6] media: mt9m111: add s_stream callback
  2018-10-29 18:24 [PATCH v2 0/6] media: mt9m111 features Marco Felsch
@ 2018-10-29 18:24 ` Marco Felsch
  2018-10-29 18:24 ` [PATCH v2 2/6] media: mt9m111: add streaming check to set_fmt Marco Felsch
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 15+ messages in thread
From: Marco Felsch @ 2018-10-29 18:24 UTC (permalink / raw)
  To: mchehab, sakari.ailus, robh+dt, mark.rutland
  Cc: enrico.scholz, akinobu.mita, linux-media, devicetree, graphics

Add callback to check if we are already streaming. Now other callbacks
can check the state and return -EBUSY if we already streaming.

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 drivers/media/i2c/mt9m111.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c
index 1395986a07bb..e0ac5aa6ea64 100644
--- a/drivers/media/i2c/mt9m111.c
+++ b/drivers/media/i2c/mt9m111.c
@@ -217,6 +217,7 @@ struct mt9m111 {
 	int power_count;
 	const struct mt9m111_datafmt *fmt;
 	int lastpage;	/* PageMap cache value */
+	bool is_streaming;
 #ifdef CONFIG_MEDIA_CONTROLLER
 	struct media_pad pad;
 #endif
@@ -879,6 +880,14 @@ static int mt9m111_enum_mbus_code(struct v4l2_subdev *sd,
 	return 0;
 }
 
+static int mt9m111_s_stream(struct v4l2_subdev *sd, int enable)
+{
+	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
+
+	mt9m111->is_streaming = !!enable;
+	return 0;
+}
+
 static int mt9m111_g_mbus_config(struct v4l2_subdev *sd,
 				struct v4l2_mbus_config *cfg)
 {
@@ -892,6 +901,7 @@ static int mt9m111_g_mbus_config(struct v4l2_subdev *sd,
 
 static const struct v4l2_subdev_video_ops mt9m111_subdev_video_ops = {
 	.g_mbus_config	= mt9m111_g_mbus_config,
+	.s_stream	= mt9m111_s_stream,
 };
 
 static const struct v4l2_subdev_pad_ops mt9m111_subdev_pad_ops = {
-- 
2.19.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 2/6] media: mt9m111: add streaming check to set_fmt
  2018-10-29 18:24 [PATCH v2 0/6] media: mt9m111 features Marco Felsch
  2018-10-29 18:24 ` [PATCH v2 1/6] media: mt9m111: add s_stream callback Marco Felsch
@ 2018-10-29 18:24 ` Marco Felsch
  2018-10-29 18:24 ` [PATCH v2 3/6] media: mt9m111: add support to select formats and fps for {Q,SXGA} Marco Felsch
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 15+ messages in thread
From: Marco Felsch @ 2018-10-29 18:24 UTC (permalink / raw)
  To: mchehab, sakari.ailus, robh+dt, mark.rutland
  Cc: enrico.scholz, akinobu.mita, linux-media, devicetree,
	Michael Grzeschik, graphics

From: Michael Grzeschik <m.grzeschik@pengutronix.de>

Currently set_fmt don't care about the streaming status, so the format
can be changed during streaming. This can lead into wrong behaviours.

Check if the device is already streaming and return -EBUSY to avoid
wrong behaviours.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
---
 drivers/media/i2c/mt9m111.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c
index e0ac5aa6ea64..1f8789fe28af 100644
--- a/drivers/media/i2c/mt9m111.c
+++ b/drivers/media/i2c/mt9m111.c
@@ -560,6 +560,9 @@ static int mt9m111_set_fmt(struct v4l2_subdev *sd,
 	bool bayer;
 	int ret;
 
+	if (mt9m111->is_streaming)
+		return -EBUSY;
+
 	if (format->pad)
 		return -EINVAL;
 
-- 
2.19.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 3/6] media: mt9m111: add support to select formats and fps for {Q,SXGA}
  2018-10-29 18:24 [PATCH v2 0/6] media: mt9m111 features Marco Felsch
  2018-10-29 18:24 ` [PATCH v2 1/6] media: mt9m111: add s_stream callback Marco Felsch
  2018-10-29 18:24 ` [PATCH v2 2/6] media: mt9m111: add streaming check to set_fmt Marco Felsch
@ 2018-10-29 18:24 ` Marco Felsch
  2018-11-16 13:26   ` Sakari Ailus
  2018-10-29 18:24 ` [PATCH v2 4/6] media: mt9m111: allow to setup pixclk polarity Marco Felsch
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Marco Felsch @ 2018-10-29 18:24 UTC (permalink / raw)
  To: mchehab, sakari.ailus, robh+dt, mark.rutland
  Cc: enrico.scholz, akinobu.mita, linux-media, devicetree,
	Michael Grzeschik, graphics

From: Michael Grzeschik <m.grzeschik@pengutronix.de>

This patch implements the framerate selection using the skipping and
readout power-modi features. The power-modi cut the framerate by half
and each context has an independent selection bit. The same applies to
the 2x skipping feature.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>

---
Changelog

v2:
- fix updating read mode register, use mt9m111_reg_mask() to update the
  relevant bits only. For this purpose add reg_mask field to
  struct mt9m111_mode_info.

 drivers/media/i2c/mt9m111.c | 163 ++++++++++++++++++++++++++++++++++++
 1 file changed, 163 insertions(+)

diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c
index 1f8789fe28af..e9879e111f58 100644
--- a/drivers/media/i2c/mt9m111.c
+++ b/drivers/media/i2c/mt9m111.c
@@ -126,6 +126,8 @@
 #define MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN	(1 << 1)
 #define MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B	(1 << 0)
 #define MT9M111_TPG_SEL_MASK		GENMASK(2, 0)
+#define MT9M111_RM_PWR_MASK		BIT(10)
+#define MT9M111_RM_SKIP2_MASK		GENMASK(3, 2)
 
 /*
  * Camera control register addresses (0x200..0x2ff not implemented)
@@ -204,6 +206,23 @@ static const struct mt9m111_datafmt mt9m111_colour_fmts[] = {
 	{MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
 };
 
+enum mt9m111_mode_id {
+	MT9M111_MODE_SXGA_8FPS,
+	MT9M111_MODE_SXGA_15FPS,
+	MT9M111_MODE_QSXGA_30FPS,
+	MT9M111_NUM_MODES,
+};
+
+struct mt9m111_mode_info {
+	unsigned int sensor_w;
+	unsigned int sensor_h;
+	unsigned int max_image_w;
+	unsigned int max_image_h;
+	unsigned int max_fps;
+	unsigned int reg_val;
+	unsigned int reg_mask;
+};
+
 struct mt9m111 {
 	struct v4l2_subdev subdev;
 	struct v4l2_ctrl_handler hdl;
@@ -213,6 +232,8 @@ struct mt9m111 {
 	struct v4l2_clk *clk;
 	unsigned int width;	/* output */
 	unsigned int height;	/* sizes */
+	struct v4l2_fract frame_interval;
+	const struct mt9m111_mode_info *current_mode;
 	struct mutex power_lock; /* lock to protect power_count */
 	int power_count;
 	const struct mt9m111_datafmt *fmt;
@@ -223,6 +244,37 @@ struct mt9m111 {
 #endif
 };
 
+static const struct mt9m111_mode_info mt9m111_mode_data[MT9M111_NUM_MODES] = {
+	[MT9M111_MODE_SXGA_8FPS] = {
+		.sensor_w = 1280,
+		.sensor_h = 1024,
+		.max_image_w = 1280,
+		.max_image_h = 1024,
+		.max_fps = 8,
+		.reg_val = MT9M111_RM_LOW_POWER_RD,
+		.reg_mask = MT9M111_RM_PWR_MASK | MT9M111_RM_SKIP2_MASK,
+	},
+	[MT9M111_MODE_SXGA_15FPS] = {
+		.sensor_w = 1280,
+		.sensor_h = 1024,
+		.max_image_w = 1280,
+		.max_image_h = 1024,
+		.max_fps = 15,
+		.reg_val = MT9M111_RM_FULL_POWER_RD,
+		.reg_mask = MT9M111_RM_PWR_MASK | MT9M111_RM_SKIP2_MASK,
+	},
+	[MT9M111_MODE_QSXGA_30FPS] = {
+		.sensor_w = 1280,
+		.sensor_h = 1024,
+		.max_image_w = 640,
+		.max_image_h = 512,
+		.max_fps = 30,
+		.reg_val = MT9M111_RM_LOW_POWER_RD | MT9M111_RM_COL_SKIP_2X |
+			   MT9M111_RM_ROW_SKIP_2X,
+		.reg_mask = MT9M111_RM_PWR_MASK | MT9M111_RM_SKIP2_MASK,
+	},
+};
+
 /* Find a data format by a pixel code */
 static const struct mt9m111_datafmt *mt9m111_find_datafmt(struct mt9m111 *mt9m111,
 						u32 code)
@@ -615,6 +667,62 @@ static int mt9m111_set_fmt(struct v4l2_subdev *sd,
 	return ret;
 }
 
+static const struct mt9m111_mode_info *
+mt9m111_find_mode(struct mt9m111 *mt9m111, unsigned int req_fps,
+		  unsigned int width, unsigned int height)
+{
+	const struct mt9m111_mode_info *mode;
+	struct v4l2_rect *sensor_rect = &mt9m111->rect;
+	unsigned int gap, gap_best = (unsigned int) -1;
+	int i, best_gap_idx = 1;
+
+	/* find best matched fps */
+	for (i = 0; i < MT9M111_NUM_MODES; i++) {
+		unsigned int fps = mt9m111_mode_data[i].max_fps;
+
+		gap = abs(fps - req_fps);
+		if (gap < gap_best) {
+			best_gap_idx = i;
+			gap_best = gap;
+		}
+	}
+
+	/*
+	 * Use context a/b default timing values instead of calculate blanking
+	 * timing values.
+	 */
+	mode = &mt9m111_mode_data[best_gap_idx];
+	mt9m111->ctx = (best_gap_idx == MT9M111_MODE_QSXGA_30FPS) ? &context_a :
+								    &context_b;
+
+	/*
+	 * Check if current settings support the fps because fps selection is
+	 * based on the row/col skipping mechanism which has some restriction.
+	 */
+	if (sensor_rect->width != mode->sensor_w ||
+	    sensor_rect->height != mode->sensor_h ||
+	    width > mode->max_image_w ||
+	    height > mode->max_image_h) {
+		/* reset sensor window size */
+		mt9m111->rect.left = MT9M111_MIN_DARK_COLS;
+		mt9m111->rect.top = MT9M111_MIN_DARK_ROWS;
+		mt9m111->rect.width = mode->sensor_w;
+		mt9m111->rect.height = mode->sensor_h;
+
+		/* reset image size */
+		mt9m111->width = mode->max_image_w;
+		mt9m111->height = mode->max_image_h;
+
+		dev_warn(mt9m111->subdev.dev,
+			 "Warning: update image size %dx%d[%dx%d] -> %dx%d[%dx%d]\n",
+			 sensor_rect->width, sensor_rect->height, width, height,
+			 mode->sensor_w, mode->sensor_h, mode->max_image_w,
+			 mode->max_image_h);
+	}
+
+	return mode;
+}
+
 #ifdef CONFIG_VIDEO_ADV_DEBUG
 static int mt9m111_g_register(struct v4l2_subdev *sd,
 			      struct v4l2_dbg_register *reg)
@@ -775,11 +883,16 @@ static int mt9m111_suspend(struct mt9m111 *mt9m111)
 
 static void mt9m111_restore_state(struct mt9m111 *mt9m111)
 {
+	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
+
 	mt9m111_set_context(mt9m111, mt9m111->ctx);
 	mt9m111_set_pixfmt(mt9m111, mt9m111->fmt->code);
 	mt9m111_setup_geometry(mt9m111, &mt9m111->rect,
 			mt9m111->width, mt9m111->height, mt9m111->fmt->code);
 	v4l2_ctrl_handler_setup(&mt9m111->hdl);
+	mt9m111_reg_mask(client, mt9m111->ctx->read_mode,
+			 mt9m111->current_mode->reg_val,
+			 mt9m111->current_mode->reg_mask);
 }
 
 static int mt9m111_resume(struct mt9m111 *mt9m111)
@@ -872,6 +985,50 @@ static const struct v4l2_subdev_core_ops mt9m111_subdev_core_ops = {
 #endif
 };
 
+static int mt9m111_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
+
+	fi->interval = mt9m111->frame_interval;
+
+	return 0;
+}
+
+static int mt9m111_s_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
+	const struct mt9m111_mode_info *mode;
+	struct v4l2_fract *fract = &fi->interval;
+	int fps;
+
+	if (mt9m111->is_streaming)
+		return -EBUSY;
+
+	if (fi->pad != 0)
+		return -EINVAL;
+
+	if (fract->numerator == 0) {
+		fract->denominator = 30;
+		fract->numerator = 1;
+	}
+
+	fps = DIV_ROUND_CLOSEST(fract->denominator, fract->numerator);
+
+	/* find best fitting mode */
+	mode = mt9m111_find_mode(mt9m111, fps, mt9m111->width, mt9m111->height);
+	if (mode->max_fps != fps) {
+		fract->denominator = mode->max_fps;
+		fract->numerator = 1;
+	}
+
+	mt9m111->current_mode = mode;
+	mt9m111->frame_interval = fi->interval;
+
+	return 0;
+}
+
 static int mt9m111_enum_mbus_code(struct v4l2_subdev *sd,
 		struct v4l2_subdev_pad_config *cfg,
 		struct v4l2_subdev_mbus_code_enum *code)
@@ -905,6 +1062,8 @@ static int mt9m111_g_mbus_config(struct v4l2_subdev *sd,
 static const struct v4l2_subdev_video_ops mt9m111_subdev_video_ops = {
 	.g_mbus_config	= mt9m111_g_mbus_config,
 	.s_stream	= mt9m111_s_stream,
+	.g_frame_interval = mt9m111_g_frame_interval,
+	.s_frame_interval = mt9m111_s_frame_interval,
 };
 
 static const struct v4l2_subdev_pad_ops mt9m111_subdev_pad_ops = {
@@ -1021,6 +1180,10 @@ static int mt9m111_probe(struct i2c_client *client,
 		goto out_hdlfree;
 #endif
 
+	mt9m111->current_mode = &mt9m111_mode_data[MT9M111_MODE_SXGA_15FPS];
+	mt9m111->frame_interval.numerator = 1;
+	mt9m111->frame_interval.denominator = mt9m111->current_mode->max_fps;
+
 	/* Second stage probe - when a capture adapter is there */
 	mt9m111->rect.left	= MT9M111_MIN_DARK_COLS;
 	mt9m111->rect.top	= MT9M111_MIN_DARK_ROWS;
-- 
2.19.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 4/6] media: mt9m111: allow to setup pixclk polarity
  2018-10-29 18:24 [PATCH v2 0/6] media: mt9m111 features Marco Felsch
                   ` (2 preceding siblings ...)
  2018-10-29 18:24 ` [PATCH v2 3/6] media: mt9m111: add support to select formats and fps for {Q,SXGA} Marco Felsch
@ 2018-10-29 18:24 ` Marco Felsch
  2018-11-16 13:32   ` Sakari Ailus
  2018-10-29 18:24 ` [PATCH v2 5/6] dt-bindings: media: mt9m111: adapt documentation to be more clear Marco Felsch
  2018-10-29 18:24 ` [PATCH v2 6/6] dt-bindings: media: mt9m111: add pclk-sample property Marco Felsch
  5 siblings, 1 reply; 15+ messages in thread
From: Marco Felsch @ 2018-10-29 18:24 UTC (permalink / raw)
  To: mchehab, sakari.ailus, robh+dt, mark.rutland
  Cc: enrico.scholz, akinobu.mita, linux-media, devicetree, graphics,
	Michael Grzeschik

From: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>

The chip can be configured to output data transitions on the
rising or falling edge of PIXCLK (Datasheet R58:1[9]), default is on the
falling edge.

Parsing the fw-node is made in a subfunction to bundle all (future)
dt-parsing / fw-parsing stuff.

Signed-off-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>
(m.grzeschik@pengutronix.de: Fix inverting clock. INV_PIX_CLOCK bit is set
per default. Set bit to 0 (enable mask bit without value) to enable
falling edge sampling.)
Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
(m.felsch@pengutronix.de: use fwnode helpers)
(m.felsch@pengutronix.de: mv fw parsing into own function)
(m.felsch@pengutronix.de: adapt commit msg)
Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>

---
Changelog:

v2:
- make use of fwnode_*() to drop OF dependency and ifdef's
- mt9m111_g_mbus_config: fix pclk_sample logic which I made due the
  conversion from Enrico's patch.

 drivers/media/i2c/mt9m111.c | 46 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 45 insertions(+), 1 deletion(-)

diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c
index e9879e111f58..112eaa5ba917 100644
--- a/drivers/media/i2c/mt9m111.c
+++ b/drivers/media/i2c/mt9m111.c
@@ -15,12 +15,14 @@
 #include <linux/delay.h>
 #include <linux/v4l2-mediabus.h>
 #include <linux/module.h>
+#include <linux/property.h>
 
 #include <media/v4l2-async.h>
 #include <media/v4l2-clk.h>
 #include <media/v4l2-common.h>
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-device.h>
+#include <media/v4l2-fwnode.h>
 
 /*
  * MT9M111, MT9M112 and MT9M131:
@@ -239,6 +241,8 @@ struct mt9m111 {
 	const struct mt9m111_datafmt *fmt;
 	int lastpage;	/* PageMap cache value */
 	bool is_streaming;
+	/* user point of view - 0: falling 1: rising edge */
+	unsigned int pclk_sample:1;
 #ifdef CONFIG_MEDIA_CONTROLLER
 	struct media_pad pad;
 #endif
@@ -591,6 +595,10 @@ static int mt9m111_set_pixfmt(struct mt9m111 *mt9m111,
 		return -EINVAL;
 	}
 
+	/* receiver samples on falling edge, chip-hw default is rising */
+	if (mt9m111->pclk_sample == 0)
+		mask_outfmt2 |= MT9M111_OUTFMT_INV_PIX_CLOCK;
+
 	ret = mt9m111_reg_mask(client, context_a.output_fmt_ctrl2,
 			       data_outfmt2, mask_outfmt2);
 	if (!ret)
@@ -1051,9 +1059,15 @@ static int mt9m111_s_stream(struct v4l2_subdev *sd, int enable)
 static int mt9m111_g_mbus_config(struct v4l2_subdev *sd,
 				struct v4l2_mbus_config *cfg)
 {
-	cfg->flags = V4L2_MBUS_MASTER | V4L2_MBUS_PCLK_SAMPLE_RISING |
+	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
+
+	cfg->flags = V4L2_MBUS_MASTER |
 		V4L2_MBUS_HSYNC_ACTIVE_HIGH | V4L2_MBUS_VSYNC_ACTIVE_HIGH |
 		V4L2_MBUS_DATA_ACTIVE_HIGH;
+
+	cfg->flags |= mt9m111->pclk_sample ? V4L2_MBUS_PCLK_SAMPLE_RISING :
+		V4L2_MBUS_PCLK_SAMPLE_FALLING;
+
 	cfg->type = V4L2_MBUS_PARALLEL;
 
 	return 0;
@@ -1123,6 +1137,32 @@ static int mt9m111_video_probe(struct i2c_client *client)
 	return ret;
 }
 
+static int mt9m111_probe_fw(struct i2c_client *client, struct mt9m111 *mt9m111)
+{
+	struct v4l2_fwnode_endpoint *bus_cfg;
+	struct fwnode_handle *np;
+	int ret = 0;
+
+	np = fwnode_graph_get_next_endpoint(dev_fwnode(&client->dev), NULL);
+	if (!np)
+		return -EINVAL;
+
+	bus_cfg = v4l2_fwnode_endpoint_alloc_parse(np);
+	if (IS_ERR(bus_cfg)) {
+		ret = PTR_ERR(bus_cfg);
+		goto out_put_fw;
+	}
+
+	mt9m111->pclk_sample = !!(bus_cfg->bus.parallel.flags &
+				  V4L2_MBUS_PCLK_SAMPLE_RISING);
+
+	v4l2_fwnode_endpoint_free(bus_cfg);
+
+out_put_fw:
+	fwnode_handle_put(np);
+	return ret;
+}
+
 static int mt9m111_probe(struct i2c_client *client,
 			 const struct i2c_device_id *did)
 {
@@ -1147,6 +1187,10 @@ static int mt9m111_probe(struct i2c_client *client,
 	/* Default HIGHPOWER context */
 	mt9m111->ctx = &context_b;
 
+	ret = mt9m111_probe_fw(client, mt9m111);
+	if (ret)
+		return ret;
+
 	v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops);
 	mt9m111->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 
-- 
2.19.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 5/6] dt-bindings: media: mt9m111: adapt documentation to be more clear
  2018-10-29 18:24 [PATCH v2 0/6] media: mt9m111 features Marco Felsch
                   ` (3 preceding siblings ...)
  2018-10-29 18:24 ` [PATCH v2 4/6] media: mt9m111: allow to setup pixclk polarity Marco Felsch
@ 2018-10-29 18:24 ` Marco Felsch
  2018-10-30 22:30   ` Rob Herring
  2018-10-29 18:24 ` [PATCH v2 6/6] dt-bindings: media: mt9m111: add pclk-sample property Marco Felsch
  5 siblings, 1 reply; 15+ messages in thread
From: Marco Felsch @ 2018-10-29 18:24 UTC (permalink / raw)
  To: mchehab, sakari.ailus, robh+dt, mark.rutland
  Cc: enrico.scholz, akinobu.mita, linux-media, devicetree, graphics

Replace the vague binding by a more verbose. Remove the remote property
from the example since the driver don't support such a property. Also
remove the bus-width property from the endpoint since the driver don't
take care of it.

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 .../devicetree/bindings/media/i2c/mt9m111.txt         | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/Documentation/devicetree/bindings/media/i2c/mt9m111.txt b/Documentation/devicetree/bindings/media/i2c/mt9m111.txt
index 6b910036b57e..921cc48c488b 100644
--- a/Documentation/devicetree/bindings/media/i2c/mt9m111.txt
+++ b/Documentation/devicetree/bindings/media/i2c/mt9m111.txt
@@ -9,8 +9,13 @@ Required Properties:
 - clocks: reference to the master clock.
 - clock-names: shall be "mclk".
 
-For further reading on port node refer to
-Documentation/devicetree/bindings/media/video-interfaces.txt.
+The device node must contain one 'port' child node with one 'endpoint' child
+sub-node for its digital output video port, in accordance with the video
+interface bindings defined in:
+Documentation/devicetree/bindings/media/video-interfaces.txt
+
+Required endpoint properties:
+- remote-endpoint: For information see ../video-interfaces.txt.
 
 Example:
 
@@ -21,10 +26,8 @@ Example:
 			clocks = <&mclk>;
 			clock-names = "mclk";
 
-			remote = <&pxa_camera>;
 			port {
 				mt9m111_1: endpoint {
-					bus-width = <8>;
 					remote-endpoint = <&pxa_camera>;
 				};
 			};
-- 
2.19.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 6/6] dt-bindings: media: mt9m111: add pclk-sample property
  2018-10-29 18:24 [PATCH v2 0/6] media: mt9m111 features Marco Felsch
                   ` (4 preceding siblings ...)
  2018-10-29 18:24 ` [PATCH v2 5/6] dt-bindings: media: mt9m111: adapt documentation to be more clear Marco Felsch
@ 2018-10-29 18:24 ` Marco Felsch
  2018-10-30 22:31   ` Rob Herring
  5 siblings, 1 reply; 15+ messages in thread
From: Marco Felsch @ 2018-10-29 18:24 UTC (permalink / raw)
  To: mchehab, sakari.ailus, robh+dt, mark.rutland
  Cc: enrico.scholz, akinobu.mita, linux-media, devicetree, graphics

Add the pclk-sample property to the list of optional properties
for the mt9m111 camera sensor.

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 Documentation/devicetree/bindings/media/i2c/mt9m111.txt | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/Documentation/devicetree/bindings/media/i2c/mt9m111.txt b/Documentation/devicetree/bindings/media/i2c/mt9m111.txt
index 921cc48c488b..6dfd0f0f6245 100644
--- a/Documentation/devicetree/bindings/media/i2c/mt9m111.txt
+++ b/Documentation/devicetree/bindings/media/i2c/mt9m111.txt
@@ -17,6 +17,10 @@ Documentation/devicetree/bindings/media/video-interfaces.txt
 Required endpoint properties:
 - remote-endpoint: For information see ../video-interfaces.txt.
 
+Optional endpoint properties:
+- pclk-sample: For information see ../video-interfaces.txt. The value is set to
+  0 if it isn't specified.
+
 Example:
 
 	i2c_master {
@@ -29,6 +33,7 @@ Example:
 			port {
 				mt9m111_1: endpoint {
 					remote-endpoint = <&pxa_camera>;
+					pclk-sample = <1>;
 				};
 			};
 		};
-- 
2.19.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 5/6] dt-bindings: media: mt9m111: adapt documentation to be more clear
  2018-10-29 18:24 ` [PATCH v2 5/6] dt-bindings: media: mt9m111: adapt documentation to be more clear Marco Felsch
@ 2018-10-30 22:30   ` Rob Herring
  0 siblings, 0 replies; 15+ messages in thread
From: Rob Herring @ 2018-10-30 22:30 UTC (permalink / raw)
  To: Marco Felsch
  Cc: mchehab, sakari.ailus, mark.rutland, enrico.scholz, akinobu.mita,
	linux-media, devicetree, graphics

On Mon, Oct 29, 2018 at 07:24:09PM +0100, Marco Felsch wrote:
> Replace the vague binding by a more verbose. Remove the remote property
> from the example since the driver don't support such a property. Also
> remove the bus-width property from the endpoint since the driver don't
> take care of it.
> 
> Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
> ---
>  .../devicetree/bindings/media/i2c/mt9m111.txt         | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/media/i2c/mt9m111.txt b/Documentation/devicetree/bindings/media/i2c/mt9m111.txt
> index 6b910036b57e..921cc48c488b 100644
> --- a/Documentation/devicetree/bindings/media/i2c/mt9m111.txt
> +++ b/Documentation/devicetree/bindings/media/i2c/mt9m111.txt
> @@ -9,8 +9,13 @@ Required Properties:
>  - clocks: reference to the master clock.
>  - clock-names: shall be "mclk".
>  
> -For further reading on port node refer to
> -Documentation/devicetree/bindings/media/video-interfaces.txt.
> +The device node must contain one 'port' child node with one 'endpoint' child
> +sub-node for its digital output video port, in accordance with the video
> +interface bindings defined in:
> +Documentation/devicetree/bindings/media/video-interfaces.txt
> +
> +Required endpoint properties:
> +- remote-endpoint: For information see ../video-interfaces.txt.

You don't need to explicitly document this.

Otherwise,

Reviewed-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 6/6] dt-bindings: media: mt9m111: add pclk-sample property
  2018-10-29 18:24 ` [PATCH v2 6/6] dt-bindings: media: mt9m111: add pclk-sample property Marco Felsch
@ 2018-10-30 22:31   ` Rob Herring
  0 siblings, 0 replies; 15+ messages in thread
From: Rob Herring @ 2018-10-30 22:31 UTC (permalink / raw)
  To: Marco Felsch
  Cc: mchehab, sakari.ailus, robh+dt, mark.rutland, enrico.scholz,
	akinobu.mita, linux-media, devicetree, graphics

On Mon, 29 Oct 2018 19:24:10 +0100, Marco Felsch wrote:
> Add the pclk-sample property to the list of optional properties
> for the mt9m111 camera sensor.
> 
> Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
> ---
>  Documentation/devicetree/bindings/media/i2c/mt9m111.txt | 5 +++++
>  1 file changed, 5 insertions(+)
> 

Reviewed-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/6] media: mt9m111: add support to select formats and fps for {Q,SXGA}
  2018-10-29 18:24 ` [PATCH v2 3/6] media: mt9m111: add support to select formats and fps for {Q,SXGA} Marco Felsch
@ 2018-11-16 13:26   ` Sakari Ailus
  2018-11-16 13:31     ` Hans Verkuil
  0 siblings, 1 reply; 15+ messages in thread
From: Sakari Ailus @ 2018-11-16 13:26 UTC (permalink / raw)
  To: Marco Felsch
  Cc: mchehab, sakari.ailus, robh+dt, mark.rutland, enrico.scholz,
	akinobu.mita, linux-media, devicetree, Michael Grzeschik,
	graphics, hverkuil

Hi Marco, Michael,

On Mon, Oct 29, 2018 at 07:24:07PM +0100, Marco Felsch wrote:
> From: Michael Grzeschik <m.grzeschik@pengutronix.de>
> 
> This patch implements the framerate selection using the skipping and
> readout power-modi features. The power-modi cut the framerate by half
> and each context has an independent selection bit. The same applies to
> the 2x skipping feature.
> 
> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
> Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
> 
> ---
> Changelog
> 
> v2:
> - fix updating read mode register, use mt9m111_reg_mask() to update the
>   relevant bits only. For this purpose add reg_mask field to
>   struct mt9m111_mode_info.
> 
>  drivers/media/i2c/mt9m111.c | 163 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 163 insertions(+)
> 
> diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c
> index 1f8789fe28af..e9879e111f58 100644
> --- a/drivers/media/i2c/mt9m111.c
> +++ b/drivers/media/i2c/mt9m111.c
> @@ -126,6 +126,8 @@
>  #define MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN	(1 << 1)
>  #define MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B	(1 << 0)
>  #define MT9M111_TPG_SEL_MASK		GENMASK(2, 0)
> +#define MT9M111_RM_PWR_MASK		BIT(10)
> +#define MT9M111_RM_SKIP2_MASK		GENMASK(3, 2)
>  
>  /*
>   * Camera control register addresses (0x200..0x2ff not implemented)
> @@ -204,6 +206,23 @@ static const struct mt9m111_datafmt mt9m111_colour_fmts[] = {
>  	{MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
>  };
>  
> +enum mt9m111_mode_id {
> +	MT9M111_MODE_SXGA_8FPS,
> +	MT9M111_MODE_SXGA_15FPS,
> +	MT9M111_MODE_QSXGA_30FPS,
> +	MT9M111_NUM_MODES,
> +};
> +
> +struct mt9m111_mode_info {
> +	unsigned int sensor_w;
> +	unsigned int sensor_h;
> +	unsigned int max_image_w;
> +	unsigned int max_image_h;
> +	unsigned int max_fps;
> +	unsigned int reg_val;
> +	unsigned int reg_mask;
> +};
> +
>  struct mt9m111 {
>  	struct v4l2_subdev subdev;
>  	struct v4l2_ctrl_handler hdl;
> @@ -213,6 +232,8 @@ struct mt9m111 {
>  	struct v4l2_clk *clk;
>  	unsigned int width;	/* output */
>  	unsigned int height;	/* sizes */
> +	struct v4l2_fract frame_interval;
> +	const struct mt9m111_mode_info *current_mode;
>  	struct mutex power_lock; /* lock to protect power_count */
>  	int power_count;
>  	const struct mt9m111_datafmt *fmt;
> @@ -223,6 +244,37 @@ struct mt9m111 {
>  #endif
>  };
>  
> +static const struct mt9m111_mode_info mt9m111_mode_data[MT9M111_NUM_MODES] = {
> +	[MT9M111_MODE_SXGA_8FPS] = {
> +		.sensor_w = 1280,
> +		.sensor_h = 1024,
> +		.max_image_w = 1280,
> +		.max_image_h = 1024,
> +		.max_fps = 8,
> +		.reg_val = MT9M111_RM_LOW_POWER_RD,
> +		.reg_mask = MT9M111_RM_PWR_MASK | MT9M111_RM_SKIP2_MASK,
> +	},
> +	[MT9M111_MODE_SXGA_15FPS] = {
> +		.sensor_w = 1280,
> +		.sensor_h = 1024,
> +		.max_image_w = 1280,
> +		.max_image_h = 1024,
> +		.max_fps = 15,
> +		.reg_val = MT9M111_RM_FULL_POWER_RD,
> +		.reg_mask = MT9M111_RM_PWR_MASK | MT9M111_RM_SKIP2_MASK,
> +	},
> +	[MT9M111_MODE_QSXGA_30FPS] = {
> +		.sensor_w = 1280,
> +		.sensor_h = 1024,
> +		.max_image_w = 640,
> +		.max_image_h = 512,
> +		.max_fps = 30,
> +		.reg_val = MT9M111_RM_LOW_POWER_RD | MT9M111_RM_COL_SKIP_2X |
> +			   MT9M111_RM_ROW_SKIP_2X,
> +		.reg_mask = MT9M111_RM_PWR_MASK | MT9M111_RM_SKIP2_MASK,
> +	},
> +};
> +
>  /* Find a data format by a pixel code */
>  static const struct mt9m111_datafmt *mt9m111_find_datafmt(struct mt9m111 *mt9m111,
>  						u32 code)
> @@ -615,6 +667,62 @@ static int mt9m111_set_fmt(struct v4l2_subdev *sd,
>  	return ret;
>  }
>  
> +static const struct mt9m111_mode_info *
> +mt9m111_find_mode(struct mt9m111 *mt9m111, unsigned int req_fps,
> +		  unsigned int width, unsigned int height)
> +{
> +	const struct mt9m111_mode_info *mode;
> +	struct v4l2_rect *sensor_rect = &mt9m111->rect;
> +	unsigned int gap, gap_best = (unsigned int) -1;
> +	int i, best_gap_idx = 1;
> +
> +	/* find best matched fps */
> +	for (i = 0; i < MT9M111_NUM_MODES; i++) {
> +		unsigned int fps = mt9m111_mode_data[i].max_fps;
> +
> +		gap = abs(fps - req_fps);
> +		if (gap < gap_best) {
> +			best_gap_idx = i;
> +			gap_best = gap;
> +		}

Could you use v4l2_find_nearest_size() instead?

Also see below...

> +	}
> +
> +	/*
> +	 * Use context a/b default timing values instead of calculate blanking
> +	 * timing values.
> +	 */
> +	mode = &mt9m111_mode_data[best_gap_idx];
> +	mt9m111->ctx = (best_gap_idx == MT9M111_MODE_QSXGA_30FPS) ? &context_a :
> +								    &context_b;
> +
> +	/*
> +	 * Check if current settings support the fps because fps selection is
> +	 * based on the row/col skipping mechanism which has some restriction.
> +	 */
> +	if (sensor_rect->width != mode->sensor_w ||
> +	    sensor_rect->height != mode->sensor_h ||
> +	    width > mode->max_image_w ||
> +	    height > mode->max_image_h) {
> +		/* reset sensor window size */
> +		mt9m111->rect.left = MT9M111_MIN_DARK_COLS;
> +		mt9m111->rect.top = MT9M111_MIN_DARK_ROWS;
> +		mt9m111->rect.width = mode->sensor_w;
> +		mt9m111->rect.height = mode->sensor_h;
> +
> +		/* reset image size */
> +		mt9m111->width = mode->max_image_w;
> +		mt9m111->height = mode->max_image_h;
> +
> +		dev_warn(mt9m111->subdev.dev,
> +			 "Warning: update image size %dx%d[%dx%d] -> %dx%d[%dx%d]\n",
> +			 sensor_rect->width, sensor_rect->height, width, height,
> +			 mode->sensor_w, mode->sensor_h, mode->max_image_w,
> +			 mode->max_image_h);

I wouldn't expect requesting a particular frame rate to change the sensor
format. The other way around is definitely fine though.

Cc Hans.

> +	}
> +
> +	return mode;
> +}
> +
>  #ifdef CONFIG_VIDEO_ADV_DEBUG
>  static int mt9m111_g_register(struct v4l2_subdev *sd,
>  			      struct v4l2_dbg_register *reg)
> @@ -775,11 +883,16 @@ static int mt9m111_suspend(struct mt9m111 *mt9m111)
>  
>  static void mt9m111_restore_state(struct mt9m111 *mt9m111)
>  {
> +	struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
> +
>  	mt9m111_set_context(mt9m111, mt9m111->ctx);
>  	mt9m111_set_pixfmt(mt9m111, mt9m111->fmt->code);
>  	mt9m111_setup_geometry(mt9m111, &mt9m111->rect,
>  			mt9m111->width, mt9m111->height, mt9m111->fmt->code);
>  	v4l2_ctrl_handler_setup(&mt9m111->hdl);
> +	mt9m111_reg_mask(client, mt9m111->ctx->read_mode,
> +			 mt9m111->current_mode->reg_val,
> +			 mt9m111->current_mode->reg_mask);
>  }
>  
>  static int mt9m111_resume(struct mt9m111 *mt9m111)
> @@ -872,6 +985,50 @@ static const struct v4l2_subdev_core_ops mt9m111_subdev_core_ops = {
>  #endif
>  };
>  
> +static int mt9m111_g_frame_interval(struct v4l2_subdev *sd,
> +				   struct v4l2_subdev_frame_interval *fi)
> +{
> +	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
> +
> +	fi->interval = mt9m111->frame_interval;
> +
> +	return 0;
> +}
> +
> +static int mt9m111_s_frame_interval(struct v4l2_subdev *sd,
> +				   struct v4l2_subdev_frame_interval *fi)
> +{
> +	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
> +	const struct mt9m111_mode_info *mode;
> +	struct v4l2_fract *fract = &fi->interval;
> +	int fps;
> +
> +	if (mt9m111->is_streaming)
> +		return -EBUSY;
> +
> +	if (fi->pad != 0)
> +		return -EINVAL;
> +
> +	if (fract->numerator == 0) {
> +		fract->denominator = 30;
> +		fract->numerator = 1;
> +	}
> +
> +	fps = DIV_ROUND_CLOSEST(fract->denominator, fract->numerator);
> +
> +	/* find best fitting mode */
> +	mode = mt9m111_find_mode(mt9m111, fps, mt9m111->width, mt9m111->height);
> +	if (mode->max_fps != fps) {
> +		fract->denominator = mode->max_fps;
> +		fract->numerator = 1;
> +	}
> +
> +	mt9m111->current_mode = mode;
> +	mt9m111->frame_interval = fi->interval;
> +
> +	return 0;
> +}
> +
>  static int mt9m111_enum_mbus_code(struct v4l2_subdev *sd,
>  		struct v4l2_subdev_pad_config *cfg,
>  		struct v4l2_subdev_mbus_code_enum *code)
> @@ -905,6 +1062,8 @@ static int mt9m111_g_mbus_config(struct v4l2_subdev *sd,
>  static const struct v4l2_subdev_video_ops mt9m111_subdev_video_ops = {
>  	.g_mbus_config	= mt9m111_g_mbus_config,
>  	.s_stream	= mt9m111_s_stream,
> +	.g_frame_interval = mt9m111_g_frame_interval,
> +	.s_frame_interval = mt9m111_s_frame_interval,
>  };
>  
>  static const struct v4l2_subdev_pad_ops mt9m111_subdev_pad_ops = {
> @@ -1021,6 +1180,10 @@ static int mt9m111_probe(struct i2c_client *client,
>  		goto out_hdlfree;
>  #endif
>  
> +	mt9m111->current_mode = &mt9m111_mode_data[MT9M111_MODE_SXGA_15FPS];
> +	mt9m111->frame_interval.numerator = 1;
> +	mt9m111->frame_interval.denominator = mt9m111->current_mode->max_fps;
> +
>  	/* Second stage probe - when a capture adapter is there */
>  	mt9m111->rect.left	= MT9M111_MIN_DARK_COLS;
>  	mt9m111->rect.top	= MT9M111_MIN_DARK_ROWS;

-- 
Kind regards,

Sakari Ailus
e-mail: sakari.ailus@iki.fi

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/6] media: mt9m111: add support to select formats and fps for {Q,SXGA}
  2018-11-16 13:26   ` Sakari Ailus
@ 2018-11-16 13:31     ` Hans Verkuil
  2018-11-16 13:33       ` Sakari Ailus
  0 siblings, 1 reply; 15+ messages in thread
From: Hans Verkuil @ 2018-11-16 13:31 UTC (permalink / raw)
  To: Sakari Ailus, Marco Felsch
  Cc: mchehab, sakari.ailus, robh+dt, mark.rutland, enrico.scholz,
	akinobu.mita, linux-media, devicetree, Michael Grzeschik,
	graphics

On 11/16/2018 02:26 PM, Sakari Ailus wrote:
> Hi Marco, Michael,
> 
> On Mon, Oct 29, 2018 at 07:24:07PM +0100, Marco Felsch wrote:
>> From: Michael Grzeschik <m.grzeschik@pengutronix.de>
>>
>> This patch implements the framerate selection using the skipping and
>> readout power-modi features. The power-modi cut the framerate by half
>> and each context has an independent selection bit. The same applies to
>> the 2x skipping feature.
>>
>> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
>> Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
>>
>> ---
>> Changelog
>>
>> v2:
>> - fix updating read mode register, use mt9m111_reg_mask() to update the
>>   relevant bits only. For this purpose add reg_mask field to
>>   struct mt9m111_mode_info.
>>
>>  drivers/media/i2c/mt9m111.c | 163 ++++++++++++++++++++++++++++++++++++
>>  1 file changed, 163 insertions(+)
>>
>> diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c

<snip>

>> +static const struct mt9m111_mode_info *
>> +mt9m111_find_mode(struct mt9m111 *mt9m111, unsigned int req_fps,
>> +		  unsigned int width, unsigned int height)
>> +{
>> +	const struct mt9m111_mode_info *mode;
>> +	struct v4l2_rect *sensor_rect = &mt9m111->rect;
>> +	unsigned int gap, gap_best = (unsigned int) -1;
>> +	int i, best_gap_idx = 1;
>> +
>> +	/* find best matched fps */
>> +	for (i = 0; i < MT9M111_NUM_MODES; i++) {
>> +		unsigned int fps = mt9m111_mode_data[i].max_fps;
>> +
>> +		gap = abs(fps - req_fps);
>> +		if (gap < gap_best) {
>> +			best_gap_idx = i;
>> +			gap_best = gap;
>> +		}
> 
> Could you use v4l2_find_nearest_size() instead?
> 
> Also see below...
> 
>> +	}
>> +
>> +	/*
>> +	 * Use context a/b default timing values instead of calculate blanking
>> +	 * timing values.
>> +	 */
>> +	mode = &mt9m111_mode_data[best_gap_idx];
>> +	mt9m111->ctx = (best_gap_idx == MT9M111_MODE_QSXGA_30FPS) ? &context_a :
>> +								    &context_b;
>> +
>> +	/*
>> +	 * Check if current settings support the fps because fps selection is
>> +	 * based on the row/col skipping mechanism which has some restriction.
>> +	 */
>> +	if (sensor_rect->width != mode->sensor_w ||
>> +	    sensor_rect->height != mode->sensor_h ||
>> +	    width > mode->max_image_w ||
>> +	    height > mode->max_image_h) {
>> +		/* reset sensor window size */
>> +		mt9m111->rect.left = MT9M111_MIN_DARK_COLS;
>> +		mt9m111->rect.top = MT9M111_MIN_DARK_ROWS;
>> +		mt9m111->rect.width = mode->sensor_w;
>> +		mt9m111->rect.height = mode->sensor_h;
>> +
>> +		/* reset image size */
>> +		mt9m111->width = mode->max_image_w;
>> +		mt9m111->height = mode->max_image_h;
>> +
>> +		dev_warn(mt9m111->subdev.dev,
>> +			 "Warning: update image size %dx%d[%dx%d] -> %dx%d[%dx%d]\n",
>> +			 sensor_rect->width, sensor_rect->height, width, height,
>> +			 mode->sensor_w, mode->sensor_h, mode->max_image_w,
>> +			 mode->max_image_h);
> 
> I wouldn't expect requesting a particular frame rate to change the sensor
> format. The other way around is definitely fine though.
> 
> Cc Hans.

I agree with Sakari. Changing the framerate should never change the format.
When you enumerate framerates those framerates are the allowed framerates
for the mediabus format and the resolution. So changing the framerate should
never modify the format or resolution. Instead, the framerate should be
mapped to a framerate that is valid for the format/resolution combo.

Regards,

	Hans

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 4/6] media: mt9m111: allow to setup pixclk polarity
  2018-10-29 18:24 ` [PATCH v2 4/6] media: mt9m111: allow to setup pixclk polarity Marco Felsch
@ 2018-11-16 13:32   ` Sakari Ailus
  2018-11-26 14:16     ` Marco Felsch
  0 siblings, 1 reply; 15+ messages in thread
From: Sakari Ailus @ 2018-11-16 13:32 UTC (permalink / raw)
  To: Marco Felsch
  Cc: mchehab, sakari.ailus, robh+dt, mark.rutland, enrico.scholz,
	akinobu.mita, linux-media, devicetree, graphics,
	Michael Grzeschik

Hi Marco, Enrico,

On Mon, Oct 29, 2018 at 07:24:08PM +0100, Marco Felsch wrote:
> From: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>
> 
> The chip can be configured to output data transitions on the
> rising or falling edge of PIXCLK (Datasheet R58:1[9]), default is on the
> falling edge.
> 
> Parsing the fw-node is made in a subfunction to bundle all (future)
> dt-parsing / fw-parsing stuff.
> 
> Signed-off-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>
> (m.grzeschik@pengutronix.de: Fix inverting clock. INV_PIX_CLOCK bit is set
> per default. Set bit to 0 (enable mask bit without value) to enable
> falling edge sampling.)
> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
> (m.felsch@pengutronix.de: use fwnode helpers)
> (m.felsch@pengutronix.de: mv fw parsing into own function)
> (m.felsch@pengutronix.de: adapt commit msg)
> Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
> 
> ---
> Changelog:
> 
> v2:
> - make use of fwnode_*() to drop OF dependency and ifdef's
> - mt9m111_g_mbus_config: fix pclk_sample logic which I made due the
>   conversion from Enrico's patch.
> 
>  drivers/media/i2c/mt9m111.c | 46 ++++++++++++++++++++++++++++++++++++-
>  1 file changed, 45 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c
> index e9879e111f58..112eaa5ba917 100644
> --- a/drivers/media/i2c/mt9m111.c
> +++ b/drivers/media/i2c/mt9m111.c
> @@ -15,12 +15,14 @@
>  #include <linux/delay.h>
>  #include <linux/v4l2-mediabus.h>
>  #include <linux/module.h>
> +#include <linux/property.h>
>  
>  #include <media/v4l2-async.h>
>  #include <media/v4l2-clk.h>
>  #include <media/v4l2-common.h>
>  #include <media/v4l2-ctrls.h>
>  #include <media/v4l2-device.h>
> +#include <media/v4l2-fwnode.h>
>  
>  /*
>   * MT9M111, MT9M112 and MT9M131:
> @@ -239,6 +241,8 @@ struct mt9m111 {
>  	const struct mt9m111_datafmt *fmt;
>  	int lastpage;	/* PageMap cache value */
>  	bool is_streaming;
> +	/* user point of view - 0: falling 1: rising edge */
> +	unsigned int pclk_sample:1;

You could use a bool. Up to you.

>  #ifdef CONFIG_MEDIA_CONTROLLER
>  	struct media_pad pad;
>  #endif
> @@ -591,6 +595,10 @@ static int mt9m111_set_pixfmt(struct mt9m111 *mt9m111,
>  		return -EINVAL;
>  	}
>  
> +	/* receiver samples on falling edge, chip-hw default is rising */
> +	if (mt9m111->pclk_sample == 0)
> +		mask_outfmt2 |= MT9M111_OUTFMT_INV_PIX_CLOCK;
> +
>  	ret = mt9m111_reg_mask(client, context_a.output_fmt_ctrl2,
>  			       data_outfmt2, mask_outfmt2);
>  	if (!ret)
> @@ -1051,9 +1059,15 @@ static int mt9m111_s_stream(struct v4l2_subdev *sd, int enable)
>  static int mt9m111_g_mbus_config(struct v4l2_subdev *sd,
>  				struct v4l2_mbus_config *cfg)
>  {
> -	cfg->flags = V4L2_MBUS_MASTER | V4L2_MBUS_PCLK_SAMPLE_RISING |
> +	struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev);
> +
> +	cfg->flags = V4L2_MBUS_MASTER |
>  		V4L2_MBUS_HSYNC_ACTIVE_HIGH | V4L2_MBUS_VSYNC_ACTIVE_HIGH |
>  		V4L2_MBUS_DATA_ACTIVE_HIGH;
> +
> +	cfg->flags |= mt9m111->pclk_sample ? V4L2_MBUS_PCLK_SAMPLE_RISING :
> +		V4L2_MBUS_PCLK_SAMPLE_FALLING;
> +
>  	cfg->type = V4L2_MBUS_PARALLEL;
>  
>  	return 0;
> @@ -1123,6 +1137,32 @@ static int mt9m111_video_probe(struct i2c_client *client)
>  	return ret;
>  }
>  
> +static int mt9m111_probe_fw(struct i2c_client *client, struct mt9m111 *mt9m111)
> +{
> +	struct v4l2_fwnode_endpoint *bus_cfg;
> +	struct fwnode_handle *np;
> +	int ret = 0;
> +
> +	np = fwnode_graph_get_next_endpoint(dev_fwnode(&client->dev), NULL);
> +	if (!np)
> +		return -EINVAL;
> +
> +	bus_cfg = v4l2_fwnode_endpoint_alloc_parse(np);
> +	if (IS_ERR(bus_cfg)) {
> +		ret = PTR_ERR(bus_cfg);
> +		goto out_put_fw;
> +	}
> +
> +	mt9m111->pclk_sample = !!(bus_cfg->bus.parallel.flags &
> +				  V4L2_MBUS_PCLK_SAMPLE_RISING);
> +
> +	v4l2_fwnode_endpoint_free(bus_cfg);
> +
> +out_put_fw:
> +	fwnode_handle_put(np);
> +	return ret;
> +}
> +
>  static int mt9m111_probe(struct i2c_client *client,
>  			 const struct i2c_device_id *did)
>  {
> @@ -1147,6 +1187,10 @@ static int mt9m111_probe(struct i2c_client *client,
>  	/* Default HIGHPOWER context */
>  	mt9m111->ctx = &context_b;
>  
> +	ret = mt9m111_probe_fw(client, mt9m111);
> +	if (ret)
> +		return ret;

Can you do this before v4l2_clk_get()? That'll go anyway, but for now,
you'd need extra error handling for it.

> +
>  	v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops);
>  	mt9m111->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
>  

Please also put this patch after the DT binding changes.

-- 
Kind regards,

Sakari Ailus
e-mail: sakari.ailus@iki.fi

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/6] media: mt9m111: add support to select formats and fps for {Q,SXGA}
  2018-11-16 13:31     ` Hans Verkuil
@ 2018-11-16 13:33       ` Sakari Ailus
  2018-11-26 16:01         ` Marco Felsch
  0 siblings, 1 reply; 15+ messages in thread
From: Sakari Ailus @ 2018-11-16 13:33 UTC (permalink / raw)
  To: Hans Verkuil
  Cc: Marco Felsch, mchehab, sakari.ailus, robh+dt, mark.rutland,
	enrico.scholz, akinobu.mita, linux-media, devicetree,
	Michael Grzeschik, graphics

Hi Hans,

On Fri, Nov 16, 2018 at 02:31:01PM +0100, Hans Verkuil wrote:
> On 11/16/2018 02:26 PM, Sakari Ailus wrote:
> > Hi Marco, Michael,
> > 
> > On Mon, Oct 29, 2018 at 07:24:07PM +0100, Marco Felsch wrote:
> >> From: Michael Grzeschik <m.grzeschik@pengutronix.de>
> >>
> >> This patch implements the framerate selection using the skipping and
> >> readout power-modi features. The power-modi cut the framerate by half
> >> and each context has an independent selection bit. The same applies to
> >> the 2x skipping feature.
> >>
> >> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
> >> Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
> >>
> >> ---
> >> Changelog
> >>
> >> v2:
> >> - fix updating read mode register, use mt9m111_reg_mask() to update the
> >>   relevant bits only. For this purpose add reg_mask field to
> >>   struct mt9m111_mode_info.
> >>
> >>  drivers/media/i2c/mt9m111.c | 163 ++++++++++++++++++++++++++++++++++++
> >>  1 file changed, 163 insertions(+)
> >>
> >> diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c
> 
> <snip>
> 
> >> +static const struct mt9m111_mode_info *
> >> +mt9m111_find_mode(struct mt9m111 *mt9m111, unsigned int req_fps,
> >> +		  unsigned int width, unsigned int height)
> >> +{
> >> +	const struct mt9m111_mode_info *mode;
> >> +	struct v4l2_rect *sensor_rect = &mt9m111->rect;
> >> +	unsigned int gap, gap_best = (unsigned int) -1;
> >> +	int i, best_gap_idx = 1;
> >> +
> >> +	/* find best matched fps */
> >> +	for (i = 0; i < MT9M111_NUM_MODES; i++) {
> >> +		unsigned int fps = mt9m111_mode_data[i].max_fps;
> >> +
> >> +		gap = abs(fps - req_fps);
> >> +		if (gap < gap_best) {
> >> +			best_gap_idx = i;
> >> +			gap_best = gap;
> >> +		}
> > 
> > Could you use v4l2_find_nearest_size() instead?
> > 
> > Also see below...
> > 
> >> +	}
> >> +
> >> +	/*
> >> +	 * Use context a/b default timing values instead of calculate blanking
> >> +	 * timing values.
> >> +	 */
> >> +	mode = &mt9m111_mode_data[best_gap_idx];
> >> +	mt9m111->ctx = (best_gap_idx == MT9M111_MODE_QSXGA_30FPS) ? &context_a :
> >> +								    &context_b;
> >> +
> >> +	/*
> >> +	 * Check if current settings support the fps because fps selection is
> >> +	 * based on the row/col skipping mechanism which has some restriction.
> >> +	 */
> >> +	if (sensor_rect->width != mode->sensor_w ||
> >> +	    sensor_rect->height != mode->sensor_h ||
> >> +	    width > mode->max_image_w ||
> >> +	    height > mode->max_image_h) {
> >> +		/* reset sensor window size */
> >> +		mt9m111->rect.left = MT9M111_MIN_DARK_COLS;
> >> +		mt9m111->rect.top = MT9M111_MIN_DARK_ROWS;
> >> +		mt9m111->rect.width = mode->sensor_w;
> >> +		mt9m111->rect.height = mode->sensor_h;
> >> +
> >> +		/* reset image size */
> >> +		mt9m111->width = mode->max_image_w;
> >> +		mt9m111->height = mode->max_image_h;
> >> +
> >> +		dev_warn(mt9m111->subdev.dev,
> >> +			 "Warning: update image size %dx%d[%dx%d] -> %dx%d[%dx%d]\n",
> >> +			 sensor_rect->width, sensor_rect->height, width, height,
> >> +			 mode->sensor_w, mode->sensor_h, mode->max_image_w,
> >> +			 mode->max_image_h);
> > 
> > I wouldn't expect requesting a particular frame rate to change the sensor
> > format. The other way around is definitely fine though.
> > 
> > Cc Hans.
> 
> I agree with Sakari. Changing the framerate should never change the format.
> When you enumerate framerates those framerates are the allowed framerates
> for the mediabus format and the resolution. So changing the framerate should
> never modify the format or resolution. Instead, the framerate should be
> mapped to a framerate that is valid for the format/resolution combo.

I don't think this is actually documented, at least not for the sub-device
API. I can send a patch.

-- 
Sakari Ailus
e-mail: sakari.ailus@iki.fi

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 4/6] media: mt9m111: allow to setup pixclk polarity
  2018-11-16 13:32   ` Sakari Ailus
@ 2018-11-26 14:16     ` Marco Felsch
  0 siblings, 0 replies; 15+ messages in thread
From: Marco Felsch @ 2018-11-26 14:16 UTC (permalink / raw)
  To: Sakari Ailus
  Cc: mark.rutland, devicetree, Michael Grzeschik, enrico.scholz,
	akinobu.mita, robh+dt, sakari.ailus, mchehab, graphics,
	linux-media

Hi Sakari,

On 18-11-16 15:32, Sakari Ailus wrote:
> Hi Marco, Enrico,
> 
> On Mon, Oct 29, 2018 at 07:24:08PM +0100, Marco Felsch wrote:
> > From: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>
> > 
> > The chip can be configured to output data transitions on the
> > rising or falling edge of PIXCLK (Datasheet R58:1[9]), default is on the
> > falling edge.
> > 
> > Parsing the fw-node is made in a subfunction to bundle all (future)
> > dt-parsing / fw-parsing stuff.
> > 
> > Signed-off-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>
> > (m.grzeschik@pengutronix.de: Fix inverting clock. INV_PIX_CLOCK bit is set
> > per default. Set bit to 0 (enable mask bit without value) to enable
> > falling edge sampling.)
> > Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
> > (m.felsch@pengutronix.de: use fwnode helpers)
> > (m.felsch@pengutronix.de: mv fw parsing into own function)
> > (m.felsch@pengutronix.de: adapt commit msg)
> > Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
> > 
> > ---
> > Changelog:
> > 
> > v2:
> > - make use of fwnode_*() to drop OF dependency and ifdef's
> > - mt9m111_g_mbus_config: fix pclk_sample logic which I made due the
> >   conversion from Enrico's patch.
> > 
> >  drivers/media/i2c/mt9m111.c | 46 ++++++++++++++++++++++++++++++++++++-
> >  1 file changed, 45 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c
> > index e9879e111f58..112eaa5ba917 100644
> > --- a/drivers/media/i2c/mt9m111.c
> > +++ b/drivers/media/i2c/mt9m111.c
> > @@ -15,12 +15,14 @@
> >  #include <linux/delay.h>
> >  #include <linux/v4l2-mediabus.h>
> >  #include <linux/module.h>
> > +#include <linux/property.h>
> >  
> >  #include <media/v4l2-async.h>
> >  #include <media/v4l2-clk.h>
> >  #include <media/v4l2-common.h>
> >  #include <media/v4l2-ctrls.h>
> >  #include <media/v4l2-device.h>
> > +#include <media/v4l2-fwnode.h>
> >  
> >  /*
> >   * MT9M111, MT9M112 and MT9M131:
> > @@ -239,6 +241,8 @@ struct mt9m111 {
> >  	const struct mt9m111_datafmt *fmt;
> >  	int lastpage;	/* PageMap cache value */
> >  	bool is_streaming;
> > +	/* user point of view - 0: falling 1: rising edge */
> > +	unsigned int pclk_sample:1;
> 
> You could use a bool. Up to you.

I find it more precise to use a unsigned int, because using a bool is
more like a statement e.g. invert_pclk.

[Snip]

> >  static int mt9m111_probe(struct i2c_client *client,
> >  			 const struct i2c_device_id *did)
> >  {
> > @@ -1147,6 +1187,10 @@ static int mt9m111_probe(struct i2c_client *client,
> >  	/* Default HIGHPOWER context */
> >  	mt9m111->ctx = &context_b;
> >  
> > +	ret = mt9m111_probe_fw(client, mt9m111);
> > +	if (ret)
> > +		return ret;
> 
> Can you do this before v4l2_clk_get()? That'll go anyway, but for now,
> you'd need extra error handling for it.

Sure, I will move it above v4l2_clk_get().

> > +
> >  	v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops);
> >  	mt9m111->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
> >  
> 
> Please also put this patch after the DT binding changes.

Okay, I will reorder it.

Regards,
Marco

> -- 
> Kind regards,
> 
> Sakari Ailus
> e-mail: sakari.ailus@iki.fi

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/6] media: mt9m111: add support to select formats and fps for {Q,SXGA}
  2018-11-16 13:33       ` Sakari Ailus
@ 2018-11-26 16:01         ` Marco Felsch
  0 siblings, 0 replies; 15+ messages in thread
From: Marco Felsch @ 2018-11-26 16:01 UTC (permalink / raw)
  To: Sakari Ailus
  Cc: Hans Verkuil, mark.rutland, devicetree, Michael Grzeschik,
	enrico.scholz, akinobu.mita, robh+dt, sakari.ailus, mchehab,
	graphics, linux-media

Hi Sakari, Hans,

On 18-11-16 15:33, Sakari Ailus wrote:
> Hi Hans,
> 
> On Fri, Nov 16, 2018 at 02:31:01PM +0100, Hans Verkuil wrote:
> > On 11/16/2018 02:26 PM, Sakari Ailus wrote:
> > > Hi Marco, Michael,
> > > 
> > > On Mon, Oct 29, 2018 at 07:24:07PM +0100, Marco Felsch wrote:
> > >> From: Michael Grzeschik <m.grzeschik@pengutronix.de>
> > >>
> > >> This patch implements the framerate selection using the skipping and
> > >> readout power-modi features. The power-modi cut the framerate by half
> > >> and each context has an independent selection bit. The same applies to
> > >> the 2x skipping feature.
> > >>
> > >> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
> > >> Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
> > >>
> > >> ---
> > >> Changelog
> > >>
> > >> v2:
> > >> - fix updating read mode register, use mt9m111_reg_mask() to update the
> > >>   relevant bits only. For this purpose add reg_mask field to
> > >>   struct mt9m111_mode_info.
> > >>
> > >>  drivers/media/i2c/mt9m111.c | 163 ++++++++++++++++++++++++++++++++++++
> > >>  1 file changed, 163 insertions(+)
> > >>
> > >> diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c
> > 
> > <snip>
> > 
> > >> +static const struct mt9m111_mode_info *
> > >> +mt9m111_find_mode(struct mt9m111 *mt9m111, unsigned int req_fps,
> > >> +		  unsigned int width, unsigned int height)
> > >> +{
> > >> +	const struct mt9m111_mode_info *mode;
> > >> +	struct v4l2_rect *sensor_rect = &mt9m111->rect;
> > >> +	unsigned int gap, gap_best = (unsigned int) -1;
> > >> +	int i, best_gap_idx = 1;
> > >> +
> > >> +	/* find best matched fps */
> > >> +	for (i = 0; i < MT9M111_NUM_MODES; i++) {
> > >> +		unsigned int fps = mt9m111_mode_data[i].max_fps;
> > >> +
> > >> +		gap = abs(fps - req_fps);
> > >> +		if (gap < gap_best) {
> > >> +			best_gap_idx = i;
> > >> +			gap_best = gap;
> > >> +		}
> > > 
> > > Could you use v4l2_find_nearest_size() instead?

I'm try to find the best matching framerate, so I think no.

> > > 
> > > Also see below...
> > > 
> > >> +	}
> > >> +
> > >> +	/*
> > >> +	 * Use context a/b default timing values instead of calculate blanking
> > >> +	 * timing values.
> > >> +	 */
> > >> +	mode = &mt9m111_mode_data[best_gap_idx];
> > >> +	mt9m111->ctx = (best_gap_idx == MT9M111_MODE_QSXGA_30FPS) ? &context_a :
> > >> +								    &context_b;
> > >> +
> > >> +	/*
> > >> +	 * Check if current settings support the fps because fps selection is
> > >> +	 * based on the row/col skipping mechanism which has some restriction.
> > >> +	 */
> > >> +	if (sensor_rect->width != mode->sensor_w ||
> > >> +	    sensor_rect->height != mode->sensor_h ||
> > >> +	    width > mode->max_image_w ||
> > >> +	    height > mode->max_image_h) {
> > >> +		/* reset sensor window size */
> > >> +		mt9m111->rect.left = MT9M111_MIN_DARK_COLS;
> > >> +		mt9m111->rect.top = MT9M111_MIN_DARK_ROWS;
> > >> +		mt9m111->rect.width = mode->sensor_w;
> > >> +		mt9m111->rect.height = mode->sensor_h;
> > >> +
> > >> +		/* reset image size */
> > >> +		mt9m111->width = mode->max_image_w;
> > >> +		mt9m111->height = mode->max_image_h;
> > >> +
> > >> +		dev_warn(mt9m111->subdev.dev,
> > >> +			 "Warning: update image size %dx%d[%dx%d] -> %dx%d[%dx%d]\n",
> > >> +			 sensor_rect->width, sensor_rect->height, width, height,
> > >> +			 mode->sensor_w, mode->sensor_h, mode->max_image_w,
> > >> +			 mode->max_image_h);
> > > 
> > > I wouldn't expect requesting a particular frame rate to change the sensor
> > > format. The other way around is definitely fine though.
> > > 
> > > Cc Hans.
> > 
> > I agree with Sakari. Changing the framerate should never change the format.
> > When you enumerate framerates those framerates are the allowed framerates
> > for the mediabus format and the resolution. So changing the framerate should
> > never modify the format or resolution. Instead, the framerate should be
> > mapped to a framerate that is valid for the format/resolution combo.
> 
> I don't think this is actually documented, at least not for the sub-device
> API. I can send a patch.

Thanks for this hint. I changed it in my v3 so the format isn't touched
anymore.

Kind regards,
Marco

> -- 
> Sakari Ailus
> e-mail: sakari.ailus@iki.fi
> 

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2018-11-27  2:55 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-29 18:24 [PATCH v2 0/6] media: mt9m111 features Marco Felsch
2018-10-29 18:24 ` [PATCH v2 1/6] media: mt9m111: add s_stream callback Marco Felsch
2018-10-29 18:24 ` [PATCH v2 2/6] media: mt9m111: add streaming check to set_fmt Marco Felsch
2018-10-29 18:24 ` [PATCH v2 3/6] media: mt9m111: add support to select formats and fps for {Q,SXGA} Marco Felsch
2018-11-16 13:26   ` Sakari Ailus
2018-11-16 13:31     ` Hans Verkuil
2018-11-16 13:33       ` Sakari Ailus
2018-11-26 16:01         ` Marco Felsch
2018-10-29 18:24 ` [PATCH v2 4/6] media: mt9m111: allow to setup pixclk polarity Marco Felsch
2018-11-16 13:32   ` Sakari Ailus
2018-11-26 14:16     ` Marco Felsch
2018-10-29 18:24 ` [PATCH v2 5/6] dt-bindings: media: mt9m111: adapt documentation to be more clear Marco Felsch
2018-10-30 22:30   ` Rob Herring
2018-10-29 18:24 ` [PATCH v2 6/6] dt-bindings: media: mt9m111: add pclk-sample property Marco Felsch
2018-10-30 22:31   ` Rob Herring

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).