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 pci_set_drvdata(pdev, th); 502b0b16d3SAlexander Shishkin 512b0b16d3SAlexander Shishkin return 0; 522b0b16d3SAlexander Shishkin } 532b0b16d3SAlexander Shishkin 542b0b16d3SAlexander Shishkin static void intel_th_pci_remove(struct pci_dev *pdev) 552b0b16d3SAlexander Shishkin { 562b0b16d3SAlexander Shishkin struct intel_th *th = pci_get_drvdata(pdev); 572b0b16d3SAlexander Shishkin 582b0b16d3SAlexander Shishkin intel_th_free(th); 592b0b16d3SAlexander Shishkin } 602b0b16d3SAlexander Shishkin 612b0b16d3SAlexander Shishkin static const struct pci_device_id intel_th_pci_id_table[] = { 622b0b16d3SAlexander Shishkin { 632b0b16d3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9d26), 642b0b16d3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 652b0b16d3SAlexander Shishkin }, 662b0b16d3SAlexander Shishkin { 672b0b16d3SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa126), 682b0b16d3SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 692b0b16d3SAlexander Shishkin }, 706396b912SAlexander Shishkin { 716396b912SAlexander Shishkin /* Apollo Lake */ 726396b912SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x5a8e), 736396b912SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 746396b912SAlexander Shishkin }, 75*3f040887SAlexander Shishkin { 76*3f040887SAlexander Shishkin /* Broxton */ 77*3f040887SAlexander Shishkin PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0a80), 78*3f040887SAlexander Shishkin .driver_data = (kernel_ulong_t)0, 79*3f040887SAlexander Shishkin }, 802b0b16d3SAlexander Shishkin { 0 }, 812b0b16d3SAlexander Shishkin }; 822b0b16d3SAlexander Shishkin 832b0b16d3SAlexander Shishkin MODULE_DEVICE_TABLE(pci, intel_th_pci_id_table); 842b0b16d3SAlexander Shishkin 852b0b16d3SAlexander Shishkin static struct pci_driver intel_th_pci_driver = { 862b0b16d3SAlexander Shishkin .name = DRIVER_NAME, 872b0b16d3SAlexander Shishkin .id_table = intel_th_pci_id_table, 882b0b16d3SAlexander Shishkin .probe = intel_th_pci_probe, 892b0b16d3SAlexander Shishkin .remove = intel_th_pci_remove, 902b0b16d3SAlexander Shishkin }; 912b0b16d3SAlexander Shishkin 922b0b16d3SAlexander Shishkin module_pci_driver(intel_th_pci_driver); 932b0b16d3SAlexander Shishkin 942b0b16d3SAlexander Shishkin MODULE_LICENSE("GPL v2"); 952b0b16d3SAlexander Shishkin MODULE_DESCRIPTION("Intel(R) Trace Hub PCI controller driver"); 962b0b16d3SAlexander Shishkin MODULE_AUTHOR("Alexander Shishkin <alexander.shishkin@intel.com>"); 97