| .. | .. |
|---|
| 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, |
|---|