From patchwork Mon Nov 24 22:33:40 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Grant Likely X-Patchwork-Id: 41426 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-la0-f69.google.com (mail-la0-f69.google.com [209.85.215.69]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id E78B325E18 for ; Mon, 24 Nov 2014 22:35:31 +0000 (UTC) Received: by mail-la0-f69.google.com with SMTP id gd6sf5992825lab.0 for ; Mon, 24 Nov 2014 14:35:30 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=tKwz3YA5R5vSl/oKDGXEbOji+lyDOlJzVzbG5udaLKY=; b=DQuPW1XpQ2nTED2CTsQlGWvRXQrTckReDw+EKgLTJXiJpA2oyc8+P0g3b3cfXLK5Sy 8+NT4ALJyAMXQV23OCs5gYrVELzSXUA6Dr4oOKv7uvamzkT6J/fBEUxnrSPOcQrgrmRt 8ulKt397S7O7Up+mEjIA7Zq5xz+RrwAlfhGJxjZRCLtzK/m90Y035vzC5kUcyFeYUaTB 7pseOvHQM5Kf9HZ7aiaprs4DURQ2L2UYa1X/oot8r9YWFRdYStxB/8161Qg5yxThy3U4 PpYGyucZASyrhhgcE0MDYbRV29BIVMzsSj8TNB2zyRMO5GWddqxddXDARwbmGDTy/W89 5wMQ== X-Gm-Message-State: ALoCoQkp/VzxJpbNyribYdO51dK3kXveyOkZIz9lwLHSRw+vxtt0bsA9lzgIZyiaP7ZaujTi14Mw X-Received: by 10.180.106.67 with SMTP id gs3mr4639031wib.3.1416868530864; Mon, 24 Nov 2014 14:35:30 -0800 (PST) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.36.100 with SMTP id p4ls451235laj.46.gmail; Mon, 24 Nov 2014 14:35:30 -0800 (PST) X-Received: by 10.152.28.227 with SMTP id e3mr23187642lah.54.1416868530670; Mon, 24 Nov 2014 14:35:30 -0800 (PST) Received: from mail-la0-f47.google.com (mail-la0-f47.google.com. [209.85.215.47]) by mx.google.com with ESMTPS id ra3si16597922lbb.24.2014.11.24.14.35.30 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 24 Nov 2014 14:35:30 -0800 (PST) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.47 as permitted sender) client-ip=209.85.215.47; Received: by mail-la0-f47.google.com with SMTP id hz20so8545995lab.34 for ; Mon, 24 Nov 2014 14:35:30 -0800 (PST) X-Received: by 10.152.87.100 with SMTP id w4mr22452093laz.27.1416868530582; Mon, 24 Nov 2014 14:35:30 -0800 (PST) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.184.201 with SMTP id ew9csp347817lbc; Mon, 24 Nov 2014 14:35:29 -0800 (PST) X-Received: by 10.66.66.40 with SMTP id c8mr38148145pat.66.1416868528887; Mon, 24 Nov 2014 14:35:28 -0800 (PST) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id nr6si23708730pdb.74.2014.11.24.14.35.28 for ; Mon, 24 Nov 2014 14:35:28 -0800 (PST) Received-SPF: none (google.com: linux-kernel-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751789AbaKXWfG (ORCPT + 26 others); Mon, 24 Nov 2014 17:35:06 -0500 Received: from mail-wi0-f178.google.com ([209.85.212.178]:35610 "EHLO mail-wi0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751359AbaKXWeP (ORCPT ); Mon, 24 Nov 2014 17:34:15 -0500 Received: by mail-wi0-f178.google.com with SMTP id hi2so7472597wib.5 for ; Mon, 24 Nov 2014 14:34:14 -0800 (PST) X-Received: by 10.180.218.39 with SMTP id pd7mr4791264wic.21.1416868454171; Mon, 24 Nov 2014 14:34:14 -0800 (PST) Received: from trevor.secretlab.ca (host86-166-84-117.range86-166.btcentralplus.com. [86.166.84.117]) by mx.google.com with ESMTPSA id ef6sm38921wic.1.2014.11.24.14.34.10 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 24 Nov 2014 14:34:12 -0800 (PST) Received: by trevor.secretlab.ca (Postfix, from userid 1000) id E49F9C44216; Mon, 24 Nov 2014 22:33:45 +0000 (GMT) From: Grant Likely To: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Pantelis Antoniou Cc: Rob Herring , Mark Brown , Wolfram Sang , Grant Likely , linux-i2c@vger.kernel.org Subject: [PATCH v2 12/14] i2c/of: Add OF_RECONFIG notifier handler Date: Mon, 24 Nov 2014 22:33:40 +0000 Message-Id: <1416868422-22103-13-git-send-email-grant.likely@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1416868422-22103-1-git-send-email-grant.likely@linaro.org> References: <1416868422-22103-1-git-send-email-grant.likely@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: grant.likely@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.47 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , From: Pantelis Antoniou CONFIG_OF_DYNAMIC enables runtime changes to the device tree which in turn may trigger addition or removal of devices from Linux. Add an OF_RECONFIG notifier handler to receive tree change events and to creating or destroy i2c devices as required. Signed-off-by: Pantelis Antoniou [grant.likely: clean up #ifdefs and drop unneeded error handling] Signed-off-by: Grant Likely Cc: Wolfram Sang Cc: Rob Herring Cc: linux-i2c@vger.kernel.org --- drivers/i2c/i2c-core.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 15ba6185dba5..d8afd3f28ca4 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -1951,6 +1951,52 @@ void i2c_clients_command(struct i2c_adapter *adap, unsigned int cmd, void *arg) } EXPORT_SYMBOL(i2c_clients_command); +#if IS_ENABLED(CONFIG_OF_DYNAMIC) +static int of_i2c_notify(struct notifier_block *nb, unsigned long action, + void *arg) +{ + struct of_reconfig_data *rd = arg; + struct i2c_adapter *adap; + struct i2c_client *client; + + switch (of_reconfig_get_state_change(action, rd)) { + case OF_RECONFIG_CHANGE_ADD: + adap = of_find_i2c_adapter_by_node(rd->dn->parent); + if (adap == NULL) + return NOTIFY_OK; /* not for us */ + + client = of_i2c_register_device(adap, rd->dn); + put_device(&adap->dev); + + if (IS_ERR(client)) { + pr_err("%s: failed to create for '%s'\n", + __func__, rd->dn->full_name); + return notifier_from_errno(PTR_ERR(client)); + } + break; + case OF_RECONFIG_CHANGE_REMOVE: + /* find our device by node */ + client = of_find_i2c_device_by_node(rd->dn); + if (client == NULL) + return NOTIFY_OK; /* no? not meant for us */ + + /* unregister takes one ref away */ + i2c_unregister_device(client); + + /* and put the reference of the find */ + put_device(&client->dev); + break; + } + + return NOTIFY_OK; +} +static struct notifier_block i2c_of_notifier = { + .notifier_call = of_i2c_notify, +}; +#else +extern struct notifier_block i2c_of_notifier; +#endif /* CONFIG_OF_DYNAMIC */ + static int __init i2c_init(void) { int retval; @@ -1968,6 +2014,10 @@ static int __init i2c_init(void) retval = i2c_add_driver(&dummy_driver); if (retval) goto class_err; + + if (IS_ENABLED(CONFIG_OF_DYNAMIC)) + WARN_ON(of_reconfig_notifier_register(&i2c_of_notifier)); + return 0; class_err: @@ -1981,6 +2031,8 @@ bus_err: static void __exit i2c_exit(void) { + if (IS_ENABLED(CONFIG_OF_DYNAMIC)) + WARN_ON(of_reconfig_notifier_unregister(&i2c_of_notifier)); i2c_del_driver(&dummy_driver); #ifdef CONFIG_I2C_COMPAT class_compat_unregister(i2c_adapter_compat_class);