From patchwork Mon Jun 2 13:41:01 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 354888 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 069B7140085 for ; Mon, 2 Jun 2014 23:41:59 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754960AbaFBNlX (ORCPT ); Mon, 2 Jun 2014 09:41:23 -0400 Received: from mail-ig0-f180.google.com ([209.85.213.180]:43197 "EHLO mail-ig0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754559AbaFBNlV (ORCPT ); Mon, 2 Jun 2014 09:41:21 -0400 Received: by mail-ig0-f180.google.com with SMTP id c1so3392408igq.7 for ; Mon, 02 Jun 2014 06:41:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=b29DBVO2lWYMtxAQKee5CAcu+3/v1194177KweCQR2s=; b=KJNcz04916lzPrDBZxXSasC+vyRoUVGvAhrud4U+pE4SZSmPqwbjP6v5hq7gjBbke5 PzLHCdrr6nS5QV48dLjgy8iKAUWZFX4XsJAFzkk6O0n4FwMduFnwF8C7cVoGvBL6EJth MlG5OFiMGlaBGKMRKCyzhSGZdJ7r3UjDcwKdFTs7N1I+CJ3z0cUPoFG1QDsiDGDa8b3x kDNFE7KIzEYdiILmpw8S5GP+VU8rBwbbBEKJDuBOaIfCPKEOlHJTFsFWbhprCOQZ90Ig IHFmCcvtg52pFsCsMyk30B0AkTAFsLu7qT5eP6qhMz7I2n/iRG7OlNxWXj/V2/TiY6CA bvqw== X-Gm-Message-State: ALoCoQlj8YHSHH3Clp1KmRMZVAFJ2QBYzFlqXwKqgrhL5vYc6V0WRThkGlSWLM2lW2I7grn9bFoR X-Received: by 10.42.78.136 with SMTP id n8mr34758421ick.28.1401716480898; Mon, 02 Jun 2014 06:41:20 -0700 (PDT) Received: from localhost.localdomain (host109-148-113-200.range109-148.btcentralplus.com. [109.148.113.200]) by mx.google.com with ESMTPSA id hy3sm6561043igb.1.2014.06.02.06.41.18 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 02 Jun 2014 06:41:20 -0700 (PDT) From: Lee Jones To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, wsa@the-dreams.de Cc: linus.walleij@linaro.org, grant.likely@linaro.org, linux-i2c@vger.kernel.org, Lee Jones Subject: [PATCH 1/3] i2c: Provide 'device type' to 'OF device node' look-up Date: Mon, 2 Jun 2014 14:41:01 +0100 Message-Id: <1401716463-23457-2-git-send-email-lee.jones@linaro.org> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1401716463-23457-1-git-send-email-lee.jones@linaro.org> References: <1401716463-23457-1-git-send-email-lee.jones@linaro.org> Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org We have a problem. There are lots of I2C device ID tables scattered around the kernel which are redundant in all Device Tree and/or ACPI only supported device drivers. After recent discussions it has become apparent that the only thing blocking the complete removal of these tables is the continued support of 'register an I2C device via sysfs' functionality. As the sysfs method doesn't know anything about Device Tree or ACPI, we can not pass any nodes in. This patch searches all known Device Tree nodes and attempts to acquire a match from the device name provided via sysfs. It can not fail, but if found assigns the matching of_node to i2c_board_info prior to registering. Signed-off-by: Lee Jones --- drivers/i2c/i2c-core.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 7c7f4b8..2e47641 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -64,6 +64,7 @@ static DEFINE_IDR(i2c_adapter_idr); static struct device_type i2c_client_type; static int i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver); +static struct device_node *of_i2c_type_to_node(char *type); static struct static_key i2c_trace_msg = STATIC_KEY_INIT_FALSE; @@ -863,6 +864,8 @@ i2c_sysfs_new_device(struct device *dev, struct device_attribute *attr, return -EINVAL; } + info.of_node = of_i2c_type_to_node(info.type); + client = i2c_new_device(adap, &info); if (!client) return -EINVAL; @@ -1088,8 +1091,36 @@ struct i2c_adapter *of_find_i2c_adapter_by_node(struct device_node *node) return i2c_verify_adapter(dev); } EXPORT_SYMBOL(of_find_i2c_adapter_by_node); + +static struct device_node *of_i2c_type_to_node(char *type) +{ + struct device_node *np; + const char *compatible, *name; + int len; + + if (!type) + return NULL; + + for_each_of_allnodes(np) { + compatible = of_get_property(np, "compatible", &len); + if (!compatible) + continue; + + name = strchr(compatible, ','); + if (!name) + name = compatible; + else + name++; + + if (!strncmp(name, type, len - (name - compatible))) + return np; + } + + return NULL; +} #else static void of_i2c_register_devices(struct i2c_adapter *adap) { } +static struct device_node *of_i2c_type_to_node(char *type) { return NULL; } #endif /* CONFIG_OF */ /* ACPI support code */