2012-11-20 22:39:31 +01:00
/*
* Clock driver for the ARM RealView boards
* Copyright ( C ) 2012 Linus Walleij
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
2012-08-06 18:32:08 +02:00
# include <linux/clk.h>
# include <linux/clkdev.h>
# include <linux/err.h>
# include <linux/io.h>
# include <linux/clk-provider.h>
# include <mach/hardware.h>
# include <mach/platform.h>
# include "clk-icst.h"
/*
* Implementation of the ARM RealView clock trees .
*/
static const struct icst_params realview_oscvco_params = {
. ref = 24000000 ,
. vco_max = ICST307_VCO_MAX ,
. vco_min = ICST307_VCO_MIN ,
. vd_min = 4 + 8 ,
. vd_max = 511 + 8 ,
. rd_min = 1 + 2 ,
. rd_max = 127 + 2 ,
. s2div = icst307_s2div ,
. idx2s = icst307_idx2s ,
} ;
2012-11-20 23:01:04 +01:00
static const struct clk_icst_desc __initdata realview_osc0_desc = {
2012-08-06 18:32:08 +02:00
. params = & realview_oscvco_params ,
2012-11-20 23:01:04 +01:00
. vco_offset = REALVIEW_SYS_OSC0_OFFSET ,
. lock_offset = REALVIEW_SYS_LOCK_OFFSET ,
} ;
static const struct clk_icst_desc __initdata realview_osc4_desc = {
. params = & realview_oscvco_params ,
. vco_offset = REALVIEW_SYS_OSC4_OFFSET ,
. lock_offset = REALVIEW_SYS_LOCK_OFFSET ,
2012-08-06 18:32:08 +02:00
} ;
/*
* realview_clk_init ( ) - set up the RealView clock tree
*/
void __init realview_clk_init ( void __iomem * sysbase , bool is_pb1176 )
{
struct clk * clk ;
/* APB clock dummy */
clk = clk_register_fixed_rate ( NULL , " apb_pclk " , NULL , CLK_IS_ROOT , 0 ) ;
clk_register_clkdev ( clk , " apb_pclk " , NULL ) ;
/* 24 MHz clock */
clk = clk_register_fixed_rate ( NULL , " clk24mhz " , NULL , CLK_IS_ROOT ,
24000000 ) ;
clk_register_clkdev ( clk , NULL , " dev:uart0 " ) ;
clk_register_clkdev ( clk , NULL , " dev:uart1 " ) ;
clk_register_clkdev ( clk , NULL , " dev:uart2 " ) ;
clk_register_clkdev ( clk , NULL , " fpga:kmi0 " ) ;
clk_register_clkdev ( clk , NULL , " fpga:kmi1 " ) ;
clk_register_clkdev ( clk , NULL , " fpga:mmc0 " ) ;
clk_register_clkdev ( clk , NULL , " dev:ssp0 " ) ;
if ( is_pb1176 ) {
/*
* UART3 is on the dev chip in PB1176
* UART4 only exists in PB1176
*/
clk_register_clkdev ( clk , NULL , " dev:uart3 " ) ;
clk_register_clkdev ( clk , NULL , " dev:uart4 " ) ;
} else
clk_register_clkdev ( clk , NULL , " fpga:uart3 " ) ;
/* 1 MHz clock */
clk = clk_register_fixed_rate ( NULL , " clk1mhz " , NULL , CLK_IS_ROOT ,
1000000 ) ;
clk_register_clkdev ( clk , NULL , " sp804 " ) ;
/* ICST VCO clock */
2012-11-20 23:01:04 +01:00
if ( is_pb1176 )
2013-11-22 11:30:05 +01:00
clk = icst_clk_register ( NULL , & realview_osc0_desc ,
2014-01-20 21:31:41 +01:00
" osc0 " , NULL , sysbase ) ;
2012-11-20 23:01:04 +01:00
else
2013-11-22 11:30:05 +01:00
clk = icst_clk_register ( NULL , & realview_osc4_desc ,
2014-01-20 21:31:41 +01:00
" osc4 " , NULL , sysbase ) ;
2012-11-20 23:01:04 +01:00
2012-08-06 18:32:08 +02:00
clk_register_clkdev ( clk , NULL , " dev:clcd " ) ;
clk_register_clkdev ( clk , NULL , " issp:clcd " ) ;
}