Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ata: ahci_brcm: Add support for Broadcom NSP SoC

Add SATA3 support for Broadcom NSP SoC

Signed-off-by: Yendapally Reddy Dhananjaya Reddy <yendapally.reddy@broadcom.com>
Acked-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Tejun Heo <tj@kernel.org>

authored by

Yendapally Reddy Dhananjaya Reddy and committed by
Tejun Heo
3ee2e6dc eba68f82

+37 -11
+1 -1
drivers/ata/Kconfig
··· 100 100 101 101 config AHCI_BRCM 102 102 tristate "Broadcom AHCI SATA support" 103 - depends on ARCH_BRCMSTB || BMIPS_GENERIC 103 + depends on ARCH_BRCMSTB || BMIPS_GENERIC || ARCH_BCM_NSP 104 104 help 105 105 This option enables support for the AHCI SATA3 controller found on 106 106 Broadcom SoC's.
+36 -10
drivers/ata/ahci_brcm.c
··· 71 71 (DATA_ENDIAN << DMADESC_ENDIAN_SHIFT) | \ 72 72 (MMIO_ENDIAN << MMIO_ENDIAN_SHIFT)) 73 73 74 + enum brcm_ahci_version { 75 + BRCM_SATA_BCM7425 = 1, 76 + BRCM_SATA_BCM7445, 77 + BRCM_SATA_NSP, 78 + }; 79 + 74 80 enum brcm_ahci_quirks { 75 81 BRCM_AHCI_QUIRK_NO_NCQ = BIT(0), 76 82 BRCM_AHCI_QUIRK_SKIP_PHY_ENABLE = BIT(1), ··· 87 81 void __iomem *top_ctrl; 88 82 u32 port_mask; 89 83 u32 quirks; 84 + enum brcm_ahci_version version; 90 85 }; 91 86 92 87 static const struct ata_port_info ahci_brcm_port_info = { ··· 254 247 255 248 static void brcm_sata_init(struct brcm_ahci_priv *priv) 256 249 { 250 + void __iomem *ctrl = priv->top_ctrl + SATA_TOP_CTRL_BUS_CTRL; 251 + 257 252 /* Configure endianness */ 258 - brcm_sata_writereg(BUS_CTRL_ENDIAN_CONF, 259 - priv->top_ctrl + SATA_TOP_CTRL_BUS_CTRL); 253 + if (priv->version == BRCM_SATA_NSP) { 254 + u32 data = brcm_sata_readreg(ctrl); 255 + 256 + data &= ~((0x03 << DMADATA_ENDIAN_SHIFT) | 257 + (0x03 << DMADESC_ENDIAN_SHIFT)); 258 + data |= (0x02 << DMADATA_ENDIAN_SHIFT) | 259 + (0x02 << DMADESC_ENDIAN_SHIFT); 260 + brcm_sata_writereg(data, ctrl); 261 + } else 262 + brcm_sata_writereg(BUS_CTRL_ENDIAN_CONF, ctrl); 260 263 } 261 264 262 265 #ifdef CONFIG_PM_SLEEP ··· 299 282 AHCI_SHT(DRV_NAME), 300 283 }; 301 284 285 + static const struct of_device_id ahci_of_match[] = { 286 + {.compatible = "brcm,bcm7425-ahci", .data = (void *)BRCM_SATA_BCM7425}, 287 + {.compatible = "brcm,bcm7445-ahci", .data = (void *)BRCM_SATA_BCM7445}, 288 + {.compatible = "brcm,bcm-nsp-ahci", .data = (void *)BRCM_SATA_NSP}, 289 + {}, 290 + }; 291 + MODULE_DEVICE_TABLE(of, ahci_of_match); 292 + 302 293 static int brcm_ahci_probe(struct platform_device *pdev) 303 294 { 295 + const struct of_device_id *of_id; 304 296 struct device *dev = &pdev->dev; 305 297 struct brcm_ahci_priv *priv; 306 298 struct ahci_host_priv *hpriv; ··· 319 293 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 320 294 if (!priv) 321 295 return -ENOMEM; 296 + 297 + of_id = of_match_node(ahci_of_match, pdev->dev.of_node); 298 + if (!of_id) 299 + return -ENODEV; 300 + 301 + priv->version = (enum brcm_ahci_version)of_id->data; 322 302 priv->dev = dev; 323 303 324 304 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "top-ctrl"); ··· 332 300 if (IS_ERR(priv->top_ctrl)) 333 301 return PTR_ERR(priv->top_ctrl); 334 302 335 - if (of_device_is_compatible(dev->of_node, "brcm,bcm7425-ahci")) { 303 + if ((priv->version == BRCM_SATA_BCM7425) || 304 + (priv->version == BRCM_SATA_NSP)) { 336 305 priv->quirks |= BRCM_AHCI_QUIRK_NO_NCQ; 337 306 priv->quirks |= BRCM_AHCI_QUIRK_SKIP_PHY_ENABLE; 338 307 } ··· 386 353 387 354 return 0; 388 355 } 389 - 390 - static const struct of_device_id ahci_of_match[] = { 391 - {.compatible = "brcm,bcm7425-ahci"}, 392 - {.compatible = "brcm,bcm7445-ahci"}, 393 - {}, 394 - }; 395 - MODULE_DEVICE_TABLE(of, ahci_of_match); 396 356 397 357 static SIMPLE_DEV_PM_OPS(ahci_brcm_pm_ops, brcm_ahci_suspend, brcm_ahci_resume); 398 358