Samsung Exynos improvements for 4.5:

1. Switch from Exynos-specific restart/poweroff handler
    (mach-exynos/pmu.c) to generic syscon-reboot and syscon-poweroff
    drivers.
    This depends on adding syscon nodes to DTS to preserve
    bisectability.
 2. Minor improvements.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJWXj9IAAoJEME3ZuaGi4PXgzcP/jjZSZaYFk31/PTtdpOlV0je
 kOAAZByLdStEr1rxY89o/YtznaqYowbFrElJPVwHr4W9y0UyP+FjIWFCBNh7vn29
 cVRlJUAg99dVP8cohrgbc1Gd6943CeR/0S3EPYAOK6SffRuoDNWvgtGg4Y9mV/7Z
 3g1FeuCIxaKisCWFmRYNw3cjnekLgeL1AC+N6IjPiX1iy2Wnx58zTeFPL0cAhpHY
 YjG4S6hVzaWFt969hR7cqhuG6a05wmSWTDKVk4PBuCkZpoX/k2lRwy0saT6WFzjc
 8MoNVgqGTqlgeYXDIQcR3upmS2NSp2IPXxjcT9I7qP8gnHX1fgb9hdYWdj9+uaKh
 7uF4JM2xlGXeMja9t1TcIBCMTc9rKPd0dxPHm4MnIYgC9BxGi5iBkvoGEH5zxoeg
 P0pAeIxkk11q+d59b2AMZF4EMUkuZh6iLZPrwUh5JWs0rdo+sh+wdDiQ0GYdvtev
 eW51mfWIuhFfwRCafYM9KL+GAf+fn+vKecYe7KFmNbLhXYSUMtmiffXVjFFhuFy7
 mW8iOEPfrxP2sqAsuElrl5c82klxvXJgLQ51hCthHeugrP/tJsYyLffIcLMhlFZL
 t8yKIeTnjytfiE8OsrHMUiDNd62bmiRyAU7vl9twlQLYU1LcYJ+tITq+mrxFfAY0
 DpUn13WehOA7qSYWy9zm
 =JWjG
 -----END PGP SIGNATURE-----

Merge tag 'samsung-soc-4.5' of https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux into next/soc

Samsung Exynos improvements for 4.5:
1. Switch from Exynos-specific restart/poweroff handler
   (mach-exynos/pmu.c) to generic syscon-reboot and syscon-poweroff
   drivers.
   This depends on adding syscon nodes to DTS to preserve
   bisectability.
2. Minor improvements.

* tag 'samsung-soc-4.5' of https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux:
  ARM: EXYNOS: Remove redundant code from regs-pmu.h
  ARM: EXYNOS: Constify local exynos_pmu_data structure
  ARM: EXYNOS: Switch to syscon reboot and poweroff
  ARM: dts: Add syscon-{reboot, poweroff} nodes for exynos5410
  ARM: dts: Add syscon-{reboot, poweroff} nodes for exynos5
  ARM: dts: Add syscon-{reboot, poweroff} nodes for exynos4
  ARM: dts: Add syscon-{reboot, poweroff} nodes for exynos3250

Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
Olof Johansson 2015-12-21 20:42:30 -08:00
commit d622bbfcae
7 changed files with 61 additions and 52 deletions

View File

@ -152,6 +152,20 @@ pmu_system_controller: system-controller@10020000 {
interrupt-parent = <&gic>;
};
poweroff: syscon-poweroff {
compatible = "syscon-poweroff";
regmap = <&pmu_system_controller>;
offset = <0x330C>; /* PS_HOLD_CONTROL */
mask = <0x5200>; /* Reset value */
};
reboot: syscon-reboot {
compatible = "syscon-reboot";
regmap = <&pmu_system_controller>;
offset = <0x0400>; /* SWRESET */
mask = <0x1>;
};
mipi_phy: video-phy@10020710 {
compatible = "samsung,s5pv210-mipi-video-phy";
#phy-cells = <1>;

View File

@ -158,6 +158,20 @@ pmu_system_controller: system-controller@10020000 {
interrupt-parent = <&gic>;
};
poweroff: syscon-poweroff {
compatible = "syscon-poweroff";
regmap = <&pmu_system_controller>;
offset = <0x330C>; /* PS_HOLD_CONTROL */
mask = <0x5200>; /* reset value */
};
reboot: syscon-reboot {
compatible = "syscon-reboot";
regmap = <&pmu_system_controller>;
offset = <0x0400>; /* SWRESET */
mask = <0x1>;
};
dsi_0: dsi@11C80000 {
compatible = "samsung,exynos4210-mipi-dsi";
reg = <0x11C80000 0x10000>;

View File

@ -88,6 +88,20 @@ rtc: rtc@101E0000 {
status = "disabled";
};
poweroff: syscon-poweroff {
compatible = "syscon-poweroff";
regmap = <&pmu_system_controller>;
offset = <0x330C>; /* PS_HOLD_CONTROL */
mask = <0x5200>; /* reset value */
};
reboot: syscon-reboot {
compatible = "syscon-reboot";
regmap = <&pmu_system_controller>;
offset = <0x0400>; /* SWRESET */
mask = <0x1>;
};
fimd: fimd@14400000 {
compatible = "samsung,exynos5250-fimd";
interrupt-parent = <&combiner>;

View File

@ -102,6 +102,20 @@ pmu_system_controller: system-controller@10040000 {
reg = <0x10040000 0x5000>;
};
poweroff: syscon-poweroff {
compatible = "syscon-poweroff";
regmap = <&pmu_system_controller>;
offset = <0x330C>; /* PS_HOLD_CONTROL */
mask = <0x5200>; /* reset value */
};
reboot: syscon-reboot {
compatible = "syscon-reboot";
regmap = <&pmu_system_controller>;
offset = <0x0400>; /* SWRESET */
mask = <0x1>;
};
mct: mct@101C0000 {
compatible = "samsung,exynos4210-mct";
reg = <0x101C0000 0xB00>;

View File

@ -27,6 +27,9 @@ menuconfig ARCH_EXYNOS
select SRAM
select THERMAL
select MFD_SYSCON
select POWER_RESET
select POWER_RESET_SYSCON
select POWER_RESET_SYSCON_POWEROFF
help
Support for SAMSUNG EXYNOS SoCs (EXYNOS4/5)

View File

@ -14,9 +14,8 @@
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/notifier.h>
#include <linux/reboot.h>
#include <asm/cputype.h>
#include "exynos-pmu.h"
#include "regs-pmu.h"
@ -681,23 +680,6 @@ static unsigned int const exynos5420_list_disable_pmu_reg[] = {
EXYNOS5420_CMU_RESET_FSYS_SYS_PWR_REG,
};
static void exynos_power_off(void)
{
unsigned int tmp;
pr_info("Power down.\n");
tmp = pmu_raw_readl(EXYNOS_PS_HOLD_CONTROL);
tmp ^= (1 << 8);
pmu_raw_writel(tmp, EXYNOS_PS_HOLD_CONTROL);
/* Wait a little so we don't give a false warning below */
mdelay(100);
pr_err("Power down failed, please power off system manually.\n");
while (1)
;
}
static void exynos5420_powerdown_conf(enum sys_powerdown mode)
{
u32 this_cluster;
@ -875,14 +857,6 @@ static void exynos5420_pmu_init(void)
pr_info("EXYNOS5420 PMU initialized\n");
}
static int pmu_restart_notify(struct notifier_block *this,
unsigned long code, void *unused)
{
pmu_raw_writel(0x1, EXYNOS_SWRESET);
return NOTIFY_DONE;
}
static const struct exynos_pmu_data exynos3250_pmu_data = {
.pmu_config = exynos3250_pmu_config,
.pmu_init = exynos3250_pmu_init,
@ -908,7 +882,7 @@ static const struct exynos_pmu_data exynos5250_pmu_data = {
.powerdown_conf = exynos5_powerdown_conf,
};
static struct exynos_pmu_data exynos5420_pmu_data = {
static const struct exynos_pmu_data exynos5420_pmu_data = {
.pmu_config = exynos5420_pmu_config,
.pmu_init = exynos5420_pmu_init,
.powerdown_conf = exynos5420_powerdown_conf,
@ -940,20 +914,11 @@ static const struct of_device_id exynos_pmu_of_device_ids[] = {
{ /*sentinel*/ },
};
/*
* Exynos PMU restart notifier, handles restart functionality
*/
static struct notifier_block pmu_restart_handler = {
.notifier_call = pmu_restart_notify,
.priority = 128,
};
static int exynos_pmu_probe(struct platform_device *pdev)
{
const struct of_device_id *match;
struct device *dev = &pdev->dev;
struct resource *res;
int ret;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
pmu_base_addr = devm_ioremap_resource(dev, res);
@ -978,12 +943,6 @@ static int exynos_pmu_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, pmu_context);
ret = register_restart_handler(&pmu_restart_handler);
if (ret)
dev_warn(dev, "can't register restart handler err=%d\n", ret);
pm_power_off = exynos_power_off;
dev_dbg(dev, "Exynos PMU Driver probe done\n");
return 0;
}

View File

@ -484,15 +484,6 @@
#define EXYNOS5420_SWRESET_KFC_SEL 0x3
#include <asm/cputype.h>
#define MAX_CPUS_IN_CLUSTER 4
static inline unsigned int exynos_pmu_cpunr(unsigned int mpidr)
{
return ((MPIDR_AFFINITY_LEVEL(mpidr, 1) * MAX_CPUS_IN_CLUSTER)
+ MPIDR_AFFINITY_LEVEL(mpidr, 0));
}
/* Only for EXYNOS5420 */
#define EXYNOS5420_ISP_ARM_OPTION 0x2488
#define EXYNOS5420_L2RSTDISABLE_VALUE BIT(3)