On Wed, Jun 10, 2020 at 03:40:04PM +0200, Niklas Söderlund wrote: > Hi Suresh, > > Thanks for your persistent work! > > On 2020-06-08 12:25:03 +0900, Suresh Udipi wrote: > > hsfreqrange should be chosen based on the calculated mbps which > > is closer to the default bit rate and within the range as per > > table[1]. But current calculation always selects first value which > > is greater than or equal to the calculated mbps which may lead > > to chosing a wrong range in some cases. > > > > For example for 360 mbps for H3/M3N > > Existing logic selects > > Calculated value 360Mbps : Default 400Mbps Range [368.125 -433.125 mbps] > > > > This hsfreqrange is out of range. > > > > The logic is changed to get the default value which is closest to the > > calculated value [1] > > > > Calculated value 360Mbps : Default 350Mbps Range [320.625 -380.625 mpbs] > > > > [1] specs r19uh0105ej0200-r-car-3rd-generation.pdf [Table 25.9] > > > > Please note that According to Renesas in Table 25.9 the range for > > 220 default value is corrected as below > > > > |Range (Mbps) | Default Bit rate (Mbps) | > > ----------------------------------------------- > > | 197.125-244.125 | 220 | > > ----------------------------------------------- > > > > Fixes: 769afd212b16 ("media: rcar-csi2: add Renesas R-Car MIPI CSI-2 receiver driver") > > > > Signed-off-by: Suresh Udipi <sudipi@xxxxxxxxxxxxxx> > > Signed-off-by: Kazuyoshi Akiyama <akiyama@xxxxxxxxxxxxx> > > Signed-off-by: Michael Rodin <mrodin@xxxxxxxxxxxxxx> > > --- > > Changes in v2: > > - Added the boundary check for the maximum bit rate. > > > > - Simplified the logic by remmoving range check > > as only the closest default value covers most > > of the use cases. > > > > - Aligning the commit message based on the above change > > > > > > Changes in v3: > > - Added max member from struct rcsi2_mbps_reg. > > mbps varialbe cannot be removed from rcsi2_mbps_reg, > > since this structure is reused for > > phtw_mbps_h3_v3h_m3n/phtw_mbps_v3m_e3 where mbps is > > used. > > > > > > - Update the walk of the array in rcsi2_set_phypll() so that it finds > > the first entry where the calculated bit rate is less than the max. > > > > - Support lower bit rates less than 80Mbps like 48Mbps > > (Raspberry pi camera 640x480 connected to Kingfisher) > > can also be supported by selecting the lowest default bit rate 80Mbps > > as done before this fix > > > > - Alignement of the commit message based on above changes. > > > > Changes in v4: > > - Remove unncessary braces. > > > > Changes in v5: > > - Removed mbps variable in rcsi2_mbps_reg and aligned all > > tables accordingly > > > > Changes in v6 > > - Renesas correct the range of default value 220Mbps. Now > > if we select the nearest value to the default value all > > the values are in range. So reverting back to original patch > > > > - Added warning for values less than Minimum 80Mbps > > > > > > drivers/media/platform/rcar-vin/rcar-csi2.c | 23 ++++++++++++++++++----- > > 1 file changed, 18 insertions(+), 5 deletions(-) > > > > diff --git a/drivers/media/platform/rcar-vin/rcar-csi2.c b/drivers/media/platform/rcar-vin/rcar-csi2.c > > index 151e6a9..8c502b7 100644 > > --- a/drivers/media/platform/rcar-vin/rcar-csi2.c > > +++ b/drivers/media/platform/rcar-vin/rcar-csi2.c > > @@ -199,6 +199,8 @@ static const struct rcsi2_mbps_reg phtw_mbps_v3m_e3[] = { > > /* PHY Frequency Control */ > > #define PHYPLL_REG 0x68 > > #define PHYPLL_HSFREQRANGE(n) ((n) << 16) > > +#define PHYPLL_HSFREQRANGE_MAX 1500 > > +#define PHYPLL_HSFREQRANGE_MIN 80 > > > > static const struct rcsi2_mbps_reg hsfreqrange_h3_v3h_m3n[] = { > > { .mbps = 80, .reg = 0x00 }, > > @@ -431,16 +433,27 @@ static int rcsi2_wait_phy_start(struct rcar_csi2 *priv) > > static int rcsi2_set_phypll(struct rcar_csi2 *priv, unsigned int mbps) > > { > > const struct rcsi2_mbps_reg *hsfreq; > > + const struct rcsi2_mbps_reg *hsfreq_prev = NULL; > > > > - for (hsfreq = priv->info->hsfreqrange; hsfreq->mbps != 0; hsfreq++) > > - if (hsfreq->mbps >= mbps) > > - break; > > - > > - if (!hsfreq->mbps) { > > + if (mbps > PHYPLL_HSFREQRANGE_MAX) { > > dev_err(priv->dev, "Unsupported PHY speed (%u Mbps)", mbps); > > return -ERANGE; > > } > > > > + if (mbps < PHYPLL_HSFREQRANGE_MIN) > > + dev_warn(priv->dev, "PHY speed (%u Mbps) less \ > > + than Min 80Mbps\n", mbps); > > I would drop this warning. > This was suggested by Michael. Michael is it ok to drop this warning as it is not available before this changes also. > > + > > + for (hsfreq = priv->info->hsfreqrange; hsfreq->mbps != 0; hsfreq++) { > > + if (hsfreq->mbps >= mbps) > > + break; > > + hsfreq_prev = hsfreq; > > + } > > + > > + if (hsfreq_prev && > > + ((mbps - hsfreq_prev->mbps) <= (hsfreq->mbps - mbps))) > > Longer lines are now OK [1] and I think it would add to the readability > here. > > > + hsfreq = hsfreq_prev; > > + > > How about > > static int rcsi2_set_phypll(struct rcar_csi2 *priv, unsigned int mbps) > { > const struct rcsi2_mbps_reg *hsfreq; > const struct rcsi2_mbps_reg *hsfreq_prev = NULL; > > for (hsfreq = priv->info->hsfreqrange; hsfreq->mbps != 0; hsfreq++) { > if (hsfreq->mbps >= mbps) > break; > hsfreq_prev = hsfreq; > } > > if (!hsfreq->mbps) { > dev_err(priv->dev, "Unsupported PHY speed (%u Mbps)", mbps); > return -ERANGE; > } > > if (hsfreq_prev && ((mbps - hsfreq_prev->mbps) <= (hsfreq->mbps - mbps))) > hsfreq = hsfreq_prev; > > rcsi2_write(priv, PHYPLL_REG, PHYPLL_HSFREQRANGE(hsfreq->reg)); > > return 0; > } > > > rcsi2_write(priv, PHYPLL_REG, PHYPLL_HSFREQRANGE(hsfreq->reg)); > > > > return 0; Agreed I will do the changes and update. > > -- > > 2.7.4 > > > > 1. https://lkml.org/lkml/2020/5/29/1038 > > -- > Regards, > Niklas Söderlund -- Best Regards, Suresh Udipi.