Merge tag 'armsoc-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
Pull ARM SoC-related driver updates from Olof Johansson: "Various driver updates for platforms and a couple of the small driver subsystems we merge through our tree: Among the larger pieces: - Power management improvements for TI am335x and am437x (RTC suspend/wake) - Misc new additions for Amlogic (socinfo updates) - ZynqMP FPGA manager - Nvidia improvements for reset/powergate handling - PMIC wrapper for Mediatek MT8516 - Misc fixes/improvements for ARM SCMI, TEE, NXP i.MX SCU drivers" * tag 'armsoc-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc: (57 commits) soc: aspeed: fix Kconfig soc: add aspeed folder and misc drivers spi: zynqmp: Fix build break soc: imx: Add generic i.MX8 SoC driver MAINTAINERS: Update email for Qualcomm SoC maintainer memory: tegra: Fix a typos for "fdcdwr2" mc client Revert "ARM: tegra: Restore memory arbitration on resume from LP1 on Tegra30+" memory: tegra: Replace readl-writel with mc_readl-mc_writel memory: tegra: Fix integer overflow on tick value calculation memory: tegra: Fix missed registers values latching ARM: tegra: cpuidle: Handle tick broadcasting within cpuidle core on Tegra20/30 optee: allow to work without static shared memory soc/tegra: pmc: Move powergate initialisation to probe soc/tegra: pmc: Remove reset sysfs entries on error soc/tegra: pmc: Fix reset sources and levels soc: amlogic: meson-gx-pwrc-vpu: Add support for G12A soc: amlogic: meson-gx-pwrc-vpu: Fix power on/off register bitmask fpga manager: Adding FPGA Manager support for Xilinx zynqmp dt-bindings: fpga: Add bindings for ZynqMP fpga driver firmware: xilinx: Add fpga API's ...
This commit is contained in:
@@ -10,6 +10,12 @@
|
||||
#include <asm/suspend.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/platform_data/pm33xx.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/platform_data/gpio-omap.h>
|
||||
#include <linux/pinctrl/pinmux.h>
|
||||
#include <linux/wkup_m3_ipc.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/rtc.h>
|
||||
|
||||
#include "cm33xx.h"
|
||||
#include "common.h"
|
||||
@@ -38,6 +44,29 @@ static int am43xx_map_scu(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int am33xx_check_off_mode_enable(void)
|
||||
{
|
||||
if (enable_off_mode)
|
||||
pr_warn("WARNING: This platform does not support off-mode, entering DeepSleep suspend.\n");
|
||||
|
||||
/* off mode not supported on am335x so return 0 always */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int am43xx_check_off_mode_enable(void)
|
||||
{
|
||||
/*
|
||||
* Check for am437x-gp-evm which has the right Hardware design to
|
||||
* support this mode reliably.
|
||||
*/
|
||||
if (of_machine_is_compatible("ti,am437x-gp-evm") && enable_off_mode)
|
||||
return enable_off_mode;
|
||||
else if (enable_off_mode)
|
||||
pr_warn("WARNING: This platform does not support off-mode, entering DeepSleep suspend.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amx3_common_init(void)
|
||||
{
|
||||
gfx_pwrdm = pwrdm_lookup("gfx_pwrdm");
|
||||
@@ -141,7 +170,9 @@ static int am43xx_suspend(unsigned int state, int (*fn)(unsigned long),
|
||||
scu_power_mode(scu_base, SCU_PM_POWEROFF);
|
||||
ret = cpu_suspend(args, fn);
|
||||
scu_power_mode(scu_base, SCU_PM_NORMAL);
|
||||
amx3_post_suspend_common();
|
||||
|
||||
if (!am43xx_check_off_mode_enable())
|
||||
amx3_post_suspend_common();
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -163,10 +194,48 @@ void __iomem *am43xx_get_rtc_base_addr(void)
|
||||
return omap_hwmod_get_mpu_rt_va(rtc_oh);
|
||||
}
|
||||
|
||||
static void am43xx_save_context(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void am33xx_save_context(void)
|
||||
{
|
||||
omap_intc_save_context();
|
||||
}
|
||||
|
||||
static void am33xx_restore_context(void)
|
||||
{
|
||||
omap_intc_restore_context();
|
||||
}
|
||||
|
||||
static void am43xx_restore_context(void)
|
||||
{
|
||||
/*
|
||||
* HACK: restore dpll_per_clkdcoldo register contents, to avoid
|
||||
* breaking suspend-resume
|
||||
*/
|
||||
writel_relaxed(0x0, AM33XX_L4_WK_IO_ADDRESS(0x44df2e14));
|
||||
}
|
||||
|
||||
static void am43xx_prepare_rtc_suspend(void)
|
||||
{
|
||||
omap_hwmod_enable(rtc_oh);
|
||||
}
|
||||
|
||||
static void am43xx_prepare_rtc_resume(void)
|
||||
{
|
||||
omap_hwmod_idle(rtc_oh);
|
||||
}
|
||||
|
||||
static struct am33xx_pm_platform_data am33xx_ops = {
|
||||
.init = am33xx_suspend_init,
|
||||
.soc_suspend = am33xx_suspend,
|
||||
.get_sram_addrs = amx3_get_sram_addrs,
|
||||
.save_context = am33xx_save_context,
|
||||
.restore_context = am33xx_restore_context,
|
||||
.prepare_rtc_suspend = am43xx_prepare_rtc_suspend,
|
||||
.prepare_rtc_resume = am43xx_prepare_rtc_resume,
|
||||
.check_off_mode_enable = am33xx_check_off_mode_enable,
|
||||
.get_rtc_base_addr = am43xx_get_rtc_base_addr,
|
||||
};
|
||||
|
||||
@@ -174,6 +243,11 @@ static struct am33xx_pm_platform_data am43xx_ops = {
|
||||
.init = am43xx_suspend_init,
|
||||
.soc_suspend = am43xx_suspend,
|
||||
.get_sram_addrs = amx3_get_sram_addrs,
|
||||
.save_context = am43xx_save_context,
|
||||
.restore_context = am43xx_restore_context,
|
||||
.prepare_rtc_suspend = am43xx_prepare_rtc_suspend,
|
||||
.prepare_rtc_resume = am43xx_prepare_rtc_resume,
|
||||
.check_off_mode_enable = am43xx_check_off_mode_enable,
|
||||
.get_rtc_base_addr = am43xx_get_rtc_base_addr,
|
||||
};
|
||||
|
||||
|
@@ -368,6 +368,9 @@ wait_emif_enable1:
|
||||
mov r1, #AM43XX_EMIF_POWEROFF_DISABLE
|
||||
str r1, [r2, #0x0]
|
||||
|
||||
ldr r1, [r9, #EMIF_PM_RUN_HW_LEVELING]
|
||||
blx r1
|
||||
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
ldr r2, l2_cache_base
|
||||
ldr r0, [r2, #L2X0_CTRL]
|
||||
|
@@ -10,6 +10,7 @@ menuconfig ARCH_TEGRA
|
||||
select HAVE_ARM_SCU if SMP
|
||||
select HAVE_ARM_TWD if SMP
|
||||
select PINCTRL
|
||||
select PM
|
||||
select PM_OPP
|
||||
select RESET_CONTROLLER
|
||||
select SOC_BUS
|
||||
|
@@ -61,7 +61,8 @@ static struct cpuidle_driver tegra_idle_driver = {
|
||||
.exit_latency = 5000,
|
||||
.target_residency = 10000,
|
||||
.power_usage = 0,
|
||||
.flags = CPUIDLE_FLAG_COUPLED,
|
||||
.flags = CPUIDLE_FLAG_COUPLED |
|
||||
CPUIDLE_FLAG_TIMER_STOP,
|
||||
.name = "powered-down",
|
||||
.desc = "CPU power gated",
|
||||
},
|
||||
@@ -136,12 +137,8 @@ static bool tegra20_cpu_cluster_power_down(struct cpuidle_device *dev,
|
||||
if (tegra20_reset_cpu_1() || !tegra_cpu_rail_off_ready())
|
||||
return false;
|
||||
|
||||
tick_broadcast_enter();
|
||||
|
||||
tegra_idle_lp2_last();
|
||||
|
||||
tick_broadcast_exit();
|
||||
|
||||
if (cpu_online(1))
|
||||
tegra20_wake_cpu1_from_reset();
|
||||
|
||||
@@ -153,14 +150,10 @@ static bool tegra20_idle_enter_lp2_cpu_1(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv,
|
||||
int index)
|
||||
{
|
||||
tick_broadcast_enter();
|
||||
|
||||
cpu_suspend(0, tegra20_sleep_cpu_secondary_finish);
|
||||
|
||||
tegra20_cpu_clear_resettable();
|
||||
|
||||
tick_broadcast_exit();
|
||||
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
|
@@ -56,6 +56,7 @@ static struct cpuidle_driver tegra_idle_driver = {
|
||||
.exit_latency = 2000,
|
||||
.target_residency = 2200,
|
||||
.power_usage = 0,
|
||||
.flags = CPUIDLE_FLAG_TIMER_STOP,
|
||||
.name = "powered-down",
|
||||
.desc = "CPU power gated",
|
||||
},
|
||||
@@ -76,12 +77,8 @@ static bool tegra30_cpu_cluster_power_down(struct cpuidle_device *dev,
|
||||
return false;
|
||||
}
|
||||
|
||||
tick_broadcast_enter();
|
||||
|
||||
tegra_idle_lp2_last();
|
||||
|
||||
tick_broadcast_exit();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -90,14 +87,10 @@ static bool tegra30_cpu_core_power_down(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv,
|
||||
int index)
|
||||
{
|
||||
tick_broadcast_enter();
|
||||
|
||||
smp_wmb();
|
||||
|
||||
cpu_suspend(0, tegra30_sleep_cpu_secondary_finish);
|
||||
|
||||
tick_broadcast_exit();
|
||||
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
|
@@ -79,24 +79,15 @@
|
||||
#define TEGRA_PMC_BASE 0x7000E400
|
||||
#define TEGRA_PMC_SIZE SZ_256
|
||||
|
||||
#define TEGRA_MC_BASE 0x7000F000
|
||||
#define TEGRA_MC_SIZE SZ_1K
|
||||
|
||||
#define TEGRA_EMC_BASE 0x7000F400
|
||||
#define TEGRA_EMC_SIZE SZ_1K
|
||||
|
||||
#define TEGRA114_MC_BASE 0x70019000
|
||||
#define TEGRA114_MC_SIZE SZ_4K
|
||||
|
||||
#define TEGRA_EMC0_BASE 0x7001A000
|
||||
#define TEGRA_EMC0_SIZE SZ_2K
|
||||
|
||||
#define TEGRA_EMC1_BASE 0x7001A800
|
||||
#define TEGRA_EMC1_SIZE SZ_2K
|
||||
|
||||
#define TEGRA124_MC_BASE 0x70019000
|
||||
#define TEGRA124_MC_SIZE SZ_4K
|
||||
|
||||
#define TEGRA124_EMC_BASE 0x7001B000
|
||||
#define TEGRA124_EMC_SIZE SZ_2K
|
||||
|
||||
|
@@ -44,8 +44,6 @@
|
||||
#define EMC_XM2VTTGENPADCTRL 0x310
|
||||
#define EMC_XM2VTTGENPADCTRL2 0x314
|
||||
|
||||
#define MC_EMEM_ARB_CFG 0x90
|
||||
|
||||
#define PMC_CTRL 0x0
|
||||
#define PMC_CTRL_SIDE_EFFECT_LP0 (1 << 14) /* enter LP0 when CPU pwr gated */
|
||||
|
||||
@@ -420,22 +418,6 @@ _pll_m_c_x_done:
|
||||
movweq r0, #:lower16:TEGRA124_EMC_BASE
|
||||
movteq r0, #:upper16:TEGRA124_EMC_BASE
|
||||
|
||||
cmp r10, #TEGRA30
|
||||
moveq r2, #0x20
|
||||
movweq r4, #:lower16:TEGRA_MC_BASE
|
||||
movteq r4, #:upper16:TEGRA_MC_BASE
|
||||
cmp r10, #TEGRA114
|
||||
moveq r2, #0x34
|
||||
movweq r4, #:lower16:TEGRA114_MC_BASE
|
||||
movteq r4, #:upper16:TEGRA114_MC_BASE
|
||||
cmp r10, #TEGRA124
|
||||
moveq r2, #0x20
|
||||
movweq r4, #:lower16:TEGRA124_MC_BASE
|
||||
movteq r4, #:upper16:TEGRA124_MC_BASE
|
||||
|
||||
ldr r1, [r5, r2] @ restore MC_EMEM_ARB_CFG
|
||||
str r1, [r4, #MC_EMEM_ARB_CFG]
|
||||
|
||||
exit_self_refresh:
|
||||
ldr r1, [r5, #0xC] @ restore EMC_XM2VTTGENPADCTRL
|
||||
str r1, [r0, #EMC_XM2VTTGENPADCTRL]
|
||||
@@ -564,7 +546,6 @@ tegra30_sdram_pad_address:
|
||||
.word TEGRA_PMC_BASE + PMC_IO_DPD_STATUS @0x14
|
||||
.word TEGRA_CLK_RESET_BASE + CLK_RESET_CLK_SOURCE_MSELECT @0x18
|
||||
.word TEGRA_CLK_RESET_BASE + CLK_RESET_SCLK_BURST @0x1c
|
||||
.word TEGRA_MC_BASE + MC_EMEM_ARB_CFG @0x20
|
||||
tegra30_sdram_pad_address_end:
|
||||
|
||||
tegra114_sdram_pad_address:
|
||||
@@ -581,7 +562,6 @@ tegra114_sdram_pad_address:
|
||||
.word TEGRA_EMC1_BASE + EMC_AUTO_CAL_INTERVAL @0x28
|
||||
.word TEGRA_EMC1_BASE + EMC_XM2VTTGENPADCTRL @0x2c
|
||||
.word TEGRA_EMC1_BASE + EMC_XM2VTTGENPADCTRL2 @0x30
|
||||
.word TEGRA114_MC_BASE + MC_EMEM_ARB_CFG @0x34
|
||||
tegra114_sdram_pad_adress_end:
|
||||
|
||||
tegra124_sdram_pad_address:
|
||||
@@ -593,7 +573,6 @@ tegra124_sdram_pad_address:
|
||||
.word TEGRA_PMC_BASE + PMC_IO_DPD_STATUS @0x14
|
||||
.word TEGRA_CLK_RESET_BASE + CLK_RESET_CLK_SOURCE_MSELECT @0x18
|
||||
.word TEGRA_CLK_RESET_BASE + CLK_RESET_SCLK_BURST @0x1c
|
||||
.word TEGRA124_MC_BASE + MC_EMEM_ARB_CFG @0x20
|
||||
tegra124_sdram_pad_address_end:
|
||||
|
||||
tegra30_sdram_pad_size:
|
||||
|
Reference in New Issue
Block a user