2018-03-16 05:52:30 +03:00
// SPDX-License-Identifier: GPL-2.0
/*
* PSC clock descriptions for TI DaVinci DM365
*
* Copyright ( C ) 2018 David Lechner < david @ lechnology . com >
*/
# include <linux/clk-provider.h>
2018-05-25 21:11:49 +03:00
# include <linux/clk/davinci.h>
2018-03-16 05:52:30 +03:00
# include <linux/clk.h>
# include <linux/clkdev.h>
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/types.h>
# include "psc.h"
LPSC_CLKDEV1 ( vpss_slave_clkdev , " slave " , " vpss " ) ;
LPSC_CLKDEV1 ( spi1_clkdev , NULL , " spi_davinci.1 " ) ;
LPSC_CLKDEV1 ( mmcsd1_clkdev , NULL , " da830-mmc.1 " ) ;
LPSC_CLKDEV1 ( asp0_clkdev , NULL , " davinci-mcbsp " ) ;
LPSC_CLKDEV1 ( usb_clkdev , " usb " , NULL ) ;
LPSC_CLKDEV1 ( spi2_clkdev , NULL , " spi_davinci.2 " ) ;
2018-06-28 12:57:37 +03:00
LPSC_CLKDEV2 ( aemif_clkdev , " aemif " , NULL ,
NULL , " ti-aemif " ) ;
2018-03-16 05:52:30 +03:00
LPSC_CLKDEV1 ( mmcsd0_clkdev , NULL , " da830-mmc.0 " ) ;
LPSC_CLKDEV1 ( i2c_clkdev , NULL , " i2c_davinci.1 " ) ;
LPSC_CLKDEV1 ( uart0_clkdev , NULL , " serial8250.0 " ) ;
LPSC_CLKDEV1 ( uart1_clkdev , NULL , " serial8250.1 " ) ;
LPSC_CLKDEV1 ( spi0_clkdev , NULL , " spi_davinci.0 " ) ;
/* REVISIT: gpio-davinci.c should be modified to drop con_id */
LPSC_CLKDEV1 ( gpio_clkdev , " gpio " , NULL ) ;
LPSC_CLKDEV1 ( timer0_clkdev , " timer0 " , NULL ) ;
LPSC_CLKDEV1 ( timer2_clkdev , NULL , " davinci-wdt " ) ;
LPSC_CLKDEV1 ( spi3_clkdev , NULL , " spi_davinci.3 " ) ;
LPSC_CLKDEV1 ( spi4_clkdev , NULL , " spi_davinci.4 " ) ;
LPSC_CLKDEV2 ( emac_clkdev , NULL , " davinci_emac.1 " ,
" fck " , " davinci_mdio.0 " ) ;
LPSC_CLKDEV1 ( voice_codec_clkdev , NULL , " davinci_voicecodec " ) ;
LPSC_CLKDEV1 ( vpss_dac_clkdev , " vpss_dac " , NULL ) ;
LPSC_CLKDEV1 ( vpss_master_clkdev , " master " , " vpss " ) ;
static const struct davinci_lpsc_clk_info dm365_psc_info [ ] = {
LPSC ( 1 , 0 , vpss_slave , pll1_sysclk5 , vpss_slave_clkdev , 0 ) ,
LPSC ( 5 , 0 , timer3 , pll1_auxclk , NULL , 0 ) ,
LPSC ( 6 , 0 , spi1 , pll1_sysclk4 , spi1_clkdev , 0 ) ,
LPSC ( 7 , 0 , mmcsd1 , pll1_sysclk4 , mmcsd1_clkdev , 0 ) ,
LPSC ( 8 , 0 , asp0 , pll1_sysclk4 , asp0_clkdev , 0 ) ,
LPSC ( 9 , 0 , usb , pll1_auxclk , usb_clkdev , 0 ) ,
LPSC ( 10 , 0 , pwm3 , pll1_auxclk , NULL , 0 ) ,
LPSC ( 11 , 0 , spi2 , pll1_sysclk4 , spi2_clkdev , 0 ) ,
LPSC ( 12 , 0 , rto , pll1_sysclk4 , NULL , 0 ) ,
LPSC ( 14 , 0 , aemif , pll1_sysclk4 , aemif_clkdev , 0 ) ,
LPSC ( 15 , 0 , mmcsd0 , pll1_sysclk8 , mmcsd0_clkdev , 0 ) ,
LPSC ( 18 , 0 , i2c , pll1_auxclk , i2c_clkdev , 0 ) ,
LPSC ( 19 , 0 , uart0 , pll1_auxclk , uart0_clkdev , 0 ) ,
LPSC ( 20 , 0 , uart1 , pll1_sysclk4 , uart1_clkdev , 0 ) ,
LPSC ( 22 , 0 , spi0 , pll1_sysclk4 , spi0_clkdev , 0 ) ,
LPSC ( 23 , 0 , pwm0 , pll1_auxclk , NULL , 0 ) ,
LPSC ( 24 , 0 , pwm1 , pll1_auxclk , NULL , 0 ) ,
LPSC ( 25 , 0 , pwm2 , pll1_auxclk , NULL , 0 ) ,
LPSC ( 26 , 0 , gpio , pll1_sysclk4 , gpio_clkdev , 0 ) ,
LPSC ( 27 , 0 , timer0 , pll1_auxclk , timer0_clkdev , LPSC_ALWAYS_ENABLED ) ,
LPSC ( 28 , 0 , timer1 , pll1_auxclk , NULL , 0 ) ,
/* REVISIT: why can't this be disabled? */
LPSC ( 29 , 0 , timer2 , pll1_auxclk , timer2_clkdev , LPSC_ALWAYS_ENABLED ) ,
LPSC ( 31 , 0 , arm , pll2_sysclk2 , NULL , LPSC_ALWAYS_ENABLED ) ,
LPSC ( 38 , 0 , spi3 , pll1_sysclk4 , spi3_clkdev , 0 ) ,
LPSC ( 39 , 0 , spi4 , pll1_auxclk , spi4_clkdev , 0 ) ,
2018-05-25 21:11:46 +03:00
LPSC ( 40 , 0 , emac , pll1_sysclk4 , emac_clkdev , 0 ) ,
/*
* The TRM ( ARM Subsystem User ' s Guide ) shows two clocks input into
* voice codec module ( PLL2 SYSCLK4 with a DIV2 and PLL1 SYSCLK4 ) . Its
* not fully clear from documentation which clock should be considered
* as parent for PSC . The clock chosen here is to maintain
* compatibility with existing code in arch / arm / mach - davinci / dm365 . c
*/
LPSC ( 44 , 0 , voice_codec , pll2_sysclk4 , voice_codec_clkdev , 0 ) ,
/*
* Its not fully clear from TRM ( ARM Subsystem User ' s Guide ) as to what
* the parent of VPSS DAC LPSC should actually be . PLL1 SYSCLK3 feeds
* into HDVICP and MJCP . The clock chosen here is to remain compatible
* with code existing in arch / arm / mach - davinci / dm365 . c
*/
LPSC ( 46 , 0 , vpss_dac , pll1_sysclk3 , vpss_dac_clkdev , 0 ) ,
2018-03-16 05:52:30 +03:00
LPSC ( 47 , 0 , vpss_master , pll1_sysclk5 , vpss_master_clkdev , 0 ) ,
LPSC ( 50 , 0 , mjcp , pll1_sysclk3 , NULL , 0 ) ,
{ }
} ;
2018-05-25 21:11:49 +03:00
int dm365_psc_init ( struct device * dev , void __iomem * base )
2018-03-16 05:52:30 +03:00
{
return davinci_psc_register_clocks ( dev , dm365_psc_info , 52 , base ) ;
}
static struct clk_bulk_data dm365_psc_parent_clks [ ] = {
{ . id = " pll1_sysclk1 " } ,
{ . id = " pll1_sysclk3 " } ,
{ . id = " pll1_sysclk4 " } ,
{ . id = " pll1_sysclk5 " } ,
{ . id = " pll1_sysclk8 " } ,
{ . id = " pll2_sysclk2 " } ,
{ . id = " pll2_sysclk4 " } ,
{ . id = " pll1_auxclk " } ,
} ;
const struct davinci_psc_init_data dm365_psc_init_data = {
. parent_clks = dm365_psc_parent_clks ,
. num_parent_clks = ARRAY_SIZE ( dm365_psc_parent_clks ) ,
. psc_init = & dm365_psc_init ,
} ;