diff options
author | Akinobu Mita <akinobu.mita@gmail.com> | 2015-01-28 18:30:29 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2015-01-28 18:45:23 -0500 |
commit | 018d5ef2048fcab339467bcbebccf588c9bd2531 (patch) | |
tree | 3f6acefe4dc0799f07a100a66b4b3eceb1087fab | |
parent | cedda4c3b1ded2cc4951aeca38fdf862b9b79fb6 (diff) |
ata: ahci_platform: fix owner module reference mismatch for scsi host
The owner module reference of the ahci platform's scsi_host is
initialized to libahci_platform's one, because these drivers use a
scsi_host_template defined in libahci_platform. So these drivers can
be unloaded even if the scsi device is being accessed.
This fixes it by pushing the scsi_host_template from libahci_platform
to all leaf drivers. The scsi_host_template is passed through a new
argument of ahci_platform_init_host().
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: linux-ide@vger.kernel.org
Cc: linux-scsi@vger.kernel.org
-rw-r--r-- | drivers/ata/ahci.h | 4 | ||||
-rw-r--r-- | drivers/ata/ahci_da850.c | 11 | ||||
-rw-r--r-- | drivers/ata/ahci_imx.c | 11 | ||||
-rw-r--r-- | drivers/ata/ahci_mvebu.c | 11 | ||||
-rw-r--r-- | drivers/ata/ahci_platform.c | 11 | ||||
-rw-r--r-- | drivers/ata/ahci_st.c | 11 | ||||
-rw-r--r-- | drivers/ata/ahci_sunxi.c | 11 | ||||
-rw-r--r-- | drivers/ata/ahci_tegra.c | 11 | ||||
-rw-r--r-- | drivers/ata/ahci_xgene.c | 11 | ||||
-rw-r--r-- | drivers/ata/libahci_platform.c | 10 | ||||
-rw-r--r-- | include/linux/ahci_platform.h | 4 | ||||
-rw-r--r-- | include/linux/libata.h | 6 |
12 files changed, 89 insertions, 23 deletions
diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h index 275358ae0b3f..71262e08648e 100644 --- a/drivers/ata/ahci.h +++ b/drivers/ata/ahci.h | |||
@@ -354,6 +354,10 @@ extern int ahci_ignore_sss; | |||
354 | extern struct device_attribute *ahci_shost_attrs[]; | 354 | extern struct device_attribute *ahci_shost_attrs[]; |
355 | extern struct device_attribute *ahci_sdev_attrs[]; | 355 | extern struct device_attribute *ahci_sdev_attrs[]; |
356 | 356 | ||
357 | /* | ||
358 | * This must be instantiated by the edge drivers. Read the comments | ||
359 | * for ATA_BASE_SHT | ||
360 | */ | ||
357 | #define AHCI_SHT(drv_name) \ | 361 | #define AHCI_SHT(drv_name) \ |
358 | ATA_NCQ_SHT(drv_name), \ | 362 | ATA_NCQ_SHT(drv_name), \ |
359 | .can_queue = AHCI_MAX_CMDS - 1, \ | 363 | .can_queue = AHCI_MAX_CMDS - 1, \ |
diff --git a/drivers/ata/ahci_da850.c b/drivers/ata/ahci_da850.c index ce8a7a6d6c7f..267a3d3e79f4 100644 --- a/drivers/ata/ahci_da850.c +++ b/drivers/ata/ahci_da850.c | |||
@@ -16,6 +16,8 @@ | |||
16 | #include <linux/ahci_platform.h> | 16 | #include <linux/ahci_platform.h> |
17 | #include "ahci.h" | 17 | #include "ahci.h" |
18 | 18 | ||
19 | #define DRV_NAME "ahci_da850" | ||
20 | |||
19 | /* SATA PHY Control Register offset from AHCI base */ | 21 | /* SATA PHY Control Register offset from AHCI base */ |
20 | #define SATA_P0PHYCR_REG 0x178 | 22 | #define SATA_P0PHYCR_REG 0x178 |
21 | 23 | ||
@@ -59,6 +61,10 @@ static const struct ata_port_info ahci_da850_port_info = { | |||
59 | .port_ops = &ahci_platform_ops, | 61 | .port_ops = &ahci_platform_ops, |
60 | }; | 62 | }; |
61 | 63 | ||
64 | static struct scsi_host_template ahci_platform_sht = { | ||
65 | AHCI_SHT(DRV_NAME), | ||
66 | }; | ||
67 | |||
62 | static int ahci_da850_probe(struct platform_device *pdev) | 68 | static int ahci_da850_probe(struct platform_device *pdev) |
63 | { | 69 | { |
64 | struct device *dev = &pdev->dev; | 70 | struct device *dev = &pdev->dev; |
@@ -85,7 +91,8 @@ static int ahci_da850_probe(struct platform_device *pdev) | |||
85 | 91 | ||
86 | da850_sata_init(dev, pwrdn_reg, hpriv->mmio); | 92 | da850_sata_init(dev, pwrdn_reg, hpriv->mmio); |
87 | 93 | ||
88 | rc = ahci_platform_init_host(pdev, hpriv, &ahci_da850_port_info); | 94 | rc = ahci_platform_init_host(pdev, hpriv, &ahci_da850_port_info, |
95 | &ahci_platform_sht); | ||
89 | if (rc) | 96 | if (rc) |
90 | goto disable_resources; | 97 | goto disable_resources; |
91 | 98 | ||
@@ -102,7 +109,7 @@ static struct platform_driver ahci_da850_driver = { | |||
102 | .probe = ahci_da850_probe, | 109 | .probe = ahci_da850_probe, |
103 | .remove = ata_platform_remove_one, | 110 | .remove = ata_platform_remove_one, |
104 | .driver = { | 111 | .driver = { |
105 | .name = "ahci_da850", | 112 | .name = DRV_NAME, |
106 | .pm = &ahci_da850_pm_ops, | 113 | .pm = &ahci_da850_pm_ops, |
107 | }, | 114 | }, |
108 | }; | 115 | }; |
diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c index 41632e57d46f..3f3a7db208ae 100644 --- a/drivers/ata/ahci_imx.c +++ b/drivers/ata/ahci_imx.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <linux/libata.h> | 28 | #include <linux/libata.h> |
29 | #include "ahci.h" | 29 | #include "ahci.h" |
30 | 30 | ||
31 | #define DRV_NAME "ahci-imx" | ||
32 | |||
31 | enum { | 33 | enum { |
32 | /* Timer 1-ms Register */ | 34 | /* Timer 1-ms Register */ |
33 | IMX_TIMER1MS = 0x00e0, | 35 | IMX_TIMER1MS = 0x00e0, |
@@ -520,6 +522,10 @@ static u32 imx_ahci_parse_props(struct device *dev, | |||
520 | return reg_value; | 522 | return reg_value; |
521 | } | 523 | } |
522 | 524 | ||
525 | static struct scsi_host_template ahci_platform_sht = { | ||
526 | AHCI_SHT(DRV_NAME), | ||
527 | }; | ||
528 | |||
523 | static int imx_ahci_probe(struct platform_device *pdev) | 529 | static int imx_ahci_probe(struct platform_device *pdev) |
524 | { | 530 | { |
525 | struct device *dev = &pdev->dev; | 531 | struct device *dev = &pdev->dev; |
@@ -616,7 +622,8 @@ static int imx_ahci_probe(struct platform_device *pdev) | |||
616 | reg_val = clk_get_rate(imxpriv->ahb_clk) / 1000; | 622 | reg_val = clk_get_rate(imxpriv->ahb_clk) / 1000; |
617 | writel(reg_val, hpriv->mmio + IMX_TIMER1MS); | 623 | writel(reg_val, hpriv->mmio + IMX_TIMER1MS); |
618 | 624 | ||
619 | ret = ahci_platform_init_host(pdev, hpriv, &ahci_imx_port_info); | 625 | ret = ahci_platform_init_host(pdev, hpriv, &ahci_imx_port_info, |
626 | &ahci_platform_sht); | ||
620 | if (ret) | 627 | if (ret) |
621 | goto disable_sata; | 628 | goto disable_sata; |
622 | 629 | ||
@@ -674,7 +681,7 @@ static struct platform_driver imx_ahci_driver = { | |||
674 | .probe = imx_ahci_probe, | 681 | .probe = imx_ahci_probe, |
675 | .remove = ata_platform_remove_one, | 682 | .remove = ata_platform_remove_one, |
676 | .driver = { | 683 | .driver = { |
677 | .name = "ahci-imx", | 684 | .name = DRV_NAME, |
678 | .of_match_table = imx_ahci_of_match, | 685 | .of_match_table = imx_ahci_of_match, |
679 | .pm = &ahci_imx_pm_ops, | 686 | .pm = &ahci_imx_pm_ops, |
680 | }, | 687 | }, |
diff --git a/drivers/ata/ahci_mvebu.c b/drivers/ata/ahci_mvebu.c index 64bb08432b69..23716dd8a7ec 100644 --- a/drivers/ata/ahci_mvebu.c +++ b/drivers/ata/ahci_mvebu.c | |||
@@ -19,6 +19,8 @@ | |||
19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
20 | #include "ahci.h" | 20 | #include "ahci.h" |
21 | 21 | ||
22 | #define DRV_NAME "ahci-mvebu" | ||
23 | |||
22 | #define AHCI_VENDOR_SPECIFIC_0_ADDR 0xa0 | 24 | #define AHCI_VENDOR_SPECIFIC_0_ADDR 0xa0 |
23 | #define AHCI_VENDOR_SPECIFIC_0_DATA 0xa4 | 25 | #define AHCI_VENDOR_SPECIFIC_0_DATA 0xa4 |
24 | 26 | ||
@@ -67,6 +69,10 @@ static const struct ata_port_info ahci_mvebu_port_info = { | |||
67 | .port_ops = &ahci_platform_ops, | 69 | .port_ops = &ahci_platform_ops, |
68 | }; | 70 | }; |
69 | 71 | ||
72 | static struct scsi_host_template ahci_platform_sht = { | ||
73 | AHCI_SHT(DRV_NAME), | ||
74 | }; | ||
75 | |||
70 | static int ahci_mvebu_probe(struct platform_device *pdev) | 76 | static int ahci_mvebu_probe(struct platform_device *pdev) |
71 | { | 77 | { |
72 | struct ahci_host_priv *hpriv; | 78 | struct ahci_host_priv *hpriv; |
@@ -88,7 +94,8 @@ static int ahci_mvebu_probe(struct platform_device *pdev) | |||
88 | ahci_mvebu_mbus_config(hpriv, dram); | 94 | ahci_mvebu_mbus_config(hpriv, dram); |
89 | ahci_mvebu_regret_option(hpriv); | 95 | ahci_mvebu_regret_option(hpriv); |
90 | 96 | ||
91 | rc = ahci_platform_init_host(pdev, hpriv, &ahci_mvebu_port_info); | 97 | rc = ahci_platform_init_host(pdev, hpriv, &ahci_mvebu_port_info, |
98 | &ahci_platform_sht); | ||
92 | if (rc) | 99 | if (rc) |
93 | goto disable_resources; | 100 | goto disable_resources; |
94 | 101 | ||
@@ -114,7 +121,7 @@ static struct platform_driver ahci_mvebu_driver = { | |||
114 | .probe = ahci_mvebu_probe, | 121 | .probe = ahci_mvebu_probe, |
115 | .remove = ata_platform_remove_one, | 122 | .remove = ata_platform_remove_one, |
116 | .driver = { | 123 | .driver = { |
117 | .name = "ahci-mvebu", | 124 | .name = DRV_NAME, |
118 | .of_match_table = ahci_mvebu_of_match, | 125 | .of_match_table = ahci_mvebu_of_match, |
119 | }, | 126 | }, |
120 | }; | 127 | }; |
diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c index 18d539837045..78d6ae0b90c4 100644 --- a/drivers/ata/ahci_platform.c +++ b/drivers/ata/ahci_platform.c | |||
@@ -22,6 +22,8 @@ | |||
22 | #include <linux/ahci_platform.h> | 22 | #include <linux/ahci_platform.h> |
23 | #include "ahci.h" | 23 | #include "ahci.h" |
24 | 24 | ||
25 | #define DRV_NAME "ahci" | ||
26 | |||
25 | static const struct ata_port_info ahci_port_info = { | 27 | static const struct ata_port_info ahci_port_info = { |
26 | .flags = AHCI_FLAG_COMMON, | 28 | .flags = AHCI_FLAG_COMMON, |
27 | .pio_mask = ATA_PIO4, | 29 | .pio_mask = ATA_PIO4, |
@@ -29,6 +31,10 @@ static const struct ata_port_info ahci_port_info = { | |||
29 | .port_ops = &ahci_platform_ops, | 31 | .port_ops = &ahci_platform_ops, |
30 | }; | 32 | }; |
31 | 33 | ||
34 | static struct scsi_host_template ahci_platform_sht = { | ||
35 | AHCI_SHT(DRV_NAME), | ||
36 | }; | ||
37 | |||
32 | static int ahci_probe(struct platform_device *pdev) | 38 | static int ahci_probe(struct platform_device *pdev) |
33 | { | 39 | { |
34 | struct device *dev = &pdev->dev; | 40 | struct device *dev = &pdev->dev; |
@@ -46,7 +52,8 @@ static int ahci_probe(struct platform_device *pdev) | |||
46 | if (of_device_is_compatible(dev->of_node, "hisilicon,hisi-ahci")) | 52 | if (of_device_is_compatible(dev->of_node, "hisilicon,hisi-ahci")) |
47 | hpriv->flags |= AHCI_HFLAG_NO_FBS | AHCI_HFLAG_NO_NCQ; | 53 | hpriv->flags |= AHCI_HFLAG_NO_FBS | AHCI_HFLAG_NO_NCQ; |
48 | 54 | ||
49 | rc = ahci_platform_init_host(pdev, hpriv, &ahci_port_info); | 55 | rc = ahci_platform_init_host(pdev, hpriv, &ahci_port_info, |
56 | &ahci_platform_sht); | ||
50 | if (rc) | 57 | if (rc) |
51 | goto disable_resources; | 58 | goto disable_resources; |
52 | 59 | ||
@@ -75,7 +82,7 @@ static struct platform_driver ahci_driver = { | |||
75 | .probe = ahci_probe, | 82 | .probe = ahci_probe, |
76 | .remove = ata_platform_remove_one, | 83 | .remove = ata_platform_remove_one, |
77 | .driver = { | 84 | .driver = { |
78 | .name = "ahci", | 85 | .name = DRV_NAME, |
79 | .of_match_table = ahci_of_match, | 86 | .of_match_table = ahci_of_match, |
80 | .pm = &ahci_pm_ops, | 87 | .pm = &ahci_pm_ops, |
81 | }, | 88 | }, |
diff --git a/drivers/ata/ahci_st.c b/drivers/ata/ahci_st.c index 2f9e8317cc16..bc971af262e7 100644 --- a/drivers/ata/ahci_st.c +++ b/drivers/ata/ahci_st.c | |||
@@ -23,6 +23,8 @@ | |||
23 | 23 | ||
24 | #include "ahci.h" | 24 | #include "ahci.h" |
25 | 25 | ||
26 | #define DRV_NAME "st_ahci" | ||
27 | |||
26 | #define ST_AHCI_OOBR 0xbc | 28 | #define ST_AHCI_OOBR 0xbc |
27 | #define ST_AHCI_OOBR_WE BIT(31) | 29 | #define ST_AHCI_OOBR_WE BIT(31) |
28 | #define ST_AHCI_OOBR_CWMIN_SHIFT 24 | 30 | #define ST_AHCI_OOBR_CWMIN_SHIFT 24 |
@@ -140,6 +142,10 @@ static const struct ata_port_info st_ahci_port_info = { | |||
140 | .port_ops = &st_ahci_port_ops, | 142 | .port_ops = &st_ahci_port_ops, |
141 | }; | 143 | }; |
142 | 144 | ||
145 | static struct scsi_host_template ahci_platform_sht = { | ||
146 | AHCI_SHT(DRV_NAME), | ||
147 | }; | ||
148 | |||
143 | static int st_ahci_probe(struct platform_device *pdev) | 149 | static int st_ahci_probe(struct platform_device *pdev) |
144 | { | 150 | { |
145 | struct st_ahci_drv_data *drv_data; | 151 | struct st_ahci_drv_data *drv_data; |
@@ -166,7 +172,8 @@ static int st_ahci_probe(struct platform_device *pdev) | |||
166 | if (err) | 172 | if (err) |
167 | return err; | 173 | return err; |
168 | 174 | ||
169 | err = ahci_platform_init_host(pdev, hpriv, &st_ahci_port_info); | 175 | err = ahci_platform_init_host(pdev, hpriv, &st_ahci_port_info, |
176 | &ahci_platform_sht); | ||
170 | if (err) { | 177 | if (err) { |
171 | ahci_platform_disable_resources(hpriv); | 178 | ahci_platform_disable_resources(hpriv); |
172 | return err; | 179 | return err; |
@@ -229,7 +236,7 @@ MODULE_DEVICE_TABLE(of, st_ahci_match); | |||
229 | 236 | ||
230 | static struct platform_driver st_ahci_driver = { | 237 | static struct platform_driver st_ahci_driver = { |
231 | .driver = { | 238 | .driver = { |
232 | .name = "st_ahci", | 239 | .name = DRV_NAME, |
233 | .pm = &st_ahci_pm_ops, | 240 | .pm = &st_ahci_pm_ops, |
234 | .of_match_table = of_match_ptr(st_ahci_match), | 241 | .of_match_table = of_match_ptr(st_ahci_match), |
235 | }, | 242 | }, |
diff --git a/drivers/ata/ahci_sunxi.c b/drivers/ata/ahci_sunxi.c index e2e0da539a2f..b26437430163 100644 --- a/drivers/ata/ahci_sunxi.c +++ b/drivers/ata/ahci_sunxi.c | |||
@@ -27,6 +27,8 @@ | |||
27 | #include <linux/regulator/consumer.h> | 27 | #include <linux/regulator/consumer.h> |
28 | #include "ahci.h" | 28 | #include "ahci.h" |
29 | 29 | ||
30 | #define DRV_NAME "ahci-sunxi" | ||
31 | |||
30 | /* Insmod parameters */ | 32 | /* Insmod parameters */ |
31 | static bool enable_pmp; | 33 | static bool enable_pmp; |
32 | module_param(enable_pmp, bool, 0); | 34 | module_param(enable_pmp, bool, 0); |
@@ -169,6 +171,10 @@ static const struct ata_port_info ahci_sunxi_port_info = { | |||
169 | .port_ops = &ahci_platform_ops, | 171 | .port_ops = &ahci_platform_ops, |
170 | }; | 172 | }; |
171 | 173 | ||
174 | static struct scsi_host_template ahci_platform_sht = { | ||
175 | AHCI_SHT(DRV_NAME), | ||
176 | }; | ||
177 | |||
172 | static int ahci_sunxi_probe(struct platform_device *pdev) | 178 | static int ahci_sunxi_probe(struct platform_device *pdev) |
173 | { | 179 | { |
174 | struct device *dev = &pdev->dev; | 180 | struct device *dev = &pdev->dev; |
@@ -200,7 +206,8 @@ static int ahci_sunxi_probe(struct platform_device *pdev) | |||
200 | if (!enable_pmp) | 206 | if (!enable_pmp) |
201 | hpriv->flags |= AHCI_HFLAG_NO_PMP; | 207 | hpriv->flags |= AHCI_HFLAG_NO_PMP; |
202 | 208 | ||
203 | rc = ahci_platform_init_host(pdev, hpriv, &ahci_sunxi_port_info); | 209 | rc = ahci_platform_init_host(pdev, hpriv, &ahci_sunxi_port_info, |
210 | &ahci_platform_sht); | ||
204 | if (rc) | 211 | if (rc) |
205 | goto disable_resources; | 212 | goto disable_resources; |
206 | 213 | ||
@@ -251,7 +258,7 @@ static struct platform_driver ahci_sunxi_driver = { | |||
251 | .probe = ahci_sunxi_probe, | 258 | .probe = ahci_sunxi_probe, |
252 | .remove = ata_platform_remove_one, | 259 | .remove = ata_platform_remove_one, |
253 | .driver = { | 260 | .driver = { |
254 | .name = "ahci-sunxi", | 261 | .name = DRV_NAME, |
255 | .of_match_table = ahci_sunxi_of_match, | 262 | .of_match_table = ahci_sunxi_of_match, |
256 | .pm = &ahci_sunxi_pm_ops, | 263 | .pm = &ahci_sunxi_pm_ops, |
257 | }, | 264 | }, |
diff --git a/drivers/ata/ahci_tegra.c b/drivers/ata/ahci_tegra.c index 032904402c95..3a62eb246d80 100644 --- a/drivers/ata/ahci_tegra.c +++ b/drivers/ata/ahci_tegra.c | |||
@@ -31,6 +31,8 @@ | |||
31 | 31 | ||
32 | #include "ahci.h" | 32 | #include "ahci.h" |
33 | 33 | ||
34 | #define DRV_NAME "tegra-ahci" | ||
35 | |||
34 | #define SATA_CONFIGURATION_0 0x180 | 36 | #define SATA_CONFIGURATION_0 0x180 |
35 | #define SATA_CONFIGURATION_EN_FPCI BIT(0) | 37 | #define SATA_CONFIGURATION_EN_FPCI BIT(0) |
36 | 38 | ||
@@ -289,6 +291,10 @@ static const struct of_device_id tegra_ahci_of_match[] = { | |||
289 | }; | 291 | }; |
290 | MODULE_DEVICE_TABLE(of, tegra_ahci_of_match); | 292 | MODULE_DEVICE_TABLE(of, tegra_ahci_of_match); |
291 | 293 | ||
294 | static struct scsi_host_template ahci_platform_sht = { | ||
295 | AHCI_SHT(DRV_NAME), | ||
296 | }; | ||
297 | |||
292 | static int tegra_ahci_probe(struct platform_device *pdev) | 298 | static int tegra_ahci_probe(struct platform_device *pdev) |
293 | { | 299 | { |
294 | struct ahci_host_priv *hpriv; | 300 | struct ahci_host_priv *hpriv; |
@@ -354,7 +360,8 @@ static int tegra_ahci_probe(struct platform_device *pdev) | |||
354 | if (ret) | 360 | if (ret) |
355 | return ret; | 361 | return ret; |
356 | 362 | ||
357 | ret = ahci_platform_init_host(pdev, hpriv, &ahci_tegra_port_info); | 363 | ret = ahci_platform_init_host(pdev, hpriv, &ahci_tegra_port_info, |
364 | &ahci_platform_sht); | ||
358 | if (ret) | 365 | if (ret) |
359 | goto deinit_controller; | 366 | goto deinit_controller; |
360 | 367 | ||
@@ -370,7 +377,7 @@ static struct platform_driver tegra_ahci_driver = { | |||
370 | .probe = tegra_ahci_probe, | 377 | .probe = tegra_ahci_probe, |
371 | .remove = ata_platform_remove_one, | 378 | .remove = ata_platform_remove_one, |
372 | .driver = { | 379 | .driver = { |
373 | .name = "tegra-ahci", | 380 | .name = DRV_NAME, |
374 | .of_match_table = tegra_ahci_of_match, | 381 | .of_match_table = tegra_ahci_of_match, |
375 | }, | 382 | }, |
376 | /* LP0 suspend support not implemented */ | 383 | /* LP0 suspend support not implemented */ |
diff --git a/drivers/ata/ahci_xgene.c b/drivers/ata/ahci_xgene.c index 7f6887535c1e..e3b8750e8e9d 100644 --- a/drivers/ata/ahci_xgene.c +++ b/drivers/ata/ahci_xgene.c | |||
@@ -30,6 +30,8 @@ | |||
30 | #include <linux/phy/phy.h> | 30 | #include <linux/phy/phy.h> |
31 | #include "ahci.h" | 31 | #include "ahci.h" |
32 | 32 | ||
33 | #define DRV_NAME "xgene-ahci" | ||
34 | |||
33 | /* Max # of disk per a controller */ | 35 | /* Max # of disk per a controller */ |
34 | #define MAX_AHCI_CHN_PERCTR 2 | 36 | #define MAX_AHCI_CHN_PERCTR 2 |
35 | 37 | ||
@@ -621,6 +623,10 @@ static int xgene_ahci_mux_select(struct xgene_ahci_context *ctx) | |||
621 | return val & CFG_SATA_ENET_SELECT_MASK ? -1 : 0; | 623 | return val & CFG_SATA_ENET_SELECT_MASK ? -1 : 0; |
622 | } | 624 | } |
623 | 625 | ||
626 | static struct scsi_host_template ahci_platform_sht = { | ||
627 | AHCI_SHT(DRV_NAME), | ||
628 | }; | ||
629 | |||
624 | static int xgene_ahci_probe(struct platform_device *pdev) | 630 | static int xgene_ahci_probe(struct platform_device *pdev) |
625 | { | 631 | { |
626 | struct device *dev = &pdev->dev; | 632 | struct device *dev = &pdev->dev; |
@@ -698,7 +704,8 @@ static int xgene_ahci_probe(struct platform_device *pdev) | |||
698 | skip_clk_phy: | 704 | skip_clk_phy: |
699 | hpriv->flags = AHCI_HFLAG_NO_PMP | AHCI_HFLAG_NO_NCQ; | 705 | hpriv->flags = AHCI_HFLAG_NO_PMP | AHCI_HFLAG_NO_NCQ; |
700 | 706 | ||
701 | rc = ahci_platform_init_host(pdev, hpriv, &xgene_ahci_port_info); | 707 | rc = ahci_platform_init_host(pdev, hpriv, &xgene_ahci_port_info, |
708 | &ahci_platform_sht); | ||
702 | if (rc) | 709 | if (rc) |
703 | goto disable_resources; | 710 | goto disable_resources; |
704 | 711 | ||
@@ -720,7 +727,7 @@ static struct platform_driver xgene_ahci_driver = { | |||
720 | .probe = xgene_ahci_probe, | 727 | .probe = xgene_ahci_probe, |
721 | .remove = ata_platform_remove_one, | 728 | .remove = ata_platform_remove_one, |
722 | .driver = { | 729 | .driver = { |
723 | .name = "xgene-ahci", | 730 | .name = DRV_NAME, |
724 | .of_match_table = xgene_ahci_of_match, | 731 | .of_match_table = xgene_ahci_of_match, |
725 | }, | 732 | }, |
726 | }; | 733 | }; |
diff --git a/drivers/ata/libahci_platform.c b/drivers/ata/libahci_platform.c index 504d534ccbfe..077c7a261354 100644 --- a/drivers/ata/libahci_platform.c +++ b/drivers/ata/libahci_platform.c | |||
@@ -35,10 +35,6 @@ struct ata_port_operations ahci_platform_ops = { | |||
35 | }; | 35 | }; |
36 | EXPORT_SYMBOL_GPL(ahci_platform_ops); | 36 | EXPORT_SYMBOL_GPL(ahci_platform_ops); |
37 | 37 | ||
38 | static struct scsi_host_template ahci_platform_sht = { | ||
39 | AHCI_SHT("ahci_platform"), | ||
40 | }; | ||
41 | |||
42 | /** | 38 | /** |
43 | * ahci_platform_enable_phys - Enable PHYs | 39 | * ahci_platform_enable_phys - Enable PHYs |
44 | * @hpriv: host private area to store config values | 40 | * @hpriv: host private area to store config values |
@@ -494,6 +490,7 @@ EXPORT_SYMBOL_GPL(ahci_platform_get_resources); | |||
494 | * @pdev: platform device pointer for the host | 490 | * @pdev: platform device pointer for the host |
495 | * @hpriv: ahci-host private data for the host | 491 | * @hpriv: ahci-host private data for the host |
496 | * @pi_template: template for the ata_port_info to use | 492 | * @pi_template: template for the ata_port_info to use |
493 | * @sht: scsi_host_template to use when registering | ||
497 | * | 494 | * |
498 | * This function does all the usual steps needed to bring up an | 495 | * This function does all the usual steps needed to bring up an |
499 | * ahci-platform host, note any necessary resources (ie clks, phys, etc.) | 496 | * ahci-platform host, note any necessary resources (ie clks, phys, etc.) |
@@ -504,7 +501,8 @@ EXPORT_SYMBOL_GPL(ahci_platform_get_resources); | |||
504 | */ | 501 | */ |
505 | int ahci_platform_init_host(struct platform_device *pdev, | 502 | int ahci_platform_init_host(struct platform_device *pdev, |
506 | struct ahci_host_priv *hpriv, | 503 | struct ahci_host_priv *hpriv, |
507 | const struct ata_port_info *pi_template) | 504 | const struct ata_port_info *pi_template, |
505 | struct scsi_host_template *sht) | ||
508 | { | 506 | { |
509 | struct device *dev = &pdev->dev; | 507 | struct device *dev = &pdev->dev; |
510 | struct ata_port_info pi = *pi_template; | 508 | struct ata_port_info pi = *pi_template; |
@@ -588,7 +586,7 @@ int ahci_platform_init_host(struct platform_device *pdev, | |||
588 | ahci_init_controller(host); | 586 | ahci_init_controller(host); |
589 | ahci_print_info(host, "platform"); | 587 | ahci_print_info(host, "platform"); |
590 | 588 | ||
591 | return ahci_host_activate(host, irq, &ahci_platform_sht); | 589 | return ahci_host_activate(host, irq, sht); |
592 | } | 590 | } |
593 | EXPORT_SYMBOL_GPL(ahci_platform_init_host); | 591 | EXPORT_SYMBOL_GPL(ahci_platform_init_host); |
594 | 592 | ||
diff --git a/include/linux/ahci_platform.h b/include/linux/ahci_platform.h index f65b33809170..a270f25ee7c7 100644 --- a/include/linux/ahci_platform.h +++ b/include/linux/ahci_platform.h | |||
@@ -21,6 +21,7 @@ struct device; | |||
21 | struct ata_port_info; | 21 | struct ata_port_info; |
22 | struct ahci_host_priv; | 22 | struct ahci_host_priv; |
23 | struct platform_device; | 23 | struct platform_device; |
24 | struct scsi_host_template; | ||
24 | 25 | ||
25 | int ahci_platform_enable_clks(struct ahci_host_priv *hpriv); | 26 | int ahci_platform_enable_clks(struct ahci_host_priv *hpriv); |
26 | void ahci_platform_disable_clks(struct ahci_host_priv *hpriv); | 27 | void ahci_platform_disable_clks(struct ahci_host_priv *hpriv); |
@@ -32,7 +33,8 @@ struct ahci_host_priv *ahci_platform_get_resources( | |||
32 | struct platform_device *pdev); | 33 | struct platform_device *pdev); |
33 | int ahci_platform_init_host(struct platform_device *pdev, | 34 | int ahci_platform_init_host(struct platform_device *pdev, |
34 | struct ahci_host_priv *hpriv, | 35 | struct ahci_host_priv *hpriv, |
35 | const struct ata_port_info *pi_template); | 36 | const struct ata_port_info *pi_template, |
37 | struct scsi_host_template *sht); | ||
36 | 38 | ||
37 | int ahci_platform_suspend_host(struct device *dev); | 39 | int ahci_platform_suspend_host(struct device *dev); |
38 | int ahci_platform_resume_host(struct device *dev); | 40 | int ahci_platform_resume_host(struct device *dev); |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 2d182413b1db..11beb4196c32 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -1338,6 +1338,12 @@ extern const struct ata_port_operations ata_base_port_ops; | |||
1338 | extern const struct ata_port_operations sata_port_ops; | 1338 | extern const struct ata_port_operations sata_port_ops; |
1339 | extern struct device_attribute *ata_common_sdev_attrs[]; | 1339 | extern struct device_attribute *ata_common_sdev_attrs[]; |
1340 | 1340 | ||
1341 | /* | ||
1342 | * All sht initializers (BASE, PIO, BMDMA, NCQ) must be instantiated | ||
1343 | * by the edge drivers. Because the 'module' field of sht must be the | ||
1344 | * edge driver's module reference, otherwise the driver can be unloaded | ||
1345 | * even if the scsi_device is being accessed. | ||
1346 | */ | ||
1341 | #define ATA_BASE_SHT(drv_name) \ | 1347 | #define ATA_BASE_SHT(drv_name) \ |
1342 | .module = THIS_MODULE, \ | 1348 | .module = THIS_MODULE, \ |
1343 | .name = drv_name, \ | 1349 | .name = drv_name, \ |