FILE
ref.h
File preview with syntax highlighting.
linux-6.19.14/drivers/dpll/zl3073x/ref.h
1/* SPDX-License-Identifier: GPL-2.0-only */ 2 3#ifndef _ZL3073X_REF_H 4#define _ZL3073X_REF_H 5 6#include <linux/bitfield.h> 7#include <linux/math64.h> 8#include <linux/types.h> 9 10#include "regs.h" 11 12struct zl3073x_dev; 13 14/** 15 * struct zl3073x_ref - input reference state 16 * @ffo: current fractional frequency offset 17 * @phase_comp: phase compensation 18 * @esync_n_div: divisor for embedded sync or n-divided signal formats 19 * @freq_base: frequency base 20 * @freq_mult: frequnecy multiplier 21 * @freq_ratio_m: FEC mode multiplier 22 * @freq_ratio_n: FEC mode divisor 23 * @config: reference config 24 * @sync_ctrl: reference sync control 25 * @mon_status: reference monitor status 26 */ 27struct zl3073x_ref { 28 s64 ffo; 29 u64 phase_comp; 30 u32 esync_n_div; 31 u16 freq_base; 32 u16 freq_mult; 33 u16 freq_ratio_m; 34 u16 freq_ratio_n; 35 u8 config; 36 u8 sync_ctrl; 37 u8 mon_status; 38}; 39 40int zl3073x_ref_state_fetch(struct zl3073x_dev *zldev, u8 index); 41 42const struct zl3073x_ref *zl3073x_ref_state_get(struct zl3073x_dev *zldev, 43 u8 index); 44 45int zl3073x_ref_state_set(struct zl3073x_dev *zldev, u8 index, 46 const struct zl3073x_ref *ref); 47 48int zl3073x_ref_freq_factorize(u32 freq, u16 *base, u16 *mult); 49 50/** 51 * zl3073x_ref_ffo_get - get current fractional frequency offset 52 * @ref: pointer to ref state 53 * 54 * Return: the latest measured fractional frequency offset 55 */ 56static inline s64 57zl3073x_ref_ffo_get(const struct zl3073x_ref *ref) 58{ 59 return ref->ffo; 60} 61 62/** 63 * zl3073x_ref_freq_get - get given input reference frequency 64 * @ref: pointer to ref state 65 * 66 * Return: frequency of the given input reference 67 */ 68static inline u32 69zl3073x_ref_freq_get(const struct zl3073x_ref *ref) 70{ 71 return mul_u64_u32_div(ref->freq_base * ref->freq_mult, 72 ref->freq_ratio_m, ref->freq_ratio_n); 73} 74 75/** 76 * zl3073x_ref_freq_set - set given input reference frequency 77 * @ref: pointer to ref state 78 * @freq: frequency to be set 79 * 80 * Return: 0 on success, <0 when frequency cannot be factorized 81 */ 82static inline int 83zl3073x_ref_freq_set(struct zl3073x_ref *ref, u32 freq) 84{ 85 u16 base, mult; 86 int rc; 87 88 rc = zl3073x_ref_freq_factorize(freq, &base, &mult); 89 if (rc) 90 return rc; 91 92 ref->freq_base = base; 93 ref->freq_mult = mult; 94 ref->freq_ratio_m = 1; 95 ref->freq_ratio_n = 1; 96 97 return 0; 98} 99 100/** 101 * zl3073x_ref_is_diff - check if the given input reference is differential 102 * @ref: pointer to ref state 103 * 104 * Return: true if reference is differential, false if reference is single-ended 105 */ 106static inline bool 107zl3073x_ref_is_diff(const struct zl3073x_ref *ref) 108{ 109 return !!FIELD_GET(ZL_REF_CONFIG_DIFF_EN, ref->config); 110} 111 112/** 113 * zl3073x_ref_is_enabled - check if the given input reference is enabled 114 * @ref: pointer to ref state 115 * 116 * Return: true if input refernce is enabled, false otherwise 117 */ 118static inline bool 119zl3073x_ref_is_enabled(const struct zl3073x_ref *ref) 120{ 121 return !!FIELD_GET(ZL_REF_CONFIG_ENABLE, ref->config); 122} 123 124/** 125 * zl3073x_ref_is_status_ok - check the given input reference status 126 * @ref: pointer to ref state 127 * 128 * Return: true if the status is ok, false otherwise 129 */ 130static inline bool 131zl3073x_ref_is_status_ok(const struct zl3073x_ref *ref) 132{ 133 return ref->mon_status == ZL_REF_MON_STATUS_OK; 134} 135 136#endif /* _ZL3073X_REF_H */
~/
Read-only file preview.