mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 06:04:23 +08:00
[media] V4L: soc-camera: add helper functions for new bus configuration type
Add helper functions to process the new media bus configuration type similar to soc_camera_apply_sensor_flags() and soc_camera_bus_param_compatible(). Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
7cd74ffb04
commit
32c69fcc78
@ -107,6 +107,40 @@ const struct soc_camera_format_xlate *soc_camera_xlate_by_fourcc(
|
||||
}
|
||||
EXPORT_SYMBOL(soc_camera_xlate_by_fourcc);
|
||||
|
||||
/**
|
||||
* soc_camera_apply_board_flags() - apply platform SOCAM_SENSOR_INVERT_* flags
|
||||
* @icl: camera platform parameters
|
||||
* @cfg: media bus configuration
|
||||
* @return: resulting flags
|
||||
*/
|
||||
unsigned long soc_camera_apply_board_flags(struct soc_camera_link *icl,
|
||||
const struct v4l2_mbus_config *cfg)
|
||||
{
|
||||
unsigned long f, flags = cfg->flags;
|
||||
|
||||
/* If only one of the two polarities is supported, switch to the opposite */
|
||||
if (icl->flags & SOCAM_SENSOR_INVERT_HSYNC) {
|
||||
f = flags & (V4L2_MBUS_HSYNC_ACTIVE_HIGH | V4L2_MBUS_HSYNC_ACTIVE_LOW);
|
||||
if (f == V4L2_MBUS_HSYNC_ACTIVE_HIGH || f == V4L2_MBUS_HSYNC_ACTIVE_LOW)
|
||||
flags ^= V4L2_MBUS_HSYNC_ACTIVE_HIGH | V4L2_MBUS_HSYNC_ACTIVE_LOW;
|
||||
}
|
||||
|
||||
if (icl->flags & SOCAM_SENSOR_INVERT_VSYNC) {
|
||||
f = flags & (V4L2_MBUS_VSYNC_ACTIVE_HIGH | V4L2_MBUS_VSYNC_ACTIVE_LOW);
|
||||
if (f == V4L2_MBUS_VSYNC_ACTIVE_HIGH || f == V4L2_MBUS_VSYNC_ACTIVE_LOW)
|
||||
flags ^= V4L2_MBUS_VSYNC_ACTIVE_HIGH | V4L2_MBUS_VSYNC_ACTIVE_LOW;
|
||||
}
|
||||
|
||||
if (icl->flags & SOCAM_SENSOR_INVERT_PCLK) {
|
||||
f = flags & (V4L2_MBUS_PCLK_SAMPLE_RISING | V4L2_MBUS_PCLK_SAMPLE_FALLING);
|
||||
if (f == V4L2_MBUS_PCLK_SAMPLE_RISING || f == V4L2_MBUS_PCLK_SAMPLE_FALLING)
|
||||
flags ^= V4L2_MBUS_PCLK_SAMPLE_RISING | V4L2_MBUS_PCLK_SAMPLE_FALLING;
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
EXPORT_SYMBOL(soc_camera_apply_board_flags);
|
||||
|
||||
/**
|
||||
* soc_camera_apply_sensor_flags() - apply platform SOCAM_SENSOR_INVERT_* flags
|
||||
* @icl: camera platform parameters
|
||||
|
@ -383,6 +383,39 @@ const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
|
||||
}
|
||||
EXPORT_SYMBOL(soc_mbus_get_fmtdesc);
|
||||
|
||||
unsigned int soc_mbus_config_compatible(const struct v4l2_mbus_config *cfg,
|
||||
unsigned int flags)
|
||||
{
|
||||
unsigned long common_flags;
|
||||
bool hsync = true, vsync = true, pclk, data, mode;
|
||||
bool mipi_lanes, mipi_clock;
|
||||
|
||||
common_flags = cfg->flags & flags;
|
||||
|
||||
switch (cfg->type) {
|
||||
case V4L2_MBUS_PARALLEL:
|
||||
hsync = common_flags & (V4L2_MBUS_HSYNC_ACTIVE_HIGH |
|
||||
V4L2_MBUS_HSYNC_ACTIVE_LOW);
|
||||
vsync = common_flags & (V4L2_MBUS_VSYNC_ACTIVE_HIGH |
|
||||
V4L2_MBUS_VSYNC_ACTIVE_LOW);
|
||||
case V4L2_MBUS_BT656:
|
||||
pclk = common_flags & (V4L2_MBUS_PCLK_SAMPLE_RISING |
|
||||
V4L2_MBUS_PCLK_SAMPLE_FALLING);
|
||||
data = common_flags & (V4L2_MBUS_DATA_ACTIVE_HIGH |
|
||||
V4L2_MBUS_DATA_ACTIVE_LOW);
|
||||
mode = common_flags & (V4L2_MBUS_MASTER | V4L2_MBUS_SLAVE);
|
||||
return (!hsync || !vsync || !pclk || !data || !mode) ?
|
||||
0 : common_flags;
|
||||
case V4L2_MBUS_CSI2:
|
||||
mipi_lanes = common_flags & V4L2_MBUS_CSI2_LANES;
|
||||
mipi_clock = common_flags & (V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK |
|
||||
V4L2_MBUS_CSI2_CONTINUOUS_CLOCK);
|
||||
return (!mipi_lanes || !mipi_clock) ? 0 : common_flags;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(soc_mbus_config_compatible);
|
||||
|
||||
static int __init soc_mbus_init(void)
|
||||
{
|
||||
return 0;
|
||||
|
@ -300,8 +300,10 @@ static inline void soc_camera_limit_side(int *start, int *length,
|
||||
*start = start_min + length_max - *length;
|
||||
}
|
||||
|
||||
extern unsigned long soc_camera_apply_sensor_flags(struct soc_camera_link *icl,
|
||||
unsigned long flags);
|
||||
unsigned long soc_camera_apply_sensor_flags(struct soc_camera_link *icl,
|
||||
unsigned long flags);
|
||||
unsigned long soc_camera_apply_board_flags(struct soc_camera_link *icl,
|
||||
const struct v4l2_mbus_config *cfg);
|
||||
|
||||
/* This is only temporary here - until v4l2-subdev begins to link to video_device */
|
||||
#include <linux/i2c.h>
|
||||
|
@ -82,5 +82,7 @@ const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
|
||||
s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf);
|
||||
int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf,
|
||||
unsigned int *numerator, unsigned int *denominator);
|
||||
unsigned int soc_mbus_config_compatible(const struct v4l2_mbus_config *cfg,
|
||||
unsigned int flags);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user