18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved. 48c2ecf20Sopenharmony_ci * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved. 58c2ecf20Sopenharmony_ci * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci/* 88c2ecf20Sopenharmony_ci * clock and PLL management functions 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifndef __VIA_CLOCK_H__ 128c2ecf20Sopenharmony_ci#define __VIA_CLOCK_H__ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <linux/types.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cienum via_clksrc { 178c2ecf20Sopenharmony_ci VIA_CLKSRC_X1 = 0, 188c2ecf20Sopenharmony_ci VIA_CLKSRC_TVX1, 198c2ecf20Sopenharmony_ci VIA_CLKSRC_TVPLL, 208c2ecf20Sopenharmony_ci VIA_CLKSRC_DVP1TVCLKR, 218c2ecf20Sopenharmony_ci VIA_CLKSRC_CAP0, 228c2ecf20Sopenharmony_ci VIA_CLKSRC_CAP1, 238c2ecf20Sopenharmony_ci}; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistruct via_pll_config { 268c2ecf20Sopenharmony_ci u16 multiplier; 278c2ecf20Sopenharmony_ci u8 divisor; 288c2ecf20Sopenharmony_ci u8 rshift; 298c2ecf20Sopenharmony_ci}; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistruct via_clock { 328c2ecf20Sopenharmony_ci void (*set_primary_clock_state)(u8 state); 338c2ecf20Sopenharmony_ci void (*set_primary_clock_source)(enum via_clksrc src, bool use_pll); 348c2ecf20Sopenharmony_ci void (*set_primary_pll_state)(u8 state); 358c2ecf20Sopenharmony_ci void (*set_primary_pll)(struct via_pll_config config); 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci void (*set_secondary_clock_state)(u8 state); 388c2ecf20Sopenharmony_ci void (*set_secondary_clock_source)(enum via_clksrc src, bool use_pll); 398c2ecf20Sopenharmony_ci void (*set_secondary_pll_state)(u8 state); 408c2ecf20Sopenharmony_ci void (*set_secondary_pll)(struct via_pll_config config); 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci void (*set_engine_pll_state)(u8 state); 438c2ecf20Sopenharmony_ci void (*set_engine_pll)(struct via_pll_config config); 448c2ecf20Sopenharmony_ci}; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_cistatic inline u32 get_pll_internal_frequency(u32 ref_freq, 488c2ecf20Sopenharmony_ci struct via_pll_config pll) 498c2ecf20Sopenharmony_ci{ 508c2ecf20Sopenharmony_ci return ref_freq / pll.divisor * pll.multiplier; 518c2ecf20Sopenharmony_ci} 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_cistatic inline u32 get_pll_output_frequency(u32 ref_freq, 548c2ecf20Sopenharmony_ci struct via_pll_config pll) 558c2ecf20Sopenharmony_ci{ 568c2ecf20Sopenharmony_ci return get_pll_internal_frequency(ref_freq, pll) >> pll.rshift; 578c2ecf20Sopenharmony_ci} 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_civoid via_clock_init(struct via_clock *clock, int gfx_chip); 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci#endif /* __VIA_CLOCK_H__ */ 62