Pins registered with an fwnode may have .state_on_dpll_set implemented
without advertising DPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE upfront.
Requiring the bit for fwnode pins ties firmware description to driver
implementation details unnecessarily.

Relax the capability check in dpll_pin_state_set() and
dpll_pin_on_pin_state_set(): when a pin has an associated fwnode, bypass
the capability gate and let the ops layer decide, returning -EOPNOTSUPP
if .state_on_dpll_set is absent. Non-fwnode pins retain the original
strict behavior.

This is used later in the series by the SyncE_Ref output pin, which
relies on the fwnode path for state control.

Reviewed-by: Aleksandr Loktionov <[email protected]>
Signed-off-by: Grzegorz Nitka <[email protected]>
---
 drivers/dpll/dpll_netlink.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/dpll/dpll_netlink.c b/drivers/dpll/dpll_netlink.c
index f81ed1071dba..162c2a8cffca 100644
--- a/drivers/dpll/dpll_netlink.c
+++ b/drivers/dpll/dpll_netlink.c
@@ -1316,8 +1316,11 @@ dpll_pin_on_pin_state_set(struct dpll_pin *pin, u32 
parent_idx,
        unsigned long i;
        int ret;
 
+       /* fwnode pins may not set the capability bit upfront; let the ops
+        * layer return -EOPNOTSUPP if the operation is unsupported.
+        */
        if (!(DPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE &
-             pin->prop.capabilities)) {
+             pin->prop.capabilities) && !pin->fwnode) {
                NL_SET_ERR_MSG(extack, "state changing is not allowed");
                return -EOPNOTSUPP;
        }
@@ -1352,8 +1355,11 @@ dpll_pin_state_set(struct dpll_device *dpll, struct 
dpll_pin *pin,
        struct dpll_pin_ref *ref;
        int ret;
 
+       /* fwnode pins may not set the capability bit upfront; let the ops
+        * layer return -EOPNOTSUPP if the operation is unsupported.
+        */
        if (!(DPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE &
-             pin->prop.capabilities)) {
+             pin->prop.capabilities) && !pin->fwnode) {
                NL_SET_ERR_MSG(extack, "state changing is not allowed");
                return -EOPNOTSUPP;
        }
-- 
2.39.3

Reply via email to