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