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