summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/media/platform/soc_camera/tegra_camera/common.c103
-rw-r--r--drivers/media/platform/soc_camera/tegra_camera/vi2.c206
2 files changed, 207 insertions, 102 deletions
diff --git a/drivers/media/platform/soc_camera/tegra_camera/common.c b/drivers/media/platform/soc_camera/tegra_camera/common.c
index d06ee4ac18bb..6274696ae83f 100644
--- a/drivers/media/platform/soc_camera/tegra_camera/common.c
+++ b/drivers/media/platform/soc_camera/tegra_camera/common.c
@@ -46,7 +46,7 @@ module_param(tpg_mode, int, 0644);
#define TEGRA_SYNCPT_RETRY_COUNT 10
-static const struct soc_mbus_pixelfmt tegra_camera_formats[] = {
+static const struct soc_mbus_pixelfmt tegra_camera_yuv_formats[] = {
{
.fourcc = V4L2_PIX_FMT_UYVY,
.name = "YUV422 (UYVY) packed",
@@ -89,6 +89,9 @@ static const struct soc_mbus_pixelfmt tegra_camera_formats[] = {
.packing = SOC_MBUS_PACKING_NONE,
.order = SOC_MBUS_ORDER_LE,
},
+};
+
+static const struct soc_mbus_pixelfmt tegra_camera_bayer_formats[] = {
{
.fourcc = V4L2_PIX_FMT_SBGGR8,
.name = "Bayer 8 BGBG.. GRGR..",
@@ -117,6 +120,9 @@ static const struct soc_mbus_pixelfmt tegra_camera_formats[] = {
.packing = SOC_MBUS_PACKING_EXTEND16,
.order = SOC_MBUS_ORDER_LE,
},
+};
+
+static const struct soc_mbus_pixelfmt tegra_camera_rgb_formats[] = {
{
.fourcc = V4L2_PIX_FMT_RGB32,
.name = "RGBA 8-8-8-8",
@@ -605,44 +611,62 @@ static int tegra_camera_get_formats(struct soc_camera_device *icd,
{
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
struct device *dev = icd->parent;
- int formats = 0;
+ struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
+ struct tegra_camera_dev *cam = ici->priv;
+ int num_formats;
+ const struct soc_mbus_pixelfmt *formats;
int ret;
enum v4l2_mbus_pixelcode code;
int k;
- ret = v4l2_subdev_call(sd, video, enum_mbus_fmt, idx, &code);
- if (ret != 0)
- /* No more formats */
- return 0;
+ /*
+ * If we're in test pattern mode, ignore the subdev's formats, and
+ * pick a format that the test pattern mode can handle.
+ */
+ if (!cam->tpg_mode) {
+ ret = v4l2_subdev_call(sd, video, enum_mbus_fmt, idx, &code);
+ if (ret != 0)
+ /* No more formats */
+ return 0;
+ } else
+ code = V4L2_MBUS_FMT_RGBA8888_4X8_LE;
switch (code) {
case V4L2_MBUS_FMT_UYVY8_2X8:
case V4L2_MBUS_FMT_VYUY8_2X8:
case V4L2_MBUS_FMT_YUYV8_2X8:
case V4L2_MBUS_FMT_YVYU8_2X8:
+ formats = tegra_camera_yuv_formats;
+ num_formats = ARRAY_SIZE(tegra_camera_yuv_formats);
+ break;
case V4L2_MBUS_FMT_SBGGR8_1X8:
case V4L2_MBUS_FMT_SGBRG8_1X8:
case V4L2_MBUS_FMT_SBGGR10_1X10:
case V4L2_MBUS_FMT_SRGGB10_1X10:
+ formats = tegra_camera_bayer_formats;
+ num_formats = ARRAY_SIZE(tegra_camera_bayer_formats);
+ break;
case V4L2_MBUS_FMT_RGBA8888_4X8_LE:
- formats += ARRAY_SIZE(tegra_camera_formats);
- for (k = 0;
- xlate && (k < ARRAY_SIZE(tegra_camera_formats));
- k++) {
- xlate->host_fmt = &tegra_camera_formats[k];
- xlate->code = code;
- xlate++;
-
- dev_dbg(dev, "Providing format %s using code %d\n",
- tegra_camera_formats[k].name, code);
- }
+ formats = tegra_camera_rgb_formats;
+ num_formats = ARRAY_SIZE(tegra_camera_rgb_formats);
break;
default:
- dev_err(dev, "Not supporting %d\n", code);
- return 0;
+ dev_notice(dev, "Not supporting mbus format code 0x%04x\n",
+ code);
+ formats = NULL;
+ num_formats = 0;
+ }
+
+ for (k = 0; xlate && (k < num_formats); k++) {
+ xlate->host_fmt = &formats[k];
+ xlate->code = code;
+ xlate++;
+
+ dev_notice(dev, "Supporting mbus format code 0x%04x using %s\n",
+ code, formats[k].name);
}
- return formats;
+ return num_formats;
}
static void tegra_camera_put_formats(struct soc_camera_device *icd)
@@ -657,12 +681,11 @@ static int tegra_camera_set_fmt(struct soc_camera_device *icd,
struct device *dev = icd->parent;
struct soc_camera_host *ici = to_soc_camera_host(dev);
struct tegra_camera_dev *cam = ici->priv;
-
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
const struct soc_camera_format_xlate *xlate = NULL;
struct v4l2_pix_format *pix = &f->fmt.pix;
struct v4l2_mbus_framefmt mf;
- int ret;
+ int ret = 0;
xlate = soc_camera_xlate_by_fourcc(icd, pix->pixelformat);
if (!xlate) {
@@ -676,17 +699,20 @@ static int tegra_camera_set_fmt(struct soc_camera_device *icd,
mf.colorspace = pix->colorspace;
mf.code = xlate->code;
- ret = v4l2_subdev_call(sd, video, s_mbus_fmt, &mf);
- if (IS_ERR_VALUE(ret)) {
- dev_warn(dev, "Failed to configure for format %x\n",
- pix->pixelformat);
- return ret;
- }
+ if (!cam->tpg_mode) {
+ ret = v4l2_subdev_call(sd, video, s_mbus_fmt, &mf);
+ if (IS_ERR_VALUE(ret)) {
+ dev_warn(dev, "Failed to configure for format %x\n",
+ pix->pixelformat);
+ return ret;
+ }
- if (mf.code != xlate->code) {
- dev_warn(dev, "mf.code = %d, xlate->code = %d, mismatch\n",
- mf.code, xlate->code);
- return -EINVAL;
+ if (mf.code != xlate->code) {
+ dev_warn(dev,
+ "mf.code = 0x%04x, xlate->code = 0x%04x, "
+ "mismatch\n", mf.code, xlate->code);
+ return -EINVAL;
+ }
}
icd->user_width = mf.width;
@@ -701,12 +727,15 @@ static int tegra_camera_set_fmt(struct soc_camera_device *icd,
static int tegra_camera_try_fmt(struct soc_camera_device *icd,
struct v4l2_format *f)
{
+ struct device *dev = icd->parent;
+ struct soc_camera_host *ici = to_soc_camera_host(dev);
+ struct tegra_camera_dev *cam = ici->priv;
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
const struct soc_camera_format_xlate *xlate;
struct v4l2_pix_format *pix = &f->fmt.pix;
struct v4l2_mbus_framefmt mf;
__u32 pixfmt = pix->pixelformat;
- int ret;
+ int ret = 0;
xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
if (!xlate) {
@@ -727,9 +756,11 @@ static int tegra_camera_try_fmt(struct soc_camera_device *icd,
mf.colorspace = pix->colorspace;
mf.code = xlate->code;
- ret = v4l2_subdev_call(sd, video, try_mbus_fmt, &mf);
- if (IS_ERR_VALUE(ret))
- return ret;
+ if (!cam->tpg_mode) {
+ ret = v4l2_subdev_call(sd, video, try_mbus_fmt, &mf);
+ if (IS_ERR_VALUE(ret))
+ return ret;
+ }
pix->width = mf.width;
pix->height = mf.height;
diff --git a/drivers/media/platform/soc_camera/tegra_camera/vi2.c b/drivers/media/platform/soc_camera/tegra_camera/vi2.c
index 7c2aa3688609..00b400799cdf 100644
--- a/drivers/media/platform/soc_camera/tegra_camera/vi2.c
+++ b/drivers/media/platform/soc_camera/tegra_camera/vi2.c
@@ -226,6 +226,66 @@
#define TEGRA_CSI_DEBUG_COUNTER_1 0xb00
#define TEGRA_CSI_DEBUG_COUNTER_2 0xb04
+/* These go into the TEGRA_VI_CSI_n_IMAGE_DEF registers bits 23:16 */
+#define TEGRA_IMAGE_FORMAT_T_L8 16
+#define TEGRA_IMAGE_FORMAT_T_R16_I 32
+#define TEGRA_IMAGE_FORMAT_T_B5G6R5 33
+#define TEGRA_IMAGE_FORMAT_T_R5G6B5 34
+#define TEGRA_IMAGE_FORMAT_T_A1B5G5R5 35
+#define TEGRA_IMAGE_FORMAT_T_A1R5G5B5 36
+#define TEGRA_IMAGE_FORMAT_T_B5G5R5A1 37
+#define TEGRA_IMAGE_FORMAT_T_R5G5B5A1 38
+#define TEGRA_IMAGE_FORMAT_T_A4B4G4R4 39
+#define TEGRA_IMAGE_FORMAT_T_A4R4G4B4 40
+#define TEGRA_IMAGE_FORMAT_T_B4G4R4A4 41
+#define TEGRA_IMAGE_FORMAT_T_R4G4B4A4 42
+#define TEGRA_IMAGE_FORMAT_T_A8B8G8R8 64
+#define TEGRA_IMAGE_FORMAT_T_A8R8G8B8 65
+#define TEGRA_IMAGE_FORMAT_T_B8G8R8A8 66
+#define TEGRA_IMAGE_FORMAT_T_R8G8B8A8 67
+#define TEGRA_IMAGE_FORMAT_T_A2B10G10R10 68
+#define TEGRA_IMAGE_FORMAT_T_A2R10G10B10 69
+#define TEGRA_IMAGE_FORMAT_T_B10G10R10A2 70
+#define TEGRA_IMAGE_FORMAT_T_R10G10B10A2 71
+#define TEGRA_IMAGE_FORMAT_T_A8Y8U8V8 193
+#define TEGRA_IMAGE_FORMAT_T_V8U8Y8A8 194
+#define TEGRA_IMAGE_FORMAT_T_A2Y10U10V10 197
+#define TEGRA_IMAGE_FORMAT_T_V10U10Y10A2 198
+#define TEGRA_IMAGE_FORMAT_T_Y8_U8__Y8_V8 200
+#define TEGRA_IMAGE_FORMAT_T_Y8_V8__Y8_U8 201
+#define TEGRA_IMAGE_FORMAT_T_U8_Y8__V8_Y8 202
+#define TEGRA_IMAGE_FORMAT_T_T_V8_Y8__U8_Y8 203
+#define TEGRA_IMAGE_FORMAT_T_T_Y8__U8__V8_N444 224
+#define TEGRA_IMAGE_FORMAT_T_Y8__U8V8_N444 225
+#define TEGRA_IMAGE_FORMAT_T_Y8__V8U8_N444 226
+#define TEGRA_IMAGE_FORMAT_T_Y8__U8__V8_N422 227
+#define TEGRA_IMAGE_FORMAT_T_Y8__U8V8_N422 228
+#define TEGRA_IMAGE_FORMAT_T_Y8__V8U8_N422 229
+#define TEGRA_IMAGE_FORMAT_T_Y8__U8__V8_N420 230
+#define TEGRA_IMAGE_FORMAT_T_Y8__U8V8_N420 231
+#define TEGRA_IMAGE_FORMAT_T_Y8__V8U8_N420 232
+#define TEGRA_IMAGE_FORMAT_T_X2Lc10Lb10La10 233
+#define TEGRA_IMAGE_FORMAT_T_A2R6R6R6R6R6 234
+
+/* These go into the TEGRA_VI_CSI_n_CSI_IMAGE_DT registers bits 7:0 */
+#define TEGRA_IMAGE_DT_YUV420_8 24
+#define TEGRA_IMAGE_DT_YUV420_10 25
+#define TEGRA_IMAGE_DT_YUV420CSPS_8 28
+#define TEGRA_IMAGE_DT_YUV420CSPS_10 29
+#define TEGRA_IMAGE_DT_YUV422_8 30
+#define TEGRA_IMAGE_DT_YUV422_10 31
+#define TEGRA_IMAGE_DT_RGB444 32
+#define TEGRA_IMAGE_DT_RGB555 33
+#define TEGRA_IMAGE_DT_RGB565 34
+#define TEGRA_IMAGE_DT_RGB666 35
+#define TEGRA_IMAGE_DT_RGB888 36
+#define TEGRA_IMAGE_DT_RAW6 40
+#define TEGRA_IMAGE_DT_RAW7 41
+#define TEGRA_IMAGE_DT_RAW8 42
+#define TEGRA_IMAGE_DT_RAW10 43
+#define TEGRA_IMAGE_DT_RAW12 44
+#define TEGRA_IMAGE_DT_RAW14 45
+
static int vi2_port_is_valid(int port)
{
return (((port) >= TEGRA_CAMERA_PORT_CSI_A) &&
@@ -481,6 +541,7 @@ static int vi2_capture_setup_csi_0(struct tegra_camera_dev *cam,
{
struct soc_camera_subdev_desc *ssdesc = &icd->sdesc->subdev_desc;
struct tegra_camera_platform_data *pdata = ssdesc->drv_priv;
+ int format = 0, data_type = 0, image_size = 0;
TC_VI_REG_WT(cam, TEGRA_CSI_PIXEL_STREAM_PPA_COMMAND, 0xf007);
TC_VI_REG_WT(cam, TEGRA_CSI_CSI_PIXEL_PARSER_A_INTERRUPT_MASK, 0x0);
@@ -508,24 +569,33 @@ static int vi2_capture_setup_csi_0(struct tegra_camera_dev *cam,
TC_VI_REG_WT(cam, TEGRA_CSI_PG_BLUE_FREQ_RATE_A, 0x0);
TC_VI_REG_WT(cam, TEGRA_CSI_PHY_CIL_COMMAND, 0x22020202);
- /* output format A8B8G8R8, only support direct to mem */
- TC_VI_REG_WT(cam, TEGRA_VI_CSI_0_IMAGE_DEF, (64 << 16) | 0x1);
- /* input format is RGB888 */
- TC_VI_REG_WT(cam, TEGRA_VI_CSI_0_CSI_IMAGE_DT, 36);
-
- TC_VI_REG_WT(cam, TEGRA_VI_CSI_0_CSI_IMAGE_SIZE_WC,
- icd->user_width * 3);
- } else {
- /* output format RAW10 T_R16_I, only support direct to mem */
- TC_VI_REG_WT(cam, TEGRA_VI_CSI_0_IMAGE_DEF,
- (1 << 24) | (32 << 16) | 0x1);
- /* input format is RAW10 */
- TC_VI_REG_WT(cam, TEGRA_VI_CSI_0_CSI_IMAGE_DT, 43);
-
- TC_VI_REG_WT(cam, TEGRA_VI_CSI_0_CSI_IMAGE_SIZE_WC,
- icd->user_width * 10 / 8);
+ format = TEGRA_IMAGE_FORMAT_T_A8B8G8R8;
+ data_type = TEGRA_IMAGE_DT_RGB888;
+ image_size = icd->user_width * 3;
+ } else if ((icd->current_fmt->code == V4L2_MBUS_FMT_UYVY8_2X8) ||
+ (icd->current_fmt->code == V4L2_MBUS_FMT_VYUY8_2X8) ||
+ (icd->current_fmt->code == V4L2_MBUS_FMT_YUYV8_2X8) ||
+ (icd->current_fmt->code == V4L2_MBUS_FMT_YVYU8_2X8)) {
+ /* TBD */
+ } else if ((icd->current_fmt->code == V4L2_MBUS_FMT_SBGGR8_1X8) ||
+ (icd->current_fmt->code == V4L2_MBUS_FMT_SGBRG8_1X8)) {
+ format = TEGRA_IMAGE_FORMAT_T_L8;
+ data_type = TEGRA_IMAGE_DT_RAW8;
+ image_size = icd->user_width;
+ } else if ((icd->current_fmt->code == V4L2_MBUS_FMT_SBGGR10_1X10) ||
+ (icd->current_fmt->code == V4L2_MBUS_FMT_SRGGB10_1X10)) {
+ format = TEGRA_IMAGE_FORMAT_T_R16_I;
+ data_type = TEGRA_IMAGE_DT_RAW10;
+ image_size = (icd->user_width * 10) >> 3;
}
+ TC_VI_REG_WT(cam, TEGRA_VI_CSI_0_IMAGE_DEF,
+ (cam->tpg_mode ? 0 : 1 << 24) | (format << 16) | 0x1);
+
+ TC_VI_REG_WT(cam, TEGRA_VI_CSI_0_CSI_IMAGE_DT, data_type);
+
+ TC_VI_REG_WT(cam, TEGRA_VI_CSI_0_CSI_IMAGE_SIZE_WC, image_size);
+
TC_VI_REG_WT(cam, TEGRA_VI_CSI_0_CSI_IMAGE_SIZE,
(icd->user_height << 16) | icd->user_width);
@@ -537,6 +607,7 @@ static int vi2_capture_setup_csi_1(struct tegra_camera_dev *cam,
{
struct soc_camera_subdev_desc *ssdesc = &icd->sdesc->subdev_desc;
struct tegra_camera_platform_data *pdata = ssdesc->drv_priv;
+ int format = 0, data_type = 0, image_size = 0;
TC_VI_REG_WT(cam, TEGRA_CSI_PIXEL_STREAM_PPB_COMMAND, 0xf007);
TC_VI_REG_WT(cam, TEGRA_CSI_CSI_PIXEL_PARSER_B_INTERRUPT_MASK, 0x0);
@@ -566,26 +637,32 @@ static int vi2_capture_setup_csi_1(struct tegra_camera_dev *cam,
TC_VI_REG_WT(cam, TEGRA_CSI_PG_BLUE_FREQ_RATE_B, 0x0);
TC_VI_REG_WT(cam, TEGRA_CSI_PHY_CIL_COMMAND, 0x22020202);
- /* output format A8B8G8R8, only support direct to mem */
- TC_VI_REG_WT(cam, TEGRA_VI_CSI_1_IMAGE_DEF, (64 << 16) | 0x1);
- /* input format is RGB888 */
- TC_VI_REG_WT(cam, TEGRA_VI_CSI_1_CSI_IMAGE_DT, 36);
-
- TC_VI_REG_WT(cam, TEGRA_VI_CSI_1_CSI_IMAGE_SIZE_WC,
- icd->user_width * 3);
- } else {
- /* output format RAW10 T_R16_I, only support direct to mem */
- TC_VI_REG_WT(cam, TEGRA_VI_CSI_1_IMAGE_DEF,
- (1 << 24) | (32 << 16) | 0x1);
- /* input format is RAW10 */
- TC_VI_REG_WT(cam, TEGRA_VI_CSI_1_CSI_IMAGE_DT, 43);
-
- TC_VI_REG_WT(cam, TEGRA_VI_CSI_1_CSI_IMAGE_SIZE_WC,
- icd->user_width * 10 / 8);
+ format = TEGRA_IMAGE_FORMAT_T_A8B8G8R8;
+ data_type = TEGRA_IMAGE_DT_RGB888;
+ image_size = icd->user_width * 3;
+ } else if ((icd->current_fmt->code == V4L2_MBUS_FMT_UYVY8_2X8) ||
+ (icd->current_fmt->code == V4L2_MBUS_FMT_VYUY8_2X8) ||
+ (icd->current_fmt->code == V4L2_MBUS_FMT_YUYV8_2X8) ||
+ (icd->current_fmt->code == V4L2_MBUS_FMT_YVYU8_2X8)) {
+ /* TBD */
+ } else if ((icd->current_fmt->code == V4L2_MBUS_FMT_SBGGR8_1X8) ||
+ (icd->current_fmt->code == V4L2_MBUS_FMT_SGBRG8_1X8)) {
+ format = TEGRA_IMAGE_FORMAT_T_L8;
+ data_type = TEGRA_IMAGE_DT_RAW8;
+ image_size = icd->user_width;
+ } else if ((icd->current_fmt->code == V4L2_MBUS_FMT_SBGGR10_1X10) ||
+ (icd->current_fmt->code == V4L2_MBUS_FMT_SRGGB10_1X10)) {
+ format = TEGRA_IMAGE_FORMAT_T_R16_I;
+ data_type = TEGRA_IMAGE_DT_RAW10;
+ image_size = icd->user_width * 10 / 8;
}
- TC_VI_REG_WT(cam, TEGRA_VI_CSI_1_CSI_IMAGE_SIZE,
- (icd->user_height << 16) | icd->user_width);
+ TC_VI_REG_WT(cam, TEGRA_VI_CSI_1_IMAGE_DEF,
+ (cam->tpg_mode ? 0 : 1 << 24) | (format << 16) | 0x1);
+
+ TC_VI_REG_WT(cam, TEGRA_VI_CSI_1_CSI_IMAGE_DT, data_type);
+
+ TC_VI_REG_WT(cam, TEGRA_VI_CSI_1_CSI_IMAGE_SIZE_WC, image_size);
return 0;
}
@@ -716,41 +793,30 @@ static int vi2_capture_buffer_setup(struct tegra_camera_dev *cam,
return 0;
}
-static int vi2_capture_error_status(struct tegra_camera_dev *cam)
+static void vi2_capture_error_status(struct tegra_camera_dev *cam)
{
- int err;
+ u32 val;
#ifdef DEBUG
- err = TC_VI_REG_RD(cam, TEGRA_CSI_DEBUG_COUNTER_0);
- if (err)
- pr_err("TEGRA_CSI_DEBUG_COUNTER_0 0x%08x\n", err);
+ val = TC_VI_REG_RD(cam, TEGRA_CSI_DEBUG_COUNTER_0);
+ pr_err("TEGRA_CSI_DEBUG_COUNTER_0 0x%08x\n", val);
#endif
- err = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_CIL_A_STATUS);
- if (err)
- pr_err("TEGRA_CSI_CSI_CIL_A_STATUS 0x%08x\n", err);
- err = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_CILA_STATUS);
- if (err)
- pr_err("TEGRA_CSI_CSI_CILA_STATUS 0x%08x\n", err);
- err = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_CIL_B_STATUS);
- if (err)
- pr_err("TEGRA_CSI_CSI_CIL_B_STATUS 0x%08x\n", err);
- err = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_CIL_C_STATUS);
- if (err)
- pr_err("TEGRA_CSI_CSI_CIL_C_STATUS 0x%08x\n", err);
- err = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_CIL_D_STATUS);
- if (err)
- pr_err("TEGRA_CSI_CSI_CIL_D_STATUS 0x%08x\n", err);
- err = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_CIL_E_STATUS);
- if (err)
- pr_err("TEGRA_CSI_CSI_CIL_E_STATUS 0x%08x\n", err);
- err = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_PIXEL_PARSER_A_STATUS);
- if (err)
- pr_err("TEGRA_CSI_CSI_PIXEL_PARSER_A_STATUS 0x%08x\n", err);
- err = TC_VI_REG_RD(cam, TEGRA_VI_CSI_0_ERROR_STATUS);
- if (err)
- pr_err("TEGRA_VI_CSI_0_ERROR_STATUS 0x%08x\n", err);
-
- return err;
+ val = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_CIL_A_STATUS);
+ pr_err("TEGRA_CSI_CSI_CIL_A_STATUS 0x%08x\n", val);
+ val = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_CILA_STATUS);
+ pr_err("TEGRA_CSI_CSI_CILA_STATUS 0x%08x\n", val);
+ val = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_CIL_B_STATUS);
+ pr_err("TEGRA_CSI_CSI_CIL_B_STATUS 0x%08x\n", val);
+ val = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_CIL_C_STATUS);
+ pr_err("TEGRA_CSI_CSI_CIL_C_STATUS 0x%08x\n", val);
+ val = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_CIL_D_STATUS);
+ pr_err("TEGRA_CSI_CSI_CIL_D_STATUS 0x%08x\n", val);
+ val = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_CIL_E_STATUS);
+ pr_err("TEGRA_CSI_CSI_CIL_E_STATUS 0x%08x\n", val);
+ val = TC_VI_REG_RD(cam, TEGRA_CSI_CSI_PIXEL_PARSER_A_STATUS);
+ pr_err("TEGRA_CSI_CSI_PIXEL_PARSER_A_STATUS 0x%08x\n", val);
+ val = TC_VI_REG_RD(cam, TEGRA_VI_CSI_0_ERROR_STATUS);
+ pr_err("TEGRA_VI_CSI_0_ERROR_STATUS 0x%08x\n", val);
}
static int vi2_capture_start(struct tegra_camera_dev *cam,
@@ -799,9 +865,17 @@ static int vi2_capture_start(struct tegra_camera_dev *cam,
/* Capture syncpt timeout err, then dump error status */
if (err) {
- dev_err(&cam->ndev->dev, "CSI sync point failure\n");
+ if (port == TEGRA_CAMERA_PORT_CSI_A)
+ dev_err(&cam->ndev->dev,
+ "CSI_A syncpt timeout, syncpt = %d, err = %d\n",
+ cam->syncpt_csi_a, err);
+ else if (port == TEGRA_CAMERA_PORT_CSI_B)
+ dev_err(&cam->ndev->dev,
+ "CSI_B syncpt timeout, syncpt = %d, err = %d\n",
+ cam->syncpt_csi_b, err);
vi2_capture_error_status(cam);
}
+
return err;
}