diff options
Diffstat (limited to 'drivers/media/video/mt9v011.c')
| -rw-r--r-- | drivers/media/video/mt9v011.c | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/drivers/media/video/mt9v011.c b/drivers/media/video/mt9v011.c index 209ff97261a9..4904d25f689f 100644 --- a/drivers/media/video/mt9v011.c +++ b/drivers/media/video/mt9v011.c | |||
| @@ -12,17 +12,41 @@ | |||
| 12 | #include <asm/div64.h> | 12 | #include <asm/div64.h> |
| 13 | #include <media/v4l2-device.h> | 13 | #include <media/v4l2-device.h> |
| 14 | #include <media/v4l2-chip-ident.h> | 14 | #include <media/v4l2-chip-ident.h> |
| 15 | #include "mt9v011.h" | 15 | #include <media/mt9v011.h> |
| 16 | 16 | ||
| 17 | MODULE_DESCRIPTION("Micron mt9v011 sensor driver"); | 17 | MODULE_DESCRIPTION("Micron mt9v011 sensor driver"); |
| 18 | MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>"); | 18 | MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>"); |
| 19 | MODULE_LICENSE("GPL"); | 19 | MODULE_LICENSE("GPL"); |
| 20 | 20 | ||
| 21 | |||
| 22 | static int debug; | 21 | static int debug; |
| 23 | module_param(debug, int, 0); | 22 | module_param(debug, int, 0); |
| 24 | MODULE_PARM_DESC(debug, "Debug level (0-2)"); | 23 | MODULE_PARM_DESC(debug, "Debug level (0-2)"); |
| 25 | 24 | ||
| 25 | #define R00_MT9V011_CHIP_VERSION 0x00 | ||
| 26 | #define R01_MT9V011_ROWSTART 0x01 | ||
| 27 | #define R02_MT9V011_COLSTART 0x02 | ||
| 28 | #define R03_MT9V011_HEIGHT 0x03 | ||
| 29 | #define R04_MT9V011_WIDTH 0x04 | ||
| 30 | #define R05_MT9V011_HBLANK 0x05 | ||
| 31 | #define R06_MT9V011_VBLANK 0x06 | ||
| 32 | #define R07_MT9V011_OUT_CTRL 0x07 | ||
| 33 | #define R09_MT9V011_SHUTTER_WIDTH 0x09 | ||
| 34 | #define R0A_MT9V011_CLK_SPEED 0x0a | ||
| 35 | #define R0B_MT9V011_RESTART 0x0b | ||
| 36 | #define R0C_MT9V011_SHUTTER_DELAY 0x0c | ||
| 37 | #define R0D_MT9V011_RESET 0x0d | ||
| 38 | #define R1E_MT9V011_DIGITAL_ZOOM 0x1e | ||
| 39 | #define R20_MT9V011_READ_MODE 0x20 | ||
| 40 | #define R2B_MT9V011_GREEN_1_GAIN 0x2b | ||
| 41 | #define R2C_MT9V011_BLUE_GAIN 0x2c | ||
| 42 | #define R2D_MT9V011_RED_GAIN 0x2d | ||
| 43 | #define R2E_MT9V011_GREEN_2_GAIN 0x2e | ||
| 44 | #define R35_MT9V011_GLOBAL_GAIN 0x35 | ||
| 45 | #define RF1_MT9V011_CHIP_ENABLE 0xf1 | ||
| 46 | |||
| 47 | #define MT9V011_VERSION 0x8232 | ||
| 48 | #define MT9V011_REV_B_VERSION 0x8243 | ||
| 49 | |||
| 26 | /* supported controls */ | 50 | /* supported controls */ |
| 27 | static struct v4l2_queryctrl mt9v011_qctrl[] = { | 51 | static struct v4l2_queryctrl mt9v011_qctrl[] = { |
| 28 | { | 52 | { |
| @@ -469,23 +493,6 @@ static int mt9v011_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt | |||
| 469 | return 0; | 493 | return 0; |
| 470 | } | 494 | } |
| 471 | 495 | ||
| 472 | static int mt9v011_s_config(struct v4l2_subdev *sd, int dumb, void *data) | ||
| 473 | { | ||
| 474 | struct mt9v011 *core = to_mt9v011(sd); | ||
| 475 | unsigned *xtal = data; | ||
| 476 | |||
| 477 | v4l2_dbg(1, debug, sd, "s_config called\n"); | ||
| 478 | |||
| 479 | if (xtal) { | ||
| 480 | core->xtal = *xtal; | ||
| 481 | v4l2_dbg(1, debug, sd, "xtal set to %d.%03d MHz\n", | ||
| 482 | *xtal / 1000000, (*xtal / 1000) % 1000); | ||
| 483 | } | ||
| 484 | |||
| 485 | return 0; | ||
| 486 | } | ||
| 487 | |||
| 488 | |||
| 489 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 496 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
| 490 | static int mt9v011_g_register(struct v4l2_subdev *sd, | 497 | static int mt9v011_g_register(struct v4l2_subdev *sd, |
| 491 | struct v4l2_dbg_register *reg) | 498 | struct v4l2_dbg_register *reg) |
| @@ -536,7 +543,6 @@ static const struct v4l2_subdev_core_ops mt9v011_core_ops = { | |||
| 536 | .g_ctrl = mt9v011_g_ctrl, | 543 | .g_ctrl = mt9v011_g_ctrl, |
| 537 | .s_ctrl = mt9v011_s_ctrl, | 544 | .s_ctrl = mt9v011_s_ctrl, |
| 538 | .reset = mt9v011_reset, | 545 | .reset = mt9v011_reset, |
| 539 | .s_config = mt9v011_s_config, | ||
| 540 | .g_chip_ident = mt9v011_g_chip_ident, | 546 | .g_chip_ident = mt9v011_g_chip_ident, |
| 541 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 547 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
| 542 | .g_register = mt9v011_g_register, | 548 | .g_register = mt9v011_g_register, |
| @@ -596,6 +602,14 @@ static int mt9v011_probe(struct i2c_client *c, | |||
| 596 | core->height = 480; | 602 | core->height = 480; |
| 597 | core->xtal = 27000000; /* Hz */ | 603 | core->xtal = 27000000; /* Hz */ |
| 598 | 604 | ||
| 605 | if (c->dev.platform_data) { | ||
| 606 | struct mt9v011_platform_data *pdata = c->dev.platform_data; | ||
| 607 | |||
| 608 | core->xtal = pdata->xtal; | ||
| 609 | v4l2_dbg(1, debug, sd, "xtal set to %d.%03d MHz\n", | ||
| 610 | core->xtal / 1000000, (core->xtal / 1000) % 1000); | ||
| 611 | } | ||
| 612 | |||
| 599 | v4l_info(c, "chip found @ 0x%02x (%s - chip version 0x%04x)\n", | 613 | v4l_info(c, "chip found @ 0x%02x (%s - chip version 0x%04x)\n", |
| 600 | c->addr << 1, c->adapter->name, version); | 614 | c->addr << 1, c->adapter->name, version); |
| 601 | 615 | ||
