xref: /linux/drivers/dpll/zl3073x/chan.h (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
13032e959SIvan Vecera /* SPDX-License-Identifier: GPL-2.0-only */
23032e959SIvan Vecera 
33032e959SIvan Vecera #ifndef _ZL3073X_CHAN_H
43032e959SIvan Vecera #define _ZL3073X_CHAN_H
53032e959SIvan Vecera 
63032e959SIvan Vecera #include <linux/bitfield.h>
73032e959SIvan Vecera #include <linux/stddef.h>
83032e959SIvan Vecera #include <linux/types.h>
93032e959SIvan Vecera 
103032e959SIvan Vecera #include "regs.h"
113032e959SIvan Vecera 
123032e959SIvan Vecera struct zl3073x_dev;
133032e959SIvan Vecera 
143032e959SIvan Vecera /**
153032e959SIvan Vecera  * struct zl3073x_chan - DPLL channel state
163032e959SIvan Vecera  * @mode_refsel: mode and reference selection register value
17f6b075bcSIvan Vecera  * @ref_prio: reference priority registers (4 bits per ref, P/N packed)
1841bab554SIvan Vecera  * @mon_status: monitor status register value
1941bab554SIvan Vecera  * @refsel_status: reference selection status register value
203032e959SIvan Vecera  */
213032e959SIvan Vecera struct zl3073x_chan {
223032e959SIvan Vecera 	struct_group(cfg,
233032e959SIvan Vecera 		u8	mode_refsel;
24f6b075bcSIvan Vecera 		u8	ref_prio[ZL3073X_NUM_REFS / 2];
253032e959SIvan Vecera 	);
2641bab554SIvan Vecera 	struct_group(stat,
2741bab554SIvan Vecera 		u8	mon_status;
2841bab554SIvan Vecera 		u8	refsel_status;
2941bab554SIvan Vecera 	);
303032e959SIvan Vecera };
313032e959SIvan Vecera 
323032e959SIvan Vecera int zl3073x_chan_state_fetch(struct zl3073x_dev *zldev, u8 index);
333032e959SIvan Vecera const struct zl3073x_chan *zl3073x_chan_state_get(struct zl3073x_dev *zldev,
343032e959SIvan Vecera 						 u8 index);
353032e959SIvan Vecera int zl3073x_chan_state_set(struct zl3073x_dev *zldev, u8 index,
363032e959SIvan Vecera 			   const struct zl3073x_chan *chan);
373032e959SIvan Vecera 
3841bab554SIvan Vecera int zl3073x_chan_state_update(struct zl3073x_dev *zldev, u8 index);
3941bab554SIvan Vecera 
403032e959SIvan Vecera /**
413032e959SIvan Vecera  * zl3073x_chan_mode_get - get DPLL channel operating mode
423032e959SIvan Vecera  * @chan: pointer to channel state
433032e959SIvan Vecera  *
443032e959SIvan Vecera  * Return: reference selection mode of the given DPLL channel
453032e959SIvan Vecera  */
463032e959SIvan Vecera static inline u8 zl3073x_chan_mode_get(const struct zl3073x_chan *chan)
473032e959SIvan Vecera {
483032e959SIvan Vecera 	return FIELD_GET(ZL_DPLL_MODE_REFSEL_MODE, chan->mode_refsel);
493032e959SIvan Vecera }
503032e959SIvan Vecera 
513032e959SIvan Vecera /**
523032e959SIvan Vecera  * zl3073x_chan_ref_get - get manually selected reference
533032e959SIvan Vecera  * @chan: pointer to channel state
543032e959SIvan Vecera  *
553032e959SIvan Vecera  * Return: reference selected in forced reference lock mode
563032e959SIvan Vecera  */
573032e959SIvan Vecera static inline u8 zl3073x_chan_ref_get(const struct zl3073x_chan *chan)
583032e959SIvan Vecera {
593032e959SIvan Vecera 	return FIELD_GET(ZL_DPLL_MODE_REFSEL_REF, chan->mode_refsel);
603032e959SIvan Vecera }
613032e959SIvan Vecera 
623032e959SIvan Vecera /**
633032e959SIvan Vecera  * zl3073x_chan_mode_set - set DPLL channel operating mode
643032e959SIvan Vecera  * @chan: pointer to channel state
653032e959SIvan Vecera  * @mode: mode to set
663032e959SIvan Vecera  */
673032e959SIvan Vecera static inline void zl3073x_chan_mode_set(struct zl3073x_chan *chan, u8 mode)
683032e959SIvan Vecera {
69*737cb619SIvan Vecera 	FIELD_MODIFY(ZL_DPLL_MODE_REFSEL_MODE, &chan->mode_refsel, mode);
703032e959SIvan Vecera }
713032e959SIvan Vecera 
723032e959SIvan Vecera /**
733032e959SIvan Vecera  * zl3073x_chan_ref_set - set manually selected reference
743032e959SIvan Vecera  * @chan: pointer to channel state
753032e959SIvan Vecera  * @ref: reference to set
763032e959SIvan Vecera  */
773032e959SIvan Vecera static inline void zl3073x_chan_ref_set(struct zl3073x_chan *chan, u8 ref)
783032e959SIvan Vecera {
79*737cb619SIvan Vecera 	FIELD_MODIFY(ZL_DPLL_MODE_REFSEL_REF, &chan->mode_refsel, ref);
803032e959SIvan Vecera }
813032e959SIvan Vecera 
8241bab554SIvan Vecera /**
83f6b075bcSIvan Vecera  * zl3073x_chan_ref_prio_get - get reference priority
84f6b075bcSIvan Vecera  * @chan: pointer to channel state
85f6b075bcSIvan Vecera  * @ref: input reference index
86f6b075bcSIvan Vecera  *
87f6b075bcSIvan Vecera  * Return: priority of the given reference <0, 15>
88f6b075bcSIvan Vecera  */
89f6b075bcSIvan Vecera static inline u8
90f6b075bcSIvan Vecera zl3073x_chan_ref_prio_get(const struct zl3073x_chan *chan, u8 ref)
91f6b075bcSIvan Vecera {
92f6b075bcSIvan Vecera 	u8 val = chan->ref_prio[ref / 2];
93f6b075bcSIvan Vecera 
94f6b075bcSIvan Vecera 	if (!(ref & 1))
95f6b075bcSIvan Vecera 		return FIELD_GET(ZL_DPLL_REF_PRIO_REF_P, val);
96f6b075bcSIvan Vecera 	else
97f6b075bcSIvan Vecera 		return FIELD_GET(ZL_DPLL_REF_PRIO_REF_N, val);
98f6b075bcSIvan Vecera }
99f6b075bcSIvan Vecera 
100f6b075bcSIvan Vecera /**
101f6b075bcSIvan Vecera  * zl3073x_chan_ref_prio_set - set reference priority
102f6b075bcSIvan Vecera  * @chan: pointer to channel state
103f6b075bcSIvan Vecera  * @ref: input reference index
104f6b075bcSIvan Vecera  * @prio: priority to set
105f6b075bcSIvan Vecera  */
106f6b075bcSIvan Vecera static inline void
107f6b075bcSIvan Vecera zl3073x_chan_ref_prio_set(struct zl3073x_chan *chan, u8 ref, u8 prio)
108f6b075bcSIvan Vecera {
109f6b075bcSIvan Vecera 	u8 *val = &chan->ref_prio[ref / 2];
110f6b075bcSIvan Vecera 
111*737cb619SIvan Vecera 	if (!(ref & 1))
112*737cb619SIvan Vecera 		FIELD_MODIFY(ZL_DPLL_REF_PRIO_REF_P, val, prio);
113*737cb619SIvan Vecera 	else
114*737cb619SIvan Vecera 		FIELD_MODIFY(ZL_DPLL_REF_PRIO_REF_N, val, prio);
115f6b075bcSIvan Vecera }
116f6b075bcSIvan Vecera 
117f6b075bcSIvan Vecera /**
118f6b075bcSIvan Vecera  * zl3073x_chan_ref_is_selectable - check if reference is selectable
119f6b075bcSIvan Vecera  * @chan: pointer to channel state
120f6b075bcSIvan Vecera  * @ref: input reference index
121f6b075bcSIvan Vecera  *
122f6b075bcSIvan Vecera  * Return: true if the reference priority is not NONE, false otherwise
123f6b075bcSIvan Vecera  */
124f6b075bcSIvan Vecera static inline bool
125f6b075bcSIvan Vecera zl3073x_chan_ref_is_selectable(const struct zl3073x_chan *chan, u8 ref)
126f6b075bcSIvan Vecera {
127f6b075bcSIvan Vecera 	return zl3073x_chan_ref_prio_get(chan, ref) != ZL_DPLL_REF_PRIO_NONE;
128f6b075bcSIvan Vecera }
129f6b075bcSIvan Vecera 
130f6b075bcSIvan Vecera /**
13141bab554SIvan Vecera  * zl3073x_chan_lock_state_get - get DPLL channel lock state
13241bab554SIvan Vecera  * @chan: pointer to channel state
13341bab554SIvan Vecera  *
13441bab554SIvan Vecera  * Return: lock state of the given DPLL channel
13541bab554SIvan Vecera  */
13641bab554SIvan Vecera static inline u8 zl3073x_chan_lock_state_get(const struct zl3073x_chan *chan)
13741bab554SIvan Vecera {
13841bab554SIvan Vecera 	return FIELD_GET(ZL_DPLL_MON_STATUS_STATE, chan->mon_status);
13941bab554SIvan Vecera }
14041bab554SIvan Vecera 
14141bab554SIvan Vecera /**
14241bab554SIvan Vecera  * zl3073x_chan_is_ho_ready - check if holdover is ready
14341bab554SIvan Vecera  * @chan: pointer to channel state
14441bab554SIvan Vecera  *
14541bab554SIvan Vecera  * Return: true if holdover is ready, false otherwise
14641bab554SIvan Vecera  */
14741bab554SIvan Vecera static inline bool zl3073x_chan_is_ho_ready(const struct zl3073x_chan *chan)
14841bab554SIvan Vecera {
14941bab554SIvan Vecera 	return !!FIELD_GET(ZL_DPLL_MON_STATUS_HO_READY, chan->mon_status);
15041bab554SIvan Vecera }
15141bab554SIvan Vecera 
15241bab554SIvan Vecera /**
15341bab554SIvan Vecera  * zl3073x_chan_refsel_state_get - get reference selection state
15441bab554SIvan Vecera  * @chan: pointer to channel state
15541bab554SIvan Vecera  *
15641bab554SIvan Vecera  * Return: reference selection state of the given DPLL channel
15741bab554SIvan Vecera  */
15841bab554SIvan Vecera static inline u8 zl3073x_chan_refsel_state_get(const struct zl3073x_chan *chan)
15941bab554SIvan Vecera {
16041bab554SIvan Vecera 	return FIELD_GET(ZL_DPLL_REFSEL_STATUS_STATE, chan->refsel_status);
16141bab554SIvan Vecera }
16241bab554SIvan Vecera 
16341bab554SIvan Vecera /**
16441bab554SIvan Vecera  * zl3073x_chan_refsel_ref_get - get currently selected reference in auto mode
16541bab554SIvan Vecera  * @chan: pointer to channel state
16641bab554SIvan Vecera  *
16741bab554SIvan Vecera  * Return: reference selected by the DPLL in automatic mode
16841bab554SIvan Vecera  */
16941bab554SIvan Vecera static inline u8 zl3073x_chan_refsel_ref_get(const struct zl3073x_chan *chan)
17041bab554SIvan Vecera {
17141bab554SIvan Vecera 	return FIELD_GET(ZL_DPLL_REFSEL_STATUS_REFSEL, chan->refsel_status);
17241bab554SIvan Vecera }
17341bab554SIvan Vecera 
1743032e959SIvan Vecera #endif /* _ZL3073X_CHAN_H */
175