From patchwork Thu May 13 17:47:27 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Felipe Contreras X-Patchwork-Id: 99359 X-Patchwork-Delegate: hiroshi.doyu@nokia.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o4DHmb7Y011900 for ; Thu, 13 May 2010 17:48:37 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758604Ab0EMRsg (ORCPT ); Thu, 13 May 2010 13:48:36 -0400 Received: from fg-out-1718.google.com ([72.14.220.157]:11171 "EHLO fg-out-1718.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753870Ab0EMRsf (ORCPT ); Thu, 13 May 2010 13:48:35 -0400 Received: by fg-out-1718.google.com with SMTP id 19so2624632fgg.1 for ; Thu, 13 May 2010 10:48:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer:in-reply-to:references; bh=ls9RUTxHBG1YJoKmdh6fKuO3E7Cne4c7xQmHqD+Pc1Y=; b=TFSh8aa7S0VWY1u0QXIVhNXTubNpKjR/KM2szxW/LAUrdNhYQTCKVFa/gxSm5S/t3N hGT8VJ77i0fvCrPG9Eu9rf6LLmwwNKfKAzV0p3LXSO9ooDwN/7Zq3nRRfwQL966EmC5v tE89bk5JvwZH2ZG441JCXnHPyo1Zl/IiBY5FQ= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; b=x6mKkoJwQm5coR4lsF6EKq7x48cuP4qQJWUZ8HwUQ9HaoKhORhP744j0YaQo+4pnOO dxsYMZ7SGCWM+hozhBC1ewgc1tpHzah3LBBU7LDxa/h/ryPlUTMNTa7rAixQmDYzrNK/ C14E9Y4TCEjhNpruKaiqp8On8PnbfDp16xzmE= Received: by 10.87.35.9 with SMTP id n9mr1062922fgj.45.1273772914320; Thu, 13 May 2010 10:48:34 -0700 (PDT) Received: from localhost (a91-153-253-80.elisa-laajakaista.fi [91.153.253.80]) by mx.google.com with ESMTPS id d6sm4235212fga.13.2010.05.13.10.48.32 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 13 May 2010 10:48:33 -0700 (PDT) From: Felipe Contreras To: linux-omap Cc: linux-arm , Hiroshi Doyu , Tony Lindgren , Russell King , Felipe Contreras Subject: [PATCH 06/15] omap: mailbox: reorganize registering Date: Thu, 13 May 2010 20:47:27 +0300 Message-Id: <1273772856-10881-7-git-send-email-felipe.contreras@gmail.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1273772856-10881-1-git-send-email-felipe.contreras@gmail.com> References: <1273772856-10881-1-git-send-email-felipe.contreras@gmail.com> Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Thu, 13 May 2010 17:48:38 +0000 (UTC) diff --git a/arch/arm/mach-omap1/mailbox.c b/arch/arm/mach-omap1/mailbox.c index 9667f2f..8b18313 100644 --- a/arch/arm/mach-omap1/mailbox.c +++ b/arch/arm/mach-omap1/mailbox.c @@ -29,6 +29,8 @@ static void __iomem *mbox_base; +static struct omap_mbox **list; + struct omap_mbox1_fifo { unsigned long cmd; unsigned long data; @@ -143,43 +145,45 @@ struct omap_mbox mbox_dsp_info = { }; EXPORT_SYMBOL(mbox_dsp_info); +struct omap_mbox *omap1_mboxes[] = { &mbox_dsp_info, NULL }; + static int __devinit omap1_mbox_probe(struct platform_device *pdev) { struct resource *res; int ret; + int i; - /* MBOX base */ - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (unlikely(!res)) { - dev_err(&pdev->dev, "invalid mem resource\n"); - return -ENODEV; - } - mbox_base = ioremap(res->start, resource_size(res)); + res = pdev->resource; + + mbox_base = ioremap(res[0].start, resource_size(&res[0])); if (!mbox_base) return -ENOMEM; - /* DSP IRQ */ - res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); - if (unlikely(!res)) { - dev_err(&pdev->dev, "invalid irq resource\n"); - ret = -ENODEV; - goto err_out; - } - mbox_dsp_info.irq = res->start; + list = omap1_mboxes; - ret = omap_mbox_register(&pdev->dev, &mbox_dsp_info); - if (ret) - goto err_out; + list[0]->irq = res[1].start; + + for (i = 0; list[i]; i++) { + ret = omap_mbox_register(&pdev->dev, list[i]); + if (ret) + goto err_out; + } return 0; err_out: + while (i--) + omap_mbox_unregister(list[i]); iounmap(mbox_base); return ret; } static int __devexit omap1_mbox_remove(struct platform_device *pdev) { - omap_mbox_unregister(&mbox_dsp_info); + int i; + + for (i = 0; list[i]; i++) + omap_mbox_unregister(list[i]); + iounmap(mbox_base); return 0; } diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 6d17da8..0902965 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c @@ -53,6 +53,8 @@ static void __iomem *mbox_base; +static struct omap_mbox **list; + struct omap_mbox2_fifo { unsigned long msg; unsigned long fifo_stat; @@ -287,6 +289,8 @@ struct omap_mbox mbox_dsp_info = { }; EXPORT_SYMBOL(mbox_dsp_info); +struct omap_mbox *omap3_mboxes[] = { &mbox_dsp_info, NULL }; + #if defined(CONFIG_ARCH_OMAP2420) /* IVA */ @@ -311,6 +315,8 @@ static struct omap_mbox mbox_iva_info = { .ops = &omap2_mbox_ops, .priv = &omap2_mbox_iva_priv, }; + +struct omap_mbox *omap2_mboxes[] = { &mbox_iva_info, &mbox_dsp_info, NULL }; #endif /* OMAP4 */ @@ -360,86 +366,65 @@ struct omap_mbox mbox_2_info = { }; EXPORT_SYMBOL(mbox_2_info); +struct omap_mbox *omap4_mboxes[] = { &mbox_1_info, &mbox_2_info, NULL }; + static int __devinit omap2_mbox_probe(struct platform_device *pdev) { struct resource *res; int ret; + int i; - /* MBOX base */ - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (unlikely(!res)) { - dev_err(&pdev->dev, "invalid mem resource\n"); - return -ENODEV; - } - mbox_base = ioremap(res->start, resource_size(res)); + res = pdev->resource; + + mbox_base = ioremap(res[0].start, resource_size(&res[0])); if (!mbox_base) return -ENOMEM; - /* DSP or IVA2 IRQ */ - res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); + if (cpu_is_omap3430()) { + list = omap3_mboxes; + + list[0]->irq = res[1].start; + } +#if defined(CONFIG_ARCH_OMAP2420) + else if (cpu_is_omap2420()) { + list = omap2_mboxes; - if (unlikely(!res)) { - dev_err(&pdev->dev, "invalid irq resource\n"); - ret = -ENODEV; - goto err_dsp; + list[0]->irq = res[1].start; + list[1]->irq = res[2].start; } - if (cpu_is_omap44xx()) { - mbox_1_info.irq = res->start; - ret = omap_mbox_register(&pdev->dev, &mbox_1_info); - } else { - mbox_dsp_info.irq = res->start; - ret = omap_mbox_register(&pdev->dev, &mbox_dsp_info); +#endif + else if (cpu_is_omap44xx()) { + list = omap4_mboxes; + + list[0]->irq = res[1].start; + list[1]->irq = res[1].start; } - if (ret) - goto err_dsp; - - if (cpu_is_omap44xx()) { - mbox_2_info.irq = res->start; - ret = omap_mbox_register(&pdev->dev, &mbox_2_info); - if (ret) { - omap_mbox_unregister(&mbox_1_info); - goto err_dsp; - } + else { + pr_err("%s: platform not supported\n", __func__); + return -ENODEV; } -#if defined(CONFIG_ARCH_OMAP2420) /* IVA */ - if (cpu_is_omap2420()) { - /* IVA IRQ */ - res = platform_get_resource(pdev, IORESOURCE_IRQ, 1); - if (unlikely(!res)) { - dev_err(&pdev->dev, "invalid irq resource\n"); - ret = -ENODEV; - goto err_iva1; - } - mbox_iva_info.irq = res->start; - ret = omap_mbox_register(&pdev->dev, &mbox_iva_info); + + for (i = 0; list[i]; i++) { + ret = omap_mbox_register(&pdev->dev, list[i]); if (ret) - goto err_iva1; + goto err_out; } -#endif return 0; -#if defined(CONFIG_ARCH_OMAP2420) /* IVA */ -err_iva1: - omap_mbox_unregister(&mbox_dsp_info); -#endif - -err_dsp: +err_out: + while (i--) + omap_mbox_unregister(list[i]); iounmap(mbox_base); return ret; } static int __devexit omap2_mbox_remove(struct platform_device *pdev) { -#if defined(CONFIG_ARCH_OMAP2420) - if (cpu_is_omap2420()) - omap_mbox_unregister(&mbox_iva_info); -#endif + int i; + + for (i = 0; list[i]; i++) + omap_mbox_unregister(list[i]); - if (cpu_is_omap44xx()) { - omap_mbox_unregister(&mbox_2_info); - omap_mbox_unregister(&mbox_1_info); - } else - omap_mbox_unregister(&mbox_dsp_info); iounmap(mbox_base); return 0; }