mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
b923ff6af0
IMX6 has been (ab)using the gic_arch_extn to provide wakeup from suspend, and it makes a lot of sense to convert this code to use stacked domains instead. This patch does just this, updating the DT files to actually reflect what the HW provides. BIG FAT WARNING: because the DTs were so far lying by not exposing the fact that the GPC block is actually the first interrupt controller in the chain, kernels with this patch applied wont have any suspend-resume facility when booted with old DTs, and old kernels with updated DTs won't even boot. Tested-by: Stefan Agner <stefan@agner.ch> Acked-by: Stefan Agner <stefan@agner.ch> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
81 lines
1.9 KiB
C
81 lines
1.9 KiB
C
/*
|
|
* 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>
|
|
#include <linux/mfd/syscon.h>
|
|
#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
|
|
#include <linux/regmap.h>
|
|
#include <asm/mach/arch.h>
|
|
#include <asm/mach/map.h>
|
|
|
|
#include "common.h"
|
|
#include "cpuidle.h"
|
|
|
|
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");
|
|
}
|
|
}
|
|
|
|
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);
|
|
|
|
imx6sl_cpuidle_init();
|
|
}
|
|
|
|
static void __init imx6sl_init_machine(void)
|
|
{
|
|
struct device *parent;
|
|
|
|
parent = imx_soc_device_init();
|
|
if (parent == NULL)
|
|
pr_warn("failed to initialize soc device\n");
|
|
|
|
of_platform_populate(NULL, of_default_bus_match_table, NULL, parent);
|
|
|
|
imx6sl_fec_init();
|
|
imx_anatop_init();
|
|
imx6sl_pm_init();
|
|
}
|
|
|
|
static void __init imx6sl_init_irq(void)
|
|
{
|
|
imx_init_revision_from_anatop();
|
|
imx_init_l2cache();
|
|
imx_src_init();
|
|
irqchip_init();
|
|
}
|
|
|
|
static const char * const imx6sl_dt_compat[] __initconst = {
|
|
"fsl,imx6sl",
|
|
NULL,
|
|
};
|
|
|
|
DT_MACHINE_START(IMX6SL, "Freescale i.MX6 SoloLite (Device Tree)")
|
|
.init_irq = imx6sl_init_irq,
|
|
.init_machine = imx6sl_init_machine,
|
|
.init_late = imx6sl_init_late,
|
|
.dt_compat = imx6sl_dt_compat,
|
|
MACHINE_END
|