Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  pcie-iproc-bcma.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (C) 2015 Broadcom Corporation
 * Copyright (C) 2015 Hauke Mehrtens <hauke@hauke-m.de>
 */


#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/phy/phy.h>
#include <linux/bcma/bcma.h>
#include <linux/ioport.h>

#include "pcie-iproc.h"


/* NS: CLASS field is R/O, and set to wrong 0x200 value */
static void bcma_pcie2_fixup_class(struct pci_dev *dev)
{
 dev->class = PCI_CLASS_BRIDGE_PCI_NORMAL;
}
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x8011, bcma_pcie2_fixup_class);
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x8012, bcma_pcie2_fixup_class);

static int iproc_bcma_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
 struct iproc_pcie *pcie = dev->sysdata;
 struct bcma_device *bdev = container_of(pcie->dev, struct bcma_device, dev);

 return bcma_core_irq(bdev, 5);
}

static int iproc_bcma_pcie_probe(struct bcma_device *bdev)
{
 struct device *dev = &bdev->dev;
 struct iproc_pcie *pcie;
 struct pci_host_bridge *bridge;
 int ret;

 bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
 if (!bridge)
  return -ENOMEM;

 pcie = pci_host_bridge_priv(bridge);

 pcie->dev = dev;

 pcie->type = IPROC_PCIE_PAXB_BCMA;
 pcie->base = bdev->io_addr;
 if (!pcie->base) {
  dev_err(dev, "no controller registers\n");
  return -ENOMEM;
 }

 pcie->base_addr = bdev->addr;

 pcie->mem.start = bdev->addr_s[0];
 pcie->mem.end = bdev->addr_s[0] + SZ_128M - 1;
 pcie->mem.name = "PCIe MEM space";
 pcie->mem.flags = IORESOURCE_MEM;
 pci_add_resource(&bridge->windows, &pcie->mem);
 ret = devm_request_pci_bus_resources(dev, &bridge->windows);
 if (ret)
  return ret;

 pcie->map_irq = iproc_bcma_pcie_map_irq;

 bcma_set_drvdata(bdev, pcie);

 return iproc_pcie_setup(pcie, &bridge->windows);
}

static void iproc_bcma_pcie_remove(struct bcma_device *bdev)
{
 struct iproc_pcie *pcie = bcma_get_drvdata(bdev);

 iproc_pcie_remove(pcie);
}

static const struct bcma_device_id iproc_bcma_pcie_table[] = {
 BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_NS_PCIEG2, BCMA_ANY_REV, BCMA_ANY_CLASS),
 {},
};
MODULE_DEVICE_TABLE(bcma, iproc_bcma_pcie_table);

static struct bcma_driver iproc_bcma_pcie_driver = {
 .name  = KBUILD_MODNAME,
 .id_table = iproc_bcma_pcie_table,
 .probe  = iproc_bcma_pcie_probe,
 .remove  = iproc_bcma_pcie_remove,
};
module_bcma_driver(iproc_bcma_pcie_driver);

MODULE_AUTHOR("Hauke Mehrtens");
MODULE_DESCRIPTION("Broadcom iProc PCIe BCMA driver");
MODULE_LICENSE("GPL v2");

Messung V0.5
C=97 H=100 G=98

¤ Dauer der Verarbeitung: 0.12 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge