.. | .. |
---|
30 | 30 | |
---|
31 | 31 | struct ahci_mvebu_plat_data { |
---|
32 | 32 | int (*plat_config)(struct ahci_host_priv *hpriv); |
---|
| 33 | + unsigned int flags; |
---|
33 | 34 | }; |
---|
34 | 35 | |
---|
35 | 36 | static void ahci_mvebu_mbus_config(struct ahci_host_priv *hpriv, |
---|
.. | .. |
---|
80 | 81 | ahci_mvebu_regret_option(hpriv); |
---|
81 | 82 | |
---|
82 | 83 | return rc; |
---|
| 84 | +} |
---|
| 85 | + |
---|
| 86 | +static int ahci_mvebu_armada_3700_config(struct ahci_host_priv *hpriv) |
---|
| 87 | +{ |
---|
| 88 | + u32 reg; |
---|
| 89 | + |
---|
| 90 | + writel(0, hpriv->mmio + AHCI_VENDOR_SPECIFIC_0_ADDR); |
---|
| 91 | + |
---|
| 92 | + reg = readl(hpriv->mmio + AHCI_VENDOR_SPECIFIC_0_DATA); |
---|
| 93 | + reg |= BIT(6); |
---|
| 94 | + writel(reg, hpriv->mmio + AHCI_VENDOR_SPECIFIC_0_DATA); |
---|
| 95 | + |
---|
| 96 | + return 0; |
---|
83 | 97 | } |
---|
84 | 98 | |
---|
85 | 99 | /** |
---|
.. | .. |
---|
148 | 162 | struct ahci_host_priv *hpriv = host->private_data; |
---|
149 | 163 | const struct ahci_mvebu_plat_data *pdata = hpriv->plat_data; |
---|
150 | 164 | |
---|
151 | | - if (pdata->plat_config) |
---|
152 | | - pdata->plat_config(hpriv); |
---|
| 165 | + pdata->plat_config(hpriv); |
---|
153 | 166 | |
---|
154 | 167 | return ahci_platform_resume_host(&pdev->dev); |
---|
155 | 168 | } |
---|
.. | .. |
---|
183 | 196 | if (IS_ERR(hpriv)) |
---|
184 | 197 | return PTR_ERR(hpriv); |
---|
185 | 198 | |
---|
| 199 | + hpriv->flags |= pdata->flags; |
---|
186 | 200 | hpriv->plat_data = (void *)pdata; |
---|
187 | 201 | |
---|
188 | 202 | rc = ahci_platform_enable_resources(hpriv); |
---|
.. | .. |
---|
191 | 205 | |
---|
192 | 206 | hpriv->stop_engine = ahci_mvebu_stop_engine; |
---|
193 | 207 | |
---|
194 | | - pdata = hpriv->plat_data; |
---|
195 | | - if (pdata->plat_config) { |
---|
196 | | - rc = pdata->plat_config(hpriv); |
---|
197 | | - if (rc) |
---|
198 | | - goto disable_resources; |
---|
199 | | - } |
---|
| 208 | + rc = pdata->plat_config(hpriv); |
---|
| 209 | + if (rc) |
---|
| 210 | + goto disable_resources; |
---|
200 | 211 | |
---|
201 | 212 | rc = ahci_platform_init_host(pdev, hpriv, &ahci_mvebu_port_info, |
---|
202 | 213 | &ahci_platform_sht); |
---|
.. | .. |
---|
215 | 226 | }; |
---|
216 | 227 | |
---|
217 | 228 | static const struct ahci_mvebu_plat_data ahci_mvebu_armada_3700_plat_data = { |
---|
218 | | - .plat_config = NULL, |
---|
| 229 | + .plat_config = ahci_mvebu_armada_3700_config, |
---|
| 230 | + .flags = AHCI_HFLAG_SUSPEND_PHYS | AHCI_HFLAG_IGN_NOTSUPP_POWER_ON, |
---|
219 | 231 | }; |
---|
220 | 232 | |
---|
221 | 233 | static const struct of_device_id ahci_mvebu_of_match[] = { |
---|
.. | .. |
---|
231 | 243 | }; |
---|
232 | 244 | MODULE_DEVICE_TABLE(of, ahci_mvebu_of_match); |
---|
233 | 245 | |
---|
234 | | -/* |
---|
235 | | - * We currently don't provide power management related operations, |
---|
236 | | - * since there is no suspend/resume support at the platform level for |
---|
237 | | - * Armada 38x for the moment. |
---|
238 | | - */ |
---|
239 | 246 | static struct platform_driver ahci_mvebu_driver = { |
---|
240 | 247 | .probe = ahci_mvebu_probe, |
---|
241 | 248 | .remove = ata_platform_remove_one, |
---|