From patchwork Mon Oct 27 07:51:25 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Kerr X-Patchwork-Id: 5872 X-Patchwork-Delegate: benh@kernel.crashing.org Return-Path: X-Original-To: linux-kernel@ozlabs.org Delivered-To: linux-kernel@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id 39645DDDE6 for ; Mon, 27 Oct 2008 18:52:03 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753208AbYJ0Hvr (ORCPT ); Mon, 27 Oct 2008 03:51:47 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752015AbYJ0Hvi (ORCPT ); Mon, 27 Oct 2008 03:51:38 -0400 Received: from ozlabs.org ([203.10.76.45]:58115 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751962AbYJ0Hvh (ORCPT ); Mon, 27 Oct 2008 03:51:37 -0400 Received: by ozlabs.org (Postfix, from userid 1023) id 50F7BDDDDB; Mon, 27 Oct 2008 18:51:35 +1100 (EST) MIME-Version: 1.0 Subject: [PATCH] OF-device: Don't overwrite numa_node in device registration Message-Id: <1225093885.321819.747371980567.1.gpush@pingu> To: Ben Herrenschmidt Cc: , , , From: Jeremy Kerr Date: Mon, 27 Oct 2008 18:51:25 +1100 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently, the numa_node of OF-devices will be overwritten during device_register, which simply sets the node to -1. On cell machines, this means that devices can't find their IOMMU, which is referenced through the device's numa node. Set the numa node for OF devices with no parent, and use the lower-level device_initialize and device_add functions, so that the node is preserved. We can remove the call to set_dev_node in of_device_alloc, as it will be overwritten during register. Signed-off-by: Jeremy Kerr --- Ben: please apply pending davem's approval - this fixes a regression in 2.6.28 --- arch/powerpc/kernel/of_device.c | 1 - drivers/of/device.c | 11 ++++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ diff --git a/arch/powerpc/kernel/of_device.c b/arch/powerpc/kernel/of_device.c index 93ae5b1..f3c9cae 100644 --- a/arch/powerpc/kernel/of_device.c +++ b/arch/powerpc/kernel/of_device.c @@ -78,7 +78,6 @@ struct of_device *of_device_alloc(struct device_node *np, dev->dev.parent = parent; dev->dev.release = of_release_dev; dev->dev.archdata.of_node = np; - set_dev_node(&dev->dev, of_node_to_nid(np)); if (bus_id) strlcpy(dev->dev.bus_id, bus_id, BUS_ID_SIZE); diff --git a/drivers/of/device.c b/drivers/of/device.c index 51e5214..224ae6b 100644 --- a/drivers/of/device.c +++ b/drivers/of/device.c @@ -105,7 +105,16 @@ EXPORT_SYMBOL(of_release_dev); int of_device_register(struct of_device *ofdev) { BUG_ON(ofdev->node == NULL); - return device_register(&ofdev->dev); + + device_initialize(&ofdev->dev); + + /* device_add will assume that this device is on the same node as + * the parent. If there is no parent defined, set the node + * explicitly */ + if (!ofdev->dev.parent) + set_dev_node(&ofdev->dev, of_node_to_nid(ofdev->node)); + + return device_add(&ofdev->dev); } EXPORT_SYMBOL(of_device_register);