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 }, 78*aaa3ca82SAlexander Shishkin { 79*aaa3ca82SAlexander Shishkin /* Broxton B-step */ 80*aaa3ca82SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1a8e), 81*aaa3ca82SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 82*aaa3ca82SAlexander Shishkin }, 832b0b16d3SAlexander Shishkin { 0 }, 842b0b16d3SAlexander Shishkin }; 852b0b16d3SAlexander Shishkin 862b0b16d3SAlexander Shishkin MODULE_DEVICE_TABLE(pci, intel_th_pci_id_table); 872b0b16d3SAlexander Shishkin 882b0b16d3SAlexander Shishkin static struct pci_driver intel_th_pci_driver = { 892b0b16d3SAlexander Shishkin .name = DRIVER_NAME, 902b0b16d3SAlexander Shishkin .id_table = intel_th_pci_id_table, 912b0b16d3SAlexander Shishkin .probe = intel_th_pci_probe, 922b0b16d3SAlexander Shishkin .remove = intel_th_pci_remove, 932b0b16d3SAlexander Shishkin }; 942b0b16d3SAlexander Shishkin 952b0b16d3SAlexander Shishkin module_pci_driver(intel_th_pci_driver); 962b0b16d3SAlexander Shishkin 972b0b16d3SAlexander Shishkin MODULE_LICENSE("GPL v2"); 982b0b16d3SAlexander Shishkin MODULE_DESCRIPTION("Intel(R) Trace Hub PCI controller driver"); 992b0b16d3SAlexander Shishkin MODULE_AUTHOR("Alexander Shishkin <alexander.shishkin@intel.com>"); 100