#include #include #include #include #include #include #include "pci-rtl86xx.h" #ifdef CONFIG_GENERIC_RTL86XX_PCIE_SLOT0 static struct resource rtl86xx_pcie0_io_resource = { .name = "RTL86xx PCIe0 IO", .flags = IORESOURCE_IO, .start = PADDR(BSP_PCIE0_D_IO), .end = PADDR(BSP_PCIE0_D_IO + 0xFFFF) }; static struct resource rtl86xx_pcie0_mem_resource = { .name = "RTL86xx PCIe0 MEM", .flags = IORESOURCE_MEM, .start = PADDR(BSP_PCIE0_D_MEM), .end = PADDR(BSP_PCIE0_D_MEM + 0xFFFFFF) }; #endif #ifdef CONFIG_GENERIC_RTL86XX_PCIE_SLOT1 static struct resource rtl86xx_pcie1_io_resource = { .name = "RTL86xx PCIe1 IO", .flags = IORESOURCE_IO, .start = PADDR(BSP_PCIE1_D_IO), .end = PADDR(BSP_PCIE1_D_IO + 0xFFFF) }; static struct resource rtl86xx_pcie1_mem_resource = { .name = "RTL86xx PCIe1 MEM", .flags = IORESOURCE_MEM, .start = PADDR(BSP_PCIE1_D_MEM), .end = PADDR(BSP_PCIE1_D_MEM + 0xFFFFFF) }; #endif #ifdef CONFIG_GENERIC_RTL86XX_PCIE_SLOT0 extern struct pci_ops rtl86xx_pcie0_ops; #endif #ifdef CONFIG_GENERIC_RTL86XX_PCIE_SLOT1 extern struct pci_ops rtl86xx_pcie1_ops; #endif struct pcie_para rtl86xx_ePHY[][29] = { { {0, 1, 0x0003}, {0, 2, 0x2d18}, {0, 3, 0x4d09}, {0, 4, 0x5c3f}, {0, 0, 0x1046}, {0, 6, 0x9048}, {0, 5, 0x2213}, {0, 7, 0x31ff}, {0, 8, 0x18d7}, {0, 9, 0x539c}, {0, 0xa, 0x00e8}, {0, 0xb, 0x0711}, {0, 0xc, 0x0828}, {0, 0xd, 0x17a6}, {0, 0xe, 0x98c5}, {0, 0xf, 0x0f0f}, {0, 0x10, 0x000c}, {0, 0x11, 0x3c00}, {0, 0x12, 0xfc00}, {0, 0x13, 0x0c81}, {0, 0x14, 0xde01}, {0, 0x19, 0xfce0}, {0, 0x1a, 0x7c00}, {0, 0x1b, 0xfc00}, {0, 0x1c, 0xfc00}, {0, 0x1d, 0xa0eb}, {0, 0x1e, 0xc280}, {0, 0x1f, 0x0600}, {0xff,0xff,0xffff}}, //8676 35.328M clk { {0, 1, 0x0003}, {0, 2, 0x2d18}, {0, 3, 0x4d09}, {0, 4, 0x5000}, {0, 0, 0x1047}, {0, 6, 0x9148}, {0, 5, 0x23cb}, {0, 7, 0x31ff}, {0, 8, 0x18d7}, {0, 9, 0x539c}, {0, 0xa, 0x00e8}, {0, 0xb, 0x0711}, {0, 0xc, 0x0828}, {0, 0xd, 0x17a6}, {0, 0xe, 0x98c5}, {0, 0xf, 0x0f0f}, {0, 0x10, 0x000c}, {0, 0x11, 0x3c00}, {0, 0x12, 0xfc00}, {0, 0x13, 0x0c81}, {0, 0x14, 0xde01}, {0, 0x19, 0xfce0}, {0, 0x1a, 0x7c00}, {0, 0x1b, 0xfc00}, {0, 0x1c, 0xfc00}, {0, 0x1d, 0xa0eb}, {0, 0x1e, 0xc280}, {0, 0x1f, 0x0600}, {0xff,0xff,0xffff}}, //8676 40M clk { {0, 0, 0x1086}, {0, 4, 0x5800}, {0, 5, 0x05d3}, {0, 6, 0xf048}, {0, 0xb, 0x0711}, {0, 0xd, 0x1766}, {0, 0xf, 0x0a00}, {0, 0x1d, 0xa0eb}, {0xff,0xff,0xffff}},//8686 40M clk { {0, 6, 0xf848}, {0, 0xb, 0x0711}, {0, 0xd, 0x1766}, {0, 0xf, 0x0a00}, {0, 0x01d, 0xa0eb}, {1, 6, 0xf848}, {1, 0xb, 0x0711}, {1, 0xd, 0x1766}, {1, 0xf, 0x0a00}, {1, 0x01d, 0xa0eb}, {0xff,0xff,0xffff}},//8686 25M clk { {0, 1, 0x0002}, {0, 2, 0x4300}, {0, 3, 0x0400}, {0, 4, 0x4644}, {0, 0, 0x0000}, {0, 6, 0x30c0}, {0, 5, 0x8101}, {0, 7, 0x7440}, {0, 8, 0x901c}, {0, 9, 0x0c9c}, {0, 0xa, 0x4037}, {0, 0xb, 0x2bb0}, //{0, 0xc, 0x0261}, {0xff,0xff,0xffff}}, //8676S 35.328M clk { {0, 1, 0x0002}, {0, 2, 0x4300}, {0, 3, 0x0400}, {0, 4, 0x4644}, {0, 0, 0x0000}, {0, 6, 0x30c0}, {0, 5, 0x8101}, {0, 7, 0x7440}, {0, 8, 0x901c}, {0, 9, 0x0c9c}, {0, 0xa, 0x4037}, {0, 0xb, 0x2bb0}, //{0, 0xc, 0x0261}, {0xff,0xff,0xffff}}, //8676S 40M clk { {0, 1, 0x06a3}, {0, 2, 0x4300}, {0, 3, 0x0400}, {0, 4, 0xd546}, {0, 0, 0x0000}, {0, 6, 0xb880}, {0, 5, 0x8101}, {0, 7, 0x7c40}, {0, 8, 0x901c}, {0, 9, 0x0c9c}, {0, 0xa, 0x4037}, {0, 0xb, 0x03b0}, {0, 0xc, 0x0261}, {0xff,0xff,0xffff}}, //0562 35.328M clk { {0, 1, 0x06a3}, {0, 2, 0x4300}, {0, 3, 0x0400}, {0, 4, 0xd546}, {0, 0, 0x0000}, {0, 6, 0xb880}, {0, 5, 0x8101}, {0, 7, 0x7c40}, {0, 8, 0x901c}, {0, 9, 0x0c9c}, {0, 0xa, 0x4037}, {0, 0xb, 0x03b0}, {0, 0xc, 0x0261}, {0xff,0xff,0xffff}}, //0562 40M clk { {0, 0, 0x404c}, {0, 1, 0x16a3}, {0, 2, 0x6340}, {0, 3, 0x370d}, {0, 4, 0x856a}, {0, 5, 0x8109}, {0, 6, 0x6081}, {0, 7, 0x5400}, {0, 8, 0x9000}, {0, 9, 0x0ccc}, {0, 0xa, 0x4437}, {0, 0xb, 0x0230}, {0, 0xc, 0x0021}, {0, 0xd, 0x0000}, {0, 0xe, 0x0000}, {0, 0x1f, 0x0000}, {0xff,0xff,0xffff}}, //8685 25M clk { {1, 0, 0x404c}, {1, 1, 0x16a3}, {1, 2, 0x6340}, {1, 3, 0x370d}, {1, 4, 0x856a}, {1, 5, 0x8109}, {1, 6, 0x6081}, {1, 7, 0x5400}, {1, 8, 0x9000}, {1, 9, 0x0ccc}, {1, 0xa, 0x4437}, {1, 0xb, 0x0230}, {1, 0xc, 0x0021}, {1, 0xd, 0x0000}, {1, 0xe, 0x0000}, {1, 0x1f, 0x0000}, {0xff,0xff,0xffff}} //8685 25M clk }; void rtl86xx_setmdio(unsigned int port_num , unsigned int reg_addr, unsigned short val) { //HOST PCIE #define PCIE0_RC_EXT_BASE (0xb8b01000) #define PCIE1_RC_EXT_BASE (0xb8b21000) //RC Extended register #define PCIE0_MDIO (PCIE0_RC_EXT_BASE+0x00) #define PCIE1_MDIO (PCIE1_RC_EXT_BASE+0x00) //MDIO #define PCIE_MDIO_DATA_OFFSET (16) #define PCIE_MDIO_DATA_MASK (0xffff <Bus->Number: %d\n", slot,pin,dev->bus->number); if (dev->bus->number < 2) return BSP_PCIE0_IRQ; else return BSP_PCIE1_IRQ; } /* Do platform specific device initialization at pci_enable_device() time */ int pcibios_plat_dev_init(struct pci_dev *dev) { return 0; } static __init int rtl86xx_pcie_init(void) { #ifdef CONFIG_GENERIC_RTL86XX_PCIE_SLOT0 if(rtl86xx_PCIE_reset_procedure(0,0,1,0xb9000000)) { printk("PCIe 0 reset failed\n"); return 0; } printk("<<<<>>>>\n"); register_pci_controller(&rtl86xx_pcie0_controller); #endif #ifdef CONFIG_GENERIC_RTL86XX_PCIE_SLOT1 #ifndef CONFIG_GENERIC_RTL86XX_PCIE_SLOT0 if(rtl86xx_PCIE_reset_procedure(1,0,1,0xba000000)) #else if(rtl86xx_PCIE_reset_procedure(1,0,0,0xba000000)) #endif { printk("PCIe 1 reset failed\n"); return 0; } printk("<<<<>>>>\n"); register_pci_controller(&rtl86xx_pcie1_controller); #endif return 0; } arch_initcall(rtl86xx_pcie_init);