From patchwork Tue Jan 21 13:41:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sakari Ailus X-Patchwork-Id: 1226560 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-i2c-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4828px6HJPz9sP3 for ; Wed, 22 Jan 2020 00:42:17 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729021AbgAUNlp (ORCPT ); Tue, 21 Jan 2020 08:41:45 -0500 Received: from mga14.intel.com ([192.55.52.115]:23934 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728977AbgAUNlp (ORCPT ); Tue, 21 Jan 2020 08:41:45 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Jan 2020 05:41:43 -0800 X-IronPort-AV: E=Sophos;i="5.70,346,1574150400"; d="scan'208";a="279583951" Received: from paasikivi.fi.intel.com ([10.237.72.42]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Jan 2020 05:41:40 -0800 Received: from punajuuri.localdomain (punajuuri.localdomain [192.168.240.130]) by paasikivi.fi.intel.com (Postfix) with ESMTP id CCD6E209B3; Tue, 21 Jan 2020 15:41:38 +0200 (EET) Received: from sailus by punajuuri.localdomain with local (Exim 4.92) (envelope-from ) id 1ittn3-0005Jp-B7; Tue, 21 Jan 2020 15:41:57 +0200 From: Sakari Ailus To: linux-i2c@vger.kernel.org Cc: Wolfram Sang , "Rafael J. Wysocki" , linux-acpi@vger.kernel.org, Bingbu Cao , linux-media@vger.kernel.org, Chiranjeevi Rapolu , Hyungwoo Yang , Bartosz Golaszewski , Arnd Bergmann , linux-kernel@vger.kernel.org, Greg Kroah-Hartman , rajmohan.mani@intel.com, Tomasz Figa Subject: [PATCH v4 1/6] i2c: Allow driver to manage the device's power state during probe Date: Tue, 21 Jan 2020 15:41:52 +0200 Message-Id: <20200121134157.20396-2-sakari.ailus@linux.intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200121134157.20396-1-sakari.ailus@linux.intel.com> References: <20200121134157.20396-1-sakari.ailus@linux.intel.com> MIME-Version: 1.0 Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Enable drivers to tell ACPI that there's no need to power on a device for probe. Drivers should still perform this by themselves if there's a need to. In some cases powering on the device during probe is undesirable, and this change enables a driver to choose what fits best for it. Signed-off-by: Sakari Ailus --- drivers/i2c/i2c-core-base.c | 15 ++++++++++++--- include/linux/i2c.h | 3 +++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 9f8dcd3f83850..7bf1699c9044d 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -303,6 +303,14 @@ static int i2c_smbus_host_notify_to_irq(const struct i2c_client *client) return irq > 0 ? irq : -ENXIO; } +static bool probe_low_power(struct device *dev) +{ + struct i2c_driver *driver = to_i2c_driver(dev->driver); + + return driver->probe_low_power && + device_property_present(dev, "probe-low-power"); +} + static int i2c_device_probe(struct device *dev) { struct i2c_client *client = i2c_verify_client(dev); @@ -375,7 +383,8 @@ static int i2c_device_probe(struct device *dev) if (status < 0) goto err_clear_wakeup_irq; - status = dev_pm_domain_attach(&client->dev, true); + status = dev_pm_domain_attach(&client->dev, + !probe_low_power(&client->dev)); if (status) goto err_clear_wakeup_irq; @@ -397,7 +406,7 @@ static int i2c_device_probe(struct device *dev) return 0; err_detach_pm_domain: - dev_pm_domain_detach(&client->dev, true); + dev_pm_domain_detach(&client->dev, !probe_low_power(&client->dev)); err_clear_wakeup_irq: dev_pm_clear_wake_irq(&client->dev); device_init_wakeup(&client->dev, false); @@ -419,7 +428,7 @@ static int i2c_device_remove(struct device *dev) status = driver->remove(client); } - dev_pm_domain_detach(&client->dev, true); + dev_pm_domain_detach(&client->dev, !probe_low_power(&client->dev)); dev_pm_clear_wake_irq(&client->dev); device_init_wakeup(&client->dev, false); diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 582ef05ec07ed..6d0d6af393c56 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -229,6 +229,8 @@ enum i2c_alert_protocol { * @address_list: The I2C addresses to probe (for detect) * @clients: List of detected clients we created (for i2c-core use only) * @disable_i2c_core_irq_mapping: Tell the i2c-core to not do irq-mapping + * @probe_low_power: Let the driver manage the device's power state + * during probe and remove. * * The driver.owner field should be set to the module owner of this driver. * The driver.name field should be set to the name of this driver. @@ -289,6 +291,7 @@ struct i2c_driver { struct list_head clients; bool disable_i2c_core_irq_mapping; + bool probe_low_power; }; #define to_i2c_driver(d) container_of(d, struct i2c_driver, driver)