Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030369AbcJQTQy (ORCPT ); Mon, 17 Oct 2016 15:16:54 -0400 Received: from mail-qk0-f169.google.com ([209.85.220.169]:33626 "EHLO mail-qk0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030465AbcJQTQp (ORCPT ); Mon, 17 Oct 2016 15:16:45 -0400 Subject: Re: [PATCH v2 2/2] i2c: mark device nodes only in case of successful instantiation Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) Content-Type: text/plain; charset=us-ascii From: Pantelis Antoniou In-Reply-To: <20161017135957.20297-3-ralf@ramses-pyramidenbau.de> Date: Mon, 17 Oct 2016 22:16:54 +0300 Cc: Mark Brown , Geert Uytterhoeven , Wolfram Sang , Linux SPI , Linux I2C , "linux-kernel @ vger . kernel . org" Message-Id: <83F4A55C-C0E5-45A7-A768-E4D322B8A4B0@konsulko.com> References: <20161017135957.20297-1-ralf@ramses-pyramidenbau.de> <20161017135957.20297-3-ralf@ramses-pyramidenbau.de> To: Ralf Ramsauer X-Mailer: Apple Mail (2.3124) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by mail.home.local id u9HJGwf8005220 Content-Length: 2279 Lines: 67 Hi Ralf, > On Oct 17, 2016, at 16:59 , Ralf Ramsauer wrote: > > Instantiated I2C device nodes are marked with OF_POPULATE. This was > introduced in 4f001fd. On unloading, loaded device nodes will of course > be unmarked. The problem are nodes that fail during initialisation: If a > node fails, it won't be unloaded and hence not be unmarked. > > If a I2C driver module is unloaded and reloaded, it will skip nodes that > failed before. > > Skip device nodes that are already populated and mark them only in case > of success. > > Note that the same issue exists for SPI. > > Fixes: 4f001fd ("i2c: Mark instantiated device nodes with OF_POPULATE") > Signed-off-by: Ralf Ramsauer > --- > drivers/i2c/i2c-core.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c > index 5ab6721..1704fc8 100644 > --- a/drivers/i2c/i2c-core.c > +++ b/drivers/i2c/i2c-core.c > @@ -1681,6 +1681,7 @@ static struct i2c_client *of_i2c_register_device(struct i2c_adapter *adap, > static void of_i2c_register_devices(struct i2c_adapter *adap) > { > struct device_node *bus, *node; > + struct i2c_client *client; > > /* Only register child devices if the adapter has a node pointer set */ > if (!adap->dev.of_node) > @@ -1695,7 +1696,14 @@ static void of_i2c_register_devices(struct i2c_adapter *adap) > for_each_available_child_of_node(bus, node) { > if (of_node_test_and_set_flag(node, OF_POPULATED)) > continue; > - of_i2c_register_device(adap, node); > + > + client = of_i2c_register_device(adap, node); > + if (IS_ERR(client)) { > + dev_warn(&adap->dev, > + "Failed to create I2C device for %s\n", > + node->full_name); > + of_node_clear_flag(node, OF_POPULATED); > + } > } > > of_node_put(bus); > @@ -2299,6 +2307,7 @@ static int of_i2c_notify(struct notifier_block *nb, unsigned long action, > if (IS_ERR(client)) { > dev_err(&adap->dev, "failed to create client for '%s'\n", > rd->dn->full_name); > + of_node_clear_flag(rd->dn, OF_POPULATED); > return notifier_from_errno(PTR_ERR(client)); > } > break; > -- > 2.10.1 > Thanks for this Acked-by: Pantelis Antoniou