 +	.pad	= &ov10635_subdev_pad_ops,
 +};
 +
-+static ssize_t ov10635_otp_id_read(struct device *dev,
-+				   struct device_attribute *attr, char *buf)
-+{
-+	struct v4l2_subdev *sd = i2c_get_clientdata(to_i2c_client(dev));
-+	struct i2c_client *client = v4l2_get_subdevdata(sd);
++static void ov10635_otp_id_read(struct i2c_client *client)
++{
++	struct ov10635_priv *priv = to_ov10635(client);
++	int i;
++
++	/* read camera id from OTP memory */
++#if 0 /* disable/reset OTP makes worse: colors become incorect randomly */
 +	u8 id[5];
-+	int i;
-+
-+	/* read camera id from OTP memory */
 +	maxim_reg16_write(client, 0x100, 1);
 +	for (i = 0; i < 5; i++)
 +		maxim_reg16_write(client, 0x3d00 + i, 0x00);

+		dev_err(&client->dev, "Product ID error %x:%x\n", pid, ver);
+		return -ENODEV;
+	}
+
+	dev_info(&client->dev, "ov10635 Product ID %x Manufacturer ID %x\n",
+		 pid, ver);
+
+	/* s/w reset sensor */
+	maxim_reg16_write(client, 0x103, 0x1);

\ No newline at end of file
diff --git a/drivers/media/i2c/soc_camera/max9286_max9271_ov10635.c b/drivers/media/i2c/soc_camera/max9286_max9271_ov10635.c
new file mode 100644
index 0000000..e206800
--- /dev/null
+++ b/drivers/media/i2c/soc_camera/max9286_max9271_ov10635.c
@@ -0,0 +1,623 @@
+/*
+ * MAXIM max9286-max9271 with OmniVision ov10635 sensor camera driver
+ *
