Commit 7a61f05e authored by Mika Westerberg's avatar Mika Westerberg Committed by Andy Shevchenko
Browse files

platform/x86: Add Elkhart Lake SCU/PMC support



Intel Elkhart Lake exposes SCU/PMC as an ACPI device that only supports
IPC functionality so add a platform driver supporting it. Interrupt is
optional so we let intel_scu_ipc_probe() to decide based on the passed
platform data whether it uses interrupt or polling.

Co-developed-by: default avatarDivya Sasidharan <divya.s.sasidharan@intel.com>
Signed-off-by: default avatarDivya Sasidharan <divya.s.sasidharan@intel.com>
Co-developed-by: default avatarRajmohan Mani <rajmohan.mani@intel.com>
Signed-off-by: default avatarRajmohan Mani <rajmohan.mani@intel.com>
Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
parent b991178f
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -1356,6 +1356,15 @@ config INTEL_SCU_PCI
	    Broxton
	    Apollo Lake

config INTEL_SCU_PLATFORM
	tristate "Intel SCU platform driver"
	depends on ACPI
	select INTEL_SCU
	help
	  This driver is used to bridge the communications between kernel
	  and SCU (sometimes called PMC as well). The driver currently
	  supports Intel Elkhart Lake and compatible platforms.

config INTEL_SCU_IPC_UTIL
	tristate "Intel SCU IPC utility driver"
	depends on INTEL_SCU
+1 −0
Original line number Diff line number Diff line
@@ -141,6 +141,7 @@ obj-$(CONFIG_INTEL_PMC_CORE) += intel_pmc_core.o intel_pmc_core_pltdrv.o
obj-$(CONFIG_INTEL_PUNIT_IPC)		+= intel_punit_ipc.o
obj-$(CONFIG_INTEL_SCU_IPC)		+= intel_scu_ipc.o
obj-$(CONFIG_INTEL_SCU_PCI)		+= intel_scu_pcidrv.o
obj-$(CONFIG_INTEL_SCU_PLATFORM)	+= intel_scu_pltdrv.o
obj-$(CONFIG_INTEL_SCU_IPC_UTIL)	+= intel_scu_ipcutil.o
obj-$(CONFIG_INTEL_TELEMETRY)		+= intel_telemetry_core.o \
					   intel_telemetry_pltdrv.o \
+60 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * Platform driver for the Intel SCU.
 *
 * Copyright (C) 2019, Intel Corporation
 * Authors: Divya Sasidharan <divya.s.sasidharan@intel.com>
 *	    Mika Westerberg <mika.westerberg@linux.intel.com>
 *	    Rajmohan Mani <rajmohan.mani@intel.com>
 */

#include <linux/err.h>
#include <linux/errno.h>
#include <linux/ioport.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/platform_device.h>

#include <asm/intel_scu_ipc.h>

static int intel_scu_platform_probe(struct platform_device *pdev)
{
	struct intel_scu_ipc_data scu_data = {};
	struct intel_scu_ipc_dev *scu;
	const struct resource *res;

	scu_data.irq = platform_get_irq_optional(pdev, 0);
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res)
		return -ENOMEM;

	scu_data.mem = *res;

	scu = devm_intel_scu_ipc_register(&pdev->dev, &scu_data);
	if (IS_ERR(scu))
		return PTR_ERR(scu);

	platform_set_drvdata(pdev, scu);
	return 0;
}

static const struct acpi_device_id intel_scu_acpi_ids[] = {
	{ "INTC1026" },
	{}
};
MODULE_DEVICE_TABLE(acpi, intel_scu_acpi_ids);

static struct platform_driver intel_scu_platform_driver = {
	.probe = intel_scu_platform_probe,
	.driver = {
		.name = "intel_scu",
		.acpi_match_table = intel_scu_acpi_ids,
	},
};
module_platform_driver(intel_scu_platform_driver);

MODULE_AUTHOR("Divya Sasidharan <divya.s.sasidharan@intel.com>");
MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com");
MODULE_AUTHOR("Rajmohan Mani <rajmohan.mani@intel.com>");
MODULE_DESCRIPTION("Intel SCU platform driver");
MODULE_LICENSE("GPL v2");