162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
462306a36Sopenharmony_ci * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
562306a36Sopenharmony_ci * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci/*
862306a36Sopenharmony_ci * clock and PLL management functions
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifndef __VIA_CLOCK_H__
1262306a36Sopenharmony_ci#define __VIA_CLOCK_H__
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <linux/types.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cienum via_clksrc {
1762306a36Sopenharmony_ci	VIA_CLKSRC_X1 = 0,
1862306a36Sopenharmony_ci	VIA_CLKSRC_TVX1,
1962306a36Sopenharmony_ci	VIA_CLKSRC_TVPLL,
2062306a36Sopenharmony_ci	VIA_CLKSRC_DVP1TVCLKR,
2162306a36Sopenharmony_ci	VIA_CLKSRC_CAP0,
2262306a36Sopenharmony_ci	VIA_CLKSRC_CAP1,
2362306a36Sopenharmony_ci};
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct via_pll_config {
2662306a36Sopenharmony_ci	u16 multiplier;
2762306a36Sopenharmony_ci	u8 divisor;
2862306a36Sopenharmony_ci	u8 rshift;
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistruct via_clock {
3262306a36Sopenharmony_ci	void (*set_primary_clock_state)(u8 state);
3362306a36Sopenharmony_ci	void (*set_primary_clock_source)(enum via_clksrc src, bool use_pll);
3462306a36Sopenharmony_ci	void (*set_primary_pll_state)(u8 state);
3562306a36Sopenharmony_ci	void (*set_primary_pll)(struct via_pll_config config);
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	void (*set_secondary_clock_state)(u8 state);
3862306a36Sopenharmony_ci	void (*set_secondary_clock_source)(enum via_clksrc src, bool use_pll);
3962306a36Sopenharmony_ci	void (*set_secondary_pll_state)(u8 state);
4062306a36Sopenharmony_ci	void (*set_secondary_pll)(struct via_pll_config config);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	void (*set_engine_pll_state)(u8 state);
4362306a36Sopenharmony_ci	void (*set_engine_pll)(struct via_pll_config config);
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistatic inline u32 get_pll_internal_frequency(u32 ref_freq,
4862306a36Sopenharmony_ci	struct via_pll_config pll)
4962306a36Sopenharmony_ci{
5062306a36Sopenharmony_ci	return ref_freq / pll.divisor * pll.multiplier;
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic inline u32 get_pll_output_frequency(u32 ref_freq,
5462306a36Sopenharmony_ci	struct via_pll_config pll)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	return get_pll_internal_frequency(ref_freq, pll) >> pll.rshift;
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_civoid via_clock_init(struct via_clock *clock, int gfx_chip);
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#endif /* __VIA_CLOCK_H__ */
62