hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/mfd/rk808.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * MFD core driver for Rockchip RK808/RK818
34 *
....@@ -9,15 +10,6 @@
910 * Copyright (C) 2016 PHYTEC Messtechnik GmbH
1011 *
1112 * Author: Wadim Egorov <w.egorov@phytec.de>
12
- *
13
- * This program is free software; you can redistribute it and/or modify it
14
- * under the terms and conditions of the GNU General Public License,
15
- * version 2, as published by the Free Software Foundation.
16
- *
17
- * This program is distributed in the hope it will be useful, but WITHOUT
18
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
20
- * more details.
2113 */
2214
2315 #include <linux/i2c.h>
....@@ -167,53 +159,29 @@
167159 .volatile_reg = rk817_is_volatile_reg,
168160 };
169161
170
-static struct resource rtc_resources[] = {
171
- {
172
- .start = RK808_IRQ_RTC_ALARM,
173
- .end = RK808_IRQ_RTC_ALARM,
174
- .flags = IORESOURCE_IRQ,
175
- }
162
+static const struct resource rtc_resources[] = {
163
+ DEFINE_RES_IRQ(RK808_IRQ_RTC_ALARM),
176164 };
177165
178
-static struct resource rk816_rtc_resources[] = {
179
- {
180
- .start = RK816_IRQ_RTC_ALARM,
181
- .end = RK816_IRQ_RTC_ALARM,
182
- .flags = IORESOURCE_IRQ,
183
- }
166
+static const struct resource rk816_rtc_resources[] = {
167
+ DEFINE_RES_IRQ(RK816_IRQ_RTC_ALARM),
184168 };
185169
186
-static struct resource rk817_rtc_resources[] = {
170
+static const struct resource rk817_rtc_resources[] = {
187171 DEFINE_RES_IRQ(RK817_IRQ_RTC_ALARM),
188172 };
189173
190
-static struct resource rk805_key_resources[] = {
191
- {
192
- .start = RK805_IRQ_PWRON_FALL,
193
- .end = RK805_IRQ_PWRON_FALL,
194
- .flags = IORESOURCE_IRQ,
195
- },
196
- {
197
- .start = RK805_IRQ_PWRON_RISE,
198
- .end = RK805_IRQ_PWRON_RISE,
199
- .flags = IORESOURCE_IRQ,
200
- }
174
+static const struct resource rk805_key_resources[] = {
175
+ DEFINE_RES_IRQ(RK805_IRQ_PWRON_FALL),
176
+ DEFINE_RES_IRQ(RK805_IRQ_PWRON_RISE),
201177 };
202178
203
-static struct resource rk816_pwrkey_resources[] = {
204
- {
205
- .start = RK816_IRQ_PWRON_FALL,
206
- .end = RK816_IRQ_PWRON_FALL,
207
- .flags = IORESOURCE_IRQ,
208
- },
209
- {
210
- .start = RK816_IRQ_PWRON_RISE,
211
- .end = RK816_IRQ_PWRON_RISE,
212
- .flags = IORESOURCE_IRQ,
213
- },
179
+static const struct resource rk816_pwrkey_resources[] = {
180
+ DEFINE_RES_IRQ(RK816_IRQ_PWRON_FALL),
181
+ DEFINE_RES_IRQ(RK816_IRQ_PWRON_RISE),
214182 };
215183
216
-static struct resource rk817_pwrkey_resources[] = {
184
+static const struct resource rk817_pwrkey_resources[] = {
217185 DEFINE_RES_IRQ(RK817_IRQ_PWRON_FALL),
218186 DEFINE_RES_IRQ(RK817_IRQ_PWRON_RISE),
219187 };
....@@ -613,7 +581,7 @@
613581 REGMAP_IRQ_REG_LINE(23, 8)
614582 };
615583
616
-static struct regmap_irq_chip rk805_irq_chip = {
584
+static const struct regmap_irq_chip rk805_irq_chip = {
617585 .name = "rk805",
618586 .irqs = rk805_irqs,
619587 .num_irqs = ARRAY_SIZE(rk805_irqs),
....@@ -668,7 +636,7 @@
668636 },
669637 };
670638
671
-static struct regmap_irq_chip rk816_irq_chip = {
639
+static const struct regmap_irq_chip rk816_irq_chip = {
672640 .name = "rk816",
673641 .irqs = rk816_irqs,
674642 .num_irqs = ARRAY_SIZE(rk816_irqs),
....@@ -680,7 +648,7 @@
680648 .init_ack_masked = true,
681649 };
682650
683
-static struct regmap_irq_chip rk816_battery_irq_chip = {
651
+static const struct regmap_irq_chip rk816_battery_irq_chip = {
684652 .name = "rk816_battery",
685653 .irqs = rk816_battery_irqs,
686654 .num_irqs = ARRAY_SIZE(rk816_battery_irqs),
....@@ -691,7 +659,7 @@
691659 .init_ack_masked = true,
692660 };
693661
694
-static struct regmap_irq_chip rk817_irq_chip = {
662
+static const struct regmap_irq_chip rk817_irq_chip = {
695663 .name = "rk817",
696664 .irqs = rk817_irqs,
697665 .num_irqs = ARRAY_SIZE(rk817_irqs),
....@@ -719,21 +687,6 @@
719687 static struct rk808_reg_data *suspend_reg, *resume_reg;
720688 static int suspend_reg_num, resume_reg_num;
721689
722
-static void rk805_device_shutdown(void)
723
-{
724
- int ret;
725
- struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
726
-
727
- if (!rk808)
728
- return;
729
-
730
- ret = regmap_update_bits(rk808->regmap,
731
- RK805_DEV_CTRL_REG,
732
- DEV_OFF, DEV_OFF);
733
- if (ret)
734
- dev_err(&rk808_i2c_client->dev, "Failed to shutdown device!\n");
735
-}
736
-
737690 static void rk805_device_shutdown_prepare(void)
738691 {
739692 int ret;
....@@ -749,56 +702,18 @@
749702 dev_err(&rk808_i2c_client->dev, "Failed to shutdown device!\n");
750703 }
751704
752
-static void rk808_device_shutdown(void)
753
-{
754
- int ret;
755
- struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
756
-
757
- if (!rk808)
758
- return;
759
-
760
- ret = regmap_update_bits(rk808->regmap,
761
- RK808_DEVCTRL_REG,
762
- DEV_OFF_RST, DEV_OFF_RST);
763
- if (ret)
764
- dev_err(&rk808_i2c_client->dev, "Failed to shutdown device!\n");
765
-}
766
-
767
-static void rk816_device_shutdown(void)
768
-{
769
- int ret;
770
- struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
771
-
772
- if (!rk808)
773
- return;
774
-
775
- ret = regmap_update_bits(rk808->regmap,
776
- RK816_DEV_CTRL_REG,
777
- DEV_OFF, DEV_OFF);
778
- if (ret)
779
- dev_err(&rk808_i2c_client->dev, "Failed to shutdown device!\n");
780
-}
781
-
782705 static void rk817_shutdown_prepare(void)
783706 {
784707 int ret;
785708 struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
786709
787
- /* close int when power off */
710
+ /* close rtc int when power off */
788711 regmap_update_bits(rk808->regmap,
789712 RK817_INT_STS_MSK_REG0,
790
- 0xff, 0xff);
791
- regmap_update_bits(rk808->regmap,
792
- RK817_INT_STS_MSK_REG1,
793
- 0xff, 0xff);
794
- regmap_update_bits(rk808->regmap,
795
- RK817_INT_STS_MSK_REG2,
796
- 0xff, 0xff);
713
+ (0x3 << 5), (0x3 << 5));
797714 regmap_update_bits(rk808->regmap,
798715 RK817_RTC_INT_REG,
799716 (0x3 << 2), (0x0 << 2));
800
-
801
- dev_info(&rk808_i2c_client->dev, "disabled int when device shutdown!\n");
802717
803718 if (rk808->pins && rk808->pins->p && rk808->pins->power_off) {
804719 ret = regmap_update_bits(rk808->regmap,
....@@ -832,17 +747,34 @@
832747 mdelay(2);
833748 }
834749
835
-static void rk818_device_shutdown(void)
750
+static void rk8xx_device_shutdown(void)
836751 {
837752 int ret;
753
+ unsigned int reg, bit;
838754 struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
839755
840
- if (!rk808)
756
+ switch (rk808->variant) {
757
+ case RK805_ID:
758
+ reg = RK805_DEV_CTRL_REG;
759
+ bit = DEV_OFF;
760
+ break;
761
+ case RK808_ID:
762
+ reg = RK808_DEVCTRL_REG,
763
+ bit = DEV_OFF_RST;
764
+ break;
765
+ case RK816_ID:
766
+ reg = RK816_DEV_CTRL_REG;
767
+ bit = DEV_OFF;
768
+ break;
769
+ case RK818_ID:
770
+ reg = RK818_DEVCTRL_REG;
771
+ bit = DEV_OFF;
772
+ break;
773
+ default:
841774 return;
775
+ }
842776
843
- ret = regmap_update_bits(rk808->regmap,
844
- RK818_DEVCTRL_REG,
845
- DEV_OFF, DEV_OFF);
777
+ ret = regmap_update_bits(rk808->regmap, reg, bit, bit);
846778 if (ret)
847779 dev_err(&rk808_i2c_client->dev, "Failed to shutdown device!\n");
848780 }
....@@ -1205,6 +1137,7 @@
12051137 void (*of_property_prepare_fn)(struct rk808 *rk808,
12061138 struct device *dev) = NULL;
12071139 int (*pinctrl_init)(struct device *dev, struct rk808 *rk808) = NULL;
1140
+ void (*device_shutdown_fn)(void) = NULL;
12081141
12091142 rk808 = devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL);
12101143 if (!rk808)
....@@ -1251,7 +1184,7 @@
12511184 suspend_reg_num = ARRAY_SIZE(rk805_suspend_reg);
12521185 resume_reg = rk805_resume_reg;
12531186 resume_reg_num = ARRAY_SIZE(rk805_resume_reg);
1254
- rk808->pm_pwroff_fn = rk805_device_shutdown;
1187
+ device_shutdown_fn = rk8xx_device_shutdown;
12551188 rk808->pm_pwroff_prep_fn = rk805_device_shutdown_prepare;
12561189 break;
12571190 case RK808_ID:
....@@ -1261,7 +1194,7 @@
12611194 nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg);
12621195 cells = rk808s;
12631196 nr_cells = ARRAY_SIZE(rk808s);
1264
- rk808->pm_pwroff_fn = rk808_device_shutdown;
1197
+ device_shutdown_fn = rk8xx_device_shutdown;
12651198 break;
12661199 case RK816_ID:
12671200 rk808->regmap_cfg = &rk816_regmap_config;
....@@ -1277,7 +1210,7 @@
12771210 suspend_reg_num = ARRAY_SIZE(rk816_suspend_reg);
12781211 resume_reg = rk816_resume_reg;
12791212 resume_reg_num = ARRAY_SIZE(rk816_resume_reg);
1280
- rk808->pm_pwroff_fn = rk816_device_shutdown;
1213
+ device_shutdown_fn = rk8xx_device_shutdown;
12811214 break;
12821215 case RK818_ID:
12831216 rk808->regmap_cfg = &rk818_regmap_config;
....@@ -1292,7 +1225,7 @@
12921225 suspend_reg_num = ARRAY_SIZE(rk818_suspend_reg);
12931226 resume_reg = rk818_resume_reg;
12941227 resume_reg_num = ARRAY_SIZE(rk818_resume_reg);
1295
- rk808->pm_pwroff_fn = rk818_device_shutdown;
1228
+ device_shutdown_fn = rk8xx_device_shutdown;
12961229 break;
12971230 case RK809_ID:
12981231 case RK817_ID:
....@@ -1402,10 +1335,10 @@
14021335 if (!pm_power_off_prepare)
14031336 pm_power_off_prepare = rk808->pm_pwroff_prep_fn;
14041337
1405
- if (rk808->pm_pwroff_fn) {
1338
+ if (device_shutdown_fn) {
14061339 register_syscore_ops(&rk808_syscore_ops);
14071340 /* power off system in the syscore shutdown ! */
1408
- pm_shutdown = rk808->pm_pwroff_fn;
1341
+ pm_shutdown = device_shutdown_fn;
14091342 }
14101343 }
14111344
....@@ -1433,7 +1366,6 @@
14331366 struct rk808 *rk808 = i2c_get_clientdata(client);
14341367
14351368 regmap_del_irq_chip(client->irq, rk808->irq_data);
1436
- mfd_remove_devices(&client->dev);
14371369
14381370 /**
14391371 * pm_power_off may points to a function from another module.
....@@ -1474,6 +1406,12 @@
14741406 }
14751407
14761408 switch (rk808->variant) {
1409
+ case RK805_ID:
1410
+ ret = regmap_update_bits(rk808->regmap,
1411
+ RK805_GPIO_IO_POL_REG,
1412
+ SLP_SD_MSK,
1413
+ SLEEP_FUN);
1414
+ break;
14771415 case RK809_ID:
14781416 case RK817_ID:
14791417 if (rk808->pins && rk808->pins->p && rk808->pins->sleep) {