summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/media/platform/tegra/mt9m114.c135
-rw-r--r--include/media/mt9m114.h83
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 {