From 1c7d6584a7811b7785ae5c1e378f14b5ba0971cf Mon Sep 17 00:00:00 2001 From: takeshi_hoshina Date: Mon, 2 Nov 2020 11:07:33 +0900 Subject: basesystem-jj recipes --- ...media-ar0xxx-add-embedded-line-into-frame.patch | 534 +++++++++++++++++++++ 1 file changed, 534 insertions(+) create mode 100644 bsp/meta-rcar/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0460-media-ar0xxx-add-embedded-line-into-frame.patch (limited to 'bsp/meta-rcar/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0460-media-ar0xxx-add-embedded-line-into-frame.patch') diff --git a/bsp/meta-rcar/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0460-media-ar0xxx-add-embedded-line-into-frame.patch b/bsp/meta-rcar/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0460-media-ar0xxx-add-embedded-line-into-frame.patch new file mode 100644 index 00000000..67dfa466 --- /dev/null +++ b/bsp/meta-rcar/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0460-media-ar0xxx-add-embedded-line-into-frame.patch @@ -0,0 +1,534 @@ +From 093694680d2fc99df1dc5118b78f80f34a0e3f4b Mon Sep 17 00:00:00 2001 +From: Vladimir Barinov +Date: Mon, 30 Dec 2019 19:48:34 +0300 +Subject: [PATCH] media: ar0xxx: add embedded line into frame + +This adds embedded line into frame for further parsing in ISP + +Signed-off-by: Petr Nechaev +Signed-off-by: Vladimir Barinov +--- + drivers/media/i2c/soc_camera/ar0140.c | 49 +++++++++++++++++++++---- + drivers/media/i2c/soc_camera/ar0140.h | 21 ++++++----- + drivers/media/i2c/soc_camera/ar0143.c | 53 +++++++++++++++++++++++++--- + drivers/media/i2c/soc_camera/ar0143.h | 17 +++++---- + drivers/media/i2c/soc_camera/ar0143_custom.h | 6 +--- + drivers/media/i2c/soc_camera/ar0143_rev1.h | 8 +---- + drivers/media/i2c/soc_camera/ar0220.h | 12 ++++--- + drivers/media/i2c/soc_camera/ar0233.c | 31 ++++++++++------ + drivers/media/i2c/soc_camera/ar0233.h | 12 ++++--- + drivers/media/i2c/soc_camera/ar0233_rev1.h | 2 +- + drivers/media/i2c/soc_camera/ar0233_rev2.h | 2 +- + 11 files changed, 150 insertions(+), 63 deletions(-) + +diff --git a/drivers/media/i2c/soc_camera/ar0140.c b/drivers/media/i2c/soc_camera/ar0140.c +index ec2b2e5..ceb2c31 100644 +--- a/drivers/media/i2c/soc_camera/ar0140.c ++++ b/drivers/media/i2c/soc_camera/ar0140.c +@@ -36,6 +36,7 @@ struct ar0140_priv { + struct v4l2_rect rect; + int init_complete; + u8 id[6]; ++ bool emb_enable; + /* serializers */ + int max9286_addr; + int max9271_addr; +@@ -115,7 +116,7 @@ static int ar0140_set_window(struct v4l2_subdev *sd) + reg16_write16(client, 0x3008, priv->rect.left + priv->rect.width - 1 + AR0140_X_START); + /* vert crop start */ + reg16_write16(client, 0x3002, priv->rect.top + AR0140_Y_START); +- /* vert crop end */ ++ /* limit window for embedded data/stats */ + reg16_write16(client, 0x3006, priv->rect.top + priv->rect.height - 1 + AR0140_Y_START); + + return 0; +@@ -235,12 +236,18 @@ static int ar0140_get_selection(struct v4l2_subdev *sd, + case V4L2_SEL_TGT_CROP_DEFAULT: + sel->r.left = 0; + sel->r.top = 0; +- sel->r.width = AR0140_MAX_WIDTH; +- sel->r.height = AR0140_MAX_HEIGHT; ++ sel->r.width = AR0140_DEFAULT_WIDTH; ++ sel->r.height = AR0140_DEFAULT_HEIGHT; + return 0; + case V4L2_SEL_TGT_CROP: + sel->r = priv->rect; + return 0; ++ case V4L2_SEL_TGT_COMPOSE_BOUNDS: ++ sel->r.left = 0; ++ sel->r.top = AR0140_EMB_PADDED; ++ sel->r.width = priv->rect.width; ++ sel->r.height = priv->rect.height; ++ return 0; + default: + return -EINVAL; + } +@@ -402,7 +409,35 @@ static ssize_t ar0140_otp_id_show(struct device *dev, + priv->id[0], priv->id[1], priv->id[2], priv->id[3], priv->id[4], priv->id[5]); + } + ++static ssize_t ar0140_emb_enable_store(struct device *dev, ++ struct device_attribute *attr, const char *buf, size_t count) ++{ ++ struct v4l2_subdev *sd = i2c_get_clientdata(to_i2c_client(dev)); ++ struct i2c_client *client = v4l2_get_subdevdata(sd); ++ struct ar0140_priv *priv = to_ar0140(client); ++ u32 val; ++ ++ if (sscanf(buf, "%u\n", &val) != 1) ++ return -EINVAL; ++ priv->emb_enable = !!val; ++ ++ reg16_write16(client, 0x3064, priv->emb_enable ? 0x1982 : 0x1802); ++ ++ return count; ++} ++ ++static ssize_t ar0140_emb_enable_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct v4l2_subdev *sd = i2c_get_clientdata(to_i2c_client(dev)); ++ struct i2c_client *client = v4l2_get_subdevdata(sd); ++ struct ar0140_priv *priv = to_ar0140(client); ++ ++ return snprintf(buf, 4, "%d\n", priv->emb_enable); ++} ++ + static DEVICE_ATTR(otp_id_ar0140, S_IRUGO, ar0140_otp_id_show, NULL); ++static DEVICE_ATTR(emb_enable_ar0140, S_IRUGO|S_IWUSR, ar0140_emb_enable_show, ar0140_emb_enable_store); + + static int ar0140_initialize(struct i2c_client *client) + { +@@ -589,14 +624,15 @@ static int ar0140_probe(struct i2c_client *client, + + priv->rect.left = 0; + priv->rect.top = 0; +- priv->rect.width = AR0140_MAX_WIDTH; +- priv->rect.height = AR0140_MAX_HEIGHT; ++ priv->rect.width = AR0140_DEFAULT_WIDTH; ++ priv->rect.height = AR0140_DEFAULT_HEIGHT; + + ret = v4l2_async_register_subdev(&priv->sd); + if (ret) + goto cleanup; + +- if (device_create_file(&client->dev, &dev_attr_otp_id_ar0140) != 0) { ++ if (device_create_file(&client->dev, &dev_attr_otp_id_ar0140) != 0 || ++ device_create_file(&client->dev, &dev_attr_emb_enable_ar0140) != 0) { + dev_err(&client->dev, "sysfs otp_id entry creation failed\n"); + goto cleanup; + } +@@ -620,6 +656,7 @@ static int ar0140_remove(struct i2c_client *client) + { + struct ar0140_priv *priv = i2c_get_clientdata(client); + ++ device_remove_file(&client->dev, &dev_attr_emb_enable_ar0140); + device_remove_file(&client->dev, &dev_attr_otp_id_ar0140); + v4l2_async_unregister_subdev(&priv->sd); + media_entity_cleanup(&priv->sd.entity); +diff --git a/drivers/media/i2c/soc_camera/ar0140.h b/drivers/media/i2c/soc_camera/ar0140.h +index 2993478..08ce1ca 100644 +--- a/drivers/media/i2c/soc_camera/ar0140.h ++++ b/drivers/media/i2c/soc_camera/ar0140.h +@@ -12,20 +12,23 @@ + //#define AR0140_DISPLAY_PATTERN_FIXED + //#define AR0140_DISPLAY_PATTERN_COLOR_BAR + +-//#define AR0140_EMBEDDED_LINE ++#define AR0140_DEFAULT_WIDTH 1280 ++#define AR0140_DEFAULT_HEIGHT 800 + +-#define AR0140_MAX_WIDTH 1280 +-#define AR0140_MAX_HEIGHT 800 ++#define AR0140_EMB_LINES 4 ++#define AR0140_EMB_PADDED (priv->emb_enable ? AR0140_EMB_LINES + 30 : 0) /* embedded data (SOF) and stats (EOF) + post padding */ + + #define AR0140_DELAY 0xffff + ++#define AR0140_MAX_WIDTH 1280 ++#define AR0140_MAX_HEIGHT 800 + #define AR0140_SENSOR_WIDTH 1280 + #define AR0140_SENSOR_HEIGHT 800 + +-#define AR0140_X_START ((AR0140_SENSOR_WIDTH - AR0140_MAX_WIDTH) / 2) +-#define AR0140_Y_START ((AR0140_SENSOR_HEIGHT - AR0140_MAX_HEIGHT) / 2) +-#define AR0140_X_END (AR0140_X_START + AR0140_MAX_WIDTH - 1) +-#define AR0140_Y_END (AR0140_Y_START + AR0140_MAX_HEIGHT + 1) /* must be +1 and not -1 or 2 lines missed - bug in imager? */ ++#define AR0140_X_START ((AR0140_SENSOR_WIDTH - AR0140_DEFAULT_WIDTH) / 2) ++#define AR0140_Y_START ((AR0140_SENSOR_HEIGHT - AR0140_DEFAULT_HEIGHT) / 2) ++#define AR0140_X_END (AR0140_X_START + AR0140_DEFAULT_WIDTH - 1) ++#define AR0140_Y_END (AR0140_Y_START + AR0140_DEFAULT_HEIGHT + 1) /* must be +1 and not -1 or 2 lines missed - bug in imager? */ + + struct ar0140_reg { + u16 reg; +@@ -395,11 +398,7 @@ static const struct ar0140_reg ar0140_regs_wizard[] = { + {0x3086, 0x2C2C}, + {0x3086, 0x2C00}, + /* End Sequencer */ +-#ifdef AR0140_EMBEDDED_LINE +-{0x3064, 0x1982}, // SMIA_TEST +-#else + {0x3064, 0x1802}, // SMIA_TEST +-#endif + /* PCLK=27Mhz/0x2 *0x30 /1/0x10 - TI serializers */ + {0x302A, 0x0010}, // vt_pix_clk_div + {0x302E, 0x0002}, // pre_pll_clk_div +diff --git a/drivers/media/i2c/soc_camera/ar0143.c b/drivers/media/i2c/soc_camera/ar0143.c +index 0c4b970..bf8d717 100644 +--- a/drivers/media/i2c/soc_camera/ar0143.c ++++ b/drivers/media/i2c/soc_camera/ar0143.c +@@ -38,6 +38,7 @@ struct ar0143_priv { + int init_complete; + u8 id[6]; + int setup; ++ bool emb_enable; + /* serializers */ + int max9286_addr; + int max9271_addr; +@@ -265,12 +270,18 @@ static int ar0143_get_selection(struct v4l2_subdev *sd, + case V4L2_SEL_TGT_CROP_DEFAULT: + sel->r.left = 0; + sel->r.top = 0; +- sel->r.width = AR0143_MAX_WIDTH; +- sel->r.height = AR0143_MAX_HEIGHT; ++ sel->r.width = AR0143_DEFAULT_WIDTH; ++ sel->r.height = AR0143_DEFAULT_HEIGHT; + return 0; + case V4L2_SEL_TGT_CROP: + sel->r = priv->rect; + return 0; ++ case V4L2_SEL_TGT_COMPOSE_BOUNDS: ++ sel->r.left = 0; ++ sel->r.top = AR0143_EMB_PADDED; ++ sel->r.width = priv->rect.width; ++ sel->r.height = priv->rect.height; ++ return 0; + default: + return -EINVAL; + } +@@ -436,7 +449,35 @@ static ssize_t ar0143_otp_id_show(struct device *dev, + priv->id[0], priv->id[1], priv->id[2], priv->id[3], priv->id[4], priv->id[5]); + } + ++static ssize_t ar0143_emb_enable_store(struct device *dev, ++ struct device_attribute *attr, const char *buf, size_t count) ++{ ++ struct v4l2_subdev *sd = i2c_get_clientdata(to_i2c_client(dev)); ++ struct i2c_client *client = v4l2_get_subdevdata(sd); ++ struct ar0143_priv *priv = to_ar0143(client); ++ u32 val; ++ ++ if (sscanf(buf, "%u\n", &val) != 1) ++ return -EINVAL; ++ priv->emb_enable = !!val; ++ ++ reg16_write16(client, 0x3064, priv->emb_enable ? 0x1982 : 0x1802); ++ ++ return count; ++} ++ ++static ssize_t ar0143_emb_enable_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct v4l2_subdev *sd = i2c_get_clientdata(to_i2c_client(dev)); ++ struct i2c_client *client = v4l2_get_subdevdata(sd); ++ struct ar0143_priv *priv = to_ar0143(client); ++ ++ return snprintf(buf, 4, "%d\n", priv->emb_enable); ++} ++ + static DEVICE_ATTR(otp_id_ar0143, S_IRUGO, ar0143_otp_id_show, NULL); ++static DEVICE_ATTR(emb_enable_ar0143, S_IRUGO|S_IWUSR, ar0143_emb_enable_show, ar0143_emb_enable_store); + + static int ar0143_initialize(struct i2c_client *client) + { +@@ -632,14 +673,15 @@ static int ar0143_probe(struct i2c_client *client, + + priv->rect.left = 0; + priv->rect.top = 0; +- priv->rect.width = AR0143_MAX_WIDTH; +- priv->rect.height = AR0143_MAX_HEIGHT; ++ priv->rect.width = AR0143_DEFAULT_WIDTH; ++ priv->rect.height = AR0143_DEFAULT_HEIGHT; + + ret = v4l2_async_register_subdev(&priv->sd); + if (ret) + goto cleanup; + +- if (device_create_file(&client->dev, &dev_attr_otp_id_ar0143) != 0) { ++ if (device_create_file(&client->dev, &dev_attr_otp_id_ar0143) != 0|| ++ device_create_file(&client->dev, &dev_attr_emb_enable_ar0143) != 0) { + dev_err(&client->dev, "sysfs otp_id entry creation failed\n"); + goto cleanup; + } +@@ -664,6 +706,7 @@ static int ar0143_remove(struct i2c_client *client) + struct ar0143_priv *priv = i2c_get_clientdata(client); + + device_remove_file(&client->dev, &dev_attr_otp_id_ar0143); ++ device_remove_file(&client->dev, &dev_attr_emb_enable_ar0143); + v4l2_async_unregister_subdev(&priv->sd); + media_entity_cleanup(&priv->sd.entity); + v4l2_ctrl_handler_free(&priv->hdl); +diff --git a/drivers/media/i2c/soc_camera/ar0143.h b/drivers/media/i2c/soc_camera/ar0143.h +index 14d8175..d14ecae 100644 +--- a/drivers/media/i2c/soc_camera/ar0143.h ++++ b/drivers/media/i2c/soc_camera/ar0143.h +@@ -12,20 +12,23 @@ + //#define AR0143_DISPLAY_PATTERN_FIXED + //#define AR0143_DISPLAY_PATTERN_COLOR_BAR + +-//#define AR0143_EMBEDDED_LINE ++#define AR0143_DEFAULT_WIDTH 1280 ++#define AR0143_DEFAULT_HEIGHT 960 + +-#define AR0143_MAX_WIDTH 1344 +-#define AR0143_MAX_HEIGHT 968 ++#define AR0143_EMB_LINES 8 ++#define AR0143_EMB_PADDED (priv->emb_enable ? AR0143_EMB_LINES + 30 : 0) /* embedded data (SOF) and stats (EOF) + post padding */ + + #define AR0143_DELAY 0xffff + ++#define AR0143_MAX_WIDTH 1344 ++#define AR0143_MAX_HEIGHT 968 + #define AR0143_SENSOR_WIDTH 1344 + #define AR0143_SENSOR_HEIGHT 968 + +-#define AR0143_X_START ((AR0143_SENSOR_WIDTH - AR0143_MAX_WIDTH) / 2) +-#define AR0143_Y_START ((AR0143_SENSOR_HEIGHT - AR0143_MAX_HEIGHT) / 2) +-#define AR0143_X_END (AR0143_X_START + AR0143_MAX_WIDTH - 1) +-#define AR0143_Y_END (AR0143_Y_START + AR0143_MAX_HEIGHT + 1) /* must be +1 and not -1 or 2 lines missed - bug in imager? */ ++#define AR0143_X_START ((AR0143_SENSOR_WIDTH - AR0143_DEFAULT_WIDTH) / 2) ++#define AR0143_Y_START ((AR0143_SENSOR_HEIGHT - AR0143_DEFAULT_HEIGHT) / 2) ++#define AR0143_X_END (AR0143_X_START + AR0143_DEFAULT_WIDTH - 1) ++#define AR0143_Y_END (AR0143_Y_START + AR0143_DEFAULT_HEIGHT + 1) /* must be +1 and not -1 or 2 lines missed - bug in imager? */ + + struct ar0143_reg { + u16 reg; +diff --git a/drivers/media/i2c/soc_camera/ar0143_custom.h b/drivers/media/i2c/soc_camera/ar0143_custom.h +index e5bc37a..8e21416 100644 +--- a/drivers/media/i2c/soc_camera/ar0143_custom.h ++++ b/drivers/media/i2c/soc_camera/ar0143_custom.h +@@ -368,11 +368,7 @@ static const struct ar0143_reg ar0143_regs_wizard_custom[] = { + {0x3180, 0x0080}, // RESERVED_MFR_3180 + {0x33E4, 0x0080}, // RESERVED_MFR_33E4 + {0x33E0, 0x0880}, // TEST_ASIL_ROWS +-#ifdef AR0143_EMBEDDED_LINE +-{0x3064, 0x1982}, // SMIA_TEST +-#else + {0x3064, 0x1802}, // SMIA_TEST +-#endif + {0x3004, 0x0000}, // X_ADDR_START_ + {0x3008, 0x053F}, // X_ADDR_END_ + {0x3002, 0x0000}, // Y_ADDR_START_ +@@ -455,7 +451,7 @@ static const struct ar0143_reg ar0143_regs_wizard_custom[] = { + {0x31B8, 0x404B}, // RESERVED_MFR_31B8 + {0x31BA, 0x020A}, // RESERVED_MFR_31BA + {0x31BC, 0x0C08}, // RESERVED_MFR_31BC +-{0x3040, 0x0000}, // READ_MODE ++{0x3040, 0x0005}, // READ_MODE + {0x30BA, 0x01E2}, // DIGITAL_CTRL + {0x3082, 0x0008}, // OPERATION_MODE_CTRL + {0x3044, 0x0400}, // DARK_CONTROL +diff --git a/drivers/media/i2c/soc_camera/ar0143_rev1.h b/drivers/media/i2c/soc_camera/ar0143_rev1.h +index ec941d8..21cb4bf 100644 +--- a/drivers/media/i2c/soc_camera/ar0143_rev1.h ++++ b/drivers/media/i2c/soc_camera/ar0143_rev1.h +@@ -390,7 +390,7 @@ static const struct ar0143_reg ar0143_regs_wizard_rev1[] = { + #ifdef AR0143_Readout_Mode_Configuration + {0x30A2, 0x0001}, // X_ODD_INC_ + {0x30A6, 0x0001}, // Y_ODD_INC_ +-{0x3040, 0x0000}, // READ_MODE ++{0x3040, 0x0005}, // READ_MODE + {0x3082, 0x0008}, // OPERATION_MODE_CTRL: 3exp + {0x30BA, 0x01E2}, // DIGITAL_CTRL: 3exp max + {0x3044, 0x0400}, // DARK_CONTROL +@@ -400,12 +400,6 @@ static const struct ar0143_reg ar0143_regs_wizard_rev1[] = { + {0x33E4, 0x0080}, // RESERVED_MFR_33E4 + #endif /* AR0143_Readout_Mode_Configuration */ + +-#ifdef AR0143_HDR_Readout_Mode_Configuration +-#ifdef AR0143_EMBEDDED_LINE +-{0x3064, 0x1982}, // SMIA_TEST: enable emb data and stats +-#endif +-#endif /* AR0143_HDR_Readout_Mode_Configuration */ +- + #ifdef AR0143_Full_Res_FOV + {0x31B0, 0x0006}, // FRAME_PREAMBLE + {0x31B2, 0x0045}, // LINE_PREAMBLE +diff --git a/drivers/media/i2c/soc_camera/ar0220.h b/drivers/media/i2c/soc_camera/ar0220.h +index 59a949e..f90deae 100644 +--- a/drivers/media/i2c/soc_camera/ar0220.h ++++ b/drivers/media/i2c/soc_camera/ar0220.h +@@ -12,16 +12,18 @@ + //#define AR0220_DISPLAY_PATTERN_FIXED + //#define AR0220_DISPLAY_PATTERN_COLOR_BAR + ++#define AR0220_DEFAULT_WIDTH 1792 ++#define AR0220_DEFAULT_HEIGHT 944 ++ + #define AR0220_MAX_WIDTH 1828 + #define AR0220_MAX_HEIGHT 948 +- + #define AR0220_SENSOR_WIDTH 1828 + #define AR0220_SENSOR_HEIGHT 948 + +-#define AR0220_X_START ((AR0220_SENSOR_WIDTH - AR0220_MAX_WIDTH) / 2) +-#define AR0220_Y_START ((AR0220_SENSOR_HEIGHT - AR0220_MAX_HEIGHT) / 2) +-#define AR0220_X_END (AR0220_X_START + AR0220_MAX_WIDTH - 1) +-#define AR0220_Y_END (AR0220_Y_START + AR0220_MAX_HEIGHT - 1) ++#define AR0220_X_START ((AR0220_SENSOR_WIDTH - AR0220_DEFAULT_WIDTH) / 2) ++#define AR0220_Y_START ((AR0220_SENSOR_HEIGHT - AR0220_DEFAULT_HEIGHT) / 2) ++#define AR0220_X_END (AR0220_X_START + AR0220_DEFAULT_WIDTH - 1) ++#define AR0220_Y_END (AR0220_Y_START + AR0220_DEFAULT_HEIGHT - 1) + + #include "ar0220_rev2.h" + #include "ar0220_rev3.h" +diff --git a/drivers/media/i2c/soc_camera/ar0233.c b/drivers/media/i2c/soc_camera/ar0233.c +index b62fb77..cdd2d8a 100644 +--- a/drivers/media/i2c/soc_camera/ar0233.c ++++ b/drivers/media/i2c/soc_camera/ar0233.c +@@ -21,9 +21,10 @@ + #include + + #define AR_DELAY 0xffff +-static int AR_MAX_WIDTH; +-static int AR_MAX_HEIGHT; +-#define AR_MAX_HEIGHT_EMB (AR_MAX_HEIGHT + priv->emb_enable * 4) /* embedded data (SOF) and stats (EOF) */ ++static int AR_MAX_WIDTH, AR_DEFAULT_WIDTH; ++static int AR_MAX_HEIGHT, AR_DEFAULT_HEIGHT; ++#define AR_EMB_LINES 8 ++#define AR_EMB_PADDED (priv->emb_enable ? AR_EMB_LINES : 0) /* embedded data (SOF) and stats (EOF) */ + static int AR_X_START; + static int AR_Y_START; + static int AR_X_END; +@@ -124,7 +125,7 @@ static int ar0233_set_window(struct v4l2_subdev *sd) + reg16_write16(client, 0x3002, priv->rect.top + AR_Y_START); + /* vert crop end */ + /* limit window for embedded data/stats */ +- reg16_write16(client, 0x3006, priv->rect.top + priv->rect.height - 1 + AR_Y_START - priv->emb_enable * 4); ++ reg16_write16(client, 0x3006, priv->rect.top + priv->rect.height - 1 + AR_Y_START); + + return 0; + }; +@@ -210,7 +211,7 @@ static int ar0233_set_selection(struct v4l2_subdev *sd, + rect->height = ALIGN(rect->height, 2); + + if ((rect->left + rect->width > AR_MAX_WIDTH) || +- (rect->top + rect->height > AR_MAX_HEIGHT_EMB)) ++ (rect->top + rect->height > AR_MAX_HEIGHT)) + *rect = priv->rect; + + priv->rect.left = rect->left; +@@ -238,17 +239,23 @@ static int ar0233_get_selection(struct v4l2_subdev *sd, + sel->r.left = 0; + sel->r.top = 0; + sel->r.width = AR_MAX_WIDTH; +- sel->r.height = AR_MAX_HEIGHT_EMB; ++ sel->r.height = AR_MAX_HEIGHT; + return 0; + case V4L2_SEL_TGT_CROP_DEFAULT: + sel->r.left = 0; + sel->r.top = 0; +- sel->r.width = AR_MAX_WIDTH; +- sel->r.height = AR_MAX_HEIGHT_EMB; ++ sel->r.width = AR_DEFAULT_WIDTH; ++ sel->r.height = AR_DEFAULT_HEIGHT; + return 0; + case V4L2_SEL_TGT_CROP: + sel->r = priv->rect; + return 0; ++ case V4L2_SEL_TGT_COMPOSE_BOUNDS: ++ sel->r.left = 0; ++ sel->r.top = AR_EMB_PADDED; ++ sel->r.width = priv->rect.width; ++ sel->r.height = priv->rect.height; ++ return 0; + default: + return -EINVAL; + } +@@ -496,6 +503,8 @@ static int ar0233_initialize(struct i2c_client *client) + strncpy(chip_name, "AR0220", 10); + AR_MAX_WIDTH = AR0220_MAX_WIDTH; + AR_MAX_HEIGHT = AR0220_MAX_HEIGHT; ++ AR_DEFAULT_WIDTH = AR0220_DEFAULT_WIDTH; ++ AR_DEFAULT_HEIGHT = AR0220_DEFAULT_HEIGHT; + AR_X_START = AR0220_X_START; + AR_Y_START = AR0220_Y_START; + AR_X_END = AR0220_X_END; +@@ -532,6 +541,8 @@ static int ar0233_initialize(struct i2c_client *client) + strncpy(chip_name, "AR0233", 10); + AR_MAX_WIDTH = AR0233_MAX_WIDTH; + AR_MAX_HEIGHT = AR0233_MAX_HEIGHT; ++ AR_DEFAULT_WIDTH = AR0233_DEFAULT_WIDTH; ++ AR_DEFAULT_HEIGHT = AR0233_DEFAULT_HEIGHT; + AR_X_START = AR0233_X_START; + AR_Y_START = AR0233_Y_START; + AR_X_END = AR0233_X_END; +@@ -693,8 +704,8 @@ static int ar0233_probe(struct i2c_client *client, + + priv->rect.left = 0; + priv->rect.top = 0; +- priv->rect.width = AR_MAX_WIDTH; +- priv->rect.height = AR_MAX_HEIGHT; ++ priv->rect.width = AR_DEFAULT_WIDTH; ++ priv->rect.height = AR_DEFAULT_HEIGHT; + + ret = v4l2_async_register_subdev(&priv->sd); + if (ret) +diff --git a/drivers/media/i2c/soc_camera/ar0233.h b/drivers/media/i2c/soc_camera/ar0233.h +index 33b661a..cb79421 100644 +--- a/drivers/media/i2c/soc_camera/ar0233.h ++++ b/drivers/media/i2c/soc_camera/ar0233.h +@@ -12,16 +12,18 @@ + //#define AR0233_DISPLAY_PATTERN_FIXED + //#define AR0233_DISPLAY_PATTERN_COLOR_BAR + ++#define AR0233_DEFAULT_WIDTH 2048 ++#define AR0233_DEFAULT_HEIGHT 1280 ++ + #define AR0233_MAX_WIDTH 2048 + #define AR0233_MAX_HEIGHT 1280 +- + #define AR0233_SENSOR_WIDTH 2072 + #define AR0233_SENSOR_HEIGHT 1296 + +-#define AR0233_X_START ((AR0233_SENSOR_WIDTH - AR0233_MAX_WIDTH) / 2) +-#define AR0233_Y_START ((AR0233_SENSOR_HEIGHT - AR0233_MAX_HEIGHT) / 2) +-#define AR0233_X_END (AR0233_X_START + AR0233_MAX_WIDTH - 1) +-#define AR0233_Y_END (AR0233_Y_START + AR0233_MAX_HEIGHT - 1) ++#define AR0233_X_START ((AR0233_SENSOR_WIDTH - AR0233_DEFAULT_WIDTH) / 2) ++#define AR0233_Y_START ((AR0233_SENSOR_HEIGHT - AR0233_DEFAULT_HEIGHT) / 2) ++#define AR0233_X_END (AR0233_X_START + AR0233_DEFAULT_WIDTH - 1) ++#define AR0233_Y_END (AR0233_Y_START + AR0233_DEFAULT_HEIGHT - 1) + + #include "ar0233_rev1.h" + #include "ar0233_rev2.h" +diff --git a/drivers/media/i2c/soc_camera/ar0233_rev1.h b/drivers/media/i2c/soc_camera/ar0233_rev1.h +index 3ff944f..8b9638b 100644 +--- a/drivers/media/i2c/soc_camera/ar0233_rev1.h ++++ b/drivers/media/i2c/soc_camera/ar0233_rev1.h +@@ -1156,7 +1156,7 @@ static const struct ar0xxx_reg ar0233_rev1_Full_resolution[] = { + }; /* Full_resolution */ + + static const struct ar0xxx_reg ar0233_rev1_disable_embed_data_stat[] = { +-{0x3040, 0xC000}, //Embedded stat2 and data2 rows, hflip/vflip=1 ++{0x3040, 0xC005}, //Embedded stat4 and data4 rows, hflip/vflip=1 + #ifdef AR0233_EMBEDDED_LINE + {0x3064, 0x0180}, //Enable embedded data and stat + #else +diff --git a/drivers/media/i2c/soc_camera/ar0233_rev2.h b/drivers/media/i2c/soc_camera/ar0233_rev2.h +index 80572ff..bd508f0 100644 +--- a/drivers/media/i2c/soc_camera/ar0233_rev2.h ++++ b/drivers/media/i2c/soc_camera/ar0233_rev2.h +@@ -2265,7 +2265,7 @@ static const struct ar0xxx_reg ar0233_rev2_O1_Recommended_Defaults_SE_T1_LIN_T2[ + }; /* O1_Recommended_Defaults_SE_T1_LIN_T2 */ + + static const struct ar0xxx_reg ar0233_rev2_disable_embed_data_stat[] = { +-{0x3040, 0xC000}, //Embedded stat2 and data2 rows, hflip/vflip=1 ++{0x3040, 0xC005}, //Embedded stat4 and data4 rows, hflip/vflip=1 + {0x350e, 0x2089}, // bit0 must be set for vflip=1 + #ifdef AR0233_EMBEDDED_LINE + {0x3064, 0x0180}, // SMIA_TEST: enable emb data and stats +-- +2.7.4 + -- cgit 1.2.3-korg