2012-07-10 16:45:24 +10:00
/*
* Copyright 2012 Red Hat Inc .
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* THE COPYRIGHT HOLDER ( S ) OR AUTHOR ( S ) BE LIABLE FOR ANY CLAIM , DAMAGES OR
* OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE ,
* ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE .
*
* Authors : Ben Skeggs
*/
2015-08-20 14:54:20 +10:00
# include "priv.h"
2015-01-14 14:47:24 +10:00
# include "pll.h"
2012-07-10 16:45:24 +10:00
2012-07-10 17:26:46 +10:00
# include <subdev/bios.h>
# include <subdev/bios/pll.h>
2014-01-14 15:55:38 +10:00
# include <subdev/devinit/nv04.h>
2012-07-10 17:26:46 +10:00
int
2015-01-14 14:47:24 +10:00
nv04_clk_pll_calc ( struct nvkm_clk * clock , struct nvbios_pll * info ,
int clk , struct nvkm_pll_vals * pv )
2012-07-10 17:26:46 +10:00
{
int N1 , M1 , N2 , M2 , P ;
2015-08-20 14:54:20 +10:00
int ret = nv04_pll_calc ( & clock - > subdev , info , clk , & N1 , & M1 , & N2 , & M2 , & P ) ;
2012-07-10 17:26:46 +10:00
if ( ret ) {
pv - > refclk = info - > refclk ;
pv - > N1 = N1 ;
pv - > M1 = M1 ;
pv - > N2 = N2 ;
pv - > M2 = M2 ;
pv - > log2P = P ;
}
return ret ;
}
int
2015-01-14 14:47:24 +10:00
nv04_clk_pll_prog ( struct nvkm_clk * clk , u32 reg1 , struct nvkm_pll_vals * pv )
2012-07-10 17:26:46 +10:00
{
2015-08-20 14:54:20 +10:00
struct nvkm_device * device = clk - > subdev . device ;
struct nvkm_devinit * devinit = device - > devinit ;
int cv = device - > bios - > version . chip ;
2012-07-10 17:26:46 +10:00
if ( cv = = 0x30 | | cv = = 0x31 | | cv = = 0x35 | | cv = = 0x36 | |
cv > = 0x40 ) {
if ( reg1 > 0x405c )
2013-03-05 10:53:54 +10:00
setPLL_double_highregs ( devinit , reg1 , pv ) ;
2012-07-10 17:26:46 +10:00
else
2013-03-05 10:53:54 +10:00
setPLL_double_lowregs ( devinit , reg1 , pv ) ;
2012-07-10 17:26:46 +10:00
} else
2013-03-05 10:53:54 +10:00
setPLL_single ( devinit , reg1 , pv ) ;
2012-07-10 17:26:46 +10:00
return 0 ;
2012-07-10 16:45:24 +10:00
}
2015-08-20 14:54:20 +10:00
static const struct nvkm_clk_func
nv04_clk = {
. domains = {
{ nv_clk_src_max }
}
2013-11-15 08:20:45 +10:00
} ;
2015-08-20 14:54:20 +10:00
int
nv04_clk_new ( struct nvkm_device * device , int index , struct nvkm_clk * * pclk )
2012-07-10 16:45:24 +10:00
{
2015-08-20 14:54:20 +10:00
int ret = nvkm_clk_new_ ( & nv04_clk , device , index , false , pclk ) ;
if ( ret = = 0 ) {
( * pclk ) - > pll_calc = nv04_clk_pll_calc ;
( * pclk ) - > pll_prog = nv04_clk_pll_prog ;
}
return ret ;
2012-07-10 16:45:24 +10:00
}