| /* SPDX-License-Identifier: GPL-2.0-only */ | |
| #ifndef _ZL3073X_OUT_H | |
| #define _ZL3073X_OUT_H | |
| #include <linux/bitfield.h> | |
| #include <linux/stddef.h> | |
| #include <linux/types.h> | |
| #include "regs.h" | |
| struct zl3073x_dev; | |
| /** | |
| * struct zl3073x_out - output state | |
| * @div: output divisor | |
| * @width: output pulse width | |
| * @esync_n_period: embedded sync or n-pin period (for n-div formats) | |
| * @esync_n_width: embedded sync or n-pin pulse width | |
| * @phase_comp: phase compensation | |
| * @mode: output mode | |
| * @ctrl: output control | |
| */ | |
| struct zl3073x_out { | |
| struct_group(cfg, /* Config */ | |
| u32 div; | |
| u32 width; | |
| u32 esync_n_period; | |
| u32 esync_n_width; | |
| s32 phase_comp; | |
| u8 mode; | |
| ); | |
| struct_group(inv, /* Invariants */ | |
| u8 ctrl; | |
| ); | |
| }; | |
| int zl3073x_out_state_fetch(struct zl3073x_dev *zldev, u8 index); | |
| const struct zl3073x_out *zl3073x_out_state_get(struct zl3073x_dev *zldev, | |
| u8 index); | |
| int zl3073x_out_state_set(struct zl3073x_dev *zldev, u8 index, | |
| const struct zl3073x_out *out); | |
| /** | |
| * zl3073x_out_clock_type_get - get output clock type | |
| * @out: pointer to out state | |
| * | |
| * Return: clock type of given output (ZL_OUTPUT_MODE_CLOCK_TYPE_*) | |
| */ | |
| static inline u8 zl3073x_out_clock_type_get(const struct zl3073x_out *out) | |
| { | |
| return FIELD_GET(ZL_OUTPUT_MODE_CLOCK_TYPE, out->mode); | |
| } | |
| /** | |
| * zl3073x_out_clock_type_set - set output clock type | |
| * @out: pointer to out state | |
| * @type: clock type (ZL_OUTPUT_MODE_CLOCK_TYPE_*) | |
| */ | |
| static inline void | |
| zl3073x_out_clock_type_set(struct zl3073x_out *out, u8 type) | |
| { | |
| FIELD_MODIFY(ZL_OUTPUT_MODE_CLOCK_TYPE, &out->mode, type); | |
| } | |
| /** | |
| * zl3073x_out_signal_format_get - get output signal format | |
| * @out: pointer to out state | |
| * | |
| * Return: signal format of given output | |
| */ | |
| static inline u8 zl3073x_out_signal_format_get(const struct zl3073x_out *out) | |
| { | |
| return FIELD_GET(ZL_OUTPUT_MODE_SIGNAL_FORMAT, out->mode); | |
| } | |
| /** | |
| * zl3073x_out_is_diff - check if the given output is differential | |
| * @out: pointer to out state | |
| * | |
| * Return: true if output is differential, false if output is single-ended | |
| */ | |
| static inline bool zl3073x_out_is_diff(const struct zl3073x_out *out) | |
| { | |
| switch (zl3073x_out_signal_format_get(out)) { | |
| case ZL_OUTPUT_MODE_SIGNAL_FORMAT_LVDS: | |
| case ZL_OUTPUT_MODE_SIGNAL_FORMAT_DIFF: | |
| case ZL_OUTPUT_MODE_SIGNAL_FORMAT_LOWVCM: | |
| return true; | |
| default: | |
| break; | |
| } | |
| return false; | |
| } | |
| /** | |
| * zl3073x_out_is_enabled - check if the given output is enabled | |
| * @out: pointer to out state | |
| * | |
| * Return: true if output is enabled, false if output is disabled | |
| */ | |
| static inline bool zl3073x_out_is_enabled(const struct zl3073x_out *out) | |
| { | |
| return !!FIELD_GET(ZL_OUTPUT_CTRL_EN, out->ctrl); | |
| } | |
| /** | |
| * zl3073x_out_is_ndiv - check if the given output is in N-div mode | |
| * @out: pointer to out state | |
| * | |
| * Return: true if output is in N-div mode, false otherwise | |
| */ | |
| static inline bool zl3073x_out_is_ndiv(const struct zl3073x_out *out) | |
| { | |
| switch (zl3073x_out_signal_format_get(out)) { | |
| case ZL_OUTPUT_MODE_SIGNAL_FORMAT_2_NDIV: | |
| case ZL_OUTPUT_MODE_SIGNAL_FORMAT_2_NDIV_INV: | |
| return true; | |
| default: | |
| return false; | |
| } | |
| } | |
| /** | |
| * zl3073x_out_synth_get - get synth connected to given output | |
| * @out: pointer to out state | |
| * | |
| * Return: index of synth connected to given output. | |
| */ | |
| static inline u8 zl3073x_out_synth_get(const struct zl3073x_out *out) | |
| { | |
| return FIELD_GET(ZL_OUTPUT_CTRL_SYNTH_SEL, out->ctrl); | |
| } | |
| #endif /* _ZL3073X_OUT_H */ |