mirror of
https://github.com/torvalds/linux.git
synced 2024-12-06 11:01:43 +00:00
media: rcar-csi2: Propagate the FLD signal for NTSC and PAL
Depending on which video standard is used the driver needs to setup the hardware to correctly handle fields. If stream is identified as NTSC or PAL setup field detection and propagate the field detection signal. Later versions of the datasheet have been updated to make it clear that FLD register should be set to 0 when dealing with non-interlaced field formats. Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
4ab44ff084
commit
9f7983bdc4
@ -68,6 +68,7 @@ struct rcar_csi2;
|
|||||||
/* Field Detection Control */
|
/* Field Detection Control */
|
||||||
#define FLD_REG 0x1c
|
#define FLD_REG 0x1c
|
||||||
#define FLD_FLD_NUM(n) (((n) & 0xff) << 16)
|
#define FLD_FLD_NUM(n) (((n) & 0xff) << 16)
|
||||||
|
#define FLD_DET_SEL(n) (((n) & 0x3) << 4)
|
||||||
#define FLD_FLD_EN4 BIT(3)
|
#define FLD_FLD_EN4 BIT(3)
|
||||||
#define FLD_FLD_EN3 BIT(2)
|
#define FLD_FLD_EN3 BIT(2)
|
||||||
#define FLD_FLD_EN2 BIT(1)
|
#define FLD_FLD_EN2 BIT(1)
|
||||||
@ -478,7 +479,7 @@ static int rcsi2_calc_mbps(struct rcar_csi2 *priv, unsigned int bpp)
|
|||||||
static int rcsi2_start_receiver(struct rcar_csi2 *priv)
|
static int rcsi2_start_receiver(struct rcar_csi2 *priv)
|
||||||
{
|
{
|
||||||
const struct rcar_csi2_format *format;
|
const struct rcar_csi2_format *format;
|
||||||
u32 phycnt, vcdt = 0, vcdt2 = 0;
|
u32 phycnt, vcdt = 0, vcdt2 = 0, fld = 0;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int mbps, ret;
|
int mbps, ret;
|
||||||
|
|
||||||
@ -510,6 +511,16 @@ static int rcsi2_start_receiver(struct rcar_csi2 *priv)
|
|||||||
vcdt2 |= vcdt_part << ((i % 2) * 16);
|
vcdt2 |= vcdt_part << ((i % 2) * 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (priv->mf.field == V4L2_FIELD_ALTERNATE) {
|
||||||
|
fld = FLD_DET_SEL(1) | FLD_FLD_EN4 | FLD_FLD_EN3 | FLD_FLD_EN2
|
||||||
|
| FLD_FLD_EN;
|
||||||
|
|
||||||
|
if (priv->mf.height == 240)
|
||||||
|
fld |= FLD_FLD_NUM(0);
|
||||||
|
else
|
||||||
|
fld |= FLD_FLD_NUM(1);
|
||||||
|
}
|
||||||
|
|
||||||
phycnt = PHYCNT_ENABLECLK;
|
phycnt = PHYCNT_ENABLECLK;
|
||||||
phycnt |= (1 << priv->lanes) - 1;
|
phycnt |= (1 << priv->lanes) - 1;
|
||||||
|
|
||||||
@ -556,8 +567,7 @@ static int rcsi2_start_receiver(struct rcar_csi2 *priv)
|
|||||||
rcsi2_write(priv, PHYCNT_REG, phycnt);
|
rcsi2_write(priv, PHYCNT_REG, phycnt);
|
||||||
rcsi2_write(priv, LINKCNT_REG, LINKCNT_MONITOR_EN |
|
rcsi2_write(priv, LINKCNT_REG, LINKCNT_MONITOR_EN |
|
||||||
LINKCNT_REG_MONI_PACT_EN | LINKCNT_ICLK_NONSTOP);
|
LINKCNT_REG_MONI_PACT_EN | LINKCNT_ICLK_NONSTOP);
|
||||||
rcsi2_write(priv, FLD_REG, FLD_FLD_NUM(2) | FLD_FLD_EN4 |
|
rcsi2_write(priv, FLD_REG, fld);
|
||||||
FLD_FLD_EN3 | FLD_FLD_EN2 | FLD_FLD_EN);
|
|
||||||
rcsi2_write(priv, PHYCNT_REG, phycnt | PHYCNT_SHUTDOWNZ);
|
rcsi2_write(priv, PHYCNT_REG, phycnt | PHYCNT_SHUTDOWNZ);
|
||||||
rcsi2_write(priv, PHYCNT_REG, phycnt | PHYCNT_SHUTDOWNZ | PHYCNT_RSTZ);
|
rcsi2_write(priv, PHYCNT_REG, phycnt | PHYCNT_SHUTDOWNZ | PHYCNT_RSTZ);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user