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