12c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat/*
22c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
32c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
42c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
52c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat *
62c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * This program is free software; you can redistribute it and/or
72c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * modify it under the terms of the GNU General Public
82c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * License as published by the Free Software Foundation;
92c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * either version 2, or (at your option) any later version.
102c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat *
112c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * This program is distributed in the hope that it will be useful,
122c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
132c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * the implied warranty of MERCHANTABILITY or FITNESS FOR
142c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * A PARTICULAR PURPOSE.See the GNU General Public License
152c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * for more details.
162c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat *
172c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * You should have received a copy of the GNU General Public License
182c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * along with this program; if not, write to the Free Software
192c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * Foundation, Inc.,
202c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
212c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat */
222c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat/*
232c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat * clock and PLL management functions
242c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat */
252c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat
262c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat#ifndef __VIA_CLOCK_H__
272c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat#define __VIA_CLOCK_H__
282c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat
292c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat#include <linux/types.h>
302c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat
312c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinatenum via_clksrc {
322c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	VIA_CLKSRC_X1 = 0,
332c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	VIA_CLKSRC_TVX1,
342c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	VIA_CLKSRC_TVPLL,
352c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	VIA_CLKSRC_DVP1TVCLKR,
362c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	VIA_CLKSRC_CAP0,
372c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	VIA_CLKSRC_CAP1,
382c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat};
392c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat
402c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinatstruct via_pll_config {
412c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	u16 multiplier;
422c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	u8 divisor;
432c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	u8 rshift;
442c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat};
452c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat
462c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinatstruct via_clock {
472c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	void (*set_primary_clock_state)(u8 state);
482c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	void (*set_primary_clock_source)(enum via_clksrc src, bool use_pll);
492c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	void (*set_primary_pll_state)(u8 state);
502c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	void (*set_primary_pll)(struct via_pll_config config);
512c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat
522c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	void (*set_secondary_clock_state)(u8 state);
532c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	void (*set_secondary_clock_source)(enum via_clksrc src, bool use_pll);
542c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	void (*set_secondary_pll_state)(u8 state);
552c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	void (*set_secondary_pll)(struct via_pll_config config);
56bea02e45874a5d18127b0779740c4fd5b3e7e44aFlorian Tobias Schandinat
57bea02e45874a5d18127b0779740c4fd5b3e7e44aFlorian Tobias Schandinat	void (*set_engine_pll_state)(u8 state);
58bea02e45874a5d18127b0779740c4fd5b3e7e44aFlorian Tobias Schandinat	void (*set_engine_pll)(struct via_pll_config config);
592c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat};
602c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat
612c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat
622c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinatstatic inline u32 get_pll_internal_frequency(u32 ref_freq,
632c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	struct via_pll_config pll)
642c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat{
652c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	return ref_freq / pll.divisor * pll.multiplier;
662c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat}
672c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat
682c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinatstatic inline u32 get_pll_output_frequency(u32 ref_freq,
692c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	struct via_pll_config pll)
702c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat{
712c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat	return get_pll_internal_frequency(ref_freq, pll) >> pll.rshift;
722c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat}
732c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat
742c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinatvoid via_clock_init(struct via_clock *clock, int gfx_chip);
752c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat
762c536f84c19c73ab1e3411bf1596ff85c4a23783Florian Tobias Schandinat#endif /* __VIA_CLOCK_H__ */
77