Thread (17 messages) 17 messages, 5 authors, 2016-10-23

Re: [PATCH v3 1/2] media: Driver for Toshiba et8ek8 5MP sensor

From: Pavel Machek <hidden>
Date: 2016-06-18 15:23:05
Also in: linux-media, lkml

Hi!
The sensor is found in Nokia N900 main camera

Signed-off-by: Ivaylo Dimitrov <redacted>
+/*
+ *
+ * Register access helpers
+ *
+ */
+
+/*
+ * Read a 8/16/32-bit i2c register.  The value is returned in 'val'.
+ * Returns zero if successful, or non-zero otherwise.
+ */
Turn the first comment into "normal" comment style, and merge the two
comments?

+static int et8ek8_i2c_read_reg(struct i2c_client *client, u16 data_length,
+			       u16 reg, u32 *val)
+{
+	int r;
+	struct i2c_msg msg[1];
Uff. That's a bit non-traditional. Use plain "struct i2c_msg msg;" if
you have just one?
+		/* Now we start writing ... */
+		r = et8ek8_i2c_buffered_write_regs(client, regs, cnt);
+
+		/* ... and then check that everything was OK */
+		if (r < 0) {
+			dev_err(&client->dev, "i2c transfer error !!!\n");
+			return r;
I'd reduce number of "!"s in the message.
+		/*
+		 * If we ran into a sleep statement when going through
+		 * the list, this is where we snooze for the required time
+		 */
+		if (next->type == ET8EK8_REG_DELAY) {
+			set_current_state(TASK_UNINTERRUPTIBLE);
+			schedule_timeout(msecs_to_jiffies(next->val));
Open-coded set_current_state(), and no restore, makes me
suspicious. Can msleep() be used here?
+{
+	int r;
+	struct i2c_msg msg[1];
I'd avoid array for single entry. (You'll need to make it &msg below,
but...)
+/*
+ * Return time of one row in microseconds, .8 fixed point format.
+ * If the sensor is not set to any mode, return zero.
+ */
typedef int fixedfp; then use it where .8 fixed point is used?
+static int et8ek8_set_test_pattern(struct et8ek8_sensor *sensor, s32 mode)
+{
...
+	rval = et8ek8_i2c_write_reg(client, ET8EK8_REG_8BIT, 0x111B,
+				    tp_mode << 4);
+	if (rval)
+		goto out;
+
+	rval = et8ek8_i2c_write_reg(client, ET8EK8_REG_8BIT, 0x1121,
+				    cbh_mode << 7);
+	if (rval)
+		goto out;
+
+	rval = et8ek8_i2c_write_reg(client, ET8EK8_REG_8BIT, 0x1124,
+				    cbv_mode << 7);
+	if (rval)
+		goto out;
+
+	rval = et8ek8_i2c_write_reg(client, ET8EK8_REG_8BIT, 0x112C, din_sw);
+	if (rval)
+		goto out;
+
+	rval = et8ek8_i2c_write_reg(client, ET8EK8_REG_8BIT, 0x1420, r1420);
+
+out:
+	return rval;
+}
I'd avoid gotos when all it does is return.
+/*
+ *
+ * Stingray sensor mode settings for Scooby
+ *
+ *
+ */
I'd fix it to normal comment style... and possibly remove it. Can you
understand what it says?
+	},
+	.regs = {
+		{ ET8EK8_REG_8BIT, 0x1239, 0x4F },	/*        */
+		{ ET8EK8_REG_8BIT, 0x1238, 0x02 },	/*        */
+		{ ET8EK8_REG_8BIT, 0x123B, 0x70 },	/*        */
+		{ ET8EK8_REG_8BIT, 0x123A, 0x05 },	/*        */
+		{ ET8EK8_REG_8BIT, 0x121B, 0x63 },	/*        */
+		{ ET8EK8_REG_8BIT, 0x1220, 0x85 },	/*        */
+		{ ET8EK8_REG_8BIT, 0x1221, 0x00 },	/*        */
+		{ ET8EK8_REG_8BIT, 0x1222, 0x58 },	/*        */
+		{ ET8EK8_REG_8BIT, 0x1223, 0x00 },	/*        */
+		{ ET8EK8_REG_8BIT, 0x121D, 0x63 },	/*        */
+		{ ET8EK8_REG_8BIT, 0x125D, 0x83 },	/*        */
+		{ ET8EK8_REG_TERM, 0, 0}
+	}
I'd remove the empty comments...
+struct et8ek8_meta_reglist meta_reglist = {
+	.version = "V14 03-June-2008",
Do we need the version?
+	.reglist = {
+		{ .ptr = &mode1_poweron_mode2_16vga_2592x1968_12_07fps },
+		{ .ptr = &mode1_16vga_2592x1968_13_12fps_dpcm10_8 },
+		{ .ptr = &mode3_4vga_1296x984_29_99fps_dpcm10_8 },
+		{ .ptr = &mode4_svga_864x656_29_88fps },
+		{ .ptr = &mode5_vga_648x492_29_93fps },
+		{ .ptr = &mode2_16vga_2592x1968_3_99fps },
+		{ .ptr = &mode_648x492_5fps },
+		{ .ptr = &mode3_4vga_1296x984_5fps },
+		{ .ptr = &mode_4vga_1296x984_25fps_dpcm10_8 },
+		{ .ptr = 0 }
+	}
+};
I'd say .ptr = NULL.
+struct v4l2_mbus_framefmt;
+struct v4l2_subdev_pad_mbus_code_enum;
+
+struct et8ek8_mode {
+	/* Physical sensor resolution and current image window */
+	__u16 sensor_width;
+	__u16 sensor_height;
+	__u16 sensor_window_origin_x;
+	__u16 sensor_window_origin_y;
+	__u16 sensor_window_width;
+	__u16 sensor_window_height;
If this can not be included from userland, convert __uX -> uX.
+#define ET8EK8_MAX_LEN			32
+struct et8ek8_meta_reglist {
+	char version[ET8EK8_MAX_LEN];
+	union {
+		struct et8ek8_reglist *ptr;
+	} reglist[];
+};
What is going on here? union with single entry is strange...

(And thanks for doing all the work.)

Best regards,
							Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help