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

Configure Feed

Select the types of activity you want to include in your feed.

at v3.12-rc5 552 lines 15 kB view raw
1/* 2 * PCIe host controller driver for Samsung EXYNOS SoCs 3 * 4 * Copyright (C) 2013 Samsung Electronics Co., Ltd. 5 * http://www.samsung.com 6 * 7 * Author: Jingoo Han <jg1.han@samsung.com> 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License version 2 as 11 * published by the Free Software Foundation. 12 */ 13 14#include <linux/clk.h> 15#include <linux/delay.h> 16#include <linux/gpio.h> 17#include <linux/interrupt.h> 18#include <linux/kernel.h> 19#include <linux/module.h> 20#include <linux/of_gpio.h> 21#include <linux/pci.h> 22#include <linux/platform_device.h> 23#include <linux/resource.h> 24#include <linux/signal.h> 25#include <linux/types.h> 26 27#include "pcie-designware.h" 28 29#define to_exynos_pcie(x) container_of(x, struct exynos_pcie, pp) 30 31struct exynos_pcie { 32 void __iomem *elbi_base; 33 void __iomem *phy_base; 34 void __iomem *block_base; 35 int reset_gpio; 36 struct clk *clk; 37 struct clk *bus_clk; 38 struct pcie_port pp; 39}; 40 41/* PCIe ELBI registers */ 42#define PCIE_IRQ_PULSE 0x000 43#define IRQ_INTA_ASSERT (0x1 << 0) 44#define IRQ_INTB_ASSERT (0x1 << 2) 45#define IRQ_INTC_ASSERT (0x1 << 4) 46#define IRQ_INTD_ASSERT (0x1 << 6) 47#define PCIE_IRQ_LEVEL 0x004 48#define PCIE_IRQ_SPECIAL 0x008 49#define PCIE_IRQ_EN_PULSE 0x00c 50#define PCIE_IRQ_EN_LEVEL 0x010 51#define PCIE_IRQ_EN_SPECIAL 0x014 52#define PCIE_PWR_RESET 0x018 53#define PCIE_CORE_RESET 0x01c 54#define PCIE_CORE_RESET_ENABLE (0x1 << 0) 55#define PCIE_STICKY_RESET 0x020 56#define PCIE_NONSTICKY_RESET 0x024 57#define PCIE_APP_INIT_RESET 0x028 58#define PCIE_APP_LTSSM_ENABLE 0x02c 59#define PCIE_ELBI_RDLH_LINKUP 0x064 60#define PCIE_ELBI_LTSSM_ENABLE 0x1 61#define PCIE_ELBI_SLV_AWMISC 0x11c 62#define PCIE_ELBI_SLV_ARMISC 0x120 63#define PCIE_ELBI_SLV_DBI_ENABLE (0x1 << 21) 64 65/* PCIe Purple registers */ 66#define PCIE_PHY_GLOBAL_RESET 0x000 67#define PCIE_PHY_COMMON_RESET 0x004 68#define PCIE_PHY_CMN_REG 0x008 69#define PCIE_PHY_MAC_RESET 0x00c 70#define PCIE_PHY_PLL_LOCKED 0x010 71#define PCIE_PHY_TRSVREG_RESET 0x020 72#define PCIE_PHY_TRSV_RESET 0x024 73 74/* PCIe PHY registers */ 75#define PCIE_PHY_IMPEDANCE 0x004 76#define PCIE_PHY_PLL_DIV_0 0x008 77#define PCIE_PHY_PLL_BIAS 0x00c 78#define PCIE_PHY_DCC_FEEDBACK 0x014 79#define PCIE_PHY_PLL_DIV_1 0x05c 80#define PCIE_PHY_TRSV0_EMP_LVL 0x084 81#define PCIE_PHY_TRSV0_DRV_LVL 0x088 82#define PCIE_PHY_TRSV0_RXCDR 0x0ac 83#define PCIE_PHY_TRSV0_LVCC 0x0dc 84#define PCIE_PHY_TRSV1_EMP_LVL 0x144 85#define PCIE_PHY_TRSV1_RXCDR 0x16c 86#define PCIE_PHY_TRSV1_LVCC 0x19c 87#define PCIE_PHY_TRSV2_EMP_LVL 0x204 88#define PCIE_PHY_TRSV2_RXCDR 0x22c 89#define PCIE_PHY_TRSV2_LVCC 0x25c 90#define PCIE_PHY_TRSV3_EMP_LVL 0x2c4 91#define PCIE_PHY_TRSV3_RXCDR 0x2ec 92#define PCIE_PHY_TRSV3_LVCC 0x31c 93 94static inline void exynos_elb_writel(struct exynos_pcie *pcie, u32 val, u32 reg) 95{ 96 writel(val, pcie->elbi_base + reg); 97} 98 99static inline u32 exynos_elb_readl(struct exynos_pcie *pcie, u32 reg) 100{ 101 return readl(pcie->elbi_base + reg); 102} 103 104static inline void exynos_phy_writel(struct exynos_pcie *pcie, u32 val, u32 reg) 105{ 106 writel(val, pcie->phy_base + reg); 107} 108 109static inline u32 exynos_phy_readl(struct exynos_pcie *pcie, u32 reg) 110{ 111 return readl(pcie->phy_base + reg); 112} 113 114static inline void exynos_blk_writel(struct exynos_pcie *pcie, u32 val, u32 reg) 115{ 116 writel(val, pcie->block_base + reg); 117} 118 119static inline u32 exynos_blk_readl(struct exynos_pcie *pcie, u32 reg) 120{ 121 return readl(pcie->block_base + reg); 122} 123 124static void exynos_pcie_sideband_dbi_w_mode(struct pcie_port *pp, bool on) 125{ 126 u32 val; 127 struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); 128 129 if (on) { 130 val = exynos_elb_readl(exynos_pcie, PCIE_ELBI_SLV_AWMISC); 131 val |= PCIE_ELBI_SLV_DBI_ENABLE; 132 exynos_elb_writel(exynos_pcie, val, PCIE_ELBI_SLV_AWMISC); 133 } else { 134 val = exynos_elb_readl(exynos_pcie, PCIE_ELBI_SLV_AWMISC); 135 val &= ~PCIE_ELBI_SLV_DBI_ENABLE; 136 exynos_elb_writel(exynos_pcie, val, PCIE_ELBI_SLV_AWMISC); 137 } 138} 139 140static void exynos_pcie_sideband_dbi_r_mode(struct pcie_port *pp, bool on) 141{ 142 u32 val; 143 struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); 144 145 if (on) { 146 val = exynos_elb_readl(exynos_pcie, PCIE_ELBI_SLV_ARMISC); 147 val |= PCIE_ELBI_SLV_DBI_ENABLE; 148 exynos_elb_writel(exynos_pcie, val, PCIE_ELBI_SLV_ARMISC); 149 } else { 150 val = exynos_elb_readl(exynos_pcie, PCIE_ELBI_SLV_ARMISC); 151 val &= ~PCIE_ELBI_SLV_DBI_ENABLE; 152 exynos_elb_writel(exynos_pcie, val, PCIE_ELBI_SLV_ARMISC); 153 } 154} 155 156static void exynos_pcie_assert_core_reset(struct pcie_port *pp) 157{ 158 u32 val; 159 struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); 160 161 val = exynos_elb_readl(exynos_pcie, PCIE_CORE_RESET); 162 val &= ~PCIE_CORE_RESET_ENABLE; 163 exynos_elb_writel(exynos_pcie, val, PCIE_CORE_RESET); 164 exynos_elb_writel(exynos_pcie, 0, PCIE_PWR_RESET); 165 exynos_elb_writel(exynos_pcie, 0, PCIE_STICKY_RESET); 166 exynos_elb_writel(exynos_pcie, 0, PCIE_NONSTICKY_RESET); 167} 168 169static void exynos_pcie_deassert_core_reset(struct pcie_port *pp) 170{ 171 u32 val; 172 struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); 173 174 val = exynos_elb_readl(exynos_pcie, PCIE_CORE_RESET); 175 val |= PCIE_CORE_RESET_ENABLE; 176 177 exynos_elb_writel(exynos_pcie, val, PCIE_CORE_RESET); 178 exynos_elb_writel(exynos_pcie, 1, PCIE_STICKY_RESET); 179 exynos_elb_writel(exynos_pcie, 1, PCIE_NONSTICKY_RESET); 180 exynos_elb_writel(exynos_pcie, 1, PCIE_APP_INIT_RESET); 181 exynos_elb_writel(exynos_pcie, 0, PCIE_APP_INIT_RESET); 182 exynos_blk_writel(exynos_pcie, 1, PCIE_PHY_MAC_RESET); 183} 184 185static void exynos_pcie_assert_phy_reset(struct pcie_port *pp) 186{ 187 struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); 188 189 exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_MAC_RESET); 190 exynos_blk_writel(exynos_pcie, 1, PCIE_PHY_GLOBAL_RESET); 191} 192 193static void exynos_pcie_deassert_phy_reset(struct pcie_port *pp) 194{ 195 struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); 196 197 exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_GLOBAL_RESET); 198 exynos_elb_writel(exynos_pcie, 1, PCIE_PWR_RESET); 199 exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_COMMON_RESET); 200 exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_CMN_REG); 201 exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_TRSVREG_RESET); 202 exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_TRSV_RESET); 203} 204 205static void exynos_pcie_init_phy(struct pcie_port *pp) 206{ 207 struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); 208 209 /* DCC feedback control off */ 210 exynos_phy_writel(exynos_pcie, 0x29, PCIE_PHY_DCC_FEEDBACK); 211 212 /* set TX/RX impedance */ 213 exynos_phy_writel(exynos_pcie, 0xd5, PCIE_PHY_IMPEDANCE); 214 215 /* set 50Mhz PHY clock */ 216 exynos_phy_writel(exynos_pcie, 0x14, PCIE_PHY_PLL_DIV_0); 217 exynos_phy_writel(exynos_pcie, 0x12, PCIE_PHY_PLL_DIV_1); 218 219 /* set TX Differential output for lane 0 */ 220 exynos_phy_writel(exynos_pcie, 0x7f, PCIE_PHY_TRSV0_DRV_LVL); 221 222 /* set TX Pre-emphasis Level Control for lane 0 to minimum */ 223 exynos_phy_writel(exynos_pcie, 0x0, PCIE_PHY_TRSV0_EMP_LVL); 224 225 /* set RX clock and data recovery bandwidth */ 226 exynos_phy_writel(exynos_pcie, 0xe7, PCIE_PHY_PLL_BIAS); 227 exynos_phy_writel(exynos_pcie, 0x82, PCIE_PHY_TRSV0_RXCDR); 228 exynos_phy_writel(exynos_pcie, 0x82, PCIE_PHY_TRSV1_RXCDR); 229 exynos_phy_writel(exynos_pcie, 0x82, PCIE_PHY_TRSV2_RXCDR); 230 exynos_phy_writel(exynos_pcie, 0x82, PCIE_PHY_TRSV3_RXCDR); 231 232 /* change TX Pre-emphasis Level Control for lanes */ 233 exynos_phy_writel(exynos_pcie, 0x39, PCIE_PHY_TRSV0_EMP_LVL); 234 exynos_phy_writel(exynos_pcie, 0x39, PCIE_PHY_TRSV1_EMP_LVL); 235 exynos_phy_writel(exynos_pcie, 0x39, PCIE_PHY_TRSV2_EMP_LVL); 236 exynos_phy_writel(exynos_pcie, 0x39, PCIE_PHY_TRSV3_EMP_LVL); 237 238 /* set LVCC */ 239 exynos_phy_writel(exynos_pcie, 0x20, PCIE_PHY_TRSV0_LVCC); 240 exynos_phy_writel(exynos_pcie, 0xa0, PCIE_PHY_TRSV1_LVCC); 241 exynos_phy_writel(exynos_pcie, 0xa0, PCIE_PHY_TRSV2_LVCC); 242 exynos_phy_writel(exynos_pcie, 0xa0, PCIE_PHY_TRSV3_LVCC); 243} 244 245static void exynos_pcie_assert_reset(struct pcie_port *pp) 246{ 247 struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); 248 249 if (exynos_pcie->reset_gpio >= 0) 250 devm_gpio_request_one(pp->dev, exynos_pcie->reset_gpio, 251 GPIOF_OUT_INIT_HIGH, "RESET"); 252 return; 253} 254 255static int exynos_pcie_establish_link(struct pcie_port *pp) 256{ 257 u32 val; 258 int count = 0; 259 struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); 260 261 if (dw_pcie_link_up(pp)) { 262 dev_err(pp->dev, "Link already up\n"); 263 return 0; 264 } 265 266 /* assert reset signals */ 267 exynos_pcie_assert_core_reset(pp); 268 exynos_pcie_assert_phy_reset(pp); 269 270 /* de-assert phy reset */ 271 exynos_pcie_deassert_phy_reset(pp); 272 273 /* initialize phy */ 274 exynos_pcie_init_phy(pp); 275 276 /* pulse for common reset */ 277 exynos_blk_writel(exynos_pcie, 1, PCIE_PHY_COMMON_RESET); 278 udelay(500); 279 exynos_blk_writel(exynos_pcie, 0, PCIE_PHY_COMMON_RESET); 280 281 /* de-assert core reset */ 282 exynos_pcie_deassert_core_reset(pp); 283 284 /* setup root complex */ 285 dw_pcie_setup_rc(pp); 286 287 /* assert reset signal */ 288 exynos_pcie_assert_reset(pp); 289 290 /* assert LTSSM enable */ 291 exynos_elb_writel(exynos_pcie, PCIE_ELBI_LTSSM_ENABLE, 292 PCIE_APP_LTSSM_ENABLE); 293 294 /* check if the link is up or not */ 295 while (!dw_pcie_link_up(pp)) { 296 mdelay(100); 297 count++; 298 if (count == 10) { 299 while (exynos_phy_readl(exynos_pcie, 300 PCIE_PHY_PLL_LOCKED) == 0) { 301 val = exynos_blk_readl(exynos_pcie, 302 PCIE_PHY_PLL_LOCKED); 303 dev_info(pp->dev, "PLL Locked: 0x%x\n", val); 304 } 305 dev_err(pp->dev, "PCIe Link Fail\n"); 306 return -EINVAL; 307 } 308 } 309 310 dev_info(pp->dev, "Link up\n"); 311 312 return 0; 313} 314 315static void exynos_pcie_clear_irq_pulse(struct pcie_port *pp) 316{ 317 u32 val; 318 struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); 319 320 val = exynos_elb_readl(exynos_pcie, PCIE_IRQ_PULSE); 321 exynos_elb_writel(exynos_pcie, val, PCIE_IRQ_PULSE); 322 return; 323} 324 325static void exynos_pcie_enable_irq_pulse(struct pcie_port *pp) 326{ 327 u32 val; 328 struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); 329 330 /* enable INTX interrupt */ 331 val = IRQ_INTA_ASSERT | IRQ_INTB_ASSERT | 332 IRQ_INTC_ASSERT | IRQ_INTD_ASSERT, 333 exynos_elb_writel(exynos_pcie, val, PCIE_IRQ_EN_PULSE); 334 return; 335} 336 337static irqreturn_t exynos_pcie_irq_handler(int irq, void *arg) 338{ 339 struct pcie_port *pp = arg; 340 341 exynos_pcie_clear_irq_pulse(pp); 342 return IRQ_HANDLED; 343} 344 345static void exynos_pcie_enable_interrupts(struct pcie_port *pp) 346{ 347 exynos_pcie_enable_irq_pulse(pp); 348 return; 349} 350 351static inline void exynos_pcie_readl_rc(struct pcie_port *pp, 352 void __iomem *dbi_base, u32 *val) 353{ 354 exynos_pcie_sideband_dbi_r_mode(pp, true); 355 *val = readl(dbi_base); 356 exynos_pcie_sideband_dbi_r_mode(pp, false); 357 return; 358} 359 360static inline void exynos_pcie_writel_rc(struct pcie_port *pp, 361 u32 val, void __iomem *dbi_base) 362{ 363 exynos_pcie_sideband_dbi_w_mode(pp, true); 364 writel(val, dbi_base); 365 exynos_pcie_sideband_dbi_w_mode(pp, false); 366 return; 367} 368 369static int exynos_pcie_rd_own_conf(struct pcie_port *pp, int where, int size, 370 u32 *val) 371{ 372 int ret; 373 374 exynos_pcie_sideband_dbi_r_mode(pp, true); 375 ret = cfg_read(pp->dbi_base + (where & ~0x3), where, size, val); 376 exynos_pcie_sideband_dbi_r_mode(pp, false); 377 return ret; 378} 379 380static int exynos_pcie_wr_own_conf(struct pcie_port *pp, int where, int size, 381 u32 val) 382{ 383 int ret; 384 385 exynos_pcie_sideband_dbi_w_mode(pp, true); 386 ret = cfg_write(pp->dbi_base + (where & ~0x3), where, size, val); 387 exynos_pcie_sideband_dbi_w_mode(pp, false); 388 return ret; 389} 390 391static int exynos_pcie_link_up(struct pcie_port *pp) 392{ 393 struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp); 394 u32 val = exynos_elb_readl(exynos_pcie, PCIE_ELBI_RDLH_LINKUP); 395 396 if (val == PCIE_ELBI_LTSSM_ENABLE) 397 return 1; 398 399 return 0; 400} 401 402static void exynos_pcie_host_init(struct pcie_port *pp) 403{ 404 exynos_pcie_establish_link(pp); 405 exynos_pcie_enable_interrupts(pp); 406} 407 408static struct pcie_host_ops exynos_pcie_host_ops = { 409 .readl_rc = exynos_pcie_readl_rc, 410 .writel_rc = exynos_pcie_writel_rc, 411 .rd_own_conf = exynos_pcie_rd_own_conf, 412 .wr_own_conf = exynos_pcie_wr_own_conf, 413 .link_up = exynos_pcie_link_up, 414 .host_init = exynos_pcie_host_init, 415}; 416 417static int add_pcie_port(struct pcie_port *pp, struct platform_device *pdev) 418{ 419 int ret; 420 421 pp->irq = platform_get_irq(pdev, 1); 422 if (!pp->irq) { 423 dev_err(&pdev->dev, "failed to get irq\n"); 424 return -ENODEV; 425 } 426 ret = devm_request_irq(&pdev->dev, pp->irq, exynos_pcie_irq_handler, 427 IRQF_SHARED, "exynos-pcie", pp); 428 if (ret) { 429 dev_err(&pdev->dev, "failed to request irq\n"); 430 return ret; 431 } 432 433 pp->root_bus_nr = -1; 434 pp->ops = &exynos_pcie_host_ops; 435 436 spin_lock_init(&pp->conf_lock); 437 ret = dw_pcie_host_init(pp); 438 if (ret) { 439 dev_err(&pdev->dev, "failed to initialize host\n"); 440 return ret; 441 } 442 443 return 0; 444} 445 446static int __init exynos_pcie_probe(struct platform_device *pdev) 447{ 448 struct exynos_pcie *exynos_pcie; 449 struct pcie_port *pp; 450 struct device_node *np = pdev->dev.of_node; 451 struct resource *elbi_base; 452 struct resource *phy_base; 453 struct resource *block_base; 454 int ret; 455 456 exynos_pcie = devm_kzalloc(&pdev->dev, sizeof(*exynos_pcie), 457 GFP_KERNEL); 458 if (!exynos_pcie) { 459 dev_err(&pdev->dev, "no memory for exynos pcie\n"); 460 return -ENOMEM; 461 } 462 463 pp = &exynos_pcie->pp; 464 465 pp->dev = &pdev->dev; 466 467 exynos_pcie->reset_gpio = of_get_named_gpio(np, "reset-gpio", 0); 468 469 exynos_pcie->clk = devm_clk_get(&pdev->dev, "pcie"); 470 if (IS_ERR(exynos_pcie->clk)) { 471 dev_err(&pdev->dev, "Failed to get pcie rc clock\n"); 472 return PTR_ERR(exynos_pcie->clk); 473 } 474 ret = clk_prepare_enable(exynos_pcie->clk); 475 if (ret) 476 return ret; 477 478 exynos_pcie->bus_clk = devm_clk_get(&pdev->dev, "pcie_bus"); 479 if (IS_ERR(exynos_pcie->bus_clk)) { 480 dev_err(&pdev->dev, "Failed to get pcie bus clock\n"); 481 ret = PTR_ERR(exynos_pcie->bus_clk); 482 goto fail_clk; 483 } 484 ret = clk_prepare_enable(exynos_pcie->bus_clk); 485 if (ret) 486 goto fail_clk; 487 488 elbi_base = platform_get_resource(pdev, IORESOURCE_MEM, 0); 489 exynos_pcie->elbi_base = devm_ioremap_resource(&pdev->dev, elbi_base); 490 if (IS_ERR(exynos_pcie->elbi_base)) 491 return PTR_ERR(exynos_pcie->elbi_base); 492 493 phy_base = platform_get_resource(pdev, IORESOURCE_MEM, 1); 494 exynos_pcie->phy_base = devm_ioremap_resource(&pdev->dev, phy_base); 495 if (IS_ERR(exynos_pcie->phy_base)) 496 return PTR_ERR(exynos_pcie->phy_base); 497 498 block_base = platform_get_resource(pdev, IORESOURCE_MEM, 2); 499 exynos_pcie->block_base = devm_ioremap_resource(&pdev->dev, block_base); 500 if (IS_ERR(exynos_pcie->block_base)) 501 return PTR_ERR(exynos_pcie->block_base); 502 503 ret = add_pcie_port(pp, pdev); 504 if (ret < 0) 505 goto fail_bus_clk; 506 507 platform_set_drvdata(pdev, exynos_pcie); 508 return 0; 509 510fail_bus_clk: 511 clk_disable_unprepare(exynos_pcie->bus_clk); 512fail_clk: 513 clk_disable_unprepare(exynos_pcie->clk); 514 return ret; 515} 516 517static int __exit exynos_pcie_remove(struct platform_device *pdev) 518{ 519 struct exynos_pcie *exynos_pcie = platform_get_drvdata(pdev); 520 521 clk_disable_unprepare(exynos_pcie->bus_clk); 522 clk_disable_unprepare(exynos_pcie->clk); 523 524 return 0; 525} 526 527static const struct of_device_id exynos_pcie_of_match[] = { 528 { .compatible = "samsung,exynos5440-pcie", }, 529 {}, 530}; 531MODULE_DEVICE_TABLE(of, exynos_pcie_of_match); 532 533static struct platform_driver exynos_pcie_driver = { 534 .remove = __exit_p(exynos_pcie_remove), 535 .driver = { 536 .name = "exynos-pcie", 537 .owner = THIS_MODULE, 538 .of_match_table = of_match_ptr(exynos_pcie_of_match), 539 }, 540}; 541 542/* Exynos PCIe driver does not allow module unload */ 543 544static int __init pcie_init(void) 545{ 546 return platform_driver_probe(&exynos_pcie_driver, exynos_pcie_probe); 547} 548subsys_initcall(pcie_init); 549 550MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>"); 551MODULE_DESCRIPTION("Samsung PCIe host controller driver"); 552MODULE_LICENSE("GPL v2");