diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2009-06-17 21:16:55 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2009-06-17 21:16:55 -0400 |
commit | 4b337c5f245b6587ba844ac7bb13c313a2912f7b (patch) | |
tree | 999c6a6580b76a083c8efb9dabff709d1c49fcd0 /drivers/media/video/mt9m001.c | |
parent | 492b057c426e4aa747484958e18e9da29003985d (diff) | |
parent | 3fe0344faf7fdcb158bd5c1a9aec960a8d70c8e8 (diff) |
Merge commit 'origin/master' into next
Diffstat (limited to 'drivers/media/video/mt9m001.c')
-rw-r--r-- | drivers/media/video/mt9m001.c | 108 |
1 files changed, 58 insertions, 50 deletions
diff --git a/drivers/media/video/mt9m001.c b/drivers/media/video/mt9m001.c index 684f62fa7897..459c04cbf69d 100644 --- a/drivers/media/video/mt9m001.c +++ b/drivers/media/video/mt9m001.c | |||
@@ -75,53 +75,50 @@ struct mt9m001 { | |||
75 | unsigned char autoexposure; | 75 | unsigned char autoexposure; |
76 | }; | 76 | }; |
77 | 77 | ||
78 | static int reg_read(struct soc_camera_device *icd, const u8 reg) | 78 | static int reg_read(struct i2c_client *client, const u8 reg) |
79 | { | 79 | { |
80 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); | ||
81 | struct i2c_client *client = mt9m001->client; | ||
82 | s32 data = i2c_smbus_read_word_data(client, reg); | 80 | s32 data = i2c_smbus_read_word_data(client, reg); |
83 | return data < 0 ? data : swab16(data); | 81 | return data < 0 ? data : swab16(data); |
84 | } | 82 | } |
85 | 83 | ||
86 | static int reg_write(struct soc_camera_device *icd, const u8 reg, | 84 | static int reg_write(struct i2c_client *client, const u8 reg, |
87 | const u16 data) | 85 | const u16 data) |
88 | { | 86 | { |
89 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); | 87 | return i2c_smbus_write_word_data(client, reg, swab16(data)); |
90 | return i2c_smbus_write_word_data(mt9m001->client, reg, swab16(data)); | ||
91 | } | 88 | } |
92 | 89 | ||
93 | static int reg_set(struct soc_camera_device *icd, const u8 reg, | 90 | static int reg_set(struct i2c_client *client, const u8 reg, |
94 | const u16 data) | 91 | const u16 data) |
95 | { | 92 | { |
96 | int ret; | 93 | int ret; |
97 | 94 | ||
98 | ret = reg_read(icd, reg); | 95 | ret = reg_read(client, reg); |
99 | if (ret < 0) | 96 | if (ret < 0) |
100 | return ret; | 97 | return ret; |
101 | return reg_write(icd, reg, ret | data); | 98 | return reg_write(client, reg, ret | data); |
102 | } | 99 | } |
103 | 100 | ||
104 | static int reg_clear(struct soc_camera_device *icd, const u8 reg, | 101 | static int reg_clear(struct i2c_client *client, const u8 reg, |
105 | const u16 data) | 102 | const u16 data) |
106 | { | 103 | { |
107 | int ret; | 104 | int ret; |
108 | 105 | ||
109 | ret = reg_read(icd, reg); | 106 | ret = reg_read(client, reg); |
110 | if (ret < 0) | 107 | if (ret < 0) |
111 | return ret; | 108 | return ret; |
112 | return reg_write(icd, reg, ret & ~data); | 109 | return reg_write(client, reg, ret & ~data); |
113 | } | 110 | } |
114 | 111 | ||
115 | static int mt9m001_init(struct soc_camera_device *icd) | 112 | static int mt9m001_init(struct soc_camera_device *icd) |
116 | { | 113 | { |
117 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); | 114 | struct i2c_client *client = to_i2c_client(icd->control); |
118 | struct soc_camera_link *icl = mt9m001->client->dev.platform_data; | 115 | struct soc_camera_link *icl = client->dev.platform_data; |
119 | int ret; | 116 | int ret; |
120 | 117 | ||
121 | dev_dbg(icd->vdev->parent, "%s\n", __func__); | 118 | dev_dbg(icd->vdev->parent, "%s\n", __func__); |
122 | 119 | ||
123 | if (icl->power) { | 120 | if (icl->power) { |
124 | ret = icl->power(&mt9m001->client->dev, 1); | 121 | ret = icl->power(&client->dev, 1); |
125 | if (ret < 0) { | 122 | if (ret < 0) { |
126 | dev_err(icd->vdev->parent, | 123 | dev_err(icd->vdev->parent, |
127 | "Platform failed to power-on the camera.\n"); | 124 | "Platform failed to power-on the camera.\n"); |
@@ -131,49 +128,53 @@ static int mt9m001_init(struct soc_camera_device *icd) | |||
131 | 128 | ||
132 | /* The camera could have been already on, we reset it additionally */ | 129 | /* The camera could have been already on, we reset it additionally */ |
133 | if (icl->reset) | 130 | if (icl->reset) |
134 | ret = icl->reset(&mt9m001->client->dev); | 131 | ret = icl->reset(&client->dev); |
135 | else | 132 | else |
136 | ret = -ENODEV; | 133 | ret = -ENODEV; |
137 | 134 | ||
138 | if (ret < 0) { | 135 | if (ret < 0) { |
139 | /* Either no platform reset, or platform reset failed */ | 136 | /* Either no platform reset, or platform reset failed */ |
140 | ret = reg_write(icd, MT9M001_RESET, 1); | 137 | ret = reg_write(client, MT9M001_RESET, 1); |
141 | if (!ret) | 138 | if (!ret) |
142 | ret = reg_write(icd, MT9M001_RESET, 0); | 139 | ret = reg_write(client, MT9M001_RESET, 0); |
143 | } | 140 | } |
144 | /* Disable chip, synchronous option update */ | 141 | /* Disable chip, synchronous option update */ |
145 | if (!ret) | 142 | if (!ret) |
146 | ret = reg_write(icd, MT9M001_OUTPUT_CONTROL, 0); | 143 | ret = reg_write(client, MT9M001_OUTPUT_CONTROL, 0); |
147 | 144 | ||
148 | return ret; | 145 | return ret; |
149 | } | 146 | } |
150 | 147 | ||
151 | static int mt9m001_release(struct soc_camera_device *icd) | 148 | static int mt9m001_release(struct soc_camera_device *icd) |
152 | { | 149 | { |
153 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); | 150 | struct i2c_client *client = to_i2c_client(icd->control); |
154 | struct soc_camera_link *icl = mt9m001->client->dev.platform_data; | 151 | struct soc_camera_link *icl = client->dev.platform_data; |
155 | 152 | ||
156 | /* Disable the chip */ | 153 | /* Disable the chip */ |
157 | reg_write(icd, MT9M001_OUTPUT_CONTROL, 0); | 154 | reg_write(client, MT9M001_OUTPUT_CONTROL, 0); |
158 | 155 | ||
159 | if (icl->power) | 156 | if (icl->power) |
160 | icl->power(&mt9m001->client->dev, 0); | 157 | icl->power(&client->dev, 0); |
161 | 158 | ||
162 | return 0; | 159 | return 0; |
163 | } | 160 | } |
164 | 161 | ||
165 | static int mt9m001_start_capture(struct soc_camera_device *icd) | 162 | static int mt9m001_start_capture(struct soc_camera_device *icd) |
166 | { | 163 | { |
164 | struct i2c_client *client = to_i2c_client(icd->control); | ||
165 | |||
167 | /* Switch to master "normal" mode */ | 166 | /* Switch to master "normal" mode */ |
168 | if (reg_write(icd, MT9M001_OUTPUT_CONTROL, 2) < 0) | 167 | if (reg_write(client, MT9M001_OUTPUT_CONTROL, 2) < 0) |
169 | return -EIO; | 168 | return -EIO; |
170 | return 0; | 169 | return 0; |
171 | } | 170 | } |
172 | 171 | ||
173 | static int mt9m001_stop_capture(struct soc_camera_device *icd) | 172 | static int mt9m001_stop_capture(struct soc_camera_device *icd) |
174 | { | 173 | { |
174 | struct i2c_client *client = to_i2c_client(icd->control); | ||
175 | |||
175 | /* Stop sensor readout */ | 176 | /* Stop sensor readout */ |
176 | if (reg_write(icd, MT9M001_OUTPUT_CONTROL, 0) < 0) | 177 | if (reg_write(client, MT9M001_OUTPUT_CONTROL, 0) < 0) |
177 | return -EIO; | 178 | return -EIO; |
178 | return 0; | 179 | return 0; |
179 | } | 180 | } |
@@ -222,28 +223,29 @@ static unsigned long mt9m001_query_bus_param(struct soc_camera_device *icd) | |||
222 | static int mt9m001_set_crop(struct soc_camera_device *icd, | 223 | static int mt9m001_set_crop(struct soc_camera_device *icd, |
223 | struct v4l2_rect *rect) | 224 | struct v4l2_rect *rect) |
224 | { | 225 | { |
226 | struct i2c_client *client = to_i2c_client(icd->control); | ||
225 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); | 227 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); |
226 | int ret; | 228 | int ret; |
227 | const u16 hblank = 9, vblank = 25; | 229 | const u16 hblank = 9, vblank = 25; |
228 | 230 | ||
229 | /* Blanking and start values - default... */ | 231 | /* Blanking and start values - default... */ |
230 | ret = reg_write(icd, MT9M001_HORIZONTAL_BLANKING, hblank); | 232 | ret = reg_write(client, MT9M001_HORIZONTAL_BLANKING, hblank); |
231 | if (!ret) | 233 | if (!ret) |
232 | ret = reg_write(icd, MT9M001_VERTICAL_BLANKING, vblank); | 234 | ret = reg_write(client, MT9M001_VERTICAL_BLANKING, vblank); |
233 | 235 | ||
234 | /* The caller provides a supported format, as verified per | 236 | /* The caller provides a supported format, as verified per |
235 | * call to icd->try_fmt() */ | 237 | * call to icd->try_fmt() */ |
236 | if (!ret) | 238 | if (!ret) |
237 | ret = reg_write(icd, MT9M001_COLUMN_START, rect->left); | 239 | ret = reg_write(client, MT9M001_COLUMN_START, rect->left); |
238 | if (!ret) | 240 | if (!ret) |
239 | ret = reg_write(icd, MT9M001_ROW_START, rect->top); | 241 | ret = reg_write(client, MT9M001_ROW_START, rect->top); |
240 | if (!ret) | 242 | if (!ret) |
241 | ret = reg_write(icd, MT9M001_WINDOW_WIDTH, rect->width - 1); | 243 | ret = reg_write(client, MT9M001_WINDOW_WIDTH, rect->width - 1); |
242 | if (!ret) | 244 | if (!ret) |
243 | ret = reg_write(icd, MT9M001_WINDOW_HEIGHT, | 245 | ret = reg_write(client, MT9M001_WINDOW_HEIGHT, |
244 | rect->height + icd->y_skip_top - 1); | 246 | rect->height + icd->y_skip_top - 1); |
245 | if (!ret && mt9m001->autoexposure) { | 247 | if (!ret && mt9m001->autoexposure) { |
246 | ret = reg_write(icd, MT9M001_SHUTTER_WIDTH, | 248 | ret = reg_write(client, MT9M001_SHUTTER_WIDTH, |
247 | rect->height + icd->y_skip_top + vblank); | 249 | rect->height + icd->y_skip_top + vblank); |
248 | if (!ret) { | 250 | if (!ret) { |
249 | const struct v4l2_queryctrl *qctrl = | 251 | const struct v4l2_queryctrl *qctrl = |
@@ -312,16 +314,16 @@ static int mt9m001_get_chip_id(struct soc_camera_device *icd, | |||
312 | static int mt9m001_get_register(struct soc_camera_device *icd, | 314 | static int mt9m001_get_register(struct soc_camera_device *icd, |
313 | struct v4l2_dbg_register *reg) | 315 | struct v4l2_dbg_register *reg) |
314 | { | 316 | { |
315 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); | 317 | struct i2c_client *client = to_i2c_client(icd->control); |
316 | 318 | ||
317 | if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0xff) | 319 | if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0xff) |
318 | return -EINVAL; | 320 | return -EINVAL; |
319 | 321 | ||
320 | if (reg->match.addr != mt9m001->client->addr) | 322 | if (reg->match.addr != client->addr) |
321 | return -ENODEV; | 323 | return -ENODEV; |
322 | 324 | ||
323 | reg->size = 2; | 325 | reg->size = 2; |
324 | reg->val = reg_read(icd, reg->reg); | 326 | reg->val = reg_read(client, reg->reg); |
325 | 327 | ||
326 | if (reg->val > 0xffff) | 328 | if (reg->val > 0xffff) |
327 | return -EIO; | 329 | return -EIO; |
@@ -332,15 +334,15 @@ static int mt9m001_get_register(struct soc_camera_device *icd, | |||
332 | static int mt9m001_set_register(struct soc_camera_device *icd, | 334 | static int mt9m001_set_register(struct soc_camera_device *icd, |
333 | struct v4l2_dbg_register *reg) | 335 | struct v4l2_dbg_register *reg) |
334 | { | 336 | { |
335 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); | 337 | struct i2c_client *client = to_i2c_client(icd->control); |
336 | 338 | ||
337 | if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0xff) | 339 | if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0xff) |
338 | return -EINVAL; | 340 | return -EINVAL; |
339 | 341 | ||
340 | if (reg->match.addr != mt9m001->client->addr) | 342 | if (reg->match.addr != client->addr) |
341 | return -ENODEV; | 343 | return -ENODEV; |
342 | 344 | ||
343 | if (reg_write(icd, reg->reg, reg->val) < 0) | 345 | if (reg_write(client, reg->reg, reg->val) < 0) |
344 | return -EIO; | 346 | return -EIO; |
345 | 347 | ||
346 | return 0; | 348 | return 0; |
@@ -416,12 +418,13 @@ static struct soc_camera_ops mt9m001_ops = { | |||
416 | 418 | ||
417 | static int mt9m001_get_control(struct soc_camera_device *icd, struct v4l2_control *ctrl) | 419 | static int mt9m001_get_control(struct soc_camera_device *icd, struct v4l2_control *ctrl) |
418 | { | 420 | { |
421 | struct i2c_client *client = to_i2c_client(icd->control); | ||
419 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); | 422 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); |
420 | int data; | 423 | int data; |
421 | 424 | ||
422 | switch (ctrl->id) { | 425 | switch (ctrl->id) { |
423 | case V4L2_CID_VFLIP: | 426 | case V4L2_CID_VFLIP: |
424 | data = reg_read(icd, MT9M001_READ_OPTIONS2); | 427 | data = reg_read(client, MT9M001_READ_OPTIONS2); |
425 | if (data < 0) | 428 | if (data < 0) |
426 | return -EIO; | 429 | return -EIO; |
427 | ctrl->value = !!(data & 0x8000); | 430 | ctrl->value = !!(data & 0x8000); |
@@ -435,6 +438,7 @@ static int mt9m001_get_control(struct soc_camera_device *icd, struct v4l2_contro | |||
435 | 438 | ||
436 | static int mt9m001_set_control(struct soc_camera_device *icd, struct v4l2_control *ctrl) | 439 | static int mt9m001_set_control(struct soc_camera_device *icd, struct v4l2_control *ctrl) |
437 | { | 440 | { |
441 | struct i2c_client *client = to_i2c_client(icd->control); | ||
438 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); | 442 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); |
439 | const struct v4l2_queryctrl *qctrl; | 443 | const struct v4l2_queryctrl *qctrl; |
440 | int data; | 444 | int data; |
@@ -447,9 +451,9 @@ static int mt9m001_set_control(struct soc_camera_device *icd, struct v4l2_contro | |||
447 | switch (ctrl->id) { | 451 | switch (ctrl->id) { |
448 | case V4L2_CID_VFLIP: | 452 | case V4L2_CID_VFLIP: |
449 | if (ctrl->value) | 453 | if (ctrl->value) |
450 | data = reg_set(icd, MT9M001_READ_OPTIONS2, 0x8000); | 454 | data = reg_set(client, MT9M001_READ_OPTIONS2, 0x8000); |
451 | else | 455 | else |
452 | data = reg_clear(icd, MT9M001_READ_OPTIONS2, 0x8000); | 456 | data = reg_clear(client, MT9M001_READ_OPTIONS2, 0x8000); |
453 | if (data < 0) | 457 | if (data < 0) |
454 | return -EIO; | 458 | return -EIO; |
455 | break; | 459 | break; |
@@ -463,7 +467,7 @@ static int mt9m001_set_control(struct soc_camera_device *icd, struct v4l2_contro | |||
463 | data = ((ctrl->value - qctrl->minimum) * 8 + range / 2) / range; | 467 | data = ((ctrl->value - qctrl->minimum) * 8 + range / 2) / range; |
464 | 468 | ||
465 | dev_dbg(&icd->dev, "Setting gain %d\n", data); | 469 | dev_dbg(&icd->dev, "Setting gain %d\n", data); |
466 | data = reg_write(icd, MT9M001_GLOBAL_GAIN, data); | 470 | data = reg_write(client, MT9M001_GLOBAL_GAIN, data); |
467 | if (data < 0) | 471 | if (data < 0) |
468 | return -EIO; | 472 | return -EIO; |
469 | } else { | 473 | } else { |
@@ -481,8 +485,8 @@ static int mt9m001_set_control(struct soc_camera_device *icd, struct v4l2_contro | |||
481 | data = ((gain - 64) * 7 + 28) / 56 + 96; | 485 | data = ((gain - 64) * 7 + 28) / 56 + 96; |
482 | 486 | ||
483 | dev_dbg(&icd->dev, "Setting gain from %d to %d\n", | 487 | dev_dbg(&icd->dev, "Setting gain from %d to %d\n", |
484 | reg_read(icd, MT9M001_GLOBAL_GAIN), data); | 488 | reg_read(client, MT9M001_GLOBAL_GAIN), data); |
485 | data = reg_write(icd, MT9M001_GLOBAL_GAIN, data); | 489 | data = reg_write(client, MT9M001_GLOBAL_GAIN, data); |
486 | if (data < 0) | 490 | if (data < 0) |
487 | return -EIO; | 491 | return -EIO; |
488 | } | 492 | } |
@@ -500,8 +504,8 @@ static int mt9m001_set_control(struct soc_camera_device *icd, struct v4l2_contro | |||
500 | range / 2) / range + 1; | 504 | range / 2) / range + 1; |
501 | 505 | ||
502 | dev_dbg(&icd->dev, "Setting shutter width from %d to %lu\n", | 506 | dev_dbg(&icd->dev, "Setting shutter width from %d to %lu\n", |
503 | reg_read(icd, MT9M001_SHUTTER_WIDTH), shutter); | 507 | reg_read(client, MT9M001_SHUTTER_WIDTH), shutter); |
504 | if (reg_write(icd, MT9M001_SHUTTER_WIDTH, shutter) < 0) | 508 | if (reg_write(client, MT9M001_SHUTTER_WIDTH, shutter) < 0) |
505 | return -EIO; | 509 | return -EIO; |
506 | icd->exposure = ctrl->value; | 510 | icd->exposure = ctrl->value; |
507 | mt9m001->autoexposure = 0; | 511 | mt9m001->autoexposure = 0; |
@@ -510,7 +514,7 @@ static int mt9m001_set_control(struct soc_camera_device *icd, struct v4l2_contro | |||
510 | case V4L2_CID_EXPOSURE_AUTO: | 514 | case V4L2_CID_EXPOSURE_AUTO: |
511 | if (ctrl->value) { | 515 | if (ctrl->value) { |
512 | const u16 vblank = 25; | 516 | const u16 vblank = 25; |
513 | if (reg_write(icd, MT9M001_SHUTTER_WIDTH, icd->height + | 517 | if (reg_write(client, MT9M001_SHUTTER_WIDTH, icd->height + |
514 | icd->y_skip_top + vblank) < 0) | 518 | icd->y_skip_top + vblank) < 0) |
515 | return -EIO; | 519 | return -EIO; |
516 | qctrl = soc_camera_find_qctrl(icd->ops, V4L2_CID_EXPOSURE); | 520 | qctrl = soc_camera_find_qctrl(icd->ops, V4L2_CID_EXPOSURE); |
@@ -529,8 +533,9 @@ static int mt9m001_set_control(struct soc_camera_device *icd, struct v4l2_contro | |||
529 | * this wasn't our capture interface, so, we wait for the right one */ | 533 | * this wasn't our capture interface, so, we wait for the right one */ |
530 | static int mt9m001_video_probe(struct soc_camera_device *icd) | 534 | static int mt9m001_video_probe(struct soc_camera_device *icd) |
531 | { | 535 | { |
536 | struct i2c_client *client = to_i2c_client(icd->control); | ||
532 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); | 537 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); |
533 | struct soc_camera_link *icl = mt9m001->client->dev.platform_data; | 538 | struct soc_camera_link *icl = client->dev.platform_data; |
534 | s32 data; | 539 | s32 data; |
535 | int ret; | 540 | int ret; |
536 | unsigned long flags; | 541 | unsigned long flags; |
@@ -542,11 +547,11 @@ static int mt9m001_video_probe(struct soc_camera_device *icd) | |||
542 | return -ENODEV; | 547 | return -ENODEV; |
543 | 548 | ||
544 | /* Enable the chip */ | 549 | /* Enable the chip */ |
545 | data = reg_write(icd, MT9M001_CHIP_ENABLE, 1); | 550 | data = reg_write(client, MT9M001_CHIP_ENABLE, 1); |
546 | dev_dbg(&icd->dev, "write: %d\n", data); | 551 | dev_dbg(&icd->dev, "write: %d\n", data); |
547 | 552 | ||
548 | /* Read out the chip version register */ | 553 | /* Read out the chip version register */ |
549 | data = reg_read(icd, MT9M001_CHIP_VERSION); | 554 | data = reg_read(client, MT9M001_CHIP_VERSION); |
550 | 555 | ||
551 | /* must be 0x8411 or 0x8421 for colour sensor and 8431 for bw */ | 556 | /* must be 0x8411 or 0x8421 for colour sensor and 8431 for bw */ |
552 | switch (data) { | 557 | switch (data) { |
@@ -604,10 +609,13 @@ ei2c: | |||
604 | static void mt9m001_video_remove(struct soc_camera_device *icd) | 609 | static void mt9m001_video_remove(struct soc_camera_device *icd) |
605 | { | 610 | { |
606 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); | 611 | struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd); |
612 | struct soc_camera_link *icl = mt9m001->client->dev.platform_data; | ||
607 | 613 | ||
608 | dev_dbg(&icd->dev, "Video %x removed: %p, %p\n", mt9m001->client->addr, | 614 | dev_dbg(&icd->dev, "Video %x removed: %p, %p\n", mt9m001->client->addr, |
609 | icd->dev.parent, icd->vdev); | 615 | icd->dev.parent, icd->vdev); |
610 | soc_camera_video_stop(icd); | 616 | soc_camera_video_stop(icd); |
617 | if (icl->free_bus) | ||
618 | icl->free_bus(icl); | ||
611 | } | 619 | } |
612 | 620 | ||
613 | static int mt9m001_probe(struct i2c_client *client, | 621 | static int mt9m001_probe(struct i2c_client *client, |