Skip to content

Commit 2d4ba91

Browse files
author
Lee Jones
committed
mfd: cs5535-mfd: Request shared IO regions centrally
Prior to this patch, IO regions were requested via an MFD subsytem-level .enable() call-back and similarly released by a .disable() call-back. Double requests/releases were avoided by a centrally handled usage count mechanism. This complexity can all be avoided by handling IO regions only once during .probe() and .remove() of the parent device. Since this is the only legitimate user of the aforementioned usage count mechanism, this patch will allow it to be removed from MFD core in subsequent steps. Suggested-by: Daniel Thompson <[email protected]> Signed-off-by: Lee Jones <[email protected]> Reviewed-by: Daniel Thompson <[email protected]>
1 parent 2129e56 commit 2d4ba91

File tree

1 file changed

+33
-41
lines changed

1 file changed

+33
-41
lines changed

drivers/mfd/cs5535-mfd.c

Lines changed: 33 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -27,38 +27,6 @@ enum cs5535_mfd_bars {
2727
NR_BARS,
2828
};
2929

30-
static int cs5535_mfd_res_enable(struct platform_device *pdev)
31-
{
32-
struct resource *res;
33-
34-
res = platform_get_resource(pdev, IORESOURCE_IO, 0);
35-
if (!res) {
36-
dev_err(&pdev->dev, "can't fetch device resource info\n");
37-
return -EIO;
38-
}
39-
40-
if (!request_region(res->start, resource_size(res), DRV_NAME)) {
41-
dev_err(&pdev->dev, "can't request region\n");
42-
return -EIO;
43-
}
44-
45-
return 0;
46-
}
47-
48-
static int cs5535_mfd_res_disable(struct platform_device *pdev)
49-
{
50-
struct resource *res;
51-
52-
res = platform_get_resource(pdev, IORESOURCE_IO, 0);
53-
if (!res) {
54-
dev_err(&pdev->dev, "can't fetch device resource info\n");
55-
return -EIO;
56-
}
57-
58-
release_region(res->start, resource_size(res));
59-
return 0;
60-
}
61-
6230
static struct resource cs5535_mfd_resources[NR_BARS];
6331

6432
static struct mfd_cell cs5535_mfd_cells[] = {
@@ -81,17 +49,11 @@ static struct mfd_cell cs5535_mfd_cells[] = {
8149
.name = "cs5535-pms",
8250
.num_resources = 1,
8351
.resources = &cs5535_mfd_resources[PMS_BAR],
84-
85-
.enable = cs5535_mfd_res_enable,
86-
.disable = cs5535_mfd_res_disable,
8752
},
8853
{
8954
.name = "cs5535-acpi",
9055
.num_resources = 1,
9156
.resources = &cs5535_mfd_resources[ACPI_BAR],
92-
93-
.enable = cs5535_mfd_res_enable,
94-
.disable = cs5535_mfd_res_disable,
9557
},
9658
};
9759

@@ -117,22 +79,47 @@ static int cs5535_mfd_probe(struct pci_dev *pdev,
11779
r->end = pci_resource_end(pdev, bar);
11880
}
11981

82+
err = pci_request_region(pdev, PMS_BAR, DRV_NAME);
83+
if (err) {
84+
dev_err(&pdev->dev, "Failed to request PMS_BAR's IO region\n");
85+
goto err_disable;
86+
}
87+
12088
err = mfd_add_devices(&pdev->dev, PLATFORM_DEVID_NONE, cs5535_mfd_cells,
12189
ARRAY_SIZE(cs5535_mfd_cells), NULL, 0, NULL);
12290
if (err) {
12391
dev_err(&pdev->dev,
12492
"Failed to add CS5535 sub-devices: %d\n", err);
125-
goto err_disable;
93+
goto err_release_pms;
12694
}
12795

128-
if (machine_is_olpc())
129-
mfd_clone_cell("cs5535-acpi", olpc_acpi_clones, ARRAY_SIZE(olpc_acpi_clones));
96+
if (machine_is_olpc()) {
97+
err = pci_request_region(pdev, ACPI_BAR, DRV_NAME);
98+
if (err) {
99+
dev_err(&pdev->dev,
100+
"Failed to request ACPI_BAR's IO region\n");
101+
goto err_remove_devices;
102+
}
103+
104+
err = mfd_clone_cell("cs5535-acpi", olpc_acpi_clones,
105+
ARRAY_SIZE(olpc_acpi_clones));
106+
if (err) {
107+
dev_err(&pdev->dev, "Failed to clone MFD cell\n");
108+
goto err_release_acpi;
109+
}
110+
}
130111

131112
dev_info(&pdev->dev, "%zu devices registered.\n",
132113
ARRAY_SIZE(cs5535_mfd_cells));
133114

134115
return 0;
135116

117+
err_release_acpi:
118+
pci_release_region(pdev, ACPI_BAR);
119+
err_remove_devices:
120+
mfd_remove_devices(&pdev->dev);
121+
err_release_pms:
122+
pci_release_region(pdev, PMS_BAR);
136123
err_disable:
137124
pci_disable_device(pdev);
138125
return err;
@@ -141,6 +128,11 @@ static int cs5535_mfd_probe(struct pci_dev *pdev,
141128
static void cs5535_mfd_remove(struct pci_dev *pdev)
142129
{
143130
mfd_remove_devices(&pdev->dev);
131+
132+
if (machine_is_olpc())
133+
pci_release_region(pdev, ACPI_BAR);
134+
135+
pci_release_region(pdev, PMS_BAR);
144136
pci_disable_device(pdev);
145137
}
146138

0 commit comments

Comments
 (0)