From patchwork Fri Jul 5 10:44:36 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hiroshi Doyu X-Patchwork-Id: 257080 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 395332C0091 for ; Fri, 5 Jul 2013 20:45:21 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757259Ab3GEKpU (ORCPT ); Fri, 5 Jul 2013 06:45:20 -0400 Received: from hqemgate04.nvidia.com ([216.228.121.35]:14775 "EHLO hqemgate04.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757265Ab3GEKpT (ORCPT ); Fri, 5 Jul 2013 06:45:19 -0400 Received: from hqnvupgp07.nvidia.com (Not Verified[216.228.121.13]) by hqemgate04.nvidia.com id ; Fri, 05 Jul 2013 03:45:36 -0700 Received: from hqemhub01.nvidia.com ([172.20.12.94]) by hqnvupgp07.nvidia.com (PGP Universal service); Fri, 05 Jul 2013 03:46:23 -0700 X-PGP-Universal: processed; by hqnvupgp07.nvidia.com on Fri, 05 Jul 2013 03:46:23 -0700 Received: from hqnvemgw02.nvidia.com (172.16.227.111) by hqemhub01.nvidia.com (172.20.150.30) with Microsoft SMTP Server id 8.3.298.1; Fri, 5 Jul 2013 03:45:18 -0700 Received: from sc-daphne.nvidia.com (Not Verified[172.20.232.60]) by hqnvemgw02.nvidia.com with MailMarshal (v7,1,2,5326) id ; Fri, 05 Jul 2013 03:45:18 -0700 Received: from oreo.Nvidia.com (dhcp-10-21-26-134.nvidia.com [10.21.26.134]) by sc-daphne.nvidia.com (8.13.8+Sun/8.8.8) with ESMTP id r65AjE3Z022328; Fri, 5 Jul 2013 03:45:16 -0700 (PDT) From: Hiroshi Doyu To: CC: , , , Hiroshi Doyu Subject: [PATCH v2 01/22] [HACK] of: dev_node has struct device pointer Date: Fri, 5 Jul 2013 13:44:36 +0300 Message-ID: <1373021097-32420-2-git-send-email-hdoyu@nvidia.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1373021097-32420-1-git-send-email-hdoyu@nvidia.com> References: <1373021097-32420-1-git-send-email-hdoyu@nvidia.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org To prevent of_platform_populate() from trying to populate duplicate devices if a device has been already populated. Signed-off-by: Hiroshi Doyu --- Need to take care of early_platform_devices, or alternative solution. --- drivers/of/base.c | 23 +++++++++++++++++++++++ drivers/of/platform.c | 8 ++++++++ include/linux/of.h | 16 ++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/drivers/of/base.c b/drivers/of/base.c index 5c54279..99062dd 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -230,6 +230,29 @@ const void *of_get_property(const struct device_node *np, const char *name, } EXPORT_SYMBOL(of_get_property); +struct device *of_get_device(const struct device_node *node) +{ + struct device *dev; + unsigned long flags; + + raw_spin_lock_irqsave(&devtree_lock, flags); + dev = node->dev; + raw_spin_unlock_irqrestore(&devtree_lock, flags); + + return dev; +} +EXPORT_SYMBOL(of_get_device); + +void of_set_device(struct device_node *node, struct device *dev) +{ + unsigned long flags; + + raw_spin_lock_irqsave(&devtree_lock, flags); + node->dev = dev; + raw_spin_unlock_irqrestore(&devtree_lock, flags); +} +EXPORT_SYMBOL(of_set_device); + /** Checks if the given "compat" string matches one of the strings in * the device's "compatible" property */ diff --git a/drivers/of/platform.c b/drivers/of/platform.c index e0a6514..a8f6b09 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -203,10 +203,17 @@ struct platform_device *of_platform_device_create_pdata( struct device *parent) { struct platform_device *dev; + struct device *tmp; if (!of_device_is_available(np)) return NULL; + tmp = of_get_device(np); + if (tmp) { + dev_info(tmp, "Already populated\n"); + return to_platform_device(tmp); + } + dev = of_device_alloc(np, bus_id, parent); if (!dev) return NULL; @@ -228,6 +235,7 @@ struct platform_device *of_platform_device_create_pdata( return NULL; } + of_set_device(np, &dev->dev); return dev; } diff --git a/include/linux/of.h b/include/linux/of.h index 1fd08ca..b548522 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -60,6 +60,9 @@ struct device_node { struct kref kref; unsigned long _flags; void *data; + + struct device *dev; /* Set only after populated */ + #if defined(CONFIG_SPARC) const char *path_component_name; unsigned int unique_id; @@ -268,6 +271,8 @@ extern const void *of_get_property(const struct device_node *node, int *lenp); #define for_each_property_of_node(dn, pp) \ for (pp = dn->properties; pp != NULL; pp = pp->next) +extern struct device *of_get_device(const struct device_node *node); +extern void of_set_device(struct device_node *node, struct device *dev); extern int of_n_addr_cells(struct device_node *np); extern int of_n_size_cells(struct device_node *np); @@ -459,6 +464,17 @@ static inline const void *of_get_property(const struct device_node *node, return NULL; } +static inline struct device *of_get_device(const struct device_node *node) +{ + return NULL; +} + +static inline void of_set_device(const struct device_node *node, + struct device *dev); +{ + return -ENOSYS; +} + static inline int of_property_read_u64(const struct device_node *np, const char *propname, u64 *out_value) {