12b0b16d3SAlexander Shishkin /* 22b0b16d3SAlexander Shishkin * Intel(R) Trace Hub pci driver 32b0b16d3SAlexander Shishkin * 42b0b16d3SAlexander Shishkin * Copyright (C) 2014-2015 Intel Corporation. 52b0b16d3SAlexander Shishkin * 62b0b16d3SAlexander Shishkin * This program is free software; you can redistribute it and/or modify it 72b0b16d3SAlexander Shishkin * under the terms and conditions of the GNU General Public License, 82b0b16d3SAlexander Shishkin * version 2, as published by the Free Software Foundation. 92b0b16d3SAlexander Shishkin * 102b0b16d3SAlexander Shishkin * This program is distributed in the hope it will be useful, but WITHOUT 112b0b16d3SAlexander Shishkin * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 122b0b16d3SAlexander Shishkin * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 132b0b16d3SAlexander Shishkin * more details. 142b0b16d3SAlexander Shishkin */ 152b0b16d3SAlexander Shishkin 162b0b16d3SAlexander Shishkin #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 172b0b16d3SAlexander Shishkin 182b0b16d3SAlexander Shishkin #include <linux/types.h> 192b0b16d3SAlexander Shishkin #include <linux/module.h> 202b0b16d3SAlexander Shishkin #include <linux/device.h> 212b0b16d3SAlexander Shishkin #include <linux/sysfs.h> 222b0b16d3SAlexander Shishkin #include <linux/pci.h> 232b0b16d3SAlexander Shishkin 242b0b16d3SAlexander Shishkin #include "intel_th.h" 252b0b16d3SAlexander Shishkin 262b0b16d3SAlexander Shishkin #define DRIVER_NAME "intel_th_pci" 272b0b16d3SAlexander Shishkin 282b0b16d3SAlexander Shishkin #define BAR_MASK (BIT(TH_MMIO_CONFIG) | BIT(TH_MMIO_SW)) 292b0b16d3SAlexander Shishkin 302b0b16d3SAlexander Shishkin static int intel_th_pci_probe(struct pci_dev *pdev, 312b0b16d3SAlexander Shishkin const struct pci_device_id *id) 322b0b16d3SAlexander Shishkin { 332b0b16d3SAlexander Shishkin struct intel_th *th; 342b0b16d3SAlexander Shishkin int err; 352b0b16d3SAlexander Shishkin 362b0b16d3SAlexander Shishkin err = pcim_enable_device(pdev); 372b0b16d3SAlexander Shishkin if (err) 382b0b16d3SAlexander Shishkin return err; 392b0b16d3SAlexander Shishkin 402b0b16d3SAlexander Shishkin err = pcim_iomap_regions_request_all(pdev, BAR_MASK, DRIVER_NAME); 412b0b16d3SAlexander Shishkin if (err) 422b0b16d3SAlexander Shishkin return err; 432b0b16d3SAlexander Shishkin 442b0b16d3SAlexander Shishkin th = intel_th_alloc(&pdev->dev, pdev->resource, 452b0b16d3SAlexander Shishkin DEVICE_COUNT_RESOURCE, pdev->irq); 462b0b16d3SAlexander Shishkin if (IS_ERR(th)) 472b0b16d3SAlexander Shishkin return PTR_ERR(th); 482b0b16d3SAlexander Shishkin 492b0b16d3SAlexander Shishkin return 0; 502b0b16d3SAlexander Shishkin } 512b0b16d3SAlexander Shishkin 522b0b16d3SAlexander Shishkin static void intel_th_pci_remove(struct pci_dev *pdev) 532b0b16d3SAlexander Shishkin { 542b0b16d3SAlexander Shishkin struct intel_th *th = pci_get_drvdata(pdev); 552b0b16d3SAlexander Shishkin 562b0b16d3SAlexander Shishkin intel_th_free(th); 572b0b16d3SAlexander Shishkin } 582b0b16d3SAlexander Shishkin 592b0b16d3SAlexander Shishkin static const struct pci_device_id intel_th_pci_id_table[] = { 602b0b16d3SAlexander Shishkin { 612b0b16d3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9d26), 622b0b16d3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 632b0b16d3SAlexander Shishkin }, 642b0b16d3SAlexander Shishkin { 652b0b16d3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa126), 662b0b16d3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 672b0b16d3SAlexander Shishkin }, 686396b912SAlexander Shishkin { 696396b912SAlexander Shishkin /* Apollo Lake */ 706396b912SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a8e), 716396b912SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 726396b912SAlexander Shishkin }, 733f040887SAlexander Shishkin { 743f040887SAlexander Shishkin /* Broxton */ 753f040887SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0a80), 763f040887SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 773f040887SAlexander Shishkin }, 78aaa3ca82SAlexander Shishkin { 79aaa3ca82SAlexander Shishkin /* Broxton B-step */ 80aaa3ca82SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1a8e), 81aaa3ca82SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 82aaa3ca82SAlexander Shishkin }, 837a1a47ceSAlexander Shishkin { 847a1a47ceSAlexander Shishkin /* Kaby Lake PCH-H */ 857a1a47ceSAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa2a6), 867a1a47ceSAlexander Shishkin .driver_data = (kernel_ulong_t)0, 877a1a47ceSAlexander Shishkin }, 88*5118ccd3SAlexander Shishkin { 89*5118ccd3SAlexander Shishkin /* Denverton */ 90*5118ccd3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x19e1), 91*5118ccd3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 92*5118ccd3SAlexander Shishkin }, 932b0b16d3SAlexander Shishkin { 0 }, 942b0b16d3SAlexander Shishkin }; 952b0b16d3SAlexander Shishkin 962b0b16d3SAlexander Shishkin MODULE_DEVICE_TABLE(pci, intel_th_pci_id_table); 972b0b16d3SAlexander Shishkin 982b0b16d3SAlexander Shishkin static struct pci_driver intel_th_pci_driver = { 992b0b16d3SAlexander Shishkin .name = DRIVER_NAME, 1002b0b16d3SAlexander Shishkin .id_table = intel_th_pci_id_table, 1012b0b16d3SAlexander Shishkin .probe = intel_th_pci_probe, 1022b0b16d3SAlexander Shishkin .remove = intel_th_pci_remove, 1032b0b16d3SAlexander Shishkin }; 1042b0b16d3SAlexander Shishkin 1052b0b16d3SAlexander Shishkin module_pci_driver(intel_th_pci_driver); 1062b0b16d3SAlexander Shishkin 1072b0b16d3SAlexander Shishkin MODULE_LICENSE("GPL v2"); 1082b0b16d3SAlexander Shishkin MODULE_DESCRIPTION("Intel(R) Trace Hub PCI controller driver"); 1092b0b16d3SAlexander Shishkin MODULE_AUTHOR("Alexander Shishkin <alexander.shishkin@intel.com>"); 110