diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-07 21:43:36 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-07 21:43:36 -0400 |
| commit | e4eaa9efbf79ccf6dc9915a9623049ef341bba85 (patch) | |
| tree | 1f7b0b0f610dc11abc498787fb1ecd378401a665 | |
| parent | 52ae2456d6a455ef958bcf1c2d1965674076887e (diff) | |
| parent | a1d78317f84bf5b5ed3775b911a7dea344a884a9 (diff) | |
Merge tag 'for-5.2/libata-20190507' of git://git.kernel.dk/linux-block
Pull libata updates from Jens Axboe:
"Just two minor fixes queued up for 5.2, adding support for two
different platforms to ahci"
* tag 'for-5.2/libata-20190507' of git://git.kernel.dk/linux-block:
ahci: qoriq: add ls1028a platforms support
ahci: qoriq: add lx2160 platforms support
| -rw-r--r-- | drivers/ata/ahci_qoriq.c | 55 |
1 files changed, 38 insertions, 17 deletions
diff --git a/drivers/ata/ahci_qoriq.c b/drivers/ata/ahci_qoriq.c index ce59253ec158..ea1175f7f147 100644 --- a/drivers/ata/ahci_qoriq.c +++ b/drivers/ata/ahci_qoriq.c | |||
| @@ -53,11 +53,13 @@ | |||
| 53 | 53 | ||
| 54 | enum ahci_qoriq_type { | 54 | enum ahci_qoriq_type { |
| 55 | AHCI_LS1021A, | 55 | AHCI_LS1021A, |
| 56 | AHCI_LS1028A, | ||
| 56 | AHCI_LS1043A, | 57 | AHCI_LS1043A, |
| 57 | AHCI_LS2080A, | 58 | AHCI_LS2080A, |
| 58 | AHCI_LS1046A, | 59 | AHCI_LS1046A, |
| 59 | AHCI_LS1088A, | 60 | AHCI_LS1088A, |
| 60 | AHCI_LS2088A, | 61 | AHCI_LS2088A, |
| 62 | AHCI_LX2160A, | ||
| 61 | }; | 63 | }; |
| 62 | 64 | ||
| 63 | struct ahci_qoriq_priv { | 65 | struct ahci_qoriq_priv { |
| @@ -67,13 +69,17 @@ struct ahci_qoriq_priv { | |||
| 67 | bool is_dmacoherent; | 69 | bool is_dmacoherent; |
| 68 | }; | 70 | }; |
| 69 | 71 | ||
| 72 | static bool ecc_initialized; | ||
| 73 | |||
| 70 | static const struct of_device_id ahci_qoriq_of_match[] = { | 74 | static const struct of_device_id ahci_qoriq_of_match[] = { |
| 71 | { .compatible = "fsl,ls1021a-ahci", .data = (void *)AHCI_LS1021A}, | 75 | { .compatible = "fsl,ls1021a-ahci", .data = (void *)AHCI_LS1021A}, |
| 76 | { .compatible = "fsl,ls1028a-ahci", .data = (void *)AHCI_LS1028A}, | ||
| 72 | { .compatible = "fsl,ls1043a-ahci", .data = (void *)AHCI_LS1043A}, | 77 | { .compatible = "fsl,ls1043a-ahci", .data = (void *)AHCI_LS1043A}, |
| 73 | { .compatible = "fsl,ls2080a-ahci", .data = (void *)AHCI_LS2080A}, | 78 | { .compatible = "fsl,ls2080a-ahci", .data = (void *)AHCI_LS2080A}, |
| 74 | { .compatible = "fsl,ls1046a-ahci", .data = (void *)AHCI_LS1046A}, | 79 | { .compatible = "fsl,ls1046a-ahci", .data = (void *)AHCI_LS1046A}, |
| 75 | { .compatible = "fsl,ls1088a-ahci", .data = (void *)AHCI_LS1088A}, | 80 | { .compatible = "fsl,ls1088a-ahci", .data = (void *)AHCI_LS1088A}, |
| 76 | { .compatible = "fsl,ls2088a-ahci", .data = (void *)AHCI_LS2088A}, | 81 | { .compatible = "fsl,ls2088a-ahci", .data = (void *)AHCI_LS2088A}, |
| 82 | { .compatible = "fsl,lx2160a-ahci", .data = (void *)AHCI_LX2160A}, | ||
| 77 | {}, | 83 | {}, |
| 78 | }; | 84 | }; |
| 79 | MODULE_DEVICE_TABLE(of, ahci_qoriq_of_match); | 85 | MODULE_DEVICE_TABLE(of, ahci_qoriq_of_match); |
| @@ -165,9 +171,10 @@ static int ahci_qoriq_phy_init(struct ahci_host_priv *hpriv) | |||
| 165 | 171 | ||
| 166 | switch (qpriv->type) { | 172 | switch (qpriv->type) { |
| 167 | case AHCI_LS1021A: | 173 | case AHCI_LS1021A: |
| 168 | if (!qpriv->ecc_addr) | 174 | if (!(qpriv->ecc_addr || ecc_initialized)) |
| 169 | return -EINVAL; | 175 | return -EINVAL; |
| 170 | writel(SATA_ECC_DISABLE, qpriv->ecc_addr); | 176 | else if (qpriv->ecc_addr && !ecc_initialized) |
| 177 | writel(SATA_ECC_DISABLE, qpriv->ecc_addr); | ||
| 171 | writel(AHCI_PORT_PHY_1_CFG, reg_base + PORT_PHY1); | 178 | writel(AHCI_PORT_PHY_1_CFG, reg_base + PORT_PHY1); |
| 172 | writel(LS1021A_PORT_PHY2, reg_base + PORT_PHY2); | 179 | writel(LS1021A_PORT_PHY2, reg_base + PORT_PHY2); |
| 173 | writel(LS1021A_PORT_PHY3, reg_base + PORT_PHY3); | 180 | writel(LS1021A_PORT_PHY3, reg_base + PORT_PHY3); |
| @@ -180,10 +187,12 @@ static int ahci_qoriq_phy_init(struct ahci_host_priv *hpriv) | |||
| 180 | break; | 187 | break; |
| 181 | 188 | ||
| 182 | case AHCI_LS1043A: | 189 | case AHCI_LS1043A: |
| 183 | if (!qpriv->ecc_addr) | 190 | if (!(qpriv->ecc_addr || ecc_initialized)) |
| 184 | return -EINVAL; | 191 | return -EINVAL; |
| 185 | writel(readl(qpriv->ecc_addr) | ECC_DIS_ARMV8_CH2, | 192 | else if (qpriv->ecc_addr && !ecc_initialized) |
| 186 | qpriv->ecc_addr); | 193 | writel(readl(qpriv->ecc_addr) | |
| 194 | ECC_DIS_ARMV8_CH2, | ||
| 195 | qpriv->ecc_addr); | ||
| 187 | writel(AHCI_PORT_PHY_1_CFG, reg_base + PORT_PHY1); | 196 | writel(AHCI_PORT_PHY_1_CFG, reg_base + PORT_PHY1); |
| 188 | writel(AHCI_PORT_PHY2_CFG, reg_base + PORT_PHY2); | 197 | writel(AHCI_PORT_PHY2_CFG, reg_base + PORT_PHY2); |
| 189 | writel(AHCI_PORT_PHY3_CFG, reg_base + PORT_PHY3); | 198 | writel(AHCI_PORT_PHY3_CFG, reg_base + PORT_PHY3); |
| @@ -202,10 +211,12 @@ static int ahci_qoriq_phy_init(struct ahci_host_priv *hpriv) | |||
| 202 | break; | 211 | break; |
| 203 | 212 | ||
| 204 | case AHCI_LS1046A: | 213 | case AHCI_LS1046A: |
| 205 | if (!qpriv->ecc_addr) | 214 | if (!(qpriv->ecc_addr || ecc_initialized)) |
| 206 | return -EINVAL; | 215 | return -EINVAL; |
| 207 | writel(readl(qpriv->ecc_addr) | ECC_DIS_ARMV8_CH2, | 216 | else if (qpriv->ecc_addr && !ecc_initialized) |
| 208 | qpriv->ecc_addr); | 217 | writel(readl(qpriv->ecc_addr) | |
| 218 | ECC_DIS_ARMV8_CH2, | ||
| 219 | qpriv->ecc_addr); | ||
| 209 | writel(AHCI_PORT_PHY_1_CFG, reg_base + PORT_PHY1); | 220 | writel(AHCI_PORT_PHY_1_CFG, reg_base + PORT_PHY1); |
| 210 | writel(AHCI_PORT_PHY2_CFG, reg_base + PORT_PHY2); | 221 | writel(AHCI_PORT_PHY2_CFG, reg_base + PORT_PHY2); |
| 211 | writel(AHCI_PORT_PHY3_CFG, reg_base + PORT_PHY3); | 222 | writel(AHCI_PORT_PHY3_CFG, reg_base + PORT_PHY3); |
| @@ -214,11 +225,15 @@ static int ahci_qoriq_phy_init(struct ahci_host_priv *hpriv) | |||
| 214 | writel(AHCI_PORT_AXICC_CFG, reg_base + PORT_AXICC); | 225 | writel(AHCI_PORT_AXICC_CFG, reg_base + PORT_AXICC); |
| 215 | break; | 226 | break; |
| 216 | 227 | ||
| 228 | case AHCI_LS1028A: | ||
| 217 | case AHCI_LS1088A: | 229 | case AHCI_LS1088A: |
| 218 | if (!qpriv->ecc_addr) | 230 | case AHCI_LX2160A: |
| 231 | if (!(qpriv->ecc_addr || ecc_initialized)) | ||
| 219 | return -EINVAL; | 232 | return -EINVAL; |
| 220 | writel(readl(qpriv->ecc_addr) | ECC_DIS_LS1088A, | 233 | else if (qpriv->ecc_addr && !ecc_initialized) |
| 221 | qpriv->ecc_addr); | 234 | writel(readl(qpriv->ecc_addr) | |
| 235 | ECC_DIS_LS1088A, | ||
| 236 | qpriv->ecc_addr); | ||
| 222 | writel(AHCI_PORT_PHY_1_CFG, reg_base + PORT_PHY1); | 237 | writel(AHCI_PORT_PHY_1_CFG, reg_base + PORT_PHY1); |
| 223 | writel(AHCI_PORT_PHY2_CFG, reg_base + PORT_PHY2); | 238 | writel(AHCI_PORT_PHY2_CFG, reg_base + PORT_PHY2); |
| 224 | writel(AHCI_PORT_PHY3_CFG, reg_base + PORT_PHY3); | 239 | writel(AHCI_PORT_PHY3_CFG, reg_base + PORT_PHY3); |
| @@ -237,6 +252,7 @@ static int ahci_qoriq_phy_init(struct ahci_host_priv *hpriv) | |||
| 237 | break; | 252 | break; |
| 238 | } | 253 | } |
| 239 | 254 | ||
| 255 | ecc_initialized = true; | ||
| 240 | return 0; | 256 | return 0; |
| 241 | } | 257 | } |
| 242 | 258 | ||
| @@ -264,13 +280,18 @@ static int ahci_qoriq_probe(struct platform_device *pdev) | |||
| 264 | 280 | ||
| 265 | qoriq_priv->type = (enum ahci_qoriq_type)of_id->data; | 281 | qoriq_priv->type = (enum ahci_qoriq_type)of_id->data; |
| 266 | 282 | ||
| 267 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, | 283 | if (unlikely(!ecc_initialized)) { |
| 268 | "sata-ecc"); | 284 | res = platform_get_resource_byname(pdev, |
| 269 | if (res) { | 285 | IORESOURCE_MEM, |
| 270 | qoriq_priv->ecc_addr = devm_ioremap_resource(dev, res); | 286 | "sata-ecc"); |
| 271 | if (IS_ERR(qoriq_priv->ecc_addr)) | 287 | if (res) { |
| 272 | return PTR_ERR(qoriq_priv->ecc_addr); | 288 | qoriq_priv->ecc_addr = |
| 289 | devm_ioremap_resource(dev, res); | ||
| 290 | if (IS_ERR(qoriq_priv->ecc_addr)) | ||
| 291 | return PTR_ERR(qoriq_priv->ecc_addr); | ||
| 292 | } | ||
| 273 | } | 293 | } |
| 294 | |||
| 274 | qoriq_priv->is_dmacoherent = of_dma_is_coherent(np); | 295 | qoriq_priv->is_dmacoherent = of_dma_is_coherent(np); |
| 275 | 296 | ||
| 276 | rc = ahci_platform_enable_resources(hpriv); | 297 | rc = ahci_platform_enable_resources(hpriv); |
