Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp186407pxa; Tue, 4 Aug 2020 03:03:10 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwYSm+5SndACKYy3DdlfO+miDOWAjYaN5nRAHOUbpZ4CCh/U4OjJjl33idlP01+qvGpbkgn X-Received: by 2002:a50:8fc4:: with SMTP id y62mr18994741edy.170.1596535388392; Tue, 04 Aug 2020 03:03:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596535388; cv=none; d=google.com; s=arc-20160816; b=ZSro8fZBcUqjcBxYS9p27UTlr0J1ejSu07V9fiLdYNYD/s9+oDBuVsDrEK6hwaXHgz pNVJL/T7/CMyNIgwdUWpGha/PQdGghZ8Zhw5hN54v1ptH7wPgYLllNCO//pvrlylQwu9 /jQ+Iqr9GQw63mLHORz6zbMqn8Pdj5fAkZ9wq77KIVT3C1S+UANLB+DJnXVRRs4gi2yD 6zZ0f0jQFt/HbtPB7bGnQf9f6J+D9jmCx/zKRptg6M7NmXo/6mRAp8HaqDuRLqS0sviG B2uVPCqUoZIOYajadYZlSgTZ+uE5wAWC2373oOLkLVxQ0TMEMwd4cBbSE3NCeZUwuhDk eDPQ== 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 :ironport-sdr:dkim-signature; bh=ZzUG/fy4jroVVwuOAfWahNn4h/q+e3+t0G2VWhZ+Nbc=; b=lOEtSc5PB/+Eb+3KSWXErVCmUM4Z1PVIwgy8mDKB2OUK7wkwiob60InoMU12ZWOYGO QCHsCx04igyyHms/v4MVMjAPX/tAqIZWvOndEAE5Ig2h/JmK74jL1bK1HgqlEyGj/0xe ZBs5+uWUfSGFIalAsAjKD2ygovxrc3IcmjC+0hIaJrSLGed5umBsnBdQ4nbh3WcBvGKu HU0OLjBmX6GBBv98pMEH/tK1eHA4E4PWZXiM2tozGHqoRrDEAgTo2Qul1T331osZakOv GrkIDGZwKhg0h6ALsC+KpOk0kLq71CuL1JFP4L9LvvUOZlzPDfoTDe4CbCNt0OjD75S6 +WOw== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@microchip.com header.s=mchp header.b=Oy0IlnFR; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=microchip.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a92si8946838edf.509.2020.08.04.03.02.45; Tue, 04 Aug 2020 03:03:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=fail header.i=@microchip.com header.s=mchp header.b=Oy0IlnFR; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=microchip.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729649AbgHDKCJ (ORCPT + 99 others); Tue, 4 Aug 2020 06:02:09 -0400 Received: from esa3.microchip.iphmx.com ([68.232.153.233]:33258 "EHLO esa3.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728034AbgHDKCH (ORCPT ); Tue, 4 Aug 2020 06:02:07 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1596535327; x=1628071327; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=2QQDoQ+rXHqAJ/jTJVuyzZWARBCmlwXj8iiuOYtPzTE=; b=Oy0IlnFRw+9dhPPqybJZKrWYYV3MNd6P2lWjN8Gp1kYi6Zt8OzykOf50 LY+Mg8uhstEzfG8pfiRAsqOQu+Jh8n0nioKCUh+cG5kGEK2wUIEJmAC+L T1G6O6sMx7m4yqLC6aNXHvenLlwhw+cV4qn3qQtRVlL92tpcq9XtgQfKC zMpSfhsW+11WDB9+ZNzIGxpnKLlv9/A6bwBwJSQWIQdxL/aNSMu/4teQT EWXYo+0bcLv9z9ILcWGHJpIKqte9c3Ug6xIS1BfCG1ZNBrqTgMyWFC1mJ pqvJ5u6vDg/pVgih0Ae96L3PFp7d4xZDtPIlLtpIRC7fCF1c38W04IQ0U Q==; IronPort-SDR: ddqle0Lzj7PH1UgxkECezH1kBLn0RgGKentPyLD9rwkpe5YpcRr+/nj1fKE+8sa7Ns5eojhvGI nnOuxQeQ1YHfy5pTL/Y0RHRjxqtthOsX3ejqOBrvgUl3JITt0OEobMMvbPwXRA/pnD3sI8afWc zA6tVTBnxwzt4tJ1sdvLi0krO0fsB3J4ObHS68J8ObeUD/S+UOySkt3eIrN9yLPm33cT6ygfcb YokG7fHcg3+DPcjxifGFacbRaIoije/IpScGw3Zl/NaL0DwMQvHWl4DZJStfVD4zArSVRQWJyM MQs= X-IronPort-AV: E=Sophos;i="5.75,433,1589266800"; d="scan'208";a="86620572" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa3.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 04 Aug 2020 03:02:07 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.87.72) by chn-vm-ex02.mchp-main.com (10.10.87.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3; Tue, 4 Aug 2020 03:02:04 -0700 Received: from rob-ult-m19940.microchip.com (10.10.115.15) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server id 15.1.1979.3 via Frontend Transport; Tue, 4 Aug 2020 03:01:21 -0700 From: Codrin Ciubotariu To: , , , CC: , , , , , , , Codrin Ciubotariu Subject: [PATCH 3/4] i2c: core: treat EPROBE_DEFER when acquiring SCL/SDA GPIOs Date: Tue, 4 Aug 2020 12:59:25 +0300 Message-ID: <20200804095926.205643-4-codrin.ciubotariu@microchip.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200804095926.205643-1-codrin.ciubotariu@microchip.com> References: <20200804095926.205643-1-codrin.ciubotariu@microchip.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Even if I2C bus GPIO recovery is optional, devm_gpiod_get() can return -EPROBE_DEFER, so we should at least treat that. This ends up with i2c_register_adapter() to be able to return -EPROBE_DEFER. Signed-off-by: Codrin Ciubotariu --- Changes from RFC: - return -EINVAL if i2c_init_recovery() doesn't have the complete information; - 'else if' added when checking if i2c_generic_scl_recovery() is used; - moved i2c_init_recovery() before class-link creation; class-link cleanup removed; - moved debug print when the adapter is probed after call to i2c_init_recovery(); drivers/i2c/i2c-core-base.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index cf0c5eb152e1..99dbaead269e 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -375,15 +375,16 @@ static int i2c_gpio_init_recovery(struct i2c_adapter *adap) return i2c_gpio_init_generic_recovery(adap); } -static void i2c_init_recovery(struct i2c_adapter *adap) +static int i2c_init_recovery(struct i2c_adapter *adap) { struct i2c_bus_recovery_info *bri = adap->bus_recovery_info; char *err_str; if (!bri) - return; + return 0; - i2c_gpio_init_recovery(adap); + if (i2c_gpio_init_recovery(adap) == -EPROBE_DEFER) + return -EPROBE_DEFER; if (!bri->recover_bus) { err_str = "no recover_bus() found"; @@ -399,10 +400,7 @@ static void i2c_init_recovery(struct i2c_adapter *adap) if (gpiod_get_direction(bri->sda_gpiod) == 0) bri->set_sda = set_sda_gpio_value; } - return; - } - - if (bri->recover_bus == i2c_generic_scl_recovery) { + } else if (bri->recover_bus == i2c_generic_scl_recovery) { /* Generic SCL recovery */ if (!bri->set_scl || !bri->get_scl) { err_str = "no {get|set}_scl() found"; @@ -414,10 +412,12 @@ static void i2c_init_recovery(struct i2c_adapter *adap) } } - return; + return 0; err: dev_err(&adap->dev, "Not using recovery: %s\n", err_str); adap->bus_recovery_info = NULL; + + return -EINVAL; } static int i2c_smbus_host_notify_to_irq(const struct i2c_client *client) @@ -1444,12 +1444,16 @@ static int i2c_register_adapter(struct i2c_adapter *adap) if (res) goto out_reg; - dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name); - pm_runtime_no_callbacks(&adap->dev); pm_suspend_ignore_children(&adap->dev, true); pm_runtime_enable(&adap->dev); + res = i2c_init_recovery(adap); + if (res == -EPROBE_DEFER) + goto out_reg; + + dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name); + #ifdef CONFIG_I2C_COMPAT res = class_compat_create_link(i2c_adapter_compat_class, &adap->dev, adap->dev.parent); @@ -1458,8 +1462,6 @@ static int i2c_register_adapter(struct i2c_adapter *adap) "Failed to create compatibility class link\n"); #endif - i2c_init_recovery(adap); - /* create pre-declared device nodes */ of_i2c_register_devices(adap); i2c_acpi_register_devices(adap); -- 2.25.1