Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp8414405ybl; Thu, 16 Jan 2020 16:24:42 -0800 (PST) X-Google-Smtp-Source: APXvYqxTS1Ht9AHweRovBsTXhqP0V2VEINHrmuibn1uC6FBJuPQidxSbe9Gl9KHnzVevfOoLRWKA X-Received: by 2002:aca:d985:: with SMTP id q127mr1444063oig.132.1579220681845; Thu, 16 Jan 2020 16:24:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579220681; cv=none; d=google.com; s=arc-20160816; b=1K9VdhnMJ4JBLVWRhg4ik2JdwjPZ9zV4oNv2gE7KQMo5AI3JTBzCGK5m8Eiebp9Zfk cXre6eZNcpTdY42lmPXhySYCoiqyMeMWmzpRPHMczLnPxnfyysY5nR8WmJbmKjyyJxH4 ynoH6hAiDFKZHeIJWCQxaZ7t306Otfkhp1zlE6w91HmTQc4lNi6xbFkzOKN/qUE6Gl9G CA1TBJx/6pOyXfuDZ89ROKbSBHt237XGNqid2mf9JW3ZWm9Mnuuuii/0i6PP83yNeoGW EoouD06nw0ErvW3/9YaNEjV20N45vrS2ZdWJM3VQB5UK4sgz6gOIIvoWP3vnLey5Mg2x 6dGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=DTahV1GtMN4KybIOWmxhd6seRxPFIwEPBPYiQMgNktc=; b=Is6tK4KtIOVVoPZeaQ5lEQZCfIjd27tOQJgIKbPCsIgjHBYaLHGbUhAGjwRCOcIc28 juFe8tI25jxPPjAvM8loj0abCtTbnthh+HvyIw1GGuHF1DgBSKTMSgcUv3m8LlyVd1dV Lnp2v35FMDb1/2O5+4/XAXlozU6aRcW/Vww9mvZAy3oJDl+CRnvi/67FqfaCv6YWEsPU 0QNdoYTkZwjt6T5Bzn+xPonpNTN1dEzIOwP6gpBXNYjwPJmDCK2goPdFYRQRzaB6tDgx JwNqdG4moQzFWJyWjUzf5IEyXpTI3UPMvQX8hLMU2gydrSVqp71KhTjDaqRaeDS7lTsm QHCA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=E9QaEx95; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m7si12165595oih.7.2020.01.16.16.24.29; Thu, 16 Jan 2020 16:24:41 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=E9QaEx95; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389726AbgAPWG2 (ORCPT + 99 others); Thu, 16 Jan 2020 17:06:28 -0500 Received: from mail-qv1-f66.google.com ([209.85.219.66]:40738 "EHLO mail-qv1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729260AbgAPWG2 (ORCPT ); Thu, 16 Jan 2020 17:06:28 -0500 Received: by mail-qv1-f66.google.com with SMTP id dp13so9840903qvb.7 for ; Thu, 16 Jan 2020 14:06:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=DTahV1GtMN4KybIOWmxhd6seRxPFIwEPBPYiQMgNktc=; b=E9QaEx95aathN8Wz33qb3J0l0uaqUlb4hHoFlae249pHM7nLFU5Ukt/Llz+yugn3H0 R2j7fBAi+ZQehL+WpOwZNFDVi+AHeWRXTCbmPG5UF1ifspWvUWDuuPKg8RbkL50oorwG 3l015kb7WaiKhAtV5YqDIs2bCbqxjhPy/kAd0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=DTahV1GtMN4KybIOWmxhd6seRxPFIwEPBPYiQMgNktc=; b=gi/LvjrgSBQNJcgMI1NUEJE+jpSz3ahodSoYbh9mVx8ya9tc1sh+VbzqiSZc5ue8Vj oy6l3yZNyR8PpZyW8xH/m4MV1PJWKkwZH02wFiD8dnBZ0fnnLKqTfOoy5O9d1VB1W3Ly 7j30LQG8f13g84HEK8guYAx13wN6kC0f+ZXz+maruAO6qM6YIEHmkA1WXtsBSXnQRBVa bbY/IZyJUlglW+IQJTXIKt4sDUizapEiuvnc3IGqNxBTGNrXQwjgEfiqlatmb2VcdTlo 9/dVH0y2dpqEDxzr0uFiEmCW9+x7SOqlJQIMX1wvOV1tNgbsraRwc51OX/IIkMbY2n/W RoNg== X-Gm-Message-State: APjAAAU7dOFArhbdsTrYQJcLGFsvZB9n9J3mfo5DndocodL7VzPUblsw 5Pe6PURQLvSLu2ZQBZnkBGeqqISqxJNTmf/HbS9Abdv7 X-Received: by 2002:a05:6214:192f:: with SMTP id es15mr4937880qvb.219.1579212387126; Thu, 16 Jan 2020 14:06:27 -0800 (PST) MIME-Version: 1.0 References: <20200114232219.93171-1-pmalani@chromium.org> <20200116195129.GD208460@google.com> In-Reply-To: <20200116195129.GD208460@google.com> From: Prashant Malani Date: Thu, 16 Jan 2020 14:06:16 -0800 Message-ID: Subject: Re: [PATCH v6 1/3] platform: chrome: Add cros-usbpd-notify driver To: Benson Leung Cc: Enric Balletbo i Serra , Guenter Roeck , Benson Leung , Lee Jones , sre@kernel.org, Linux Kernel Mailing List , linux-pm@vger.kernel.org, Jon Flatley , Gwendal Grignou Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jan 16, 2020 at 11:51 AM Benson Leung wrote: > > On Tue, Jan 14, 2020 at 03:22:18PM -0800, Prashant Malani wrote: > > From: Jon Flatley > > > > ChromiumOS uses ACPI device with HID "GOOG0003" for power delivery > > related events. The existing cros-usbpd-charger driver relies on these > > events without ever actually receiving them on ACPI platforms. This is > > because in the ChromeOS kernel trees, the GOOG0003 device is owned by an > > ACPI driver that offers firmware updates to USB-C chargers. > > > > Introduce a new platform driver under cros-ec, the ChromeOS embedded > > controller, that handles these PD events and dispatches them > > appropriately over a notifier chain to all drivers that use them. > > > > On platforms that don't have the ACPI device defined, the driver gets > > instantiated for ECs which support the EC_FEATURE_USB_PD feature bit, > > and the notification events will get delivered using the MKBP event > > handling mechanism. > > > > Co-Developed-by: Prashant Malani > > Reviewed-by: Gwendal Grignou > > Signed-off-by: Jon Flatley > > Signed-off-by: Prashant Malani > > Minor nit, otherwise, > Reviewed-by: Benson Leung Thanks, will add this in the next version. > > > > --- > > diff --git a/drivers/platform/chrome/cros_usbpd_notify.c b/drivers/platform/chrome/cros_usbpd_notify.c > > new file mode 100644 > > index 0000000000000..858e494995843 > > --- /dev/null > > +++ b/drivers/platform/chrome/cros_usbpd_notify.c > > @@ -0,0 +1,153 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * Copyright 2020 Google LLC > > + * > > + * This driver serves as the receiver of cros_ec PD host events. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > Same nit as other: Alphabetize #include list. Done > > > +#include > > +#include > > + > > +#define DRV_NAME "cros-usbpd-notify" > > +#define ACPI_DRV_NAME "GOOG0003" > > + > > +static BLOCKING_NOTIFIER_HEAD(cros_usbpd_notifier_list); > > + > > +/** > > + * cros_usbpd_register_notify - Register a notifier callback for PD events. > > + * @nb: Notifier block pointer to register > > + * > > + * On ACPI platforms this corresponds to host events on the ECPD > > + * "GOOG0003" ACPI device. On non-ACPI platforms this will filter mkbp events > > + * for USB PD events. > > + * > > + * Return: 0 on success or negative error code. > > + */ > > +int cros_usbpd_register_notify(struct notifier_block *nb) > > +{ > > + return blocking_notifier_chain_register( > > + &cros_usbpd_notifier_list, nb); > > +} > > +EXPORT_SYMBOL_GPL(cros_usbpd_register_notify); > > + > > + > > +/** > > + * cros_usbpd_unregister_notify - Unregister notifier callback for PD events. > > + * @nb: Notifier block pointer to unregister > > + * > > + * Unregister a notifier callback that was previously registered with > > + * cros_usbpd_register_notify(). > > + */ > > +void cros_usbpd_unregister_notify(struct notifier_block *nb) > > +{ > > + blocking_notifier_chain_unregister(&cros_usbpd_notifier_list, nb); > > +} > > +EXPORT_SYMBOL_GPL(cros_usbpd_unregister_notify); > > + > > +#ifdef CONFIG_ACPI > > + > > +static int cros_usbpd_notify_add_acpi(struct acpi_device *adev) > > +{ > > + return 0; > > +} > > + > > +static void cros_usbpd_notify_acpi(struct acpi_device *adev, u32 event) > > +{ > > + blocking_notifier_call_chain(&cros_usbpd_notifier_list, event, NULL); > > +} > > + > > +static const struct acpi_device_id cros_usbpd_notify_acpi_device_ids[] = { > > + { ACPI_DRV_NAME, 0 }, > > + { } > > +}; > > +MODULE_DEVICE_TABLE(acpi, cros_usbpd_notify_acpi_device_ids); > > + > > +static struct acpi_driver cros_usbpd_notify_acpi_driver = { > > + .name = DRV_NAME, > > + .class = DRV_NAME, > > + .ids = cros_usbpd_notify_acpi_device_ids, > > + .ops = { > > + .add = cros_usbpd_notify_add_acpi, > > + .notify = cros_usbpd_notify_acpi, > > + }, > > +}; > > +module_acpi_driver(cros_usbpd_notify_acpi_driver); > > + > > +#endif /* CONFIG_ACPI */ > > + > > +#ifdef CONFIG_OF > > + > > +static int cros_usbpd_notify_plat(struct notifier_block *nb, > > + unsigned long queued_during_suspend, void *data) > > +{ > > + struct cros_ec_device *ec_dev = (struct cros_ec_device *)data; > > + u32 host_event = cros_ec_get_host_event(ec_dev); > > + > > + if (!host_event) > > + return NOTIFY_BAD; > > + > > + if (host_event & EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU)) { > > + blocking_notifier_call_chain(&cros_usbpd_notifier_list, > > + host_event, NULL); > > + return NOTIFY_OK; > > + } > > + return NOTIFY_DONE; > > +} > > + > > +static int cros_usbpd_notify_probe_plat(struct platform_device *pdev) > > +{ > > + struct device *dev = &pdev->dev; > > + struct cros_ec_dev *ecdev = dev_get_drvdata(dev->parent); > > + struct notifier_block *nb; > > + int ret; > > + > > + nb = devm_kzalloc(dev, sizeof(*nb), GFP_KERNEL); > > + if (!nb) > > + return -ENOMEM; > > + > > + nb->notifier_call = cros_usbpd_notify_plat; > > + dev_set_drvdata(dev, nb); > > + > > + ret = blocking_notifier_chain_register(&ecdev->ec_dev->event_notifier, > > + nb); > > + if (ret < 0) { > > + dev_err(dev, "Failed to register notifier\n"); > > + return ret; > > + } > > + > > + return 0; > > +} > > + > > +static int cros_usbpd_notify_remove_plat(struct platform_device *pdev) > > +{ > > + struct device *dev = &pdev->dev; > > + struct cros_ec_dev *ecdev = dev_get_drvdata(dev->parent); > > + struct notifier_block *nb = > > + (struct notifier_block *)dev_get_drvdata(dev); > > + > > + blocking_notifier_chain_unregister(&ecdev->ec_dev->event_notifier, > > + nb); > > + > > + return 0; > > +} > > + > > +static struct platform_driver cros_usbpd_notify_plat_driver = { > > + .driver = { > > + .name = DRV_NAME, > > + }, > > + .probe = cros_usbpd_notify_probe_plat, > > + .remove = cros_usbpd_notify_remove_plat, > > +}; > > +module_platform_driver(cros_usbpd_notify_plat_driver); > > + > > +#endif /* CONFIG_OF */ > > + > > +MODULE_LICENSE("GPL"); > > +MODULE_DESCRIPTION("ChromeOS power delivery notifier device"); > > +MODULE_AUTHOR("Jon Flatley "); > > +MODULE_ALIAS("platform:" DRV_NAME); > > diff --git a/include/linux/platform_data/cros_usbpd_notify.h b/include/linux/platform_data/cros_usbpd_notify.h > > new file mode 100644 > > index 0000000000000..4f2791722b6d3 > > --- /dev/null > > +++ b/include/linux/platform_data/cros_usbpd_notify.h > > @@ -0,0 +1,17 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * ChromeOS EC Power Delivery Notifier Driver > > + * > > + * Copyright 2020 Google LLC > > + */ > > + > > +#ifndef __LINUX_PLATFORM_DATA_CROS_USBPD_NOTIFY_H > > +#define __LINUX_PLATFORM_DATA_CROS_USBPD_NOTIFY_H > > + > > +#include > > + > > +int cros_usbpd_register_notify(struct notifier_block *nb); > > + > > +void cros_usbpd_unregister_notify(struct notifier_block *nb); > > + > > +#endif /* __LINUX_PLATFORM_DATA_CROS_USBPD_NOTIFY_H */ > > -- > > 2.25.0.341.g760bfbb309-goog > > > > -- > Benson Leung > Staff Software Engineer > Chrome OS Kernel > Google Inc. > bleung@google.com > Chromium OS Project > bleung@chromium.org