From patchwork Sun Dec 16 17:25:57 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 1885251 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by patchwork2.kernel.org (Postfix) with ESMTP id 74B0EDFAC4 for ; Sun, 16 Dec 2012 17:31:41 +0000 (UTC) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1TkI0S-0006aJ-AS; Sun, 16 Dec 2012 17:28:07 +0000 Received: from perceval.ideasonboard.com ([95.142.166.194]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1TkHxf-00059P-QS for linux-arm-kernel@lists.infradead.org; Sun, 16 Dec 2012 17:25:13 +0000 Received: from avalon.quadriga.com (unknown [194.136.87.226]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 7D468359A7; Sun, 16 Dec 2012 18:24:59 +0100 (CET) From: Laurent Pinchart To: Hideki EIRAKU Subject: [PATCH/WIP/RFC 11/14] shmobile-ipmmu: Store a struct shmobile_iommu_arch_data in archdata.iommu Date: Sun, 16 Dec 2012 18:25:57 +0100 Message-Id: <1355678760-27357-12-git-send-email-laurent.pinchart+renesas@ideasonboard.com> X-Mailer: git-send-email 1.7.8.6 In-Reply-To: <1355678760-27357-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> References: <1350290093-998-1-git-send-email-hdk@igel.co.jp> <1355678760-27357-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20121216_122512_070457_CA13763D X-CRM114-Status: UNSURE ( 9.87 ) X-CRM114-Notice: Please train this message. X-Spam-Score: -2.6 (--) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-2.6 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: Katsuya MATSUBARA , Simon Horman , linux-sh@vger.kernel.org, Magnus Damm , linux-kernel@vger.kernel.org, Paul Mundt , Damian Hobson-Garcia , linux-arm-kernel@lists.infradead.org, Marek Szyprowski X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org Signed-off-by: Laurent Pinchart --- drivers/iommu/shmobile-iommu.c | 20 +++++++++++++++++--- include/linux/sh_iommu.h | 10 ++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/drivers/iommu/shmobile-iommu.c b/drivers/iommu/shmobile-iommu.c index 423993c..f27d842 100644 --- a/drivers/iommu/shmobile-iommu.c +++ b/drivers/iommu/shmobile-iommu.c @@ -308,25 +308,39 @@ static int shmobile_iommu_attach_all_devices(void) ret = PTR_ERR(iommu_mapping); goto err; } - for (dev = ipmmu_devices; dev; dev = dev->archdata.iommu) { + for (dev = ipmmu_devices; dev; ) { + struct shmobile_iommu_arch_data *data = dev->archdata.iommu; + if (arm_iommu_attach_device(dev, iommu_mapping)) pr_err("arm_iommu_attach_device failed\n"); + + dev = data->next; } err: spin_unlock(&lock_add); return 0; } -void ipmmu_add_device(struct device *dev) +int ipmmu_add_device(struct device *dev) { + struct shmobile_iommu_arch_data *data; + + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (data == NULL) + return -ENOMEM; + + dev->archdata.iommu = data; + spin_lock(&lock_add); - dev->archdata.iommu = ipmmu_devices; + data->next = ipmmu_devices; ipmmu_devices = dev; if (!IS_ERR_OR_NULL(iommu_mapping)) { if (arm_iommu_attach_device(dev, iommu_mapping)) pr_err("arm_iommu_attach_device failed\n"); } spin_unlock(&lock_add); + + return 0; } int ipmmu_iommu_init(struct shmobile_ipmmu *ipmmu) diff --git a/include/linux/sh_iommu.h b/include/linux/sh_iommu.h index cc669a0..8b7b51d 100644 --- a/include/linux/sh_iommu.h +++ b/include/linux/sh_iommu.h @@ -1,10 +1,16 @@ #ifndef __SH_IOMMU_H__ #define __SH_IOMMU_H__ +struct device; + +struct shmobile_iommu_arch_data { + struct device *next; +}; + #ifdef CONFIG_SHMOBILE_IPMMU_TLB -void ipmmu_add_device(struct device *dev); +int ipmmu_add_device(struct device *dev); #else -static inline void ipmmu_add_device(struct device *dev) +static inline int ipmmu_add_device(struct device *dev) { } #endif