Message ID | 20190110140213.5198-5-jacopo+renesas@jmondi.org (mailing list archive) |
---|---|
State | New |
Delegated to: | Kieran Bingham |
Headers | show |
Series | media: adv748x: Implement dynamic routing support | expand |
Hi Jacopo, Thanks for your patch. On 2019-01-10 15:02:11 +0100, Jacopo Mondi wrote: > The power_up_tx() procedure needs to set a few registers conditionally to > the selected video source, but it currently checks for the provided tx to > be either TXA or TXB. > > With the introduction of dynamic routing between HDMI and AFE entities to > TXA, checking which TX the function is operating on is not meaningful anymore. > > To fix this, store the subdevice of the source providing video data to the > CSI-2 TX in the 'struct adv748x_csi2' representing the TX and check on it. > > Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org> Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> > --- > drivers/media/i2c/adv748x/adv748x-core.c | 2 +- > drivers/media/i2c/adv748x/adv748x-csi2.c | 13 ++++++++++--- > drivers/media/i2c/adv748x/adv748x.h | 1 + > 3 files changed, 12 insertions(+), 4 deletions(-) > > diff --git a/drivers/media/i2c/adv748x/adv748x-core.c b/drivers/media/i2c/adv748x/adv748x-core.c > index ad4e6424753a..200e00f93546 100644 > --- a/drivers/media/i2c/adv748x/adv748x-core.c > +++ b/drivers/media/i2c/adv748x/adv748x-core.c > @@ -254,7 +254,7 @@ static int adv748x_power_up_tx(struct adv748x_csi2 *tx) > adv748x_write_check(state, page, 0x00, 0xa0 | tx->num_lanes, &ret); > > /* ADI Required Write */ > - if (is_txa(tx)) { > + if (tx->src == &state->hdmi.sd) { > adv748x_write_check(state, page, 0xdb, 0x10, &ret); > adv748x_write_check(state, page, 0xd6, 0x07, &ret); > } else { > diff --git a/drivers/media/i2c/adv748x/adv748x-csi2.c b/drivers/media/i2c/adv748x/adv748x-csi2.c > index 8c3714495e11..353b6b9bf6a7 100644 > --- a/drivers/media/i2c/adv748x/adv748x-csi2.c > +++ b/drivers/media/i2c/adv748x/adv748x-csi2.c > @@ -46,9 +46,16 @@ static int adv748x_csi2_register_link(struct adv748x_csi2 *tx, > return ret; > } > > - return media_create_pad_link(&src->entity, src_pad, > - &tx->sd.entity, ADV748X_CSI2_SINK, > - enable ? MEDIA_LNK_FL_ENABLED : 0); > + ret = media_create_pad_link(&src->entity, src_pad, > + &tx->sd.entity, ADV748X_CSI2_SINK, > + enable ? MEDIA_LNK_FL_ENABLED : 0); > + if (ret) > + return ret; > + > + if (enable) > + tx->src = src; > + > + return 0; > } > > /* ----------------------------------------------------------------------------- > diff --git a/drivers/media/i2c/adv748x/adv748x.h b/drivers/media/i2c/adv748x/adv748x.h > index ab0c84adbea9..d22270f5e2c1 100644 > --- a/drivers/media/i2c/adv748x/adv748x.h > +++ b/drivers/media/i2c/adv748x/adv748x.h > @@ -84,6 +84,7 @@ struct adv748x_csi2 { > struct media_pad pads[ADV748X_CSI2_NR_PADS]; > struct v4l2_ctrl_handler ctrl_hdl; > struct v4l2_ctrl *pixel_rate; > + struct v4l2_subdev *src; > struct v4l2_subdev sd; > }; > > -- > 2.20.1 >
diff --git a/drivers/media/i2c/adv748x/adv748x-core.c b/drivers/media/i2c/adv748x/adv748x-core.c index ad4e6424753a..200e00f93546 100644 --- a/drivers/media/i2c/adv748x/adv748x-core.c +++ b/drivers/media/i2c/adv748x/adv748x-core.c @@ -254,7 +254,7 @@ static int adv748x_power_up_tx(struct adv748x_csi2 *tx) adv748x_write_check(state, page, 0x00, 0xa0 | tx->num_lanes, &ret); /* ADI Required Write */ - if (is_txa(tx)) { + if (tx->src == &state->hdmi.sd) { adv748x_write_check(state, page, 0xdb, 0x10, &ret); adv748x_write_check(state, page, 0xd6, 0x07, &ret); } else { diff --git a/drivers/media/i2c/adv748x/adv748x-csi2.c b/drivers/media/i2c/adv748x/adv748x-csi2.c index 8c3714495e11..353b6b9bf6a7 100644 --- a/drivers/media/i2c/adv748x/adv748x-csi2.c +++ b/drivers/media/i2c/adv748x/adv748x-csi2.c @@ -46,9 +46,16 @@ static int adv748x_csi2_register_link(struct adv748x_csi2 *tx, return ret; } - return media_create_pad_link(&src->entity, src_pad, - &tx->sd.entity, ADV748X_CSI2_SINK, - enable ? MEDIA_LNK_FL_ENABLED : 0); + ret = media_create_pad_link(&src->entity, src_pad, + &tx->sd.entity, ADV748X_CSI2_SINK, + enable ? MEDIA_LNK_FL_ENABLED : 0); + if (ret) + return ret; + + if (enable) + tx->src = src; + + return 0; } /* ----------------------------------------------------------------------------- diff --git a/drivers/media/i2c/adv748x/adv748x.h b/drivers/media/i2c/adv748x/adv748x.h index ab0c84adbea9..d22270f5e2c1 100644 --- a/drivers/media/i2c/adv748x/adv748x.h +++ b/drivers/media/i2c/adv748x/adv748x.h @@ -84,6 +84,7 @@ struct adv748x_csi2 { struct media_pad pads[ADV748X_CSI2_NR_PADS]; struct v4l2_ctrl_handler ctrl_hdl; struct v4l2_ctrl *pixel_rate; + struct v4l2_subdev *src; struct v4l2_subdev sd; };