diff options
Diffstat (limited to 'drivers/pci/controller/pcie-mediatek.c')
| -rw-r--r-- | drivers/pci/controller/pcie-mediatek.c | 20 | 
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c index 80601e1b939e..626a7c352dfd 100644 --- a/drivers/pci/controller/pcie-mediatek.c +++ b/drivers/pci/controller/pcie-mediatek.c @@ -73,6 +73,7 @@  #define PCIE_MSI_VECTOR		0x0c0  #define PCIE_CONF_VEND_ID	0x100 +#define PCIE_CONF_DEVICE_ID	0x102  #define PCIE_CONF_CLASS_ID	0x106  #define PCIE_INT_MASK		0x420 @@ -141,12 +142,16 @@ struct mtk_pcie_port;  /**   * struct mtk_pcie_soc - differentiate between host generations   * @need_fix_class_id: whether this host's class ID needed to be fixed or not + * @need_fix_device_id: whether this host's device ID needed to be fixed or not + * @device_id: device ID which this host need to be fixed   * @ops: pointer to configuration access functions   * @startup: pointer to controller setting functions   * @setup_irq: pointer to initialize IRQ functions   */  struct mtk_pcie_soc {  	bool need_fix_class_id; +	bool need_fix_device_id; +	unsigned int device_id;  	struct pci_ops *ops;  	int (*startup)(struct mtk_pcie_port *port);  	int (*setup_irq)(struct mtk_pcie_port *port, struct device_node *node); @@ -630,8 +635,6 @@ static void mtk_pcie_intr_handler(struct irq_desc *desc)  	}  	chained_irq_exit(irqchip, desc); - -	return;  }  static int mtk_pcie_setup_irq(struct mtk_pcie_port *port, @@ -696,6 +699,9 @@ static int mtk_pcie_startup_port_v2(struct mtk_pcie_port *port)  		writew(val, port->base + PCIE_CONF_CLASS_ID);  	} +	if (soc->need_fix_device_id) +		writew(soc->device_id, port->base + PCIE_CONF_DEVICE_ID); +  	/* 100ms timeout value should be enough for Gen1/2 training */  	err = readl_poll_timeout(port->base + PCIE_LINK_STATUS_V2, val,  				 !!(val & PCIE_PORT_LINKUP_V2), 20, @@ -1216,11 +1222,21 @@ static const struct mtk_pcie_soc mtk_pcie_soc_mt7622 = {  	.setup_irq = mtk_pcie_setup_irq,  }; +static const struct mtk_pcie_soc mtk_pcie_soc_mt7629 = { +	.need_fix_class_id = true, +	.need_fix_device_id = true, +	.device_id = PCI_DEVICE_ID_MEDIATEK_7629, +	.ops = &mtk_pcie_ops_v2, +	.startup = mtk_pcie_startup_port_v2, +	.setup_irq = mtk_pcie_setup_irq, +}; +  static const struct of_device_id mtk_pcie_ids[] = {  	{ .compatible = "mediatek,mt2701-pcie", .data = &mtk_pcie_soc_v1 },  	{ .compatible = "mediatek,mt7623-pcie", .data = &mtk_pcie_soc_v1 },  	{ .compatible = "mediatek,mt2712-pcie", .data = &mtk_pcie_soc_mt2712 },  	{ .compatible = "mediatek,mt7622-pcie", .data = &mtk_pcie_soc_mt7622 }, +	{ .compatible = "mediatek,mt7629-pcie", .data = &mtk_pcie_soc_mt7629 },  	{},  };  |