Message ID | 20230111020546.3384569-1-pmalani@chromium.org |
---|---|
State | New |
Headers | show |
Series | [1/3] usb: typec: altmodes/displayport: Add pin assignment helper | expand |
On Wed, Jan 11, 2023 at 02:05:41AM +0000, Prashant Malani wrote: > The code to extract a peripheral's currently supported Pin Assignments > is repeated in a couple of locations. Factor it out into a separate > function. > > This will also make it easier to add fixes (we only need to update 1 > location instead of 2). > > Fixes: c1e5c2f0cb8a ("usb: typec: altmodes/displayport: correct pin assignment for UFP receptacles") > Cc: stable@vger.kernel.org > Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com> > Signed-off-by: Prashant Malani <pmalani@chromium.org> Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> > --- > > While this patch doesn't fix anything, it is required by the actual > fix (which is Patch 2/3 in this series). So, I've add the "Fixes" tag > and "Cc stable" tag to ensure that both patches are picked. > > If this is the incorrect approach and there is a better way, my > apologies, and please let me know the appropriate process. > > drivers/usb/typec/altmodes/displayport.c | 22 ++++++++++++++-------- > 1 file changed, 14 insertions(+), 8 deletions(-) > > diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c > index 06fb4732f8cd..f9d4a7648bc9 100644 > --- a/drivers/usb/typec/altmodes/displayport.c > +++ b/drivers/usb/typec/altmodes/displayport.c > @@ -420,6 +420,18 @@ static const char * const pin_assignments[] = { > [DP_PIN_ASSIGN_F] = "F", > }; > > +/* > + * Helper function to extract a peripheral's currently supported > + * Pin Assignments from its DisplayPort alternate mode state. > + */ > +static u8 get_current_pin_assignments(struct dp_altmode *dp) > +{ > + if (DP_CONF_CURRENTLY(dp->data.conf) == DP_CONF_DFP_D) > + return DP_CAP_UFP_D_PIN_ASSIGN(dp->alt->vdo); > + else > + return DP_CAP_DFP_D_PIN_ASSIGN(dp->alt->vdo); > +} > + > static ssize_t > pin_assignment_store(struct device *dev, struct device_attribute *attr, > const char *buf, size_t size) > @@ -446,10 +458,7 @@ pin_assignment_store(struct device *dev, struct device_attribute *attr, > goto out_unlock; > } > > - if (DP_CONF_CURRENTLY(dp->data.conf) == DP_CONF_DFP_D) > - assignments = DP_CAP_UFP_D_PIN_ASSIGN(dp->alt->vdo); > - else > - assignments = DP_CAP_DFP_D_PIN_ASSIGN(dp->alt->vdo); > + assignments = get_current_pin_assignments(dp); > > if (!(DP_CONF_GET_PIN_ASSIGN(conf) & assignments)) { > ret = -EINVAL; > @@ -486,10 +495,7 @@ static ssize_t pin_assignment_show(struct device *dev, > > cur = get_count_order(DP_CONF_GET_PIN_ASSIGN(dp->data.conf)); > > - if (DP_CONF_CURRENTLY(dp->data.conf) == DP_CONF_DFP_D) > - assignments = DP_CAP_UFP_D_PIN_ASSIGN(dp->alt->vdo); > - else > - assignments = DP_CAP_DFP_D_PIN_ASSIGN(dp->alt->vdo); > + assignments = get_current_pin_assignments(dp); > > for (i = 0; assignments; assignments >>= 1, i++) { > if (assignments & 1) { > -- > 2.39.0.314.g84b9a713c41-goog
diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c index 06fb4732f8cd..f9d4a7648bc9 100644 --- a/drivers/usb/typec/altmodes/displayport.c +++ b/drivers/usb/typec/altmodes/displayport.c @@ -420,6 +420,18 @@ static const char * const pin_assignments[] = { [DP_PIN_ASSIGN_F] = "F", }; +/* + * Helper function to extract a peripheral's currently supported + * Pin Assignments from its DisplayPort alternate mode state. + */ +static u8 get_current_pin_assignments(struct dp_altmode *dp) +{ + if (DP_CONF_CURRENTLY(dp->data.conf) == DP_CONF_DFP_D) + return DP_CAP_UFP_D_PIN_ASSIGN(dp->alt->vdo); + else + return DP_CAP_DFP_D_PIN_ASSIGN(dp->alt->vdo); +} + static ssize_t pin_assignment_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) @@ -446,10 +458,7 @@ pin_assignment_store(struct device *dev, struct device_attribute *attr, goto out_unlock; } - if (DP_CONF_CURRENTLY(dp->data.conf) == DP_CONF_DFP_D) - assignments = DP_CAP_UFP_D_PIN_ASSIGN(dp->alt->vdo); - else - assignments = DP_CAP_DFP_D_PIN_ASSIGN(dp->alt->vdo); + assignments = get_current_pin_assignments(dp); if (!(DP_CONF_GET_PIN_ASSIGN(conf) & assignments)) { ret = -EINVAL; @@ -486,10 +495,7 @@ static ssize_t pin_assignment_show(struct device *dev, cur = get_count_order(DP_CONF_GET_PIN_ASSIGN(dp->data.conf)); - if (DP_CONF_CURRENTLY(dp->data.conf) == DP_CONF_DFP_D) - assignments = DP_CAP_UFP_D_PIN_ASSIGN(dp->alt->vdo); - else - assignments = DP_CAP_DFP_D_PIN_ASSIGN(dp->alt->vdo); + assignments = get_current_pin_assignments(dp); for (i = 0; assignments; assignments >>= 1, i++) { if (assignments & 1) {
The code to extract a peripheral's currently supported Pin Assignments is repeated in a couple of locations. Factor it out into a separate function. This will also make it easier to add fixes (we only need to update 1 location instead of 2). Fixes: c1e5c2f0cb8a ("usb: typec: altmodes/displayport: correct pin assignment for UFP receptacles") Cc: stable@vger.kernel.org Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com> Signed-off-by: Prashant Malani <pmalani@chromium.org> --- While this patch doesn't fix anything, it is required by the actual fix (which is Patch 2/3 in this series). So, I've add the "Fixes" tag and "Cc stable" tag to ensure that both patches are picked. If this is the incorrect approach and there is a better way, my apologies, and please let me know the appropriate process. drivers/usb/typec/altmodes/displayport.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-)