aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2019-05-07 21:43:36 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-05-07 21:43:36 -0400
commite4eaa9efbf79ccf6dc9915a9623049ef341bba85 (patch)
tree1f7b0b0f610dc11abc498787fb1ecd378401a665
parent52ae2456d6a455ef958bcf1c2d1965674076887e (diff)
parenta1d78317f84bf5b5ed3775b911a7dea344a884a9 (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.c55
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
54enum ahci_qoriq_type { 54enum 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
63struct ahci_qoriq_priv { 65struct ahci_qoriq_priv {
@@ -67,13 +69,17 @@ struct ahci_qoriq_priv {
67 bool is_dmacoherent; 69 bool is_dmacoherent;
68}; 70};
69 71
72static bool ecc_initialized;
73
70static const struct of_device_id ahci_qoriq_of_match[] = { 74static 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};
79MODULE_DEVICE_TABLE(of, ahci_qoriq_of_match); 85MODULE_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);