1*607f2c00SIvan Vecera /* SPDX-License-Identifier: GPL-2.0-only */ 2*607f2c00SIvan Vecera 3*607f2c00SIvan Vecera #ifndef _ZL3073X_SYNTH_H 4*607f2c00SIvan Vecera #define _ZL3073X_SYNTH_H 5*607f2c00SIvan Vecera 6*607f2c00SIvan Vecera #include <linux/bitfield.h> 7*607f2c00SIvan Vecera #include <linux/math64.h> 8*607f2c00SIvan Vecera #include <linux/types.h> 9*607f2c00SIvan Vecera 10*607f2c00SIvan Vecera #include "regs.h" 11*607f2c00SIvan Vecera 12*607f2c00SIvan Vecera struct zl3073x_dev; 13*607f2c00SIvan Vecera 14*607f2c00SIvan Vecera /** 15*607f2c00SIvan Vecera * struct zl3073x_synth - synthesizer state 16*607f2c00SIvan Vecera * @freq_mult: frequency multiplier 17*607f2c00SIvan Vecera * @freq_base: frequency base 18*607f2c00SIvan Vecera * @freq_m: frequency numerator 19*607f2c00SIvan Vecera * @freq_n: frequency denominator 20*607f2c00SIvan Vecera * @ctrl: synth control 21*607f2c00SIvan Vecera */ 22*607f2c00SIvan Vecera struct zl3073x_synth { 23*607f2c00SIvan Vecera u32 freq_mult; 24*607f2c00SIvan Vecera u16 freq_base; 25*607f2c00SIvan Vecera u16 freq_m; 26*607f2c00SIvan Vecera u16 freq_n; 27*607f2c00SIvan Vecera u8 ctrl; 28*607f2c00SIvan Vecera }; 29*607f2c00SIvan Vecera 30*607f2c00SIvan Vecera int zl3073x_synth_state_fetch(struct zl3073x_dev *zldev, u8 synth_id); 31*607f2c00SIvan Vecera 32*607f2c00SIvan Vecera const struct zl3073x_synth *zl3073x_synth_state_get(struct zl3073x_dev *zldev, 33*607f2c00SIvan Vecera u8 synth_id); 34*607f2c00SIvan Vecera 35*607f2c00SIvan Vecera int zl3073x_synth_state_set(struct zl3073x_dev *zldev, u8 synth_id, 36*607f2c00SIvan Vecera const struct zl3073x_synth *synth); 37*607f2c00SIvan Vecera 38*607f2c00SIvan Vecera /** 39*607f2c00SIvan Vecera * zl3073x_synth_dpll_get - get DPLL ID the synth is driven by 40*607f2c00SIvan Vecera * @synth: pointer to synth state 41*607f2c00SIvan Vecera * 42*607f2c00SIvan Vecera * Return: ID of DPLL the given synthetizer is driven by 43*607f2c00SIvan Vecera */ 44*607f2c00SIvan Vecera static inline u8 zl3073x_synth_dpll_get(const struct zl3073x_synth *synth) 45*607f2c00SIvan Vecera { 46*607f2c00SIvan Vecera return FIELD_GET(ZL_SYNTH_CTRL_DPLL_SEL, synth->ctrl); 47*607f2c00SIvan Vecera } 48*607f2c00SIvan Vecera 49*607f2c00SIvan Vecera /** 50*607f2c00SIvan Vecera * zl3073x_synth_freq_get - get synth current freq 51*607f2c00SIvan Vecera * @synth: pointer to synth state 52*607f2c00SIvan Vecera * 53*607f2c00SIvan Vecera * Return: frequency of given synthetizer 54*607f2c00SIvan Vecera */ 55*607f2c00SIvan Vecera static inline u32 zl3073x_synth_freq_get(const struct zl3073x_synth *synth) 56*607f2c00SIvan Vecera { 57*607f2c00SIvan Vecera return mul_u64_u32_div(synth->freq_base * synth->freq_m, 58*607f2c00SIvan Vecera synth->freq_mult, synth->freq_n); 59*607f2c00SIvan Vecera } 60*607f2c00SIvan Vecera 61*607f2c00SIvan Vecera /** 62*607f2c00SIvan Vecera * zl3073x_synth_is_enabled - check if the given synth is enabled 63*607f2c00SIvan Vecera * @synth: pointer to synth state 64*607f2c00SIvan Vecera * 65*607f2c00SIvan Vecera * Return: true if synth is enabled, false otherwise 66*607f2c00SIvan Vecera */ 67*607f2c00SIvan Vecera static inline bool zl3073x_synth_is_enabled(const struct zl3073x_synth *synth) 68*607f2c00SIvan Vecera { 69*607f2c00SIvan Vecera return FIELD_GET(ZL_SYNTH_CTRL_EN, synth->ctrl); 70*607f2c00SIvan Vecera } 71*607f2c00SIvan Vecera 72*607f2c00SIvan Vecera #endif /* _ZL3073X_SYNTH_H */ 73