From patchwork Tue May 16 11:27:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wolfram Sang X-Patchwork-Id: 9728891 X-Patchwork-Delegate: geert@linux-m68k.org Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 550F4602DB for ; Tue, 16 May 2017 11:28:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4590D289FF for ; Tue, 16 May 2017 11:28:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 38D5128A15; Tue, 16 May 2017 11:28:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 72B95289FF for ; Tue, 16 May 2017 11:28:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751436AbdEPL2F (ORCPT ); Tue, 16 May 2017 07:28:05 -0400 Received: from sauhun.de ([88.99.104.3]:34635 "EHLO pokefinder.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750853AbdEPL2E (ORCPT ); Tue, 16 May 2017 07:28:04 -0400 Received: from localhost (p54B33129.dip0.t-ipconnect.de [84.179.49.41]) by pokefinder.org (Postfix) with ESMTPSA id 6296C2C0872; Tue, 16 May 2017 13:28:02 +0200 (CEST) From: Wolfram Sang To: linux-i2c@vger.kernel.org Cc: Jean Delvare , Guenter Roeck , linux-renesas-soc@vger.kernel.org, Wolfram Sang Subject: [RFC] i2c-stub: make it usable with DT when booting Date: Tue, 16 May 2017 13:27:58 +0200 Message-Id: <20170516112758.2842-1-wsa+renesas@sang-engineering.com> X-Mailer: git-send-email 2.11.0 Sender: linux-renesas-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-renesas-soc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch makes the stub driver parse the device tree when booting and create a virtual bus with the desired devices attached. Here is an example DTS snipplet making use of it. It is for simulating a more complex camera device which has dependencies which needs to be sorted out at boot time: i2c@42 { compatible = "i2c-stub"; #address-cells = <1>; #size-cells = <0>; des@4c { compatible = "maxim,max9268"; reg = <0x4c>; }; eeprom@57 { compatible = "atmel,24c02"; reg = <0x57>; }; }; FIXME: can fw_* calls be used instead of of_*? Signed-off-by: Wolfram Sang --- It was really useful when developing. When using fw_* calls, we probably could make use of it with ACPI as well. Still, calling for opinions if we want this upstream or if we want to stay module-only? Also, the binding should really be marked as "development only". Or is it better to keep it as a separate patch to keep the binding un-official? drivers/i2c/Kconfig | 2 +- drivers/i2c/i2c-stub.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig index efc3354d60ae89..6d38b38632f44c 100644 --- a/drivers/i2c/Kconfig +++ b/drivers/i2c/Kconfig @@ -99,7 +99,7 @@ source drivers/i2c/busses/Kconfig config I2C_STUB tristate "I2C/SMBus Test Stub" - depends on m + depends on m || OF default 'n' help This module may be useful to developers of SMBus client drivers, diff --git a/drivers/i2c/i2c-stub.c b/drivers/i2c/i2c-stub.c index 5627b1df391c7e..ce30bc4ac15a28 100644 --- a/drivers/i2c/i2c-stub.c +++ b/drivers/i2c/i2c-stub.c @@ -359,10 +359,44 @@ static void i2c_stub_free(void) kfree(stub_chips); } +#ifdef CONFIG_OF +void i2c_stub_parse_of(void) +{ + struct device_node *np, *child; + u32 reg, i = 0; + + np = of_find_compatible_node(NULL, NULL, "i2c-stub"); + if (!np) + return; + + for_each_available_child_of_node(np, child) { + if (of_property_read_u32(child, "reg", ®) == 0) { + chip_addr[i++] = reg; + if (i == MAX_CHIPS) { + pr_warn("Maximum number of chips reached!\n"); + break; + } + } + } + + stub_adapter.dev.of_node = np; + + np = of_find_compatible_node(np, NULL, "i2c-stub"); + if (np) { + pr_warn("Driver can currently do only one stub from DT!\n"); + of_node_put(np); + } +} +#else +void i2c_stub_parse_of(void) { } +#endif + static int __init i2c_stub_init(void) { int i, ret; + i2c_stub_parse_of(); + if (!chip_addr[0]) { pr_err("Please specify a chip address\n"); return -ENODEV;