aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Szyprowski <m.szyprowski@samsung.com>2017-01-26 04:29:27 -0500
committerLinus Walleij <linus.walleij@linaro.org>2017-01-26 10:57:33 -0500
commit2b24efa8e5c5042b0f126c09622b3e9e3c86a4fa (patch)
treea681c773e6f92cc995d885c656a7e7f5a0e731c7
parentdabd14569299c34f8c32b87760b464de6ed3f350 (diff)
pinctrl: samsung: Replace syscore ops with standard platform device pm_ops
Once the dependency on PMU driver (for pad retention control) has been removed, there is no reason to use syscore_ops based suspend/resume. This patch replaces it with standard platform device pm_ops based solution. Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org> Acked-by: Tomasz Figa <tomasz.figa@gmail.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r--drivers/pinctrl/samsung/pinctrl-samsung.c72
1 files changed, 14 insertions, 58 deletions
diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c
index 021abd7221f8..d79eadad6c5f 100644
--- a/drivers/pinctrl/samsung/pinctrl-samsung.c
+++ b/drivers/pinctrl/samsung/pinctrl-samsung.c
@@ -29,7 +29,6 @@
29#include <linux/irqdomain.h> 29#include <linux/irqdomain.h>
30#include <linux/of_device.h> 30#include <linux/of_device.h>
31#include <linux/spinlock.h> 31#include <linux/spinlock.h>
32#include <linux/syscore_ops.h>
33 32
34#include "../core.h" 33#include "../core.h"
35#include "pinctrl-samsung.h" 34#include "pinctrl-samsung.h"
@@ -49,9 +48,6 @@ static struct pin_config {
49 { "samsung,pin-val", PINCFG_TYPE_DAT }, 48 { "samsung,pin-val", PINCFG_TYPE_DAT },
50}; 49};
51 50
52/* Global list of devices (struct samsung_pinctrl_drv_data) */
53static LIST_HEAD(drvdata_list);
54
55static unsigned int pin_base; 51static unsigned int pin_base;
56 52
57static int samsung_get_group_count(struct pinctrl_dev *pctldev) 53static int samsung_get_group_count(struct pinctrl_dev *pctldev)
@@ -1084,22 +1080,18 @@ static int samsung_pinctrl_probe(struct platform_device *pdev)
1084 1080
1085 platform_set_drvdata(pdev, drvdata); 1081 platform_set_drvdata(pdev, drvdata);
1086 1082
1087 /* Add to the global list */
1088 list_add_tail(&drvdata->node, &drvdata_list);
1089
1090 return 0; 1083 return 0;
1091} 1084}
1092 1085
1093#ifdef CONFIG_PM 1086#ifdef CONFIG_PM
1094
1095/** 1087/**
1096 * samsung_pinctrl_suspend_dev - save pinctrl state for suspend for a device 1088 * samsung_pinctrl_suspend - save pinctrl state for suspend
1097 * 1089 *
1098 * Save data for all banks handled by this device. 1090 * Save data for all banks handled by this device.
1099 */ 1091 */
1100static void samsung_pinctrl_suspend_dev( 1092static int samsung_pinctrl_suspend(struct device *dev)
1101 struct samsung_pinctrl_drv_data *drvdata)
1102{ 1093{
1094 struct samsung_pinctrl_drv_data *drvdata = dev_get_drvdata(dev);
1103 int i; 1095 int i;
1104 1096
1105 for (i = 0; i < drvdata->nr_banks; i++) { 1097 for (i = 0; i < drvdata->nr_banks; i++) {
@@ -1135,18 +1127,21 @@ static void samsung_pinctrl_suspend_dev(
1135 drvdata->suspend(drvdata); 1127 drvdata->suspend(drvdata);
1136 if (drvdata->retention_ctrl && drvdata->retention_ctrl->enable) 1128 if (drvdata->retention_ctrl && drvdata->retention_ctrl->enable)
1137 drvdata->retention_ctrl->enable(drvdata); 1129 drvdata->retention_ctrl->enable(drvdata);
1130
1131 return 0;
1138} 1132}
1139 1133
1140/** 1134/**
1141 * samsung_pinctrl_resume_dev - restore pinctrl state from suspend for a device 1135 * samsung_pinctrl_resume - restore pinctrl state from suspend
1142 * 1136 *
1143 * Restore one of the banks that was saved during suspend. 1137 * Restore one of the banks that was saved during suspend.
1144 * 1138 *
1145 * We don't bother doing anything complicated to avoid glitching lines since 1139 * We don't bother doing anything complicated to avoid glitching lines since
1146 * we're called before pad retention is turned off. 1140 * we're called before pad retention is turned off.
1147 */ 1141 */
1148static void samsung_pinctrl_resume_dev(struct samsung_pinctrl_drv_data *drvdata) 1142static int samsung_pinctrl_resume(struct device *dev)
1149{ 1143{
1144 struct samsung_pinctrl_drv_data *drvdata = dev_get_drvdata(dev);
1150 int i; 1145 int i;
1151 1146
1152 if (drvdata->resume) 1147 if (drvdata->resume)
@@ -1185,48 +1180,11 @@ static void samsung_pinctrl_resume_dev(struct samsung_pinctrl_drv_data *drvdata)
1185 1180
1186 if (drvdata->retention_ctrl && drvdata->retention_ctrl->disable) 1181 if (drvdata->retention_ctrl && drvdata->retention_ctrl->disable)
1187 drvdata->retention_ctrl->disable(drvdata); 1182 drvdata->retention_ctrl->disable(drvdata);
1188}
1189
1190/**
1191 * samsung_pinctrl_suspend - save pinctrl state for suspend
1192 *
1193 * Save data for all banks across all devices.
1194 */
1195static int samsung_pinctrl_suspend(void)
1196{
1197 struct samsung_pinctrl_drv_data *drvdata;
1198
1199 list_for_each_entry(drvdata, &drvdata_list, node) {
1200 samsung_pinctrl_suspend_dev(drvdata);
1201 }
1202 1183
1203 return 0; 1184 return 0;
1204} 1185}
1205
1206/**
1207 * samsung_pinctrl_resume - restore pinctrl state for suspend
1208 *
1209 * Restore data for all banks across all devices.
1210 */
1211static void samsung_pinctrl_resume(void)
1212{
1213 struct samsung_pinctrl_drv_data *drvdata;
1214
1215 list_for_each_entry_reverse(drvdata, &drvdata_list, node) {
1216 samsung_pinctrl_resume_dev(drvdata);
1217 }
1218}
1219
1220#else
1221#define samsung_pinctrl_suspend NULL
1222#define samsung_pinctrl_resume NULL
1223#endif 1186#endif
1224 1187
1225static struct syscore_ops samsung_pinctrl_syscore_ops = {
1226 .suspend = samsung_pinctrl_suspend,
1227 .resume = samsung_pinctrl_resume,
1228};
1229
1230static const struct of_device_id samsung_pinctrl_dt_match[] = { 1188static const struct of_device_id samsung_pinctrl_dt_match[] = {
1231#ifdef CONFIG_PINCTRL_EXYNOS 1189#ifdef CONFIG_PINCTRL_EXYNOS
1232 { .compatible = "samsung,exynos3250-pinctrl", 1190 { .compatible = "samsung,exynos3250-pinctrl",
@@ -1268,25 +1226,23 @@ static const struct of_device_id samsung_pinctrl_dt_match[] = {
1268}; 1226};
1269MODULE_DEVICE_TABLE(of, samsung_pinctrl_dt_match); 1227MODULE_DEVICE_TABLE(of, samsung_pinctrl_dt_match);
1270 1228
1229static const struct dev_pm_ops samsung_pinctrl_pm_ops = {
1230 SET_LATE_SYSTEM_SLEEP_PM_OPS(samsung_pinctrl_suspend,
1231 samsung_pinctrl_resume)
1232};
1233
1271static struct platform_driver samsung_pinctrl_driver = { 1234static struct platform_driver samsung_pinctrl_driver = {
1272 .probe = samsung_pinctrl_probe, 1235 .probe = samsung_pinctrl_probe,
1273 .driver = { 1236 .driver = {
1274 .name = "samsung-pinctrl", 1237 .name = "samsung-pinctrl",
1275 .of_match_table = samsung_pinctrl_dt_match, 1238 .of_match_table = samsung_pinctrl_dt_match,
1276 .suppress_bind_attrs = true, 1239 .suppress_bind_attrs = true,
1240 .pm = &samsung_pinctrl_pm_ops,
1277 }, 1241 },
1278}; 1242};
1279 1243
1280static int __init samsung_pinctrl_drv_register(void) 1244static int __init samsung_pinctrl_drv_register(void)
1281{ 1245{
1282 /*
1283 * Register syscore ops for save/restore of registers across suspend.
1284 * It's important to ensure that this driver is running at an earlier
1285 * initcall level than any arch-specific init calls that install syscore
1286 * ops that turn off pad retention (like exynos_pm_resume).
1287 */
1288 register_syscore_ops(&samsung_pinctrl_syscore_ops);
1289
1290 return platform_driver_register(&samsung_pinctrl_driver); 1246 return platform_driver_register(&samsung_pinctrl_driver);
1291} 1247}
1292postcore_initcall(samsung_pinctrl_drv_register); 1248postcore_initcall(samsung_pinctrl_drv_register);