]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
dpll: zl3073x: drop selected and simplify connected ref getter
authorIvan Vecera <ivecera@redhat.com>
Sun, 15 Mar 2026 17:42:24 +0000 (18:42 +0100)
committerJakub Kicinski <kuba@kernel.org>
Wed, 18 Mar 2026 02:05:12 +0000 (19:05 -0700)
The HW reports the currently selected reference in the
dpll_refsel_status register regardless of the DPLL mode. Use this to
delete zl3073x_dpll_selected_ref_get() and have callers read the
register directly via the cached channel state.

Simplify zl3073x_dpll_connected_ref_get() to check refsel_state for
LOCK directly and return the reference index, changing the return
type from int to u8. The redundant ref_is_status_ok check is removed
since the DPLL cannot be in LOCK state with a failed reference.

In zl3073x_dpll_mode_set(), replace the selected_ref_get() call with
zl3073x_chan_refsel_ref_get() to read the currently selected
reference directly from the cached channel state.

Signed-off-by: Ivan Vecera <ivecera@redhat.com>
Link: https://patch.msgid.link/20260315174224.399074-7-ivecera@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/dpll/zl3073x/dpll.c

index 7fb851976402b3cb632b4cc7717810fa8cd0b69e..a29f606318f6d50113e9b7057855e5d1371eec8b 100644 (file)
@@ -243,72 +243,27 @@ zl3073x_dpll_input_pin_frequency_set(const struct dpll_pin *dpll_pin,
        return zl3073x_ref_state_set(zldev, ref_id, &ref);
 }
 
-/**
- * zl3073x_dpll_selected_ref_get - get currently selected reference
- * @zldpll: pointer to zl3073x_dpll
- * @ref: place to store selected reference
- *
- * Check for currently selected reference the DPLL should be locked to
- * and stores its index to given @ref.
- *
- * Return: 0 on success, <0 on error
- */
-static int
-zl3073x_dpll_selected_ref_get(struct zl3073x_dpll *zldpll, u8 *ref)
-{
-       const struct zl3073x_chan *chan;
-
-       chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
-
-       switch (zl3073x_chan_mode_get(chan)) {
-       case ZL_DPLL_MODE_REFSEL_MODE_AUTO:
-               /* Return the reference only if the DPLL is locked to it */
-               if (zl3073x_chan_refsel_state_get(chan) ==
-                   ZL_DPLL_REFSEL_STATUS_STATE_LOCK)
-                       *ref = zl3073x_chan_refsel_ref_get(chan);
-               else
-                       *ref = ZL3073X_DPLL_REF_NONE;
-               break;
-       case ZL_DPLL_MODE_REFSEL_MODE_REFLOCK:
-               /* For manual mode return stored value */
-               *ref = zl3073x_chan_ref_get(chan);
-               break;
-       default:
-               /* For other modes like NCO, freerun... there is no input ref */
-               *ref = ZL3073X_DPLL_REF_NONE;
-               break;
-       }
-
-       return 0;
-}
-
 /**
  * zl3073x_dpll_connected_ref_get - get currently connected reference
  * @zldpll: pointer to zl3073x_dpll
- * @ref: place to store selected reference
  *
- * Looks for currently connected the DPLL is locked to and stores its index
- * to given @ref.
+ * Looks for currently connected reference the DPLL is locked to.
  *
- * Return: 0 on success, <0 on error
+ * Return: reference index if locked, ZL3073X_DPLL_REF_NONE otherwise
  */
-static int
-zl3073x_dpll_connected_ref_get(struct zl3073x_dpll *zldpll, u8 *ref)
+static u8
+zl3073x_dpll_connected_ref_get(struct zl3073x_dpll *zldpll)
 {
-       struct zl3073x_dev *zldev = zldpll->dev;
-       int rc;
-
-       /* Get currently selected input reference */
-       rc = zl3073x_dpll_selected_ref_get(zldpll, ref);
-       if (rc)
-               return rc;
+       const struct zl3073x_chan *chan = zl3073x_chan_state_get(zldpll->dev,
+                                                                zldpll->id);
+       u8 state;
 
-       /* If the monitor indicates an error nothing is connected */
-       if (ZL3073X_DPLL_REF_IS_VALID(*ref) &&
-           !zl3073x_dev_ref_is_status_ok(zldev, *ref))
-               *ref = ZL3073X_DPLL_REF_NONE;
+       /* A reference is connected only when the DPLL is locked to it */
+       state = zl3073x_chan_refsel_state_get(chan);
+       if (state == ZL_DPLL_REFSEL_STATUS_STATE_LOCK)
+               return zl3073x_chan_refsel_ref_get(chan);
 
-       return 0;
+       return ZL3073X_DPLL_REF_NONE;
 }
 
 static int
@@ -324,12 +279,9 @@ zl3073x_dpll_input_pin_phase_offset_get(const struct dpll_pin *dpll_pin,
        const struct zl3073x_ref *ref;
        u8 conn_id, ref_id;
        s64 ref_phase;
-       int rc;
 
        /* Get currently connected reference */
-       rc = zl3073x_dpll_connected_ref_get(zldpll, &conn_id);
-       if (rc)
-               return rc;
+       conn_id = zl3073x_dpll_connected_ref_get(zldpll);
 
        /* Report phase offset only for currently connected pin if the phase
         * monitor feature is disabled and only if the input pin signal is
@@ -367,7 +319,7 @@ zl3073x_dpll_input_pin_phase_offset_get(const struct dpll_pin *dpll_pin,
 
        *phase_offset = ref_phase * DPLL_PHASE_OFFSET_DIVIDER;
 
-       return rc;
+       return 0;
 }
 
 static int
@@ -447,18 +399,13 @@ zl3073x_dpll_ref_state_get(struct zl3073x_dpll_pin *pin,
        struct zl3073x_dpll *zldpll = pin->dpll;
        struct zl3073x_dev *zldev = zldpll->dev;
        const struct zl3073x_chan *chan;
-       u8 ref, ref_conn;
-       int rc;
+       u8 ref;
 
        chan = zl3073x_chan_state_get(zldev, zldpll->id);
        ref = zl3073x_input_pin_ref_get(pin->id);
 
-       /* Get currently connected reference */
-       rc = zl3073x_dpll_connected_ref_get(zldpll, &ref_conn);
-       if (rc)
-               return rc;
-
-       if (ref == ref_conn) {
+       /* Check if the pin reference is connected */
+       if (ref == zl3073x_dpll_connected_ref_get(zldpll)) {
                *state = DPLL_PIN_STATE_CONNECTED;
                return 0;
        }
@@ -1087,13 +1034,8 @@ zl3073x_dpll_mode_set(const struct dpll_device *dpll, void *dpll_priv,
        u8 hw_mode, ref;
        int rc;
 
-       rc = zl3073x_dpll_selected_ref_get(zldpll, &ref);
-       if (rc) {
-               NL_SET_ERR_MSG_MOD(extack, "failed to get selected reference");
-               return rc;
-       }
-
        chan = *zl3073x_chan_state_get(zldpll->dev, zldpll->id);
+       ref = zl3073x_chan_refsel_ref_get(&chan);
 
        if (mode == DPLL_MODE_MANUAL) {
                /* We are switching from automatic to manual mode: