1/******************************************************************************
2**
3** FILE NAME    : ifxmips_fixup_pcie.c
4** PROJECT      : IFX UEIP for VRX200
5** MODULES      : PCIe
6**
7** DATE         : 02 Mar 2009
8** AUTHOR       : Lei Chuanhua
9** DESCRIPTION  : PCIe Root Complex Driver
10** COPYRIGHT    :       Copyright (c) 2009
11**                      Infineon Technologies AG
12**                      Am Campeon 1-12, 85579 Neubiberg, Germany
13**
14**    This program is free software; you can redistribute it and/or modify
15**    it under the terms of the GNU General Public License as published by
16**    the Free Software Foundation; either version 2 of the License, or
17**    (at your option) any later version.
18** HISTORY
19** $Version $Date        $Author         $Comment
20** 0.0.1    17 Mar,2009  Lei Chuanhua    Initial version
21*******************************************************************************/
22/*!
23 \file ifxmips_fixup_pcie.c
24 \ingroup IFX_PCIE
25 \brief PCIe Fixup functions source file
26*/
27#include <linux/pci.h>
28#include <linux/pci_regs.h>
29#include <linux/pci_ids.h>
30
31#include <lantiq_soc.h>
32
33#include "pcie-lantiq.h"
34
35#define PCI_VENDOR_ID_INFINEON         0x15D1
36#define PCI_DEVICE_ID_INFINEON_DANUBE  0x000F
37#define PCI_DEVICE_ID_INFINEON_PCIE    0x0011
38#define PCI_VENDOR_ID_LANTIQ        0x1BEF
39#define PCI_DEVICE_ID_LANTIQ_PCIE       0x0011
40
41
42
43static void __devinit
44ifx_pcie_fixup_resource(struct pci_dev *dev)
45{
46    u32 reg;
47
48    IFX_PCIE_PRINT(PCIE_MSG_FIXUP, "%s dev %s: enter\n", __func__, pci_name(dev));
49
50    IFX_PCIE_PRINT(PCIE_MSG_FIXUP, "%s: fixup host controller %s (%04x:%04x)\n",
51        __func__, pci_name(dev), dev->vendor, dev->device);
52
53   /* Setup COMMAND register */
54    reg = PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER /* |
55          PCI_COMMAND_INTX_DISABLE */| PCI_COMMAND_SERR;
56    pci_write_config_word(dev, PCI_COMMAND, reg);
57    IFX_PCIE_PRINT(PCIE_MSG_FIXUP, "%s dev %s: exit\n", __func__, pci_name(dev));
58}
59DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INFINEON, PCI_DEVICE_ID_INFINEON_PCIE, ifx_pcie_fixup_resource);
60DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LANTIQ, PCI_VENDOR_ID_LANTIQ, ifx_pcie_fixup_resource);
61
62static void __devinit
63ifx_pcie_rc_class_early_fixup(struct pci_dev *dev)
64{
65    IFX_PCIE_PRINT(PCIE_MSG_FIXUP, "%s dev %s: enter\n", __func__, pci_name(dev));
66
67    if (dev->devfn == PCI_DEVFN(0, 0) &&
68        (dev->class >> 8) == PCI_CLASS_BRIDGE_HOST) {
69
70        dev->class = (PCI_CLASS_BRIDGE_PCI << 8) | (dev->class & 0xff);
71
72        printk(KERN_INFO "%s: fixed pcie host bridge to pci-pci bridge\n", __func__);
73    }
74    IFX_PCIE_PRINT(PCIE_MSG_FIXUP, "%s dev %s: exit\n", __func__, pci_name(dev));
75}
76
77DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INFINEON, PCI_DEVICE_ID_INFINEON_PCIE,
78     ifx_pcie_rc_class_early_fixup);
79
80DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LANTIQ, PCI_DEVICE_ID_LANTIQ_PCIE,
81     ifx_pcie_rc_class_early_fixup);
82