diff options
author | Marek Szyprowski <m.szyprowski@samsung.com> | 2017-01-26 04:29:27 -0500 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2017-01-26 10:57:33 -0500 |
commit | 2b24efa8e5c5042b0f126c09622b3e9e3c86a4fa (patch) | |
tree | a681c773e6f92cc995d885c656a7e7f5a0e731c7 | |
parent | dabd14569299c34f8c32b87760b464de6ed3f350 (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.c | 72 |
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) */ | ||
53 | static LIST_HEAD(drvdata_list); | ||
54 | |||
55 | static unsigned int pin_base; | 51 | static unsigned int pin_base; |
56 | 52 | ||
57 | static int samsung_get_group_count(struct pinctrl_dev *pctldev) | 53 | static 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 | */ |
1100 | static void samsung_pinctrl_suspend_dev( | 1092 | static 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 | */ |
1148 | static void samsung_pinctrl_resume_dev(struct samsung_pinctrl_drv_data *drvdata) | 1142 | static 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 | */ | ||
1195 | static 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 | */ | ||
1211 | static 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 | ||
1225 | static struct syscore_ops samsung_pinctrl_syscore_ops = { | ||
1226 | .suspend = samsung_pinctrl_suspend, | ||
1227 | .resume = samsung_pinctrl_resume, | ||
1228 | }; | ||
1229 | |||
1230 | static const struct of_device_id samsung_pinctrl_dt_match[] = { | 1188 | static 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 | }; |
1269 | MODULE_DEVICE_TABLE(of, samsung_pinctrl_dt_match); | 1227 | MODULE_DEVICE_TABLE(of, samsung_pinctrl_dt_match); |
1270 | 1228 | ||
1229 | static 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 | |||
1271 | static struct platform_driver samsung_pinctrl_driver = { | 1234 | static 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 | ||
1280 | static int __init samsung_pinctrl_drv_register(void) | 1244 | static 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 | } |
1292 | postcore_initcall(samsung_pinctrl_drv_register); | 1248 | postcore_initcall(samsung_pinctrl_drv_register); |