1*2b0b16d3SAlexander Shishkin /* 2*2b0b16d3SAlexander Shishkin * Intel(R) Trace Hub pci driver 3*2b0b16d3SAlexander Shishkin * 4*2b0b16d3SAlexander Shishkin * Copyright (C) 2014-2015 Intel Corporation. 5*2b0b16d3SAlexander Shishkin * 6*2b0b16d3SAlexander Shishkin * This program is free software; you can redistribute it and/or modify it 7*2b0b16d3SAlexander Shishkin * under the terms and conditions of the GNU General Public License, 8*2b0b16d3SAlexander Shishkin * version 2, as published by the Free Software Foundation. 9*2b0b16d3SAlexander Shishkin * 10*2b0b16d3SAlexander Shishkin * This program is distributed in the hope it will be useful, but WITHOUT 11*2b0b16d3SAlexander Shishkin * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12*2b0b16d3SAlexander Shishkin * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13*2b0b16d3SAlexander Shishkin * more details. 14*2b0b16d3SAlexander Shishkin */ 15*2b0b16d3SAlexander Shishkin 16*2b0b16d3SAlexander Shishkin #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 17*2b0b16d3SAlexander Shishkin 18*2b0b16d3SAlexander Shishkin #include <linux/types.h> 19*2b0b16d3SAlexander Shishkin #include <linux/module.h> 20*2b0b16d3SAlexander Shishkin #include <linux/device.h> 21*2b0b16d3SAlexander Shishkin #include <linux/sysfs.h> 22*2b0b16d3SAlexander Shishkin #include <linux/pci.h> 23*2b0b16d3SAlexander Shishkin 24*2b0b16d3SAlexander Shishkin #include "intel_th.h" 25*2b0b16d3SAlexander Shishkin 26*2b0b16d3SAlexander Shishkin #define DRIVER_NAME "intel_th_pci" 27*2b0b16d3SAlexander Shishkin 28*2b0b16d3SAlexander Shishkin #define BAR_MASK (BIT(TH_MMIO_CONFIG) | BIT(TH_MMIO_SW)) 29*2b0b16d3SAlexander Shishkin 30*2b0b16d3SAlexander Shishkin static int intel_th_pci_probe(struct pci_dev *pdev, 31*2b0b16d3SAlexander Shishkin const struct pci_device_id *id) 32*2b0b16d3SAlexander Shishkin { 33*2b0b16d3SAlexander Shishkin struct intel_th *th; 34*2b0b16d3SAlexander Shishkin int err; 35*2b0b16d3SAlexander Shishkin 36*2b0b16d3SAlexander Shishkin err = pcim_enable_device(pdev); 37*2b0b16d3SAlexander Shishkin if (err) 38*2b0b16d3SAlexander Shishkin return err; 39*2b0b16d3SAlexander Shishkin 40*2b0b16d3SAlexander Shishkin err = pcim_iomap_regions_request_all(pdev, BAR_MASK, DRIVER_NAME); 41*2b0b16d3SAlexander Shishkin if (err) 42*2b0b16d3SAlexander Shishkin return err; 43*2b0b16d3SAlexander Shishkin 44*2b0b16d3SAlexander Shishkin th = intel_th_alloc(&pdev->dev, pdev->resource, 45*2b0b16d3SAlexander Shishkin DEVICE_COUNT_RESOURCE, pdev->irq); 46*2b0b16d3SAlexander Shishkin if (IS_ERR(th)) 47*2b0b16d3SAlexander Shishkin return PTR_ERR(th); 48*2b0b16d3SAlexander Shishkin 49*2b0b16d3SAlexander Shishkin pci_set_drvdata(pdev, th); 50*2b0b16d3SAlexander Shishkin 51*2b0b16d3SAlexander Shishkin return 0; 52*2b0b16d3SAlexander Shishkin } 53*2b0b16d3SAlexander Shishkin 54*2b0b16d3SAlexander Shishkin static void intel_th_pci_remove(struct pci_dev *pdev) 55*2b0b16d3SAlexander Shishkin { 56*2b0b16d3SAlexander Shishkin struct intel_th *th = pci_get_drvdata(pdev); 57*2b0b16d3SAlexander Shishkin 58*2b0b16d3SAlexander Shishkin intel_th_free(th); 59*2b0b16d3SAlexander Shishkin } 60*2b0b16d3SAlexander Shishkin 61*2b0b16d3SAlexander Shishkin static const struct pci_device_id intel_th_pci_id_table[] = { 62*2b0b16d3SAlexander Shishkin { 63*2b0b16d3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9d26), 64*2b0b16d3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 65*2b0b16d3SAlexander Shishkin }, 66*2b0b16d3SAlexander Shishkin { 67*2b0b16d3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa126), 68*2b0b16d3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 69*2b0b16d3SAlexander Shishkin }, 70*2b0b16d3SAlexander Shishkin { 0 }, 71*2b0b16d3SAlexander Shishkin }; 72*2b0b16d3SAlexander Shishkin 73*2b0b16d3SAlexander Shishkin MODULE_DEVICE_TABLE(pci, intel_th_pci_id_table); 74*2b0b16d3SAlexander Shishkin 75*2b0b16d3SAlexander Shishkin static struct pci_driver intel_th_pci_driver = { 76*2b0b16d3SAlexander Shishkin .name = DRIVER_NAME, 77*2b0b16d3SAlexander Shishkin .id_table = intel_th_pci_id_table, 78*2b0b16d3SAlexander Shishkin .probe = intel_th_pci_probe, 79*2b0b16d3SAlexander Shishkin .remove = intel_th_pci_remove, 80*2b0b16d3SAlexander Shishkin }; 81*2b0b16d3SAlexander Shishkin 82*2b0b16d3SAlexander Shishkin module_pci_driver(intel_th_pci_driver); 83*2b0b16d3SAlexander Shishkin 84*2b0b16d3SAlexander Shishkin MODULE_LICENSE("GPL v2"); 85*2b0b16d3SAlexander Shishkin MODULE_DESCRIPTION("Intel(R) Trace Hub PCI controller driver"); 86*2b0b16d3SAlexander Shishkin MODULE_AUTHOR("Alexander Shishkin <alexander.shishkin@intel.com>"); 87