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