xref: /linux/drivers/dpll/zl3073x/out.h (revision 84318277d6334c6981ab326d4acc87c6a6ddc9b8)
1607f2c00SIvan Vecera /* SPDX-License-Identifier: GPL-2.0-only */
2607f2c00SIvan Vecera 
3607f2c00SIvan Vecera #ifndef _ZL3073X_OUT_H
4607f2c00SIvan Vecera #define _ZL3073X_OUT_H
5607f2c00SIvan Vecera 
6607f2c00SIvan Vecera #include <linux/bitfield.h>
7607f2c00SIvan Vecera #include <linux/types.h>
8607f2c00SIvan Vecera 
9607f2c00SIvan Vecera #include "regs.h"
10607f2c00SIvan Vecera 
11607f2c00SIvan Vecera struct zl3073x_dev;
12607f2c00SIvan Vecera 
13607f2c00SIvan Vecera /**
14607f2c00SIvan Vecera  * struct zl3073x_out - output state
15*5fb9b0d4SIvan Vecera  * @div: output divisor
16*5fb9b0d4SIvan Vecera  * @width: output pulse width
17*5fb9b0d4SIvan Vecera  * @esync_n_period: embedded sync or n-pin period (for n-div formats)
18*5fb9b0d4SIvan Vecera  * @esync_n_width: embedded sync or n-pin pulse width
19*5fb9b0d4SIvan Vecera  * @phase_comp: phase compensation
20607f2c00SIvan Vecera  * @ctrl: output control
21607f2c00SIvan Vecera  * @mode: output mode
22607f2c00SIvan Vecera  */
23607f2c00SIvan Vecera struct zl3073x_out {
24*5fb9b0d4SIvan Vecera 	u32	div;
25*5fb9b0d4SIvan Vecera 	u32	width;
26*5fb9b0d4SIvan Vecera 	u32	esync_n_period;
27*5fb9b0d4SIvan Vecera 	u32	esync_n_width;
28*5fb9b0d4SIvan Vecera 	s32	phase_comp;
29607f2c00SIvan Vecera 	u8	ctrl;
30607f2c00SIvan Vecera 	u8	mode;
31607f2c00SIvan Vecera };
32607f2c00SIvan Vecera 
33607f2c00SIvan Vecera int zl3073x_out_state_fetch(struct zl3073x_dev *zldev, u8 index);
34607f2c00SIvan Vecera const struct zl3073x_out *zl3073x_out_state_get(struct zl3073x_dev *zldev,
35607f2c00SIvan Vecera 						u8 index);
36607f2c00SIvan Vecera 
37*5fb9b0d4SIvan Vecera int zl3073x_out_state_set(struct zl3073x_dev *zldev, u8 index,
38*5fb9b0d4SIvan Vecera 			  const struct zl3073x_out *out);
39*5fb9b0d4SIvan Vecera 
40607f2c00SIvan Vecera /**
41607f2c00SIvan Vecera  * zl3073x_out_signal_format_get - get output signal format
42607f2c00SIvan Vecera  * @out: pointer to out state
43607f2c00SIvan Vecera  *
44607f2c00SIvan Vecera  * Return: signal format of given output
45607f2c00SIvan Vecera  */
46607f2c00SIvan Vecera static inline u8 zl3073x_out_signal_format_get(const struct zl3073x_out *out)
47607f2c00SIvan Vecera {
48607f2c00SIvan Vecera 	return FIELD_GET(ZL_OUTPUT_MODE_SIGNAL_FORMAT, out->mode);
49607f2c00SIvan Vecera }
50607f2c00SIvan Vecera 
51607f2c00SIvan Vecera /**
52607f2c00SIvan Vecera  * zl3073x_out_is_diff - check if the given output is differential
53607f2c00SIvan Vecera  * @out: pointer to out state
54607f2c00SIvan Vecera  *
55607f2c00SIvan Vecera  * Return: true if output is differential, false if output is single-ended
56607f2c00SIvan Vecera  */
57607f2c00SIvan Vecera static inline bool zl3073x_out_is_diff(const struct zl3073x_out *out)
58607f2c00SIvan Vecera {
59607f2c00SIvan Vecera 	switch (zl3073x_out_signal_format_get(out)) {
60607f2c00SIvan Vecera 	case ZL_OUTPUT_MODE_SIGNAL_FORMAT_LVDS:
61607f2c00SIvan Vecera 	case ZL_OUTPUT_MODE_SIGNAL_FORMAT_DIFF:
62607f2c00SIvan Vecera 	case ZL_OUTPUT_MODE_SIGNAL_FORMAT_LOWVCM:
63607f2c00SIvan Vecera 		return true;
64607f2c00SIvan Vecera 	default:
65607f2c00SIvan Vecera 		break;
66607f2c00SIvan Vecera 	}
67607f2c00SIvan Vecera 
68607f2c00SIvan Vecera 	return false;
69607f2c00SIvan Vecera }
70607f2c00SIvan Vecera 
71607f2c00SIvan Vecera /**
72607f2c00SIvan Vecera  * zl3073x_out_is_enabled - check if the given output is enabled
73607f2c00SIvan Vecera  * @out: pointer to out state
74607f2c00SIvan Vecera  *
75607f2c00SIvan Vecera  * Return: true if output is enabled, false if output is disabled
76607f2c00SIvan Vecera  */
77607f2c00SIvan Vecera static inline bool zl3073x_out_is_enabled(const struct zl3073x_out *out)
78607f2c00SIvan Vecera {
79607f2c00SIvan Vecera 	return !!FIELD_GET(ZL_OUTPUT_CTRL_EN, out->ctrl);
80607f2c00SIvan Vecera }
81607f2c00SIvan Vecera 
82607f2c00SIvan Vecera /**
83607f2c00SIvan Vecera  * zl3073x_out_synth_get - get synth connected to given output
84607f2c00SIvan Vecera  * @out: pointer to out state
85607f2c00SIvan Vecera  *
86607f2c00SIvan Vecera  * Return: index of synth connected to given output.
87607f2c00SIvan Vecera  */
88607f2c00SIvan Vecera static inline u8 zl3073x_out_synth_get(const struct zl3073x_out *out)
89607f2c00SIvan Vecera {
90607f2c00SIvan Vecera 	return FIELD_GET(ZL_OUTPUT_CTRL_SYNTH_SEL, out->ctrl);
91607f2c00SIvan Vecera }
92607f2c00SIvan Vecera 
93607f2c00SIvan Vecera #endif /* _ZL3073X_OUT_H */
94