2013-05-03 07:24:47 +04:00
/*
* Copyright 2013 Freescale Semiconductor , Inc .
*
* 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 .
*
*/
# include <linux/irqchip.h>
# include <linux/of.h>
# include <linux/of_platform.h>
2013-09-04 06:58:17 +04:00
# include <linux/mfd/syscon.h>
# include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
# include <linux/regmap.h>
2013-05-03 07:24:47 +04:00
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
# include "common.h"
2014-01-09 12:03:16 +04:00
# include "cpuidle.h"
2018-03-08 12:34:55 +03:00
# include "hardware.h"
2013-05-03 07:24:47 +04:00
2013-09-04 06:58:17 +04:00
static void __init imx6sl_fec_init ( void )
{
struct regmap * gpr ;
/* set FEC clock from internal PLL clock source */
gpr = syscon_regmap_lookup_by_compatible ( " fsl,imx6sl-iomuxc-gpr " ) ;
if ( ! IS_ERR ( gpr ) ) {
regmap_update_bits ( gpr , IOMUXC_GPR1 ,
IMX6SL_GPR1_FEC_CLOCK_MUX2_SEL_MASK , 0 ) ;
regmap_update_bits ( gpr , IOMUXC_GPR1 ,
IMX6SL_GPR1_FEC_CLOCK_MUX1_SEL_MASK , 0 ) ;
} else {
pr_err ( " failed to find fsl,imx6sl-iomux-gpr regmap \n " ) ;
}
}
2013-12-20 00:35:37 +04:00
static void __init imx6sl_init_late ( void )
{
/* imx6sl reuses imx6q cpufreq driver */
if ( IS_ENABLED ( CONFIG_ARM_IMX6Q_CPUFREQ ) )
platform_device_register_simple ( " imx6q-cpufreq " , - 1 , NULL , 0 ) ;
2014-01-09 12:03:16 +04:00
imx6sl_cpuidle_init ( ) ;
2013-12-20 00:35:37 +04:00
}
2013-05-03 07:24:47 +04:00
static void __init imx6sl_init_machine ( void )
{
2013-08-13 12:59:28 +04:00
struct device * parent ;
parent = imx_soc_device_init ( ) ;
if ( parent = = NULL )
pr_warn ( " failed to initialize soc device \n " ) ;
2016-06-01 09:53:05 +03:00
of_platform_default_populate ( NULL , NULL , parent ) ;
2013-09-04 06:58:17 +04:00
2018-03-08 12:34:55 +03:00
if ( cpu_is_imx6sl ( ) )
imx6sl_fec_init ( ) ;
2013-10-17 06:07:09 +04:00
imx_anatop_init ( ) ;
2014-01-17 07:39:05 +04:00
imx6sl_pm_init ( ) ;
2013-05-03 07:24:47 +04:00
}
static void __init imx6sl_init_irq ( void )
{
2015-03-13 19:05:37 +03:00
imx_gpc_check_dt ( ) ;
2013-08-13 12:54:05 +04:00
imx_init_revision_from_anatop ( ) ;
2013-07-08 17:52:33 +04:00
imx_init_l2cache ( ) ;
2013-05-03 07:24:47 +04:00
imx_src_init ( ) ;
irqchip_init ( ) ;
2018-03-08 12:34:55 +03:00
if ( cpu_is_imx6sl ( ) )
imx6_pm_ccm_init ( " fsl,imx6sl-ccm " ) ;
else
imx6_pm_ccm_init ( " fsl,imx6sll-ccm " ) ;
2013-05-03 07:24:47 +04:00
}
2014-07-01 12:03:00 +04:00
static const char * const imx6sl_dt_compat [ ] __initconst = {
2013-05-03 07:24:47 +04:00
" fsl,imx6sl " ,
2018-03-08 12:34:55 +03:00
" fsl,imx6sll " ,
2013-05-03 07:24:47 +04:00
NULL ,
} ;
DT_MACHINE_START ( IMX6SL , " Freescale i.MX6 SoloLite (Device Tree) " )
2016-06-19 04:09:31 +03:00
. l2c_aux_val = 0 ,
. l2c_aux_mask = ~ 0 ,
2013-05-03 07:24:47 +04:00
. init_irq = imx6sl_init_irq ,
. init_machine = imx6sl_init_machine ,
2013-12-20 00:35:37 +04:00
. init_late = imx6sl_init_late ,
2013-05-03 07:24:47 +04:00
. dt_compat = imx6sl_dt_compat ,
MACHINE_END