| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * PCI driver for the Intel SCU. |
| * |
| * Copyright (C) 2008-2010, 2015, 2020 Intel Corporation |
| * Authors: Sreedhara DS (sreedhara.ds@intel.com) |
| * Mika Westerberg <mika.westerberg@linux.intel.com> |
| */ |
| |
| #include <linux/errno.h> |
| #include <linux/init.h> |
| #include <linux/pci.h> |
| |
| #include <asm/intel-mid.h> |
| #include <asm/intel_scu_ipc.h> |
| |
| static int intel_scu_pci_probe(struct pci_dev *pdev, |
| const struct pci_device_id *id) |
| { |
| void (*setup_fn)(void) = (void (*)(void))id->driver_data; |
| struct intel_scu_ipc_data scu_data = {}; |
| struct intel_scu_ipc_dev *scu; |
| int ret; |
| |
| ret = pcim_enable_device(pdev); |
| if (ret) |
| return ret; |
| |
| scu_data.mem = pdev->resource[0]; |
| scu_data.irq = pdev->irq; |
| |
| scu = intel_scu_ipc_register(&pdev->dev, &scu_data); |
| if (IS_ERR(scu)) |
| return PTR_ERR(scu); |
| |
| if (setup_fn) |
| setup_fn(); |
| return 0; |
| } |
| |
| static void intel_mid_scu_setup(void) |
| { |
| intel_scu_devices_create(); |
| } |
| |
| static const struct pci_device_id pci_ids[] = { |
| { PCI_VDEVICE(INTEL, 0x080e), |
| .driver_data = (kernel_ulong_t)intel_mid_scu_setup }, |
| { PCI_VDEVICE(INTEL, 0x08ea), |
| .driver_data = (kernel_ulong_t)intel_mid_scu_setup }, |
| { PCI_VDEVICE(INTEL, 0x0a94) }, |
| { PCI_VDEVICE(INTEL, 0x11a0), |
| .driver_data = (kernel_ulong_t)intel_mid_scu_setup }, |
| { PCI_VDEVICE(INTEL, 0x1a94) }, |
| { PCI_VDEVICE(INTEL, 0x5a94) }, |
| {} |
| }; |
| |
| static struct pci_driver intel_scu_pci_driver = { |
| .driver = { |
| .suppress_bind_attrs = true, |
| }, |
| .name = "intel_scu", |
| .id_table = pci_ids, |
| .probe = intel_scu_pci_probe, |
| }; |
| |
| builtin_pci_driver(intel_scu_pci_driver); |