Commit 40b17a34 authored by Jameson Thies's avatar Jameson Thies Committed by Greg Kroah-Hartman
Browse files

usb: typec: cros_ec_ucsi: Load driver from OF and ACPI definitions



Add support for cros_ec_ucsi to load based on "google,cros-ec-ucsi"
compatible devices and "GOOG0021" ACPI nodes.

Signed-off-by: default avatarJameson Thies <jthies@google.com>
Reviewed-by: default avatarBenson Leung <bleung@chromium.org>
Reviewed-by: default avatarAbhishek Pandit-Subedi <abhishekpandit@chromium.org>
Link: https://patch.msgid.link/20260403223357.1896403-3-jthies@google.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 250892b5
Loading
Loading
Loading
Loading
+24 −2
Original line number Diff line number Diff line
@@ -5,11 +5,13 @@
 * Copyright 2024 Google LLC.
 */

#include <linux/acpi.h>
#include <linux/container_of.h>
#include <linux/dev_printk.h>
#include <linux/jiffies.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_data/cros_ec_commands.h>
#include <linux/platform_data/cros_usbpd_notify.h>
#include <linux/platform_data/cros_ec_proto.h>
@@ -257,7 +259,6 @@ static void cros_ucsi_destroy(struct cros_ucsi_data *udata)
static int cros_ucsi_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct cros_ec_dev *ec_data = dev_get_drvdata(dev->parent);
	struct cros_ucsi_data *udata;
	int ret;

@@ -265,9 +266,16 @@ static int cros_ucsi_probe(struct platform_device *pdev)
	if (!udata)
		return -ENOMEM;

	/* ACPI and OF FW nodes for cros_ec_ucsi are children of the ChromeOS EC. If the
	 * cros_ec_ucsi device has an ACPI or OF FW node, its parent is the ChromeOS EC device.
	 * Platforms without a FW node for cros_ec_ucsi may add it as a subdevice of cros_ec_dev.
	 */
	udata->dev = dev;
	if (is_acpi_device_node(dev->fwnode) || is_of_node(dev->fwnode))
		udata->ec = dev_get_drvdata(dev->parent);
	else
		udata->ec = ((struct cros_ec_dev *)dev_get_drvdata(dev->parent))->ec_dev;

	udata->ec = ec_data->ec_dev;
	if (!udata->ec)
		return dev_err_probe(dev, -ENODEV, "couldn't find parent EC device\n");

@@ -348,10 +356,24 @@ static const struct platform_device_id cros_ucsi_id[] = {
};
MODULE_DEVICE_TABLE(platform, cros_ucsi_id);

static const struct acpi_device_id cros_ec_ucsi_acpi_device_ids[] = {
	{ "GOOG0021", 0 },
	{ }
};
MODULE_DEVICE_TABLE(acpi, cros_ec_ucsi_acpi_device_ids);

static const struct of_device_id cros_ucsi_of_match[] = {
	{ .compatible = "google,cros-ec-ucsi", },
	{}
};
MODULE_DEVICE_TABLE(of, cros_ucsi_of_match);

static struct platform_driver cros_ucsi_driver = {
	.driver = {
		.name = KBUILD_MODNAME,
		.pm = &cros_ucsi_pm_ops,
		.acpi_match_table = cros_ec_ucsi_acpi_device_ids,
		.of_match_table = cros_ucsi_of_match,
	},
	.id_table = cros_ucsi_id,
	.probe = cros_ucsi_probe,