forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/mfd/cs5535-mfd.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * cs5535-mfd.c - core MFD driver for CS5535/CS5536 southbridges
34 *
....@@ -7,19 +8,6 @@
78 * hardcoded in the CS553x specifications.
89 *
910 * Copyright (c) 2010 Andres Salomon <dilinger@queued.net>
10
- *
11
- * This program is free software; you can redistribute it and/or modify
12
- * it under the terms of the GNU General Public License version 2 as
13
- * published by the Free Software Foundation.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
- * GNU General Public License for more details.
19
- *
20
- * You should have received a copy of the GNU General Public License
21
- * along with this program; if not, write to the Free Software
22
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
2311 */
2412
2513 #include <linux/kernel.h>
....@@ -39,131 +27,106 @@
3927 NR_BARS,
4028 };
4129
42
-static int cs5535_mfd_res_enable(struct platform_device *pdev)
43
-{
44
- struct resource *res;
45
-
46
- res = platform_get_resource(pdev, IORESOURCE_IO, 0);
47
- if (!res) {
48
- dev_err(&pdev->dev, "can't fetch device resource info\n");
49
- return -EIO;
50
- }
51
-
52
- if (!request_region(res->start, resource_size(res), DRV_NAME)) {
53
- dev_err(&pdev->dev, "can't request region\n");
54
- return -EIO;
55
- }
56
-
57
- return 0;
58
-}
59
-
60
-static int cs5535_mfd_res_disable(struct platform_device *pdev)
61
-{
62
- struct resource *res;
63
-
64
- res = platform_get_resource(pdev, IORESOURCE_IO, 0);
65
- if (!res) {
66
- dev_err(&pdev->dev, "can't fetch device resource info\n");
67
- return -EIO;
68
- }
69
-
70
- release_region(res->start, resource_size(res));
71
- return 0;
72
-}
73
-
7430 static struct resource cs5535_mfd_resources[NR_BARS];
7531
7632 static struct mfd_cell cs5535_mfd_cells[] = {
7733 {
78
- .id = SMB_BAR,
7934 .name = "cs5535-smb",
8035 .num_resources = 1,
8136 .resources = &cs5535_mfd_resources[SMB_BAR],
8237 },
8338 {
84
- .id = GPIO_BAR,
8539 .name = "cs5535-gpio",
8640 .num_resources = 1,
8741 .resources = &cs5535_mfd_resources[GPIO_BAR],
8842 },
8943 {
90
- .id = MFGPT_BAR,
9144 .name = "cs5535-mfgpt",
9245 .num_resources = 1,
9346 .resources = &cs5535_mfd_resources[MFGPT_BAR],
9447 },
9548 {
96
- .id = PMS_BAR,
9749 .name = "cs5535-pms",
9850 .num_resources = 1,
9951 .resources = &cs5535_mfd_resources[PMS_BAR],
100
-
101
- .enable = cs5535_mfd_res_enable,
102
- .disable = cs5535_mfd_res_disable,
103
- },
104
- {
105
- .id = ACPI_BAR,
106
- .name = "cs5535-acpi",
107
- .num_resources = 1,
108
- .resources = &cs5535_mfd_resources[ACPI_BAR],
109
-
110
- .enable = cs5535_mfd_res_enable,
111
- .disable = cs5535_mfd_res_disable,
11252 },
11353 };
11454
115
-#ifdef CONFIG_OLPC
116
-static void cs5535_clone_olpc_cells(void)
117
-{
118
- static const char *acpi_clones[] = {
119
- "olpc-xo1-pm-acpi",
120
- "olpc-xo1-sci-acpi"
121
- };
122
-
123
- if (!machine_is_olpc())
124
- return;
125
-
126
- mfd_clone_cell("cs5535-acpi", acpi_clones, ARRAY_SIZE(acpi_clones));
127
-}
128
-#else
129
-static void cs5535_clone_olpc_cells(void) { }
130
-#endif
55
+static struct mfd_cell cs5535_olpc_mfd_cells[] = {
56
+ {
57
+ .name = "olpc-xo1-pm-acpi",
58
+ .num_resources = 1,
59
+ .resources = &cs5535_mfd_resources[ACPI_BAR],
60
+ },
61
+ {
62
+ .name = "olpc-xo1-sci-acpi",
63
+ .num_resources = 1,
64
+ .resources = &cs5535_mfd_resources[ACPI_BAR],
65
+ },
66
+};
13167
13268 static int cs5535_mfd_probe(struct pci_dev *pdev,
13369 const struct pci_device_id *id)
13470 {
135
- int err, i;
71
+ int err, bar;
13672
13773 err = pci_enable_device(pdev);
13874 if (err)
13975 return err;
14076
141
- /* fill in IO range for each cell; subdrivers handle the region */
142
- for (i = 0; i < ARRAY_SIZE(cs5535_mfd_cells); i++) {
143
- int bar = cs5535_mfd_cells[i].id;
77
+ for (bar = 0; bar < NR_BARS; bar++) {
14478 struct resource *r = &cs5535_mfd_resources[bar];
14579
14680 r->flags = IORESOURCE_IO;
14781 r->start = pci_resource_start(pdev, bar);
14882 r->end = pci_resource_end(pdev, bar);
149
-
150
- /* id is used for temporarily storing BAR; unset it now */
151
- cs5535_mfd_cells[i].id = 0;
15283 }
15384
154
- err = mfd_add_devices(&pdev->dev, -1, cs5535_mfd_cells,
155
- ARRAY_SIZE(cs5535_mfd_cells), NULL, 0, NULL);
85
+ err = pci_request_region(pdev, PMS_BAR, DRV_NAME);
15686 if (err) {
157
- dev_err(&pdev->dev, "MFD add devices failed: %d\n", err);
87
+ dev_err(&pdev->dev, "Failed to request PMS_BAR's IO region\n");
15888 goto err_disable;
15989 }
160
- cs5535_clone_olpc_cells();
90
+
91
+ err = mfd_add_devices(&pdev->dev, PLATFORM_DEVID_NONE, cs5535_mfd_cells,
92
+ ARRAY_SIZE(cs5535_mfd_cells), NULL, 0, NULL);
93
+ if (err) {
94
+ dev_err(&pdev->dev,
95
+ "Failed to add CS5535 sub-devices: %d\n", err);
96
+ goto err_release_pms;
97
+ }
98
+
99
+ if (machine_is_olpc()) {
100
+ err = pci_request_region(pdev, ACPI_BAR, DRV_NAME);
101
+ if (err) {
102
+ dev_err(&pdev->dev,
103
+ "Failed to request ACPI_BAR's IO region\n");
104
+ goto err_remove_devices;
105
+ }
106
+
107
+ err = mfd_add_devices(&pdev->dev, PLATFORM_DEVID_NONE,
108
+ cs5535_olpc_mfd_cells,
109
+ ARRAY_SIZE(cs5535_olpc_mfd_cells),
110
+ NULL, 0, NULL);
111
+ if (err) {
112
+ dev_err(&pdev->dev,
113
+ "Failed to add CS5535 OLPC sub-devices: %d\n",
114
+ err);
115
+ goto err_release_acpi;
116
+ }
117
+ }
161118
162119 dev_info(&pdev->dev, "%zu devices registered.\n",
163120 ARRAY_SIZE(cs5535_mfd_cells));
164121
165122 return 0;
166123
124
+err_release_acpi:
125
+ pci_release_region(pdev, ACPI_BAR);
126
+err_remove_devices:
127
+ mfd_remove_devices(&pdev->dev);
128
+err_release_pms:
129
+ pci_release_region(pdev, PMS_BAR);
167130 err_disable:
168131 pci_disable_device(pdev);
169132 return err;
....@@ -172,6 +135,11 @@
172135 static void cs5535_mfd_remove(struct pci_dev *pdev)
173136 {
174137 mfd_remove_devices(&pdev->dev);
138
+
139
+ if (machine_is_olpc())
140
+ pci_release_region(pdev, ACPI_BAR);
141
+
142
+ pci_release_region(pdev, PMS_BAR);
175143 pci_disable_device(pdev);
176144 }
177145