]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
dpll: zl3073x: Add output pin frequency helper
authorIvan Vecera <ivecera@redhat.com>
Thu, 5 Feb 2026 15:43:49 +0000 (16:43 +0100)
committerJakub Kicinski <kuba@kernel.org>
Sat, 7 Feb 2026 04:44:20 +0000 (20:44 -0800)
Introduce zl3073x_dev_output_pin_freq_get() helper function to compute
the output pin frequency based on synthesizer frequency, output divisor,
and signal format. For N-div signal formats, the N-pin frequency is
additionally divided by esync_n_period.

Add zl3073x_out_is_ndiv() helper to check if an output is configured
in N-div mode (2_NDIV or 2_NDIV_INV signal formats).

Refactor zl3073x_dpll_output_pin_frequency_get() callback to use the
new helper, reducing code duplication and enabling reuse of the
frequency calculation logic in other contexts.

This is a preparatory change for adding current frequency to the
supported frequencies list in pin properties.

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

index 09bca2d0926d500a191f5184a5af4c9d1468c737..dddfcacea5c0a5484739192c963f063f2b008e6f 100644 (file)
@@ -301,6 +301,36 @@ u8 zl3073x_dev_out_dpll_get(struct zl3073x_dev *zldev, u8 index)
        return zl3073x_synth_dpll_get(synth);
 }
 
+/**
+ * zl3073x_dev_output_pin_freq_get - get output pin frequency
+ * @zldev: pointer to zl3073x device
+ * @id: output pin id
+ *
+ * Computes the output pin frequency based on the synth frequency, output
+ * divisor, and signal format. For N-div formats, N-pin frequency is
+ * additionally divided by esync_n_period.
+ *
+ * Return: frequency of the given output pin in Hz
+ */
+static inline u32
+zl3073x_dev_output_pin_freq_get(struct zl3073x_dev *zldev, u8 id)
+{
+       const struct zl3073x_synth *synth;
+       const struct zl3073x_out *out;
+       u8 out_id;
+       u32 freq;
+
+       out_id = zl3073x_output_pin_out_get(id);
+       out = zl3073x_out_state_get(zldev, out_id);
+       synth = zl3073x_synth_state_get(zldev, zl3073x_out_synth_get(out));
+       freq = zl3073x_synth_freq_get(synth) / out->div;
+
+       if (zl3073x_out_is_ndiv(out) && zl3073x_is_n_pin(id))
+               freq /= out->esync_n_period;
+
+       return freq;
+}
+
 /**
  * zl3073x_dev_out_is_diff - check if the given output is differential
  * @zldev: pointer to zl3073x device
index a99d143a7acde73cb5edcaf1fca7a811814a974c..eb94c29af2cf974d4f3668a56e97a97001be80a7 100644 (file)
@@ -916,46 +916,9 @@ zl3073x_dpll_output_pin_frequency_get(const struct dpll_pin *dpll_pin,
                                      struct netlink_ext_ack *extack)
 {
        struct zl3073x_dpll *zldpll = dpll_priv;
-       struct zl3073x_dev *zldev = zldpll->dev;
        struct zl3073x_dpll_pin *pin = pin_priv;
-       const struct zl3073x_synth *synth;
-       const struct zl3073x_out *out;
-       u32 synth_freq;
-       u8 out_id;
 
-       out_id = zl3073x_output_pin_out_get(pin->id);
-       out = zl3073x_out_state_get(zldev, out_id);
-
-       /* Get attached synth frequency */
-       synth = zl3073x_synth_state_get(zldev, zl3073x_out_synth_get(out));
-       synth_freq = zl3073x_synth_freq_get(synth);
-
-       switch (zl3073x_out_signal_format_get(out)) {
-       case ZL_OUTPUT_MODE_SIGNAL_FORMAT_2_NDIV:
-       case ZL_OUTPUT_MODE_SIGNAL_FORMAT_2_NDIV_INV:
-               /* In case of divided format we have to distiguish between
-                * given output pin type.
-                *
-                * For P-pin the resulting frequency is computed as simple
-                * division of synth frequency and output divisor.
-                *
-                * For N-pin we have to divide additionally by divisor stored
-                * in esync_n_period output mailbox register that is used as
-                * N-pin divisor for these modes.
-                */
-               *frequency = synth_freq / out->div;
-
-               if (!zl3073x_dpll_is_p_pin(pin))
-                       *frequency = (u32)*frequency / out->esync_n_period;
-
-               break;
-       default:
-               /* In other modes the resulting frequency is computed as
-                * division of synth frequency and output divisor.
-                */
-               *frequency = synth_freq / out->div;
-               break;
-       }
+       *frequency = zl3073x_dev_output_pin_freq_get(zldpll->dev, pin->id);
 
        return 0;
 }
index e8ea7a0e0f071c64504074040ad4a7108c06f7f9..318f9bb8da3a064abe48711ba7e12830e482ab66 100644 (file)
@@ -79,6 +79,23 @@ static inline bool zl3073x_out_is_enabled(const struct zl3073x_out *out)
        return !!FIELD_GET(ZL_OUTPUT_CTRL_EN, out->ctrl);
 }
 
+/**
+ * zl3073x_out_is_ndiv - check if the given output is in N-div mode
+ * @out: pointer to out state
+ *
+ * Return: true if output is in N-div mode, false otherwise
+ */
+static inline bool zl3073x_out_is_ndiv(const struct zl3073x_out *out)
+{
+       switch (zl3073x_out_signal_format_get(out)) {
+       case ZL_OUTPUT_MODE_SIGNAL_FORMAT_2_NDIV:
+       case ZL_OUTPUT_MODE_SIGNAL_FORMAT_2_NDIV_INV:
+               return true;
+       default:
+               return false;
+       }
+}
+
 /**
  * zl3073x_out_synth_get - get synth connected to given output
  * @out: pointer to out state