From adc6a443b7df188545c99cea1c3ebd5c965763b7 Mon Sep 17 00:00:00 2001 From: Wojciech Bieganski Date: Mon, 14 Apr 2014 15:56:00 +0200 Subject: media: added camera settings per decoder This commit adds settings such as: - values of horizontal/vertical active start, - enabling/disabling internal sync, to the private data of decoders: MAX9526, ADV7180, TVP5150, OV7670 and AS0260. The feature is available through *_tegra_camera_platform_data struct initialised in board-*.c files. --- arch/arm/mach-tegra/board-apalis_t30.c | 92 +++++++++++++++++++++++++++++---- arch/arm/mach-tegra/board-colibri_t20.c | 56 ++++++++++++++++---- arch/arm/mach-tegra/board-colibri_t30.c | 56 ++++++++++++++++---- drivers/media/video/tegra_v4l2_camera.c | 16 ++---- include/media/tegra_v4l2_camera.h | 5 ++ 5 files changed, 183 insertions(+), 42 deletions(-) diff --git a/arch/arm/mach-tegra/board-apalis_t30.c b/arch/arm/mach-tegra/board-apalis_t30.c index d26991be9e25..9c5cb6ff606e 100644 --- a/arch/arm/mach-tegra/board-apalis_t30.c +++ b/arch/arm/mach-tegra/board-apalis_t30.c @@ -111,23 +111,26 @@ static int tegra_camera_enable(struct nvhost_device *ndev) return 0; } -static struct tegra_camera_platform_data tegra_camera_platform_data = { +#if defined(CONFIG_SOC_CAMERA_MAX9526) || defined(CONFIG_SOC_CAMERA_MAX9526_MODULE) +static struct i2c_board_info camera_i2c_max9526 = { + I2C_BOARD_INFO("max9526", 0x20), +}; + +static struct tegra_camera_platform_data max9526_tegra_camera_platform_data = { .disable_camera = tegra_camera_disable, .enable_camera = tegra_camera_enable, .flip_h = 0, .flip_v = 0, .port = TEGRA_CAMERA_PORT_VIP, -}; - -#if defined(CONFIG_SOC_CAMERA_MAX9526) || defined(CONFIG_SOC_CAMERA_MAX9526_MODULE) -static struct i2c_board_info camera_i2c_max9526 = { - I2C_BOARD_INFO("max9526", 0x20), + .internal_sync = false, + .vip_h_active_start = 0x8F, + .vip_v_active_start = 0x12, }; static struct soc_camera_link iclink_max9526 = { .board_info = &camera_i2c_max9526, .bus_id = -1, /* This must match the .id of tegra_vi01_device */ - .priv = &tegra_camera_platform_data, + .priv = &max9526_tegra_camera_platform_data, .i2c_adapter_id = 2, }; @@ -145,10 +148,21 @@ static struct i2c_board_info camera_i2c_adv7180 = { I2C_BOARD_INFO("adv7180", 0x21), }; +static struct tegra_camera_platform_data adv7180_tegra_camera_platform_data = { + .disable_camera = tegra_camera_disable, + .enable_camera = tegra_camera_enable, + .flip_h = 0, + .flip_v = 0, + .port = TEGRA_CAMERA_PORT_VIP, + .internal_sync = false, + .vip_h_active_start = 0x8F, + .vip_v_active_start = 0x12, +}; + static struct soc_camera_link iclink_adv7180 = { .board_info = &camera_i2c_adv7180, .bus_id = -1, /* This must match the .id of tegra_vi01_device */ - .priv = &tegra_camera_platform_data, + .priv = &adv7180_tegra_camera_platform_data, .i2c_adapter_id = 2, }; @@ -166,10 +180,21 @@ static struct i2c_board_info camera_i2c_tvp5150soc = { I2C_BOARD_INFO("tvp5150soc", 0x5d), }; +static struct tegra_camera_platform_data tvp5150soc_tegra_camera_platform_data = { + .disable_camera = tegra_camera_disable, + .enable_camera = tegra_camera_enable, + .flip_h = 0, + .flip_v = 0, + .port = TEGRA_CAMERA_PORT_VIP, + .internal_sync = false, + .vip_h_active_start = 0x8F, + .vip_v_active_start = 0x12, +}; + static struct soc_camera_link iclink_tvp5150soc = { .board_info = &camera_i2c_tvp5150soc, .bus_id = -1, /* This must match the .id of tegra_vi01_device */ - .priv = &tegra_camera_platform_data, + .priv = &tvp5150soc_tegra_camera_platform_data, .i2c_adapter_id = 2, }; @@ -187,10 +212,21 @@ static struct i2c_board_info camera_i2c_ov7670soc = { I2C_BOARD_INFO("ov7670soc", 0x21), }; +static struct tegra_camera_platform_data ov7670_tegra_camera_platform_data = { + .disable_camera = tegra_camera_disable, + .enable_camera = tegra_camera_enable, + .flip_h = 0, + .flip_v = 0, + .port = TEGRA_CAMERA_PORT_VIP, + .internal_sync = false, + .vip_h_active_start = 0x8F, + .vip_v_active_start = 0x12, +}; + static struct soc_camera_link iclink_ov7670soc = { .board_info = &camera_i2c_ov7670soc, .bus_id = -1, /* This must match the .id of tegra_vi01_device */ - .priv = &tegra_camera_platform_data, + .priv = &ov7670_tegra_camera_platform_data, .i2c_adapter_id = 2, }; @@ -202,6 +238,39 @@ static struct platform_device soc_camera_ov7670soc = { }, }; #endif /* CONFIG_SOC_CAMERA_OV7670SOC | CONFIG_SOC_CAMERA_OV7670SOC_MODULE */ + +#if defined(CONFIG_SOC_CAMERA_AS0260) || defined(CONFIG_SOC_CAMERA_AS0260_MODULE) +static struct i2c_board_info camera_i2c_as0260soc = { + I2C_BOARD_INFO("as0260soc", 0x48), +}; + +static struct tegra_camera_platform_data as0260soc_tegra_camera_platform_data = { + .disable_camera = tegra_camera_disable, + .enable_camera = tegra_camera_enable, + .flip_h = 0, + .flip_v = 0, + .port = TEGRA_CAMERA_PORT_VIP, + .internal_sync = false, + .vip_h_active_start = 0, + .vip_v_active_start = 0, +}; + +static struct soc_camera_link iclink_as0260soc = { + .board_info = &camera_i2c_as0260soc, + .bus_id = -1, /* This must match the .id of tegra_vi01_device */ + .priv = &as0260soc_tegra_camera_platform_data, + .i2c_adapter_id = 2, +}; + +static struct platform_device soc_camera_as0260soc = { + .name = "soc-camera-pdrv", + .id = 4, + .dev = { + .platform_data = &iclink_as0260soc, + }, +}; +#endif /* CONFIG_SOC_CAMERA_AS0260 | CONFIG_SOC_CAMERA_AS0260_MODULE */ + #endif /* CONFIG_VIDEO_TEGRA | CONFIG_VIDEO_TEGRA_MODULE */ /* CAN */ @@ -1441,6 +1510,9 @@ static void __init apalis_t30_init(void) #if defined(CONFIG_SOC_CAMERA_OV7670SOC) || defined(CONFIG_SOC_CAMERA_OV7670SOC_MODULE) platform_device_register(&soc_camera_ov7670soc); #endif +#if defined(CONFIG_SOC_CAMERA_AS0260) || defined(CONFIG_SOC_CAMERA_AS0260_MODULE) + platform_device_register(&soc_camera_as0260soc); +#endif #endif /* CONFIG_VIDEO_TEGRA | CONFIG_VIDEO_TEGRA_MODULE */ tegra_release_bootloader_fb(); diff --git a/arch/arm/mach-tegra/board-colibri_t20.c b/arch/arm/mach-tegra/board-colibri_t20.c index 0f07ca4b63ed..5e1a6866430b 100644 --- a/arch/arm/mach-tegra/board-colibri_t20.c +++ b/arch/arm/mach-tegra/board-colibri_t20.c @@ -115,23 +115,26 @@ static int tegra_camera_enable(struct nvhost_device *ndev) return 0; } -static struct tegra_camera_platform_data tegra_camera_platform_data = { +#if defined(CONFIG_SOC_CAMERA_MAX9526) || defined(CONFIG_SOC_CAMERA_MAX9526_MODULE) +static struct i2c_board_info camera_i2c_max9526 = { + I2C_BOARD_INFO("max9526", 0x20), +}; + +static struct tegra_camera_platform_data max9526_tegra_camera_platform_data = { .disable_camera = tegra_camera_disable, .enable_camera = tegra_camera_enable, .flip_h = 0, .flip_v = 0, .port = TEGRA_CAMERA_PORT_VIP, -}; - -#if defined(CONFIG_SOC_CAMERA_MAX9526) || defined(CONFIG_SOC_CAMERA_MAX9526_MODULE) -static struct i2c_board_info camera_i2c_max9526 = { - I2C_BOARD_INFO("max9526", 0x20), + .internal_sync = false, + .vip_h_active_start = 0x8F, + .vip_v_active_start = 0x12, }; static struct soc_camera_link iclink_max9526 = { .board_info = &camera_i2c_max9526, .bus_id = -1, /* This must match the .id of tegra_vi01_device */ - .priv = &tegra_camera_platform_data, + .priv = &max9526_tegra_camera_platform_data, .i2c_adapter_id = 0, }; @@ -149,10 +152,21 @@ static struct i2c_board_info camera_i2c_adv7180 = { I2C_BOARD_INFO("adv7180", 0x21), }; +static struct tegra_camera_platform_data adv7180_tegra_camera_platform_data = { + .disable_camera = tegra_camera_disable, + .enable_camera = tegra_camera_enable, + .flip_h = 0, + .flip_v = 0, + .port = TEGRA_CAMERA_PORT_VIP, + .internal_sync = false, + .vip_h_active_start = 0x8F, + .vip_v_active_start = 0x12, +}; + static struct soc_camera_link iclink_adv7180 = { .board_info = &camera_i2c_adv7180, .bus_id = -1, /* This must match the .id of tegra_vi01_device */ - .priv = &tegra_camera_platform_data, + .priv = &adv7180_tegra_camera_platform_data, .i2c_adapter_id = 0, }; @@ -170,10 +184,21 @@ static struct i2c_board_info camera_i2c_tvp5150soc = { I2C_BOARD_INFO("tvp5150soc", 0x5d), }; +static struct tegra_camera_platform_data tvp5150soc_tegra_camera_platform_data = { + .disable_camera = tegra_camera_disable, + .enable_camera = tegra_camera_enable, + .flip_h = 0, + .flip_v = 0, + .port = TEGRA_CAMERA_PORT_VIP, + .internal_sync = false, + .vip_h_active_start = 0x8F, + .vip_v_active_start = 0x12, +}; + static struct soc_camera_link iclink_tvp5150soc = { .board_info = &camera_i2c_tvp5150soc, .bus_id = -1, /* This must match the .id of tegra_vi01_device */ - .priv = &tegra_camera_platform_data, + .priv = &tvp5150soc_tegra_camera_platform_data, .i2c_adapter_id = 0, }; @@ -191,10 +216,21 @@ static struct i2c_board_info camera_i2c_ov7670soc = { I2C_BOARD_INFO("ov7670soc", 0x21), }; +static struct tegra_camera_platform_data ov7670_tegra_camera_platform_data = { + .disable_camera = tegra_camera_disable, + .enable_camera = tegra_camera_enable, + .flip_h = 0, + .flip_v = 0, + .port = TEGRA_CAMERA_PORT_VIP, + .internal_sync = false, + .vip_h_active_start = 0x8F, + .vip_v_active_start = 0x12, +}; + static struct soc_camera_link iclink_ov7670soc = { .board_info = &camera_i2c_ov7670soc, .bus_id = -1, /* This must match the .id of tegra_vi01_device */ - .priv = &tegra_camera_platform_data, + .priv = &ov7670_tegra_camera_platform_data, .i2c_adapter_id = 0, }; diff --git a/arch/arm/mach-tegra/board-colibri_t30.c b/arch/arm/mach-tegra/board-colibri_t30.c index 1195cb2847b7..2a8230d48cd9 100644 --- a/arch/arm/mach-tegra/board-colibri_t30.c +++ b/arch/arm/mach-tegra/board-colibri_t30.c @@ -111,23 +111,26 @@ static int tegra_camera_enable(struct nvhost_device *ndev) return 0; } -static struct tegra_camera_platform_data tegra_camera_platform_data = { +#if defined(CONFIG_SOC_CAMERA_MAX9526) || defined(CONFIG_SOC_CAMERA_MAX9526_MODULE) +static struct i2c_board_info camera_i2c_max9526 = { + I2C_BOARD_INFO("max9526", 0x20), +}; + +static struct tegra_camera_platform_data max9526_tegra_camera_platform_data = { .disable_camera = tegra_camera_disable, .enable_camera = tegra_camera_enable, .flip_h = 0, .flip_v = 0, .port = TEGRA_CAMERA_PORT_VIP, -}; - -#if defined(CONFIG_SOC_CAMERA_MAX9526) || defined(CONFIG_SOC_CAMERA_MAX9526_MODULE) -static struct i2c_board_info camera_i2c_max9526 = { - I2C_BOARD_INFO("max9526", 0x20), + .internal_sync = false, + .vip_h_active_start = 0x8F, + .vip_v_active_start = 0x12, }; static struct soc_camera_link iclink_max9526 = { .board_info = &camera_i2c_max9526, .bus_id = -1, /* This must match the .id of tegra_vi01_device */ - .priv = &tegra_camera_platform_data, + .priv = &max9526_tegra_camera_platform_data, .i2c_adapter_id = 0, }; @@ -145,10 +148,21 @@ static struct i2c_board_info camera_i2c_adv7180 = { I2C_BOARD_INFO("adv7180", 0x21), }; +static struct tegra_camera_platform_data adv7180_tegra_camera_platform_data = { + .disable_camera = tegra_camera_disable, + .enable_camera = tegra_camera_enable, + .flip_h = 0, + .flip_v = 0, + .port = TEGRA_CAMERA_PORT_VIP, + .internal_sync = false, + .vip_h_active_start = 0x8F, + .vip_v_active_start = 0x12, +}; + static struct soc_camera_link iclink_adv7180 = { .board_info = &camera_i2c_adv7180, .bus_id = -1, /* This must match the .id of tegra_vi01_device */ - .priv = &tegra_camera_platform_data, + .priv = &adv7180_tegra_camera_platform_data, .i2c_adapter_id = 0, }; @@ -166,10 +180,21 @@ static struct i2c_board_info camera_i2c_tvp5150soc = { I2C_BOARD_INFO("tvp5150soc", 0x5d), }; +static struct tegra_camera_platform_data tvp5150soc_tegra_camera_platform_data = { + .disable_camera = tegra_camera_disable, + .enable_camera = tegra_camera_enable, + .flip_h = 0, + .flip_v = 0, + .port = TEGRA_CAMERA_PORT_VIP, + .internal_sync = false, + .vip_h_active_start = 0x8F, + .vip_v_active_start = 0x12, +}; + static struct soc_camera_link iclink_tvp5150soc = { .board_info = &camera_i2c_tvp5150soc, .bus_id = -1, /* This must match the .id of tegra_vi01_device */ - .priv = &tegra_camera_platform_data, + .priv = &tvp5150soc_tegra_camera_platform_data, .i2c_adapter_id = 0, }; @@ -187,10 +212,21 @@ static struct i2c_board_info camera_i2c_ov7670soc = { I2C_BOARD_INFO("ov7670soc", 0x21), }; +static struct tegra_camera_platform_data ov7670_tegra_camera_platform_data = { + .disable_camera = tegra_camera_disable, + .enable_camera = tegra_camera_enable, + .flip_h = 0, + .flip_v = 0, + .port = TEGRA_CAMERA_PORT_VIP, + .internal_sync = false, + .vip_h_active_start = 0x8F, + .vip_v_active_start = 0x12, +}; + static struct soc_camera_link iclink_ov7670soc = { .board_info = &camera_i2c_ov7670soc, .bus_id = -1, /* This must match the .id of tegra_vi01_device */ - .priv = &tegra_camera_platform_data, + .priv = &ov7670_tegra_camera_platform_data, .i2c_adapter_id = 0, }; diff --git a/drivers/media/video/tegra_v4l2_camera.c b/drivers/media/video/tegra_v4l2_camera.c index c222048b59d4..e5cbb3a582dc 100644 --- a/drivers/media/video/tegra_v4l2_camera.c +++ b/drivers/media/video/tegra_v4l2_camera.c @@ -43,19 +43,11 @@ #define TEGRA_CAM_DRV_NAME "vi" #define TEGRA_CAM_VERSION_CODE KERNEL_VERSION(0, 0, 5) -static unsigned int internal_sync = 0; -module_param(internal_sync, int, 0644); -MODULE_PARM_DESC(internal_sync, "enable internal vsync and hsync decoded " \ - "from data"); - #define TEGRA_SYNCPT_VI_WAIT_TIMEOUT 200 #define TEGRA_SYNCPT_CSI_WAIT_TIMEOUT 200 #define TEGRA_SYNCPT_RETRY_COUNT 10 -#define TEGRA_VIP_H_ACTIVE_START 0x8F /*0x98 */ -#define TEGRA_VIP_V_ACTIVE_START 0x12 /*0x10 */ - /* SYNCPTs 12-17 are reserved for VI. */ #define TEGRA_VI_SYNCPT_VI NVSYNCPT_VI_ISP_2 #define TEGRA_VI_SYNCPT_CSI_A NVSYNCPT_VI_ISP_3 @@ -630,14 +622,14 @@ static void tegra_camera_capture_setup_vip(struct tegra_camera_dev *pcdev, struct soc_camera_device *icd, u32 input_control) { - + struct tegra_camera_platform_data *pdata = icd->link->priv; TC_VI_REG_WT(pcdev, TEGRA_VI_VI_CORE_CONTROL, 0x00000000); TC_VI_REG_WT(pcdev, TEGRA_VI_VI_INPUT_CONTROL, /* (1 << 27) | field detect */ (0 << 28) | /* 1 == top field is even field, 00 == odd */ - ((internal_sync == 1) << 25) | /* 1 == hsync/vsync decoded + (((pdata->internal_sync == true) ? 1 : 0) << 25) | /* 1 == hsync/vsync decoded internally from data (BT.656) */ (1 << 1) | /* VIP_INPUT_ENABLE */ @@ -649,10 +641,10 @@ static void tegra_camera_capture_setup_vip(struct tegra_camera_dev *pcdev, /* VIP H_ACTIVE and V_ACTIVE */ TC_VI_REG_WT(pcdev, TEGRA_VI_VIP_H_ACTIVE, (icd->user_width << 16) | - (TEGRA_VIP_H_ACTIVE_START - ((internal_sync == 1) ? 1 : 0))); + (pdata->vip_h_active_start - ((pdata->internal_sync == true) ? 1 : 0))); TC_VI_REG_WT(pcdev, TEGRA_VI_VIP_V_ACTIVE, ((IS_INTERLACED ? (icd->user_height/2) : (icd->user_height)) << 16) | - TEGRA_VIP_V_ACTIVE_START); + pdata->vip_v_active_start); /* * For VIP, D9..D2 is mapped to the video decoder's P7..P0. diff --git a/include/media/tegra_v4l2_camera.h b/include/media/tegra_v4l2_camera.h index f6390b6e5609..fef8a9bb5db0 100644 --- a/include/media/tegra_v4l2_camera.h +++ b/include/media/tegra_v4l2_camera.h @@ -35,6 +35,11 @@ struct tegra_camera_platform_data { enum tegra_camera_port port; int lanes; /* For CSI port only */ bool continuous_clk; /* For CSI port only */ + + bool internal_sync; /* VIP */ + u8 vip_h_active_start; /* VIP */ + u8 vip_v_active_start; /* VIP */ + }; #endif /* _TEGRA_CAMERA_H_ */ -- cgit v1.2.3