Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp3707661ybl; Tue, 21 Jan 2020 05:44:31 -0800 (PST) X-Google-Smtp-Source: APXvYqxl9wSXmJoH64A0DoGZVvNllbUO5kyTVTFKV+/Z1J/YTbuwjAUV4YxOMMjZKrjb/9zz9+d6 X-Received: by 2002:a05:6808:53:: with SMTP id v19mr3132924oic.18.1579614271501; Tue, 21 Jan 2020 05:44:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579614271; cv=none; d=google.com; s=arc-20160816; b=VxuOFxItMA6Ynyjs0rfKv+FwN4JH7kQjRCdT65OLCk1nSIMHlOWlN0SU1d+JiLwqS/ HBm65SA+dArU+CI8qXzIxI8TMHMue4wLCAfkpQJOmx3Gl471r7VTZwaFjTbVuv1nwwF1 MRKQmeP8zoRYnfzjpZgH9KjR2thvft4lCQqGls7ukYbmKjA2oGVp68hPy4ST0z+sF4WX 7RuYAeHbkK5ZOQir2nxgPDwx3Sb0Q0AJqWozEsTlBcUOINjft6hAO+D/mkfkdGj2CBYh 6XwJR5KjGykKxVAX1biBZY2VyQsLHJDPKoLDPIAcfP5uXQOSBgcKmzLXekW6OEJD1aK/ UbKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=Xe7S9arYeaAoIQtE6hpfPJYRpLaIn3hECZgrZ2Rk0gY=; b=ECb8WMPld7g6mti5jj96ajXXUAc8h215PsOCLijHLengytLC1aqGRftGqvIws4m1yU l0tY/+8dv5PFK6PwCyqCGL2DXugUBNdSOFUaXg4TMH63Hg5X0HXMX1PX72DapY4ckd92 sTRCGzvAQwLcoo4DPTGAm/+2ilLeccqgrEFtjywu49Shpxl27F/TlqdPLnJjCvxf4PZ6 t3qQ5KS67GeyL6Z4ySSGOSsoFf3fyoDCtjjJdlAVyCeH7FTftq7yjqE26pe9RdtrJs2i MsghPmbK4xSn2gr+uyN31036USBtMjWk094pDsOjmjuBxHlaS4xqesLL03ssS45OdDUA frhQ== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g138si20631778oib.190.2020.01.21.05.44.19; Tue, 21 Jan 2020 05:44:31 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729099AbgAUNlp (ORCPT + 99 others); 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 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@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) -- 2.20.1