linux/drivers/platform/x86/intel_pmc_core_pltdrv.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2
   3/*
   4 * Intel PMC Core platform init
   5 * Copyright (c) 2019, Google Inc.
   6 * Author - Rajat Jain
   7 *
   8 * This code instantiates platform devices for intel_pmc_core driver, only
   9 * on supported platforms that may not have the ACPI devices in the ACPI tables.
  10 * No new platforms should be added here, because we expect that new platforms
  11 * should all have the ACPI device, which is the preferred way of enumeration.
  12 */
  13
  14#include <linux/acpi.h>
  15#include <linux/module.h>
  16#include <linux/platform_device.h>
  17
  18#include <asm/cpu_device_id.h>
  19#include <asm/intel-family.h>
  20
  21static struct platform_device pmc_core_device = {
  22        .name = "intel_pmc_core",
  23};
  24
  25/*
  26 * intel_pmc_core_platform_ids is the list of platforms where we want to
  27 * instantiate the platform_device if not already instantiated. This is
  28 * different than intel_pmc_core_ids in intel_pmc_core.c which is the
  29 * list of platforms that the driver supports for pmc_core device. The
  30 * other list may grow, but this list should not.
  31 */
  32static const struct x86_cpu_id intel_pmc_core_platform_ids[] = {
  33        INTEL_CPU_FAM6(SKYLAKE_MOBILE, pmc_core_device),
  34        INTEL_CPU_FAM6(SKYLAKE_DESKTOP, pmc_core_device),
  35        INTEL_CPU_FAM6(KABYLAKE_MOBILE, pmc_core_device),
  36        INTEL_CPU_FAM6(KABYLAKE_DESKTOP, pmc_core_device),
  37        INTEL_CPU_FAM6(CANNONLAKE_MOBILE, pmc_core_device),
  38        INTEL_CPU_FAM6(ICELAKE_MOBILE, pmc_core_device),
  39        {}
  40};
  41MODULE_DEVICE_TABLE(x86cpu, intel_pmc_core_platform_ids);
  42
  43static int __init pmc_core_platform_init(void)
  44{
  45        /* Skip creating the platform device if ACPI already has a device */
  46        if (acpi_dev_present("INT33A1", NULL, -1))
  47                return -ENODEV;
  48
  49        if (!x86_match_cpu(intel_pmc_core_platform_ids))
  50                return -ENODEV;
  51
  52        return platform_device_register(&pmc_core_device);
  53}
  54
  55static void __exit pmc_core_platform_exit(void)
  56{
  57        platform_device_unregister(&pmc_core_device);
  58}
  59
  60module_init(pmc_core_platform_init);
  61module_exit(pmc_core_platform_exit);
  62MODULE_LICENSE("GPL v2");
  63