11 #include <linux/device.h>
12 #include <linux/i2c.h>
15 #include <linux/slab.h>
17 #include <linux/videodev2.h>
18 #include <linux/module.h>
39 #define MT9T031_CHIP_VERSION 0x00
40 #define MT9T031_ROW_START 0x01
41 #define MT9T031_COLUMN_START 0x02
42 #define MT9T031_WINDOW_HEIGHT 0x03
43 #define MT9T031_WINDOW_WIDTH 0x04
44 #define MT9T031_HORIZONTAL_BLANKING 0x05
45 #define MT9T031_VERTICAL_BLANKING 0x06
46 #define MT9T031_OUTPUT_CONTROL 0x07
47 #define MT9T031_SHUTTER_WIDTH_UPPER 0x08
48 #define MT9T031_SHUTTER_WIDTH 0x09
49 #define MT9T031_PIXEL_CLOCK_CONTROL 0x0a
50 #define MT9T031_FRAME_RESTART 0x0b
51 #define MT9T031_SHUTTER_DELAY 0x0c
52 #define MT9T031_RESET 0x0d
53 #define MT9T031_READ_MODE_1 0x1e
54 #define MT9T031_READ_MODE_2 0x20
55 #define MT9T031_READ_MODE_3 0x21
56 #define MT9T031_ROW_ADDRESS_MODE 0x22
57 #define MT9T031_COLUMN_ADDRESS_MODE 0x23
58 #define MT9T031_GLOBAL_GAIN 0x35
59 #define MT9T031_CHIP_ENABLE 0xF8
61 #define MT9T031_MAX_HEIGHT 1536
62 #define MT9T031_MAX_WIDTH 2048
63 #define MT9T031_MIN_HEIGHT 2
64 #define MT9T031_MIN_WIDTH 18
65 #define MT9T031_HORIZONTAL_BLANK 142
66 #define MT9T031_VERTICAL_BLANK 25
67 #define MT9T031_COLUMN_SKIP 32
68 #define MT9T031_ROW_SKIP 20
93 return i2c_smbus_read_word_swapped(client, reg);
99 return i2c_smbus_write_word_swapped(client, reg, data);
110 return reg_write(client, reg, ret | data);
121 return reg_write(client, reg, ret & ~data);
124 static int set_shutter(
struct i2c_client *client,
const u32 data)
145 *data |= ret & 0xffff;
147 return ret < 0 ? ret : 0;
150 static int mt9t031_idle(
struct i2c_client *client)
161 return ret >= 0 ? 0 : -
EIO;
166 struct i2c_client *client = v4l2_get_subdevdata(sd);
187 if (*source < target + target / 2) {
192 skip =
min(max, *source + target / 2) /
target;
195 *source = target *
skip;
201 static int mt9t031_set_params(
struct i2c_client *client,
210 xbin =
min(xskip, (
u16)3);
211 ybin =
min(yskip, (
u16)3);
240 dev_dbg(&client->
dev,
"skip %u:%u, rect %ux%u@%u:%u\n",
253 if (yskip != mt9t031->
yskip || xskip != mt9t031->
xskip) {
257 ((xbin - 1) << 4) | (xskip - 1));
260 ((ybin - 1) << 4) | (yskip - 1));
262 dev_dbg(&client->
dev,
"new physical left %u, top %u\n",
281 ret = set_shutter(client, mt9t031->
total_h);
294 return ret < 0 ? ret : 0;
300 struct i2c_client *client = v4l2_get_subdevdata(sd);
301 struct mt9t031 *mt9t031 = to_mt9t031(client);
306 soc_camera_limit_side(&rect.
left, &rect.
width,
309 soc_camera_limit_side(&rect.
top, &rect.
height,
312 return mt9t031_set_params(client, &rect, mt9t031->
xskip, mt9t031->
yskip);
317 struct i2c_client *client = v4l2_get_subdevdata(sd);
318 struct mt9t031 *mt9t031 = to_mt9t031(client);
320 a->
c = mt9t031->
rect;
341 struct v4l2_mbus_framefmt *mf)
343 struct i2c_client *client = v4l2_get_subdevdata(sd);
344 struct mt9t031 *mt9t031 = to_mt9t031(client);
346 mf->width = mt9t031->
rect.width / mt9t031->
xskip;
347 mf->height = mt9t031->
rect.height / mt9t031->
yskip;
356 struct v4l2_mbus_framefmt *mf)
358 struct i2c_client *client = v4l2_get_subdevdata(sd);
359 struct mt9t031 *mt9t031 = to_mt9t031(client);
374 return mt9t031_set_params(client, &rect, xskip, yskip);
382 struct v4l2_mbus_framefmt *mf)
394 static int mt9t031_g_chip_ident(
struct v4l2_subdev *sd,
397 struct i2c_client *client = v4l2_get_subdevdata(sd);
398 struct mt9t031 *mt9t031 = to_mt9t031(client);
406 id->ident = mt9t031->
model;
412 #ifdef CONFIG_VIDEO_ADV_DEBUG
413 static int mt9t031_g_register(
struct v4l2_subdev *sd,
416 struct i2c_client *client = v4l2_get_subdevdata(sd);
426 if (reg->
val > 0xffff)
432 static int mt9t031_s_register(
struct v4l2_subdev *sd,
435 struct i2c_client *client = v4l2_get_subdevdata(sd);
453 struct mt9t031,
hdl);
462 (shutter_max / 2 + (mt9t031->
total_h - 1) * (max - min))
469 static int mt9t031_s_ctrl(
struct v4l2_ctrl *ctrl)
472 struct mt9t031,
hdl);
474 struct i2c_client *client = v4l2_get_subdevdata(sd);
502 dev_dbg(&client->
dev,
"Setting gain %d\n", data);
512 1015 + range / 2) / range + 9;
517 data = ((gain - 32) * 16 + 16) / 32 + 80;
520 data = (((gain - 64 + 7) * 32) & 0xff00) | 0x60;
522 dev_dbg(&client->
dev,
"Set gain from 0x%x to 0x%x\n",
533 unsigned int shutter = ((exp->
val - exp->
minimum) * 1048 +
534 range / 2) / range + 1;
537 get_shutter(client, &old);
538 dev_dbg(&client->
dev,
"Set shutter from %u to %u\n",
540 if (set_shutter(client, shutter) < 0)
547 if (set_shutter(client, mt9t031->
total_h) < 0)
561 static int mt9t031_runtime_suspend(
struct device *
dev)
572 static int mt9t031_runtime_resume(
struct device *
dev)
575 struct v4l2_subdev *sd = soc_camera_vdev_to_subdev(vdev);
576 struct i2c_client *client = v4l2_get_subdevdata(sd);
577 struct mt9t031 *mt9t031 = to_mt9t031(client);
586 ((xbin - 1) << 4) | (mt9t031->
xskip - 1));
591 ((ybin - 1) << 4) | (mt9t031->
yskip - 1));
598 static struct dev_pm_ops mt9t031_dev_pm_ops = {
599 .runtime_suspend = mt9t031_runtime_suspend,
600 .runtime_resume = mt9t031_runtime_resume,
605 .pm = &mt9t031_dev_pm_ops,
608 static int mt9t031_s_power(
struct v4l2_subdev *sd,
int on)
610 struct i2c_client *client = v4l2_get_subdevdata(sd);
612 struct video_device *vdev = soc_camera_i2c_to_vdev(client);
619 vdev->
dev.type = &mt9t031_dev_type;
632 static int mt9t031_video_probe(
struct i2c_client *client)
634 struct mt9t031 *mt9t031 = to_mt9t031(client);
638 ret = mt9t031_s_power(&mt9t031->
subdev, 1);
642 ret = mt9t031_idle(client);
644 dev_err(&client->
dev,
"Failed to initialise the camera\n");
657 "No MT9T031 chip detected, register read %x\n", data);
662 dev_info(&client->
dev,
"Detected a MT9T031 chip ID %x\n", data);
667 mt9t031_s_power(&mt9t031->
subdev, 0);
672 static int mt9t031_g_skip_top_lines(
struct v4l2_subdev *sd,
u32 *lines)
674 struct i2c_client *client = v4l2_get_subdevdata(sd);
675 struct mt9t031 *mt9t031 = to_mt9t031(client);
683 .g_volatile_ctrl = mt9t031_g_volatile_ctrl,
684 .s_ctrl = mt9t031_s_ctrl,
688 .g_chip_ident = mt9t031_g_chip_ident,
689 .s_power = mt9t031_s_power,
690 #ifdef CONFIG_VIDEO_ADV_DEBUG
691 .g_register = mt9t031_g_register,
692 .s_register = mt9t031_s_register,
706 static int mt9t031_g_mbus_config(
struct v4l2_subdev *sd,
709 struct i2c_client *client = v4l2_get_subdevdata(sd);
721 static int mt9t031_s_mbus_config(
struct v4l2_subdev *sd,
724 struct i2c_client *client = v4l2_get_subdevdata(sd);
735 .s_stream = mt9t031_s_stream,
736 .s_mbus_fmt = mt9t031_s_fmt,
737 .g_mbus_fmt = mt9t031_g_fmt,
738 .try_mbus_fmt = mt9t031_try_fmt,
739 .s_crop = mt9t031_s_crop,
740 .g_crop = mt9t031_g_crop,
741 .cropcap = mt9t031_cropcap,
742 .enum_mbus_fmt = mt9t031_enum_fmt,
743 .g_mbus_config = mt9t031_g_mbus_config,
744 .s_mbus_config = mt9t031_s_mbus_config,
748 .g_skip_top_lines = mt9t031_g_skip_top_lines,
752 .core = &mt9t031_subdev_core_ops,
753 .video = &mt9t031_subdev_video_ops,
754 .sensor = &mt9t031_subdev_sensor_ops,
757 static int mt9t031_probe(
struct i2c_client *client,
760 struct mt9t031 *mt9t031;
766 dev_err(&client->
dev,
"MT9T031 driver needs platform data\n");
772 "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n");
776 mt9t031 = kzalloc(
sizeof(
struct mt9t031),
GFP_KERNEL);
799 mt9t031->
subdev.ctrl_handler = &mt9t031->
hdl;
800 if (mt9t031->
hdl.error) {
801 int err = mt9t031->
hdl.error;
818 ret = mt9t031_video_probe(client);
827 static int mt9t031_remove(
struct i2c_client *client)
829 struct mt9t031 *mt9t031 = to_mt9t031(client);
844 static struct i2c_driver mt9t031_i2c_driver = {
848 .probe = mt9t031_probe,
849 .remove = mt9t031_remove,
850 .id_table = mt9t031_id,