diff options
-rw-r--r-- | drivers/media/platform/tegra/mt9m114.c | 135 | ||||
-rw-r--r-- | include/media/mt9m114.h | 83 |
2 files changed, 193 insertions, 25 deletions
diff --git a/drivers/media/platform/tegra/mt9m114.c b/drivers/media/platform/tegra/mt9m114.c index 0f5dd61670b6..51144366f25e 100644 --- a/drivers/media/platform/tegra/mt9m114.c +++ b/drivers/media/platform/tegra/mt9m114.c @@ -343,6 +343,75 @@ static struct mt9m114_reg mode_1280x960_30fps[] = { {MT9M114_SENSOR_TABLE_END, 0x0000} }; +static struct mt9m114_reg mt9m114_Whitebalance_Auto[] = { + {MT9M114_SENSOR_WORD_WRITE, 0x098E, 0x0000}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC909, 0x02}, + {MT9M114_SENSOR_TABLE_END, 0x0000} +}; + +static struct mt9m114_reg mt9m114_Whitebalance_Cloudy[] = { + {MT9M114_SENSOR_WORD_WRITE, 0x098E, 0x0000}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC909, 0x00}, + {MT9M114_SENSOR_WORD_WRITE, 0xC8F0, 0x1964}, + {MT9M114_SENSOR_TABLE_END, 0x0000} +}; + +static struct mt9m114_reg mt9m114_Whitebalance_Daylight[] = { + {MT9M114_SENSOR_WORD_WRITE, 0x098E, 0x0000}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC909, 0x00}, + {MT9M114_SENSOR_WORD_WRITE, 0xC8F0, 0x1964}, + {MT9M114_SENSOR_TABLE_END, 0x0000} +}; + +static struct mt9m114_reg mt9m114_Whitebalance_Incandescent[] = { + {MT9M114_SENSOR_WORD_WRITE, 0x098E, 0x0000}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC909, 0x00}, + {MT9M114_SENSOR_WORD_WRITE, 0xC8F0, 0x0A8C}, + {MT9M114_SENSOR_TABLE_END, 0x0000} +}; + +static struct mt9m114_reg mt9m114_Whitebalance_Fluorescent[] = { + {MT9M114_SENSOR_WORD_WRITE, 0x098E, 0x0000}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC909, 0x00}, + {MT9M114_SENSOR_WORD_WRITE, 0xC8F0, 0x0E74}, + {MT9M114_SENSOR_TABLE_END, 0x0000} +}; + +static struct mt9m114_reg mt9m114_EV_zero[] = { + {MT9M114_SENSOR_WORD_WRITE, 0x098E, 0xC87A}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC87A, 0x3C}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC87B, 0x1E}, + {MT9M114_SENSOR_TABLE_END, 0x0000} +}; + +static struct mt9m114_reg mt9m114_EV_plus_1[] = { + {MT9M114_SENSOR_WORD_WRITE, 0x098E, 0xC87A}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC87A, 0x42}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC87B, 0x21}, + {MT9M114_SENSOR_TABLE_END, 0x0000} +}; + +static struct mt9m114_reg mt9m114_EV_plus_2[] = { + {MT9M114_SENSOR_WORD_WRITE, 0x098E, 0xC87A}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC87A, 0x48}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC87B, 0x24}, + {MT9M114_SENSOR_TABLE_END, 0x0000} +}; + +static struct mt9m114_reg mt9m114_EV_minus_1[] = { + {MT9M114_SENSOR_WORD_WRITE, 0x098E, 0xC87A}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC87A, 0x36}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC87B, 0x1B}, + {MT9M114_SENSOR_TABLE_END, 0x0000} +}; + +static struct mt9m114_reg mt9m114_EV_minus_2[] = { + {MT9M114_SENSOR_WORD_WRITE, 0x098E, 0xC87A}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC87A, 0x32}, + {MT9M114_SENSOR_BYTE_WRITE, 0xC87B, 0x19}, + {MT9M114_SENSOR_TABLE_END, 0x0000} +}; + struct mt9m114_info { struct miscdevice miscdev_info; struct mt9m114_power_rail power; @@ -741,6 +810,72 @@ static long mt9m114_ioctl(struct file *file, err = mt9m114_set_mode(info, &mode); break; } + case MT9M114_SENSOR_IOCTL_SET_WHITE_BALANCE: + { + u8 whitebalance; + + if (copy_from_user(&whitebalance, (const void __user *)arg, + sizeof(whitebalance))) { + return -EFAULT; + } + + switch (whitebalance) { + case MT9M114_YUV_Whitebalance_Auto: + err = mt9m114_write_table(info, + mt9m114_Whitebalance_Auto); + break; + case MT9M114_YUV_Whitebalance_Daylight: + err = mt9m114_write_table(info, + mt9m114_Whitebalance_Daylight); + break; + case MT9M114_YUV_Whitebalance_CloudyDaylight: + err = mt9m114_write_table(info, + mt9m114_Whitebalance_Cloudy); + break; + case MT9M114_YUV_Whitebalance_Incandescent: + err = mt9m114_write_table(info, + mt9m114_Whitebalance_Incandescent); + break; + case MT9M114_YUV_Whitebalance_Fluorescent: + err = mt9m114_write_table(info, + mt9m114_Whitebalance_Fluorescent); + break; + default: + break; + } + + if (err) + return err; + + return 0; + } + + case MT9M114_SENSOR_IOCTL_SET_EV: + { + short ev; + + if (copy_from_user(&ev, + (const void __user *)arg, + sizeof(short))) + return -EFAULT; + + if (ev == -2) + err = mt9m114_write_table(info, mt9m114_EV_minus_2); + else if (ev == -1) + err = mt9m114_write_table(info, mt9m114_EV_minus_1); + else if (ev == 0) + err = mt9m114_write_table(info, mt9m114_EV_zero); + else if (ev == 1) + err = mt9m114_write_table(info, mt9m114_EV_plus_1); + else if (ev == 2) + err = mt9m114_write_table(info, mt9m114_EV_plus_2); + else + err = -1; + + if (err) + return err; + return 0; + } default: dev_dbg(&info->i2c_client->dev, "INVALID IOCTL\n"); diff --git a/include/media/mt9m114.h b/include/media/mt9m114.h index 1f936119163b..25f27ac62b8c 100644 --- a/include/media/mt9m114.h +++ b/include/media/mt9m114.h @@ -47,6 +47,8 @@ #define MT9M114_SENSOR_IOCTL_SET_AF_MODE _IOW('o', 6, __u8) #define MT9M114_SENSOR_IOCTL_GET_AF_STATUS _IOR('o', 7, __u8) #define MT9M114_SENSOR_IOCTL_SET_CAMERA _IOW('o', 8, __u8) +#define MT9M114_SENSOR_IOCTL_SET_EV _IOW('o', 9, __s16) +#define MT9M114_SENSOR_IOCTL_GET_EV _IOR('o', 10, __s16) struct mt9m114_mode { int xres; @@ -58,39 +60,70 @@ struct mt9m114_modeinfo { int yres; }; -#define AF_CMD_START 0 -#define AF_CMD_ABORT 1 -#define AF_CMD_SET_POSITION 2 -#define AF_CMD_SET_WINDOW_POSITION 3 -#define AF_CMD_SET_WINDOW_SIZE 4 -#define AF_CMD_SET_AFMODE 5 -#define AF_CMD_SET_CAF 6 -#define AF_CMD_GET_AF_STATUS 7 +#define AF_CMD_START 0 +#define AF_CMD_ABORT 1 +#define AF_CMD_SET_POSITION 2 +#define AF_CMD_SET_WINDOW_POSITION 3 +#define AF_CMD_SET_WINDOW_SIZE 4 +#define AF_CMD_SET_AFMODE 5 +#define AF_CMD_SET_CAF 6 +#define AF_CMD_GET_AF_STATUS 7 enum { - YUV_COLOR_EFFECT = 0, - YUV_WHITE_BALANCE, - YUV_SCENE_MODE, + MT9M114_YUV_ColorEffect_Invalid = 0xA000, + MT9M114_YUV_ColorEffect_Aqua, + MT9M114_YUV_ColorEffect_Blackboard, + MT9M114_YUV_ColorEffect_Mono, + MT9M114_YUV_ColorEffect_Negative, + MT9M114_YUV_ColorEffect_None, + MT9M114_YUV_ColorEffect_Posterize, + MT9M114_YUV_ColorEffect_Sepia, + MT9M114_YUV_ColorEffect_Solarize, + MT9M114_YUV_ColorEffect_Whiteboard, + MT9M114_YUV_ColorEffect_Vivid, + MT9M114_YUV_ColorEffect_WaterColor, + MT9M114_YUV_ColorEffect_Vintage, + MT9M114_YUV_ColorEffect_Vintage2, + MT9M114_YUV_ColorEffect_Lomo, + MT9M114_YUV_ColorEffect_Red, + MT9M114_YUV_ColorEffect_Blue, + MT9M114_YUV_ColorEffect_Yellow, + MT9M114_YUV_ColorEffect_Aura, + MT9M114_YUV_ColorEffect_Max }; enum { - YUV_COLOR_EFFECT_INVALID = 0, - YUV_COLOR_EFFECT_NONE, - YUV_COLOR_EFFECT_MONO, - YUV_COLOR_EFFECT_NEGATIVE, - YUV_COLOR_EFFECT_POSTERIZE, - YUV_COLOR_EFFECT_SEPIA, - YUV_COLOR_EFFECT_SOLARIZE, - YUV_COLOR_EFFECT_MAX + MT9M114_YUV_Whitebalance_Invalid = 0, + MT9M114_YUV_Whitebalance_Auto, + MT9M114_YUV_Whitebalance_Incandescent, + MT9M114_YUV_Whitebalance_Fluorescent, + MT9M114_YUV_Whitebalance_WarmFluorescent, + MT9M114_YUV_Whitebalance_Daylight, + MT9M114_YUV_Whitebalance_CloudyDaylight, + MT9M114_YUV_Whitebalance_Shade, + MT9M114_YUV_Whitebalance_Twilight, + MT9M114_YUV_Whitebalance_Custom }; enum { - YUV_WHITE_BALANCE_INVALID = 0, - YUV_WHITE_BALANCE_AUTO, - YUV_WHITE_BALANCE_INCANDESCENT, - YUV_WHITE_BALANCE_FLUORESCENT, - YUV_WHITE_BALANCE_DAYLIGHT, - YUV_WHITE_BALANCE_CUSTOME + MT9M114_YUV_SceneMode_Invalid = 0, + MT9M114_YUV_SceneMode_Auto, + MT9M114_YUV_SceneMode_Action, + MT9M114_YUV_SceneMode_Portrait, + MT9M114_YUV_SceneMode_Landscape, + MT9M114_YUV_SceneMode_Beach, + MT9M114_YUV_SceneMode_Candlelight, + MT9M114_YUV_SceneMode_Fireworks, + MT9M114_YUV_SceneMode_Night, + MT9M114_YUV_SceneMode_NightPortrait, + MT9M114_YUV_SceneMode_Party, + MT9M114_YUV_SceneMode_Snow, + MT9M114_YUV_SceneMode_Sports, + MT9M114_YUV_SceneMode_SteadyPhoto, + MT9M114_YUV_SceneMode_Sunset, + MT9M114_YUV_SceneMode_Theatre, + MT9M114_YUV_SceneMode_Barcode, + MT9M114_YUV_SceneMode_BackLight }; struct mt9m114_sensordata { |