Commit 24e4336a authored by Ivan Vecera's avatar Ivan Vecera Committed by Jakub Kicinski
Browse files

dpll: zl3073x: Add output pin frequency helper



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: default avatarIvan Vecera <ivecera@redhat.com>
Link: https://patch.msgid.link/20260205154350.3180465-2-ivecera@redhat.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent a14d9317
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -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
+1 −38
Original line number Diff line number Diff line
@@ -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;
}
+17 −0
Original line number Diff line number Diff line
@@ -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