Message ID | 20201215170957.92761-6-jacopo+renesas@jmondi.org (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Kieran Bingham |
Headers | show |
Series | media: i2c: Add RDACM21 camera module | expand |
Hi Jacopo, Thank you for the patch. On Tue, Dec 15, 2020 at 06:09:57PM +0100, Jacopo Mondi wrote: > Adjust the initial reverse channel amplitude parsing from > firmware interface the 'maxim,reverse-channel-microvolt' > property. > > This change is required for both rdacm20 and rdacm21 camera > modules to be correctly probed when used in combination with > the max9286 deserializer. > > Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> > Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org> > --- > drivers/media/i2c/max9286.c | 23 ++++++++++++++++++++++- > 1 file changed, 22 insertions(+), 1 deletion(-) > > diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c > index 021309c6dd6f..9b40a4890c4d 100644 > --- a/drivers/media/i2c/max9286.c > +++ b/drivers/media/i2c/max9286.c > @@ -163,6 +163,8 @@ struct max9286_priv { > unsigned int mux_channel; > bool mux_open; > > + u32 reverse_channel_mv; > + > struct v4l2_ctrl_handler ctrls; > struct v4l2_ctrl *pixelrate; > > @@ -557,10 +559,14 @@ static int max9286_notify_bound(struct v4l2_async_notifier *notifier, > * All enabled sources have probed and enabled their reverse control > * channels: > * > + * - Increase the reverse channel amplitude to compensate for the > + * remote ends high threshold, if not done already > * - Verify all configuration links are properly detected > * - Disable auto-ack as communication on the control channel are now > * stable. > */ > + if (priv->reverse_channel_mv < 170) > + max9286_reverse_channel_setup(priv, 170); I'm beginning to wonder if there will be a need in the future to not increase the reverse channel amplitude (keeping the threshold low on the remote side). An increased amplitude increases power consumption, and if the environment isn't noisy, a low amplitude would work. The device tree would then need to specify both the initial amplitude required by the remote side, and the desired amplitude after initialization. What do you think ? Is it overkill ? We don't have to implement this now, so Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> but if this feature could be required later, we may want to take into account in the naming of the new DT property to reflect the fact that it is the initial value. > max9286_check_config_link(priv, priv->source_mask); > > /* > @@ -967,7 +973,7 @@ static int max9286_setup(struct max9286_priv *priv) > * only. This should be disabled after the mux is initialised. > */ > max9286_configure_i2c(priv, true); > - max9286_reverse_channel_setup(priv, 170); > + max9286_reverse_channel_setup(priv, priv->reverse_channel_mv); > > /* > * Enable GMSL links, mask unused ones and autodetect link > @@ -1131,6 +1137,7 @@ static int max9286_parse_dt(struct max9286_priv *priv) > struct device_node *i2c_mux; > struct device_node *node = NULL; > unsigned int i2c_mux_mask = 0; > + u32 reverse_channel_microvolt; > > /* Balance the of_node_put() performed by of_find_node_by_name(). */ > of_node_get(dev->of_node); > @@ -1221,6 +1228,20 @@ static int max9286_parse_dt(struct max9286_priv *priv) > } > of_node_put(node); > > + /* > + * Parse the initial value of the reverse channel amplitude from > + * the firmware interface and convert it to millivolts. > + * > + * Default it to 170mV for backward compatibility with DTBs that do not > + * provide the property. > + */ > + if (of_property_read_u32(dev->of_node, > + "maxim,reverse-channel-microvolt", > + &reverse_channel_microvolt)) > + priv->reverse_channel_mv = 170; > + else > + priv->reverse_channel_mv = reverse_channel_microvolt / 1000U; > + > priv->route_mask = priv->source_mask; > > return 0;
Hi Laurent, On Wed, Dec 16, 2020 at 07:22:17PM +0200, Laurent Pinchart wrote: > Hi Jacopo, > > Thank you for the patch. > > On Tue, Dec 15, 2020 at 06:09:57PM +0100, Jacopo Mondi wrote: > > Adjust the initial reverse channel amplitude parsing from > > firmware interface the 'maxim,reverse-channel-microvolt' > > property. > > > > This change is required for both rdacm20 and rdacm21 camera > > modules to be correctly probed when used in combination with > > the max9286 deserializer. > > > > Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> > > Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org> > > --- > > drivers/media/i2c/max9286.c | 23 ++++++++++++++++++++++- > > 1 file changed, 22 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c > > index 021309c6dd6f..9b40a4890c4d 100644 > > --- a/drivers/media/i2c/max9286.c > > +++ b/drivers/media/i2c/max9286.c > > @@ -163,6 +163,8 @@ struct max9286_priv { > > unsigned int mux_channel; > > bool mux_open; > > > > + u32 reverse_channel_mv; > > + > > struct v4l2_ctrl_handler ctrls; > > struct v4l2_ctrl *pixelrate; > > > > @@ -557,10 +559,14 @@ static int max9286_notify_bound(struct v4l2_async_notifier *notifier, > > * All enabled sources have probed and enabled their reverse control > > * channels: > > * > > + * - Increase the reverse channel amplitude to compensate for the > > + * remote ends high threshold, if not done already > > * - Verify all configuration links are properly detected > > * - Disable auto-ack as communication on the control channel are now > > * stable. > > */ > > + if (priv->reverse_channel_mv < 170) > > + max9286_reverse_channel_setup(priv, 170); > > I'm beginning to wonder if there will be a need in the future to not > increase the reverse channel amplitude (keeping the threshold low on the > remote side). An increased amplitude increases power consumption, and if > the environment isn't noisy, a low amplitude would work. The device tree > would then need to specify both the initial amplitude required by the > remote side, and the desired amplitude after initialization. What do you > think ? Is it overkill ? We don't have to implement this now, so > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > but if this feature could be required later, we may want to take into > account in the naming of the new DT property to reflect the fact that it > is the initial value. I had the same thought when I initially proposed "maxim,initial-reverse-channel-mV" Having to use the standard unit suffix that would have become "maxim,initial-reverse-channel-microvolt" which is extremely long. I can't tell if there will be any need to adjust the amplitude later. In any case, I would not rely on a DTS property to do so, as once we have probed the remote we have a subdev where to call 'get_mbus_config()' on, and from there we can report the high threshold status of the serializer and adjust the deser amplitude accordingly. The property documentation clearly says the there specified amplitude is 'initial' many times, so I don't think it is strictly necessary to report it in the name too. Would this work for you ? > > > max9286_check_config_link(priv, priv->source_mask); > > > > /* > > @@ -967,7 +973,7 @@ static int max9286_setup(struct max9286_priv *priv) > > * only. This should be disabled after the mux is initialised. > > */ > > max9286_configure_i2c(priv, true); > > - max9286_reverse_channel_setup(priv, 170); > > + max9286_reverse_channel_setup(priv, priv->reverse_channel_mv); > > > > /* > > * Enable GMSL links, mask unused ones and autodetect link > > @@ -1131,6 +1137,7 @@ static int max9286_parse_dt(struct max9286_priv *priv) > > struct device_node *i2c_mux; > > struct device_node *node = NULL; > > unsigned int i2c_mux_mask = 0; > > + u32 reverse_channel_microvolt; > > > > /* Balance the of_node_put() performed by of_find_node_by_name(). */ > > of_node_get(dev->of_node); > > @@ -1221,6 +1228,20 @@ static int max9286_parse_dt(struct max9286_priv *priv) > > } > > of_node_put(node); > > > > + /* > > + * Parse the initial value of the reverse channel amplitude from > > + * the firmware interface and convert it to millivolts. > > + * > > + * Default it to 170mV for backward compatibility with DTBs that do not > > + * provide the property. > > + */ > > + if (of_property_read_u32(dev->of_node, > > + "maxim,reverse-channel-microvolt", > > + &reverse_channel_microvolt)) > > + priv->reverse_channel_mv = 170; > > + else > > + priv->reverse_channel_mv = reverse_channel_microvolt / 1000U; > > + > > priv->route_mask = priv->source_mask; > > > > return 0; > > -- > Regards, > > Laurent Pinchart
Hi Jacopo, On Mon, Jan 11, 2021 at 11:43:11AM +0100, Jacopo Mondi wrote: > On Wed, Dec 16, 2020 at 07:22:17PM +0200, Laurent Pinchart wrote: > > On Tue, Dec 15, 2020 at 06:09:57PM +0100, Jacopo Mondi wrote: > > > Adjust the initial reverse channel amplitude parsing from > > > firmware interface the 'maxim,reverse-channel-microvolt' > > > property. > > > > > > This change is required for both rdacm20 and rdacm21 camera > > > modules to be correctly probed when used in combination with > > > the max9286 deserializer. > > > > > > Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> > > > Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org> > > > --- > > > drivers/media/i2c/max9286.c | 23 ++++++++++++++++++++++- > > > 1 file changed, 22 insertions(+), 1 deletion(-) > > > > > > diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c > > > index 021309c6dd6f..9b40a4890c4d 100644 > > > --- a/drivers/media/i2c/max9286.c > > > +++ b/drivers/media/i2c/max9286.c > > > @@ -163,6 +163,8 @@ struct max9286_priv { > > > unsigned int mux_channel; > > > bool mux_open; > > > > > > + u32 reverse_channel_mv; > > > + > > > struct v4l2_ctrl_handler ctrls; > > > struct v4l2_ctrl *pixelrate; > > > > > > @@ -557,10 +559,14 @@ static int max9286_notify_bound(struct v4l2_async_notifier *notifier, > > > * All enabled sources have probed and enabled their reverse control > > > * channels: > > > * > > > + * - Increase the reverse channel amplitude to compensate for the > > > + * remote ends high threshold, if not done already > > > * - Verify all configuration links are properly detected > > > * - Disable auto-ack as communication on the control channel are now > > > * stable. > > > */ > > > + if (priv->reverse_channel_mv < 170) > > > + max9286_reverse_channel_setup(priv, 170); > > > > I'm beginning to wonder if there will be a need in the future to not > > increase the reverse channel amplitude (keeping the threshold low on the > > remote side). An increased amplitude increases power consumption, and if > > the environment isn't noisy, a low amplitude would work. The device tree > > would then need to specify both the initial amplitude required by the > > remote side, and the desired amplitude after initialization. What do you > > think ? Is it overkill ? We don't have to implement this now, so > > > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > > > but if this feature could be required later, we may want to take into > > account in the naming of the new DT property to reflect the fact that it > > is the initial value. > > I had the same thought when I initially proposed > "maxim,initial-reverse-channel-mV" > > Having to use the standard unit suffix that would have become > "maxim,initial-reverse-channel-microvolt" > which is extremely long. > > I can't tell if there will be any need to adjust the amplitude later. > In any case, I would not rely on a DTS property to do so, as once we > have probed the remote we have a subdev where to call > 'get_mbus_config()' on, and from there we can report the high threshold > status of the serializer and adjust the deser amplitude accordingly. I don't think that's the point. The threshold of the serializer is something we can configure at runtime. What voltage level to use after initialization time is a system property as it depends on noise immunity, so we'll have to specify it in DT. > The property documentation clearly says the there specified amplitude > is 'initial' many times, so I don't think it is strictly necessary to > report it in the name too. > > Would this work for you ? I don't mind either way. > > > max9286_check_config_link(priv, priv->source_mask); > > > > > > /* > > > @@ -967,7 +973,7 @@ static int max9286_setup(struct max9286_priv *priv) > > > * only. This should be disabled after the mux is initialised. > > > */ > > > max9286_configure_i2c(priv, true); > > > - max9286_reverse_channel_setup(priv, 170); > > > + max9286_reverse_channel_setup(priv, priv->reverse_channel_mv); > > > > > > /* > > > * Enable GMSL links, mask unused ones and autodetect link > > > @@ -1131,6 +1137,7 @@ static int max9286_parse_dt(struct max9286_priv *priv) > > > struct device_node *i2c_mux; > > > struct device_node *node = NULL; > > > unsigned int i2c_mux_mask = 0; > > > + u32 reverse_channel_microvolt; > > > > > > /* Balance the of_node_put() performed by of_find_node_by_name(). */ > > > of_node_get(dev->of_node); > > > @@ -1221,6 +1228,20 @@ static int max9286_parse_dt(struct max9286_priv *priv) > > > } > > > of_node_put(node); > > > > > > + /* > > > + * Parse the initial value of the reverse channel amplitude from > > > + * the firmware interface and convert it to millivolts. > > > + * > > > + * Default it to 170mV for backward compatibility with DTBs that do not > > > + * provide the property. > > > + */ > > > + if (of_property_read_u32(dev->of_node, > > > + "maxim,reverse-channel-microvolt", > > > + &reverse_channel_microvolt)) > > > + priv->reverse_channel_mv = 170; > > > + else > > > + priv->reverse_channel_mv = reverse_channel_microvolt / 1000U; > > > + > > > priv->route_mask = priv->source_mask; > > > > > > return 0;
Hi Laurent, On Mon, Jan 11, 2021 at 12:58:59PM +0200, Laurent Pinchart wrote: > Hi Jacopo, > > On Mon, Jan 11, 2021 at 11:43:11AM +0100, Jacopo Mondi wrote: > > On Wed, Dec 16, 2020 at 07:22:17PM +0200, Laurent Pinchart wrote: > > > On Tue, Dec 15, 2020 at 06:09:57PM +0100, Jacopo Mondi wrote: > > > > Adjust the initial reverse channel amplitude parsing from > > > > firmware interface the 'maxim,reverse-channel-microvolt' > > > > property. > > > > > > > > This change is required for both rdacm20 and rdacm21 camera > > > > modules to be correctly probed when used in combination with > > > > the max9286 deserializer. > > > > > > > > Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> > > > > Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org> > > > > --- > > > > drivers/media/i2c/max9286.c | 23 ++++++++++++++++++++++- > > > > 1 file changed, 22 insertions(+), 1 deletion(-) > > > > > > > > diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c > > > > index 021309c6dd6f..9b40a4890c4d 100644 > > > > --- a/drivers/media/i2c/max9286.c > > > > +++ b/drivers/media/i2c/max9286.c > > > > @@ -163,6 +163,8 @@ struct max9286_priv { > > > > unsigned int mux_channel; > > > > bool mux_open; > > > > > > > > + u32 reverse_channel_mv; > > > > + > > > > struct v4l2_ctrl_handler ctrls; > > > > struct v4l2_ctrl *pixelrate; > > > > > > > > @@ -557,10 +559,14 @@ static int max9286_notify_bound(struct v4l2_async_notifier *notifier, > > > > * All enabled sources have probed and enabled their reverse control > > > > * channels: > > > > * > > > > + * - Increase the reverse channel amplitude to compensate for the > > > > + * remote ends high threshold, if not done already > > > > * - Verify all configuration links are properly detected > > > > * - Disable auto-ack as communication on the control channel are now > > > > * stable. > > > > */ > > > > + if (priv->reverse_channel_mv < 170) > > > > + max9286_reverse_channel_setup(priv, 170); > > > > > > I'm beginning to wonder if there will be a need in the future to not > > > increase the reverse channel amplitude (keeping the threshold low on the > > > remote side). An increased amplitude increases power consumption, and if > > > the environment isn't noisy, a low amplitude would work. The device tree > > > would then need to specify both the initial amplitude required by the > > > remote side, and the desired amplitude after initialization. What do you > > > think ? Is it overkill ? We don't have to implement this now, so > > > > > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > > > > > but if this feature could be required later, we may want to take into > > > account in the naming of the new DT property to reflect the fact that it > > > is the initial value. > > > > I had the same thought when I initially proposed > > "maxim,initial-reverse-channel-mV" > > > > Having to use the standard unit suffix that would have become > > "maxim,initial-reverse-channel-microvolt" > > which is extremely long. > > > > I can't tell if there will be any need to adjust the amplitude later. > > In any case, I would not rely on a DTS property to do so, as once we > > have probed the remote we have a subdev where to call > > 'get_mbus_config()' on, and from there we can report the high threshold > > status of the serializer and adjust the deser amplitude accordingly. > > I don't think that's the point. The threshold of the serializer is > something we can configure at runtime. What voltage level to use after How so ? I mean, we can add an API for this, but currently it's configured at probe time and that's it. Its configuration might as well come from a DT property like we do on the deserializer here but I fail to see why it's different. Both settings depends on the required noise immunity of th system. > initialization time is a system property as it depends on noise > immunity, so we'll have to specify it in DT. I don't see it differently than what happens on the serializer. We can add an API if we want to, but it's configured at probe time (initial value) and later can be adjusted in reponse to the serializer configuration setting. I feel like we're on different pages :/ > > > The property documentation clearly says the there specified amplitude > > is 'initial' many times, so I don't think it is strictly necessary to > > report it in the name too. > > > > Would this work for you ? > > I don't mind either way. > > > > > max9286_check_config_link(priv, priv->source_mask); > > > > > > > > /* > > > > @@ -967,7 +973,7 @@ static int max9286_setup(struct max9286_priv *priv) > > > > * only. This should be disabled after the mux is initialised. > > > > */ > > > > max9286_configure_i2c(priv, true); > > > > - max9286_reverse_channel_setup(priv, 170); > > > > + max9286_reverse_channel_setup(priv, priv->reverse_channel_mv); > > > > > > > > /* > > > > * Enable GMSL links, mask unused ones and autodetect link > > > > @@ -1131,6 +1137,7 @@ static int max9286_parse_dt(struct max9286_priv *priv) > > > > struct device_node *i2c_mux; > > > > struct device_node *node = NULL; > > > > unsigned int i2c_mux_mask = 0; > > > > + u32 reverse_channel_microvolt; > > > > > > > > /* Balance the of_node_put() performed by of_find_node_by_name(). */ > > > > of_node_get(dev->of_node); > > > > @@ -1221,6 +1228,20 @@ static int max9286_parse_dt(struct max9286_priv *priv) > > > > } > > > > of_node_put(node); > > > > > > > > + /* > > > > + * Parse the initial value of the reverse channel amplitude from > > > > + * the firmware interface and convert it to millivolts. > > > > + * > > > > + * Default it to 170mV for backward compatibility with DTBs that do not > > > > + * provide the property. > > > > + */ > > > > + if (of_property_read_u32(dev->of_node, > > > > + "maxim,reverse-channel-microvolt", > > > > + &reverse_channel_microvolt)) > > > > + priv->reverse_channel_mv = 170; > > > > + else > > > > + priv->reverse_channel_mv = reverse_channel_microvolt / 1000U; > > > > + > > > > priv->route_mask = priv->source_mask; > > > > > > > > return 0; > > -- > Regards, > > Laurent Pinchart
Hi Jacopo, On Mon, Jan 11, 2021 at 12:20:23PM +0100, Jacopo Mondi wrote: > On Mon, Jan 11, 2021 at 12:58:59PM +0200, Laurent Pinchart wrote: > > On Mon, Jan 11, 2021 at 11:43:11AM +0100, Jacopo Mondi wrote: > >> On Wed, Dec 16, 2020 at 07:22:17PM +0200, Laurent Pinchart wrote: > >>> On Tue, Dec 15, 2020 at 06:09:57PM +0100, Jacopo Mondi wrote: > >>>> Adjust the initial reverse channel amplitude parsing from > >>>> firmware interface the 'maxim,reverse-channel-microvolt' > >>>> property. > >>>> > >>>> This change is required for both rdacm20 and rdacm21 camera > >>>> modules to be correctly probed when used in combination with > >>>> the max9286 deserializer. > >>>> > >>>> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> > >>>> Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org> > >>>> --- > >>>> drivers/media/i2c/max9286.c | 23 ++++++++++++++++++++++- > >>>> 1 file changed, 22 insertions(+), 1 deletion(-) > >>>> > >>>> diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c > >>>> index 021309c6dd6f..9b40a4890c4d 100644 > >>>> --- a/drivers/media/i2c/max9286.c > >>>> +++ b/drivers/media/i2c/max9286.c > >>>> @@ -163,6 +163,8 @@ struct max9286_priv { > >>>> unsigned int mux_channel; > >>>> bool mux_open; > >>>> > >>>> + u32 reverse_channel_mv; > >>>> + > >>>> struct v4l2_ctrl_handler ctrls; > >>>> struct v4l2_ctrl *pixelrate; > >>>> > >>>> @@ -557,10 +559,14 @@ static int max9286_notify_bound(struct v4l2_async_notifier *notifier, > >>>> * All enabled sources have probed and enabled their reverse control > >>>> * channels: > >>>> * > >>>> + * - Increase the reverse channel amplitude to compensate for the > >>>> + * remote ends high threshold, if not done already > >>>> * - Verify all configuration links are properly detected > >>>> * - Disable auto-ack as communication on the control channel are now > >>>> * stable. > >>>> */ > >>>> + if (priv->reverse_channel_mv < 170) > >>>> + max9286_reverse_channel_setup(priv, 170); > >>> > >>> I'm beginning to wonder if there will be a need in the future to not > >>> increase the reverse channel amplitude (keeping the threshold low on the > >>> remote side). An increased amplitude increases power consumption, and if > >>> the environment isn't noisy, a low amplitude would work. The device tree > >>> would then need to specify both the initial amplitude required by the > >>> remote side, and the desired amplitude after initialization. What do you > >>> think ? Is it overkill ? We don't have to implement this now, so > >>> > >>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > >>> > >>> but if this feature could be required later, we may want to take into > >>> account in the naming of the new DT property to reflect the fact that it > >>> is the initial value. > >> > >> I had the same thought when I initially proposed > >> "maxim,initial-reverse-channel-mV" > >> > >> Having to use the standard unit suffix that would have become > >> "maxim,initial-reverse-channel-microvolt" > >> which is extremely long. > >> > >> I can't tell if there will be any need to adjust the amplitude later. > >> In any case, I would not rely on a DTS property to do so, as once we > >> have probed the remote we have a subdev where to call > >> 'get_mbus_config()' on, and from there we can report the high threshold > >> status of the serializer and adjust the deser amplitude accordingly. > > > > I don't think that's the point. The threshold of the serializer is > > something we can configure at runtime. What voltage level to use after > > How so ? I mean, we can add an API for this, but currently it's > configured at probe time and that's it. Its configuration might as > well come from a DT property like we do on the deserializer here but I > fail to see why it's different. Both settings depends on the required > noise immunity of th system. The voltage level configuration need to match between the tserializer (transmitter) and the deserializer (receiver). The serializer is configured with a voltage level, and the deserializer needs to be configured with a corresponding threshold. The voltage level of the serializer is configurable on the camera side when the system is powered up. The RDACM20 has a microcontroller which can configure the serializer, and other cameras may have similar mechanisms. As the deserializer can't query the information from the serializer (communication is unreliable if the threshold has an incorrect value), we need a DT property to tell the deserializer what threshold is initially used by the camera when it gets powered up. This only covers initialization. A camera could boot up with a low voltage level, but we may want to increase the voltage level (and thus the threshold on the deserializer side) to increase noise immunity. Or, if the system environment isn't noisy, we may want to keep a low voltage level, or even decrease it if the camera boots up with a high voltage level. This runtime voltage level depends on the system design and its susceptibility to noise, and is thus a system property. Should we want to make it configurable, it should be specified in DT, and it's separate from the initial voltage level that is used to establish communication. > > initialization time is a system property as it depends on noise > > immunity, so we'll have to specify it in DT. > > I don't see it differently than what happens on the serializer. We can > add an API if we want to, but it's configured at probe time (initial > value) and later can be adjusted in reponse to the serializer > configuration setting. > > I feel like we're on different pages :/ > > >> The property documentation clearly says the there specified amplitude > >> is 'initial' many times, so I don't think it is strictly necessary to > >> report it in the name too. > >> > >> Would this work for you ? > > > > I don't mind either way. > > > >>>> max9286_check_config_link(priv, priv->source_mask); > >>>> > >>>> /* > >>>> @@ -967,7 +973,7 @@ static int max9286_setup(struct max9286_priv *priv) > >>>> * only. This should be disabled after the mux is initialised. > >>>> */ > >>>> max9286_configure_i2c(priv, true); > >>>> - max9286_reverse_channel_setup(priv, 170); > >>>> + max9286_reverse_channel_setup(priv, priv->reverse_channel_mv); > >>>> > >>>> /* > >>>> * Enable GMSL links, mask unused ones and autodetect link > >>>> @@ -1131,6 +1137,7 @@ static int max9286_parse_dt(struct max9286_priv *priv) > >>>> struct device_node *i2c_mux; > >>>> struct device_node *node = NULL; > >>>> unsigned int i2c_mux_mask = 0; > >>>> + u32 reverse_channel_microvolt; > >>>> > >>>> /* Balance the of_node_put() performed by of_find_node_by_name(). */ > >>>> of_node_get(dev->of_node); > >>>> @@ -1221,6 +1228,20 @@ static int max9286_parse_dt(struct max9286_priv *priv) > >>>> } > >>>> of_node_put(node); > >>>> > >>>> + /* > >>>> + * Parse the initial value of the reverse channel amplitude from > >>>> + * the firmware interface and convert it to millivolts. > >>>> + * > >>>> + * Default it to 170mV for backward compatibility with DTBs that do not > >>>> + * provide the property. > >>>> + */ > >>>> + if (of_property_read_u32(dev->of_node, > >>>> + "maxim,reverse-channel-microvolt", > >>>> + &reverse_channel_microvolt)) > >>>> + priv->reverse_channel_mv = 170; > >>>> + else > >>>> + priv->reverse_channel_mv = reverse_channel_microvolt / 1000U; > >>>> + > >>>> priv->route_mask = priv->source_mask; > >>>> > >>>> return 0;
Hi Laurent, On Tue, Jan 12, 2021 at 07:03:42AM +0200, Laurent Pinchart wrote: > Hi Jacopo, > > On Mon, Jan 11, 2021 at 12:20:23PM +0100, Jacopo Mondi wrote: > > On Mon, Jan 11, 2021 at 12:58:59PM +0200, Laurent Pinchart wrote: > > > On Mon, Jan 11, 2021 at 11:43:11AM +0100, Jacopo Mondi wrote: > > >> On Wed, Dec 16, 2020 at 07:22:17PM +0200, Laurent Pinchart wrote: > > >>> On Tue, Dec 15, 2020 at 06:09:57PM +0100, Jacopo Mondi wrote: > > >>>> Adjust the initial reverse channel amplitude parsing from > > >>>> firmware interface the 'maxim,reverse-channel-microvolt' > > >>>> property. > > >>>> > > >>>> This change is required for both rdacm20 and rdacm21 camera > > >>>> modules to be correctly probed when used in combination with > > >>>> the max9286 deserializer. > > >>>> > > >>>> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> > > >>>> Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org> > > >>>> --- > > >>>> drivers/media/i2c/max9286.c | 23 ++++++++++++++++++++++- > > >>>> 1 file changed, 22 insertions(+), 1 deletion(-) > > >>>> > > >>>> diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c > > >>>> index 021309c6dd6f..9b40a4890c4d 100644 > > >>>> --- a/drivers/media/i2c/max9286.c > > >>>> +++ b/drivers/media/i2c/max9286.c > > >>>> @@ -163,6 +163,8 @@ struct max9286_priv { > > >>>> unsigned int mux_channel; > > >>>> bool mux_open; > > >>>> > > >>>> + u32 reverse_channel_mv; > > >>>> + > > >>>> struct v4l2_ctrl_handler ctrls; > > >>>> struct v4l2_ctrl *pixelrate; > > >>>> > > >>>> @@ -557,10 +559,14 @@ static int max9286_notify_bound(struct v4l2_async_notifier *notifier, > > >>>> * All enabled sources have probed and enabled their reverse control > > >>>> * channels: > > >>>> * > > >>>> + * - Increase the reverse channel amplitude to compensate for the > > >>>> + * remote ends high threshold, if not done already > > >>>> * - Verify all configuration links are properly detected > > >>>> * - Disable auto-ack as communication on the control channel are now > > >>>> * stable. > > >>>> */ > > >>>> + if (priv->reverse_channel_mv < 170) > > >>>> + max9286_reverse_channel_setup(priv, 170); > > >>> > > >>> I'm beginning to wonder if there will be a need in the future to not > > >>> increase the reverse channel amplitude (keeping the threshold low on the > > >>> remote side). An increased amplitude increases power consumption, and if > > >>> the environment isn't noisy, a low amplitude would work. The device tree > > >>> would then need to specify both the initial amplitude required by the > > >>> remote side, and the desired amplitude after initialization. What do you > > >>> think ? Is it overkill ? We don't have to implement this now, so > > >>> > > >>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > >>> > > >>> but if this feature could be required later, we may want to take into > > >>> account in the naming of the new DT property to reflect the fact that it > > >>> is the initial value. > > >> > > >> I had the same thought when I initially proposed > > >> "maxim,initial-reverse-channel-mV" > > >> > > >> Having to use the standard unit suffix that would have become > > >> "maxim,initial-reverse-channel-microvolt" > > >> which is extremely long. > > >> > > >> I can't tell if there will be any need to adjust the amplitude later. > > >> In any case, I would not rely on a DTS property to do so, as once we > > >> have probed the remote we have a subdev where to call > > >> 'get_mbus_config()' on, and from there we can report the high threshold > > >> status of the serializer and adjust the deser amplitude accordingly. > > > > > > I don't think that's the point. The threshold of the serializer is > > > something we can configure at runtime. What voltage level to use after > > > > How so ? I mean, we can add an API for this, but currently it's > > configured at probe time and that's it. Its configuration might as > > well come from a DT property like we do on the deserializer here but I > > fail to see why it's different. Both settings depends on the required > > noise immunity of th system. > > The voltage level configuration need to match between the tserializer > (transmitter) and the deserializer (receiver). The serializer is > configured with a voltage level, and the deserializer needs to be > configured with a corresponding threshold. > If I'm not mistaken it's actually the other way around, at least for the chips we're dealing with. The serializer (MAX9271) has an "Reverse Channel Receiver High Threshold Enable" bit (register 0x08[0]) undocumented in the chip manual but described in the "MAX9286 Programming Guide 2 10.pdf" document in the "Important Registers" section. The deserializer (MAX9286) has instead a configurable setting for the reverse channel signal amplitude, which is what we are controlling in this series. The deserializer reverse channel amplitude has to match the remote side 'high threshold enable' setting. If it is enabled the amplitude has to be increased to be able to probe the remote side. If it's not a lower amplitude has to be used to make comunication reliable. As you said, some models (RDACM20) might be pre-programmed with the 'high threshold enable' bit set, and so the deserializer reverse channel amplitude has to be adjusted accordingly to be able to comunicate on the reverse channel. > The voltage level of the serializer is configurable on the camera side > when the system is powered up. The RDACM20 has a microcontroller which > can configure the serializer, and other cameras may have similar > mechanisms. As the deserializer can't query the information from the > serializer (communication is unreliable if the threshold has an > incorrect value), we need a DT property to tell the deserializer what > threshold is initially used by the camera when it gets powered up. > That's what this series does, yes. > This only covers initialization. A camera could boot up with a low > voltage level, but we may want to increase the voltage level (and thus > the threshold on the deserializer side) to increase noise immunity. Or, > if the system environment isn't noisy, we may want to keep a low voltage > level, or even decrease it if the camera boots up with a high voltage > level. This runtime voltage level depends on the system design and its > susceptibility to noise, and is thus a system property. Should we want > to make it configurable, it should be specified in DT, and it's separate > from the initial voltage level that is used to establish communication. > And that's what I meant. Assuming we handle initialization correctly with this series, the serializers 'high threshold' configuration -after- initialization can be specified with a DT property on the -serializer- side. Then, to adjust the deserializer reverse channel amplitude, once we the remote has probed and we have a subdevice registered for it, we can query the 'high threshold' configuration using get_mbus_config() (or another API if we think it's better) and adjust the deserializer accordingly. All in all: - yes, I think there might be a need to control the noise immunity settings after initialization - I think it should be done on the serializer side, possibly with a DT property, possibly something like a boolean 'maxim,high-threshold-enable' - the deserializer can query that information with a kAPI like get_mbus_config() after the remote has probed - Because of that there is no need for an additional deserializer property Hope this makes sense
Hi Jacopo, On Tue, Jan 12, 2021 at 10:07 AM Jacopo Mondi <jacopo@jmondi.org> wrote: > On Tue, Jan 12, 2021 at 07:03:42AM +0200, Laurent Pinchart wrote: > > On Mon, Jan 11, 2021 at 12:20:23PM +0100, Jacopo Mondi wrote: > > > On Mon, Jan 11, 2021 at 12:58:59PM +0200, Laurent Pinchart wrote: > > > > On Mon, Jan 11, 2021 at 11:43:11AM +0100, Jacopo Mondi wrote: > > > >> On Wed, Dec 16, 2020 at 07:22:17PM +0200, Laurent Pinchart wrote: > > > >>> On Tue, Dec 15, 2020 at 06:09:57PM +0100, Jacopo Mondi wrote: > > > >>>> Adjust the initial reverse channel amplitude parsing from > > > >>>> firmware interface the 'maxim,reverse-channel-microvolt' > > > >>>> property. > > > >>>> > > > >>>> This change is required for both rdacm20 and rdacm21 camera > > > >>>> modules to be correctly probed when used in combination with > > > >>>> the max9286 deserializer. > > > >>>> > > > >>>> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> > > > >>>> Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org> > > > >>>> --- > > > >>>> drivers/media/i2c/max9286.c | 23 ++++++++++++++++++++++- > > > >>>> 1 file changed, 22 insertions(+), 1 deletion(-) > > > >>>> > > > >>>> diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c > > > >>>> index 021309c6dd6f..9b40a4890c4d 100644 > > > >>>> --- a/drivers/media/i2c/max9286.c > > > >>>> +++ b/drivers/media/i2c/max9286.c > > > >>>> @@ -163,6 +163,8 @@ struct max9286_priv { > > > >>>> unsigned int mux_channel; > > > >>>> bool mux_open; > > > >>>> > > > >>>> + u32 reverse_channel_mv; > > > >>>> + > > > >>>> struct v4l2_ctrl_handler ctrls; > > > >>>> struct v4l2_ctrl *pixelrate; > > > >>>> > > > >>>> @@ -557,10 +559,14 @@ static int max9286_notify_bound(struct v4l2_async_notifier *notifier, > > > >>>> * All enabled sources have probed and enabled their reverse control > > > >>>> * channels: > > > >>>> * > > > >>>> + * - Increase the reverse channel amplitude to compensate for the > > > >>>> + * remote ends high threshold, if not done already > > > >>>> * - Verify all configuration links are properly detected > > > >>>> * - Disable auto-ack as communication on the control channel are now > > > >>>> * stable. > > > >>>> */ > > > >>>> + if (priv->reverse_channel_mv < 170) > > > >>>> + max9286_reverse_channel_setup(priv, 170); > > > >>> > > > >>> I'm beginning to wonder if there will be a need in the future to not > > > >>> increase the reverse channel amplitude (keeping the threshold low on the > > > >>> remote side). An increased amplitude increases power consumption, and if > > > >>> the environment isn't noisy, a low amplitude would work. The device tree > > > >>> would then need to specify both the initial amplitude required by the > > > >>> remote side, and the desired amplitude after initialization. What do you > > > >>> think ? Is it overkill ? We don't have to implement this now, so > > > >>> > > > >>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > > >>> > > > >>> but if this feature could be required later, we may want to take into > > > >>> account in the naming of the new DT property to reflect the fact that it > > > >>> is the initial value. > > > >> > > > >> I had the same thought when I initially proposed > > > >> "maxim,initial-reverse-channel-mV" > > > >> > > > >> Having to use the standard unit suffix that would have become > > > >> "maxim,initial-reverse-channel-microvolt" > > > >> which is extremely long. > > > >> > > > >> I can't tell if there will be any need to adjust the amplitude later. > > > >> In any case, I would not rely on a DTS property to do so, as once we > > > >> have probed the remote we have a subdev where to call > > > >> 'get_mbus_config()' on, and from there we can report the high threshold > > > >> status of the serializer and adjust the deser amplitude accordingly. > > > > > > > > I don't think that's the point. The threshold of the serializer is > > > > something we can configure at runtime. What voltage level to use after > > > > > > How so ? I mean, we can add an API for this, but currently it's > > > configured at probe time and that's it. Its configuration might as > > > well come from a DT property like we do on the deserializer here but I > > > fail to see why it's different. Both settings depends on the required > > > noise immunity of th system. > > > > The voltage level configuration need to match between the tserializer > > (transmitter) and the deserializer (receiver). The serializer is > > configured with a voltage level, and the deserializer needs to be > > configured with a corresponding threshold. > > > > If I'm not mistaken it's actually the other way around, at least for > the chips we're dealing with. > > The serializer (MAX9271) has an "Reverse Channel Receiver High > Threshold Enable" bit (register 0x08[0]) undocumented in the chip > manual but described in the "MAX9286 Programming Guide 2 10.pdf" > document in the "Important Registers" section. > > The deserializer (MAX9286) has instead a configurable setting for the reverse > channel signal amplitude, which is what we are controlling in this > series. > > The deserializer reverse channel amplitude has to match the remote > side 'high threshold enable' setting. If it is enabled the amplitude > has to be increased to be able to probe the remote side. If it's not > a lower amplitude has to be used to make comunication reliable. > > As you said, some models (RDACM20) might be pre-programmed with the > 'high threshold enable' bit set, and so the deserializer reverse > channel amplitude has to be adjusted accordingly to be able to > comunicate on the reverse channel. > > > The voltage level of the serializer is configurable on the camera side > > when the system is powered up. The RDACM20 has a microcontroller which > > can configure the serializer, and other cameras may have similar > > mechanisms. As the deserializer can't query the information from the > > serializer (communication is unreliable if the threshold has an > > incorrect value), we need a DT property to tell the deserializer what > > threshold is initially used by the camera when it gets powered up. > > > > That's what this series does, yes. > > > This only covers initialization. A camera could boot up with a low > > voltage level, but we may want to increase the voltage level (and thus > > the threshold on the deserializer side) to increase noise immunity. Or, > > if the system environment isn't noisy, we may want to keep a low voltage > > level, or even decrease it if the camera boots up with a high voltage > > level. This runtime voltage level depends on the system design and its > > susceptibility to noise, and is thus a system property. Should we want > > to make it configurable, it should be specified in DT, and it's separate > > from the initial voltage level that is used to establish communication. > > > > And that's what I meant. Assuming we handle initialization correctly > with this series, the serializers 'high threshold' configuration > -after- initialization can be specified with a DT property on the > -serializer- side. Then, to adjust the deserializer reverse channel > amplitude, once we the remote has probed and we have a subdevice > registered for it, we can query the 'high threshold' configuration > using get_mbus_config() (or another API if we think it's better) and > adjust the deserializer accordingly. > > All in all: > - yes, I think there might be a need to control the noise immunity > settings after initialization > - I think it should be done on the serializer side, possibly with a DT > property, possibly something like a boolean 'maxim,high-threshold-enable' Can the needed voltage level be calibrated at runtime, cfr. DDR link training? Gr{oetje,eeting}s, Geert
Hi Geert On Tue, Jan 12, 2021 at 10:10:39AM +0100, Geert Uytterhoeven wrote: > Hi Jacopo, > > On Tue, Jan 12, 2021 at 10:07 AM Jacopo Mondi <jacopo@jmondi.org> wrote: > > On Tue, Jan 12, 2021 at 07:03:42AM +0200, Laurent Pinchart wrote: > > > On Mon, Jan 11, 2021 at 12:20:23PM +0100, Jacopo Mondi wrote: > > > > On Mon, Jan 11, 2021 at 12:58:59PM +0200, Laurent Pinchart wrote: > > > > > On Mon, Jan 11, 2021 at 11:43:11AM +0100, Jacopo Mondi wrote: > > > > >> On Wed, Dec 16, 2020 at 07:22:17PM +0200, Laurent Pinchart wrote: > > > > >>> On Tue, Dec 15, 2020 at 06:09:57PM +0100, Jacopo Mondi wrote: > > > > >>>> Adjust the initial reverse channel amplitude parsing from > > > > >>>> firmware interface the 'maxim,reverse-channel-microvolt' > > > > >>>> property. > > > > >>>> > > > > >>>> This change is required for both rdacm20 and rdacm21 camera > > > > >>>> modules to be correctly probed when used in combination with > > > > >>>> the max9286 deserializer. > > > > >>>> > > > > >>>> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> > > > > >>>> Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org> > > > > >>>> --- > > > > >>>> drivers/media/i2c/max9286.c | 23 ++++++++++++++++++++++- > > > > >>>> 1 file changed, 22 insertions(+), 1 deletion(-) > > > > >>>> > > > > >>>> diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c > > > > >>>> index 021309c6dd6f..9b40a4890c4d 100644 > > > > >>>> --- a/drivers/media/i2c/max9286.c > > > > >>>> +++ b/drivers/media/i2c/max9286.c > > > > >>>> @@ -163,6 +163,8 @@ struct max9286_priv { > > > > >>>> unsigned int mux_channel; > > > > >>>> bool mux_open; > > > > >>>> > > > > >>>> + u32 reverse_channel_mv; > > > > >>>> + > > > > >>>> struct v4l2_ctrl_handler ctrls; > > > > >>>> struct v4l2_ctrl *pixelrate; > > > > >>>> > > > > >>>> @@ -557,10 +559,14 @@ static int max9286_notify_bound(struct v4l2_async_notifier *notifier, > > > > >>>> * All enabled sources have probed and enabled their reverse control > > > > >>>> * channels: > > > > >>>> * > > > > >>>> + * - Increase the reverse channel amplitude to compensate for the > > > > >>>> + * remote ends high threshold, if not done already > > > > >>>> * - Verify all configuration links are properly detected > > > > >>>> * - Disable auto-ack as communication on the control channel are now > > > > >>>> * stable. > > > > >>>> */ > > > > >>>> + if (priv->reverse_channel_mv < 170) > > > > >>>> + max9286_reverse_channel_setup(priv, 170); > > > > >>> > > > > >>> I'm beginning to wonder if there will be a need in the future to not > > > > >>> increase the reverse channel amplitude (keeping the threshold low on the > > > > >>> remote side). An increased amplitude increases power consumption, and if > > > > >>> the environment isn't noisy, a low amplitude would work. The device tree > > > > >>> would then need to specify both the initial amplitude required by the > > > > >>> remote side, and the desired amplitude after initialization. What do you > > > > >>> think ? Is it overkill ? We don't have to implement this now, so > > > > >>> > > > > >>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > > > >>> > > > > >>> but if this feature could be required later, we may want to take into > > > > >>> account in the naming of the new DT property to reflect the fact that it > > > > >>> is the initial value. > > > > >> > > > > >> I had the same thought when I initially proposed > > > > >> "maxim,initial-reverse-channel-mV" > > > > >> > > > > >> Having to use the standard unit suffix that would have become > > > > >> "maxim,initial-reverse-channel-microvolt" > > > > >> which is extremely long. > > > > >> > > > > >> I can't tell if there will be any need to adjust the amplitude later. > > > > >> In any case, I would not rely on a DTS property to do so, as once we > > > > >> have probed the remote we have a subdev where to call > > > > >> 'get_mbus_config()' on, and from there we can report the high threshold > > > > >> status of the serializer and adjust the deser amplitude accordingly. > > > > > > > > > > I don't think that's the point. The threshold of the serializer is > > > > > something we can configure at runtime. What voltage level to use after > > > > > > > > How so ? I mean, we can add an API for this, but currently it's > > > > configured at probe time and that's it. Its configuration might as > > > > well come from a DT property like we do on the deserializer here but I > > > > fail to see why it's different. Both settings depends on the required > > > > noise immunity of th system. > > > > > > The voltage level configuration need to match between the tserializer > > > (transmitter) and the deserializer (receiver). The serializer is > > > configured with a voltage level, and the deserializer needs to be > > > configured with a corresponding threshold. > > > > > > > If I'm not mistaken it's actually the other way around, at least for > > the chips we're dealing with. > > > > The serializer (MAX9271) has an "Reverse Channel Receiver High > > Threshold Enable" bit (register 0x08[0]) undocumented in the chip > > manual but described in the "MAX9286 Programming Guide 2 10.pdf" > > document in the "Important Registers" section. > > > > The deserializer (MAX9286) has instead a configurable setting for the reverse > > channel signal amplitude, which is what we are controlling in this > > series. > > > > The deserializer reverse channel amplitude has to match the remote > > side 'high threshold enable' setting. If it is enabled the amplitude > > has to be increased to be able to probe the remote side. If it's not > > a lower amplitude has to be used to make comunication reliable. > > > > As you said, some models (RDACM20) might be pre-programmed with the > > 'high threshold enable' bit set, and so the deserializer reverse > > channel amplitude has to be adjusted accordingly to be able to > > comunicate on the reverse channel. > > > > > The voltage level of the serializer is configurable on the camera side > > > when the system is powered up. The RDACM20 has a microcontroller which > > > can configure the serializer, and other cameras may have similar > > > mechanisms. As the deserializer can't query the information from the > > > serializer (communication is unreliable if the threshold has an > > > incorrect value), we need a DT property to tell the deserializer what > > > threshold is initially used by the camera when it gets powered up. > > > > > > > That's what this series does, yes. > > > > > This only covers initialization. A camera could boot up with a low > > > voltage level, but we may want to increase the voltage level (and thus > > > the threshold on the deserializer side) to increase noise immunity. Or, > > > if the system environment isn't noisy, we may want to keep a low voltage > > > level, or even decrease it if the camera boots up with a high voltage > > > level. This runtime voltage level depends on the system design and its > > > susceptibility to noise, and is thus a system property. Should we want > > > to make it configurable, it should be specified in DT, and it's separate > > > from the initial voltage level that is used to establish communication. > > > > > > > And that's what I meant. Assuming we handle initialization correctly > > with this series, the serializers 'high threshold' configuration > > -after- initialization can be specified with a DT property on the > > -serializer- side. Then, to adjust the deserializer reverse channel > > amplitude, once we the remote has probed and we have a subdevice > > registered for it, we can query the 'high threshold' configuration > > using get_mbus_config() (or another API if we think it's better) and > > adjust the deserializer accordingly. > > > > All in all: > > - yes, I think there might be a need to control the noise immunity > > settings after initialization > > - I think it should be done on the serializer side, possibly with a DT > > property, possibly something like a boolean 'maxim,high-threshold-enable' > > Can the needed voltage level be calibrated at runtime, cfr. DDR > link training? I'm not familiar with the mechanism you mention here, but being the voltages levels a tuning parameters meant to maximize the reliability of a communication channel which might show failure that cannot be recovered easily [1] I fear it hardly can be run-time calibrated but it's rather a decision that system integrators have to make, depending on their usage environment and possibly a lot of reliability testing. Thanks j [1] To give a simple example, if the deserializer detects it cannot communicate with the remote side (and that's also hard to guess, as the start-up phase requires auto-ack of i2c messages transmitted on the reverse channel) how could it 'suggest' to the remote side that it should enable its noise immunity threshold ? > > Gr{oetje,eeting}s, > > Geert > > -- > Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org > > In personal conversations with technical people, I call myself a hacker. But > when I'm talking to journalists I just say "programmer" or something like that. > -- Linus Torvalds
Hi Jacopo, On Tue, Jan 12, 2021 at 10:08:05AM +0100, Jacopo Mondi wrote: > On Tue, Jan 12, 2021 at 07:03:42AM +0200, Laurent Pinchart wrote: > > On Mon, Jan 11, 2021 at 12:20:23PM +0100, Jacopo Mondi wrote: > > > On Mon, Jan 11, 2021 at 12:58:59PM +0200, Laurent Pinchart wrote: > > > > On Mon, Jan 11, 2021 at 11:43:11AM +0100, Jacopo Mondi wrote: > > > >> On Wed, Dec 16, 2020 at 07:22:17PM +0200, Laurent Pinchart wrote: > > > >>> On Tue, Dec 15, 2020 at 06:09:57PM +0100, Jacopo Mondi wrote: > > > >>>> Adjust the initial reverse channel amplitude parsing from > > > >>>> firmware interface the 'maxim,reverse-channel-microvolt' > > > >>>> property. > > > >>>> > > > >>>> This change is required for both rdacm20 and rdacm21 camera > > > >>>> modules to be correctly probed when used in combination with > > > >>>> the max9286 deserializer. > > > >>>> > > > >>>> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> > > > >>>> Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org> > > > >>>> --- > > > >>>> drivers/media/i2c/max9286.c | 23 ++++++++++++++++++++++- > > > >>>> 1 file changed, 22 insertions(+), 1 deletion(-) > > > >>>> > > > >>>> diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c > > > >>>> index 021309c6dd6f..9b40a4890c4d 100644 > > > >>>> --- a/drivers/media/i2c/max9286.c > > > >>>> +++ b/drivers/media/i2c/max9286.c > > > >>>> @@ -163,6 +163,8 @@ struct max9286_priv { > > > >>>> unsigned int mux_channel; > > > >>>> bool mux_open; > > > >>>> > > > >>>> + u32 reverse_channel_mv; > > > >>>> + > > > >>>> struct v4l2_ctrl_handler ctrls; > > > >>>> struct v4l2_ctrl *pixelrate; > > > >>>> > > > >>>> @@ -557,10 +559,14 @@ static int max9286_notify_bound(struct v4l2_async_notifier *notifier, > > > >>>> * All enabled sources have probed and enabled their reverse control > > > >>>> * channels: > > > >>>> * > > > >>>> + * - Increase the reverse channel amplitude to compensate for the > > > >>>> + * remote ends high threshold, if not done already > > > >>>> * - Verify all configuration links are properly detected > > > >>>> * - Disable auto-ack as communication on the control channel are now > > > >>>> * stable. > > > >>>> */ > > > >>>> + if (priv->reverse_channel_mv < 170) > > > >>>> + max9286_reverse_channel_setup(priv, 170); > > > >>> > > > >>> I'm beginning to wonder if there will be a need in the future to not > > > >>> increase the reverse channel amplitude (keeping the threshold low on the > > > >>> remote side). An increased amplitude increases power consumption, and if > > > >>> the environment isn't noisy, a low amplitude would work. The device tree > > > >>> would then need to specify both the initial amplitude required by the > > > >>> remote side, and the desired amplitude after initialization. What do you > > > >>> think ? Is it overkill ? We don't have to implement this now, so > > > >>> > > > >>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > > >>> > > > >>> but if this feature could be required later, we may want to take into > > > >>> account in the naming of the new DT property to reflect the fact that it > > > >>> is the initial value. > > > >> > > > >> I had the same thought when I initially proposed > > > >> "maxim,initial-reverse-channel-mV" > > > >> > > > >> Having to use the standard unit suffix that would have become > > > >> "maxim,initial-reverse-channel-microvolt" > > > >> which is extremely long. > > > >> > > > >> I can't tell if there will be any need to adjust the amplitude later. > > > >> In any case, I would not rely on a DTS property to do so, as once we > > > >> have probed the remote we have a subdev where to call > > > >> 'get_mbus_config()' on, and from there we can report the high threshold > > > >> status of the serializer and adjust the deser amplitude accordingly. > > > > > > > > I don't think that's the point. The threshold of the serializer is > > > > something we can configure at runtime. What voltage level to use after > > > > > > How so ? I mean, we can add an API for this, but currently it's > > > configured at probe time and that's it. Its configuration might as > > > well come from a DT property like we do on the deserializer here but I > > > fail to see why it's different. Both settings depends on the required > > > noise immunity of th system. > > > > The voltage level configuration need to match between the tserializer > > (transmitter) and the deserializer (receiver). The serializer is > > configured with a voltage level, and the deserializer needs to be > > configured with a corresponding threshold. > > If I'm not mistaken it's actually the other way around, at least for > the chips we're dealing with. Yes, I mixed up the direction, sorry about that. > The serializer (MAX9271) has an "Reverse Channel Receiver High > Threshold Enable" bit (register 0x08[0]) undocumented in the chip > manual but described in the "MAX9286 Programming Guide 2 10.pdf" > document in the "Important Registers" section. > > The deserializer (MAX9286) has instead a configurable setting for the reverse > channel signal amplitude, which is what we are controlling in this > series. > > The deserializer reverse channel amplitude has to match the remote > side 'high threshold enable' setting. If it is enabled the amplitude > has to be increased to be able to probe the remote side. If it's not > a lower amplitude has to be used to make comunication reliable. > > As you said, some models (RDACM20) might be pre-programmed with the > 'high threshold enable' bit set, and so the deserializer reverse > channel amplitude has to be adjusted accordingly to be able to > comunicate on the reverse channel. > > > The voltage level of the serializer is configurable on the camera side > > when the system is powered up. The RDACM20 has a microcontroller which > > can configure the serializer, and other cameras may have similar > > mechanisms. As the deserializer can't query the information from the > > serializer (communication is unreliable if the threshold has an > > incorrect value), we need a DT property to tell the deserializer what > > threshold is initially used by the camera when it gets powered up. > > That's what this series does, yes. > > > This only covers initialization. A camera could boot up with a low > > voltage level, but we may want to increase the voltage level (and thus > > the threshold on the deserializer side) to increase noise immunity. Or, > > if the system environment isn't noisy, we may want to keep a low voltage > > level, or even decrease it if the camera boots up with a high voltage > > level. This runtime voltage level depends on the system design and its > > susceptibility to noise, and is thus a system property. Should we want > > to make it configurable, it should be specified in DT, and it's separate > > from the initial voltage level that is used to establish communication. > > And that's what I meant. Assuming we handle initialization correctly > with this series, the serializers 'high threshold' configuration > -after- initialization can be specified with a DT property on the > -serializer- side. Then, to adjust the deserializer reverse channel > amplitude, once we the remote has probed and we have a subdevice > registered for it, we can query the 'high threshold' configuration > using get_mbus_config() (or another API if we think it's better) and > adjust the deserializer accordingly. > > All in all: > - yes, I think there might be a need to control the noise immunity > settings after initialization > - I think it should be done on the serializer side, possibly with a DT > property, possibly something like a boolean 'maxim,high-threshold-enable' > - the deserializer can query that information with a kAPI like > get_mbus_config() after the remote has probed > - Because of that there is no need for an additional deserializer property > > Hope this makes sense Now I get what you meant. Sorry for missing the point. While it would be technically feasible to query the property from the serializer at runtime, there's the additional issue that the deserializer has a single reverse channel amplitude setting for all the channels. We would need to ensure that the property is set to the same value in all camera DT nodes. Wouldn't it be best to then set it once only, in the deserializer node ?
Hi Laurent, On Thu, Jan 14, 2021 at 07:53:36AM +0200, Laurent Pinchart wrote: > Hi Jacopo, > > > > > All in all: > > - yes, I think there might be a need to control the noise immunity > > settings after initialization > > - I think it should be done on the serializer side, possibly with a DT > > property, possibly something like a boolean 'maxim,high-threshold-enable' > > - the deserializer can query that information with a kAPI like > > get_mbus_config() after the remote has probed > > - Because of that there is no need for an additional deserializer property > > > > Hope this makes sense > > Now I get what you meant. Sorry for missing the point. > > While it would be technically feasible to query the property from the > serializer at runtime, there's the additional issue that the > deserializer has a single reverse channel amplitude setting for all the > channels. We would need to ensure that the property is set to the same > value in all camera DT nodes. Wouldn't it be best to then set it once > only, in the deserializer node ? > To be honest I wouldn't mind a run-time error, or a fallback like "the first one to probe is the authoritative one, the rest have to follow". And don't forget we would need a serializer property anyway to tell the chip if it has to enable its noise immunity threshold or not. But anyway, the here introduced new property already requires knwoledge on the deserializer about which camera is connected on the other side. It's not so bad, as if cameras are described in a .dtsi or .dtbo the deserializer property can be overridden. We can do the same for an additional property. ie. a deserializer-serializer 'maxim,high-threshold-enable' property RDACM20: pre-programmed high threshold enable -------------- rdacm20.dtsi ------------------- &gmsl { maxim,reverse-channel-microvolt = <170000>; i2c-mux { i2c@0 { camera@51 { .... } } } }; ------------------------------------------------- RDACM21: no pre-programmed high-threshold, high threshold enabled after camera probe -------------- rdacm21.dtsi ------------------- &gmsl { maxim,reverse-channel-microvolt = <100000>; maxim,high-threshold-enable; i2c-mux { i2c@0 { camera@51 { maxim,high-threshold-enable; .... } } } }; ------------------------------------------------- RDACM21: no high-threshold enabled at all -------------- rdacm21.dtsi ------------------- &gmsl { maxim,reverse-channel-microvolt = <100000>; i2c-mux { i2c@0 { camera@51 { .... } } } }; ------------------------------------------------- For the serializer it's a boolean, for the deser we might need to specify a voltage, so it might become an uint32 'maxim,high-threshold-microvolt' there. -------------- rdacm21.dtsi ------------------- &gmsl { maxim,reverse-channel-microvolt = <100000>; maxim,high-threshold-microvolt = <170000>; i2c-mux { i2c@0 { camera@51 { maxim,high-threshold-enable; .... } } } }; ------------------------------------------------- > -- > Regards, > > Laurent Pinchart
diff --git a/drivers/media/i2c/max9286.c b/drivers/media/i2c/max9286.c index 021309c6dd6f..9b40a4890c4d 100644 --- a/drivers/media/i2c/max9286.c +++ b/drivers/media/i2c/max9286.c @@ -163,6 +163,8 @@ struct max9286_priv { unsigned int mux_channel; bool mux_open; + u32 reverse_channel_mv; + struct v4l2_ctrl_handler ctrls; struct v4l2_ctrl *pixelrate; @@ -557,10 +559,14 @@ static int max9286_notify_bound(struct v4l2_async_notifier *notifier, * All enabled sources have probed and enabled their reverse control * channels: * + * - Increase the reverse channel amplitude to compensate for the + * remote ends high threshold, if not done already * - Verify all configuration links are properly detected * - Disable auto-ack as communication on the control channel are now * stable. */ + if (priv->reverse_channel_mv < 170) + max9286_reverse_channel_setup(priv, 170); max9286_check_config_link(priv, priv->source_mask); /* @@ -967,7 +973,7 @@ static int max9286_setup(struct max9286_priv *priv) * only. This should be disabled after the mux is initialised. */ max9286_configure_i2c(priv, true); - max9286_reverse_channel_setup(priv, 170); + max9286_reverse_channel_setup(priv, priv->reverse_channel_mv); /* * Enable GMSL links, mask unused ones and autodetect link @@ -1131,6 +1137,7 @@ static int max9286_parse_dt(struct max9286_priv *priv) struct device_node *i2c_mux; struct device_node *node = NULL; unsigned int i2c_mux_mask = 0; + u32 reverse_channel_microvolt; /* Balance the of_node_put() performed by of_find_node_by_name(). */ of_node_get(dev->of_node); @@ -1221,6 +1228,20 @@ static int max9286_parse_dt(struct max9286_priv *priv) } of_node_put(node); + /* + * Parse the initial value of the reverse channel amplitude from + * the firmware interface and convert it to millivolts. + * + * Default it to 170mV for backward compatibility with DTBs that do not + * provide the property. + */ + if (of_property_read_u32(dev->of_node, + "maxim,reverse-channel-microvolt", + &reverse_channel_microvolt)) + priv->reverse_channel_mv = 170; + else + priv->reverse_channel_mv = reverse_channel_microvolt / 1000U; + priv->route_mask = priv->source_mask; return 0;