From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kevin Hilman Subject: Re: [PATCH 3/5] omap: mailbox: add omap_device latency information Date: Tue, 09 Nov 2010 15:48:10 -0800 Message-ID: <87hbfqf491.fsf@deeprootsystems.com> References: <1288129984-22957-1-git-send-email-omar.ramirez@ti.com> <1288129984-22957-4-git-send-email-omar.ramirez@ti.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Received: from mail-pv0-f174.google.com ([74.125.83.174]:39134 "EHLO mail-pv0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752169Ab0KIXsO (ORCPT ); Tue, 9 Nov 2010 18:48:14 -0500 Received: by pva4 with SMTP id 4so6204pva.19 for ; Tue, 09 Nov 2010 15:48:13 -0800 (PST) In-Reply-To: <1288129984-22957-4-git-send-email-omar.ramirez@ti.com> (Omar Ramirez Luna's message of "Tue, 26 Oct 2010 16:53:02 -0500") Sender: linux-omap-owner@vger.kernel.org List-Id: linux-omap@vger.kernel.org To: Omar Ramirez Luna Cc: Tony Lindgren , Hiroshi DOYU , Felipe Contreras , Dmitry Kasatkin , Suman Anna , Paul Walmsley , Benoit Cousson , "Govindraj.R" , C A Subramaniam , linux-omap@vger.kernel.org Omar Ramirez Luna writes: > From: Felipe Contreras > > So that we can enable the main clock. -ENO_DESCRIPTIVE_CHANGELOG omap_device_enable/disable do more than just manage the clocks > Signed-off-by: Felipe Contreras > Signed-off-by: Omar Ramirez Luna > --- > arch/arm/mach-omap2/devices.c | 19 +++++++++++++++++-- > arch/arm/mach-omap2/mailbox.c | 21 +++++++++------------ > arch/arm/plat-omap/include/plat/mailbox.h | 6 ++++++ > 3 files changed, 32 insertions(+), 14 deletions(-) > > diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c > index d977572..337fd7a 100644 > --- a/arch/arm/mach-omap2/devices.c > +++ b/arch/arm/mach-omap2/devices.c > @@ -29,6 +29,7 @@ > #include > #include > #include > +#include > > #include "mux.h" > #include "control.h" > @@ -141,10 +142,20 @@ static inline void omap_init_camera(void) > #endif > > #if defined(CONFIG_OMAP_MBOX_FWK) || defined(CONFIG_OMAP_MBOX_FWK_MODULE) > +static struct omap_device_pm_latency mbox_latencies[] = { > + [0] = { > + .activate_func = omap_device_enable_clocks, > + .activate_lat = 50000, /* FIXME random value */ > + .deactivate_func = omap_device_enable_clocks, > + .deactivate_lat = 50000, /* FIXME random value */ > + }, > +}; hmm, I'm hoping you're not expecting this to merge when using random values. > static inline void omap_init_mbox(void) > { > struct omap_hwmod *oh; > struct omap_device *od; > + struct omap_mbox_platform_data pdata; > > oh = omap_hwmod_lookup("mailbox"); > if (!oh) { > @@ -152,10 +163,14 @@ static inline void omap_init_mbox(void) > return; > } > > + pdata.device_enable = omap_device_enable; > + pdata.device_disable = omap_device_idle; If the driver want's to use the hooks, just use the runtime PM API. More on this below. > od = omap_device_build("omap-mailbox", -1, oh, > - NULL, 0, > - NULL, 0, > + &pdata, sizeof(pdata), > + mbox_latencies, ARRAY_SIZE(mbox_latencies), > 0); > + > if (!od) { > pr_err("%s: could not build device\n", __func__); > return; > diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c > index 1ddb82d..61f2149 100644 > --- a/arch/arm/mach-omap2/mailbox.c > +++ b/arch/arm/mach-omap2/mailbox.c > @@ -53,6 +53,7 @@ > #define OMAP4_MBOX_NR_REGS (OMAP4_MBOX_REG_SIZE / sizeof(u32)) > > static void __iomem *mbox_base; > +static struct platform_device *mbox_pdev; > > struct omap_mbox2_fifo { > unsigned long msg; > @@ -71,8 +72,6 @@ struct omap_mbox2_priv { > unsigned long irqdisable; > }; > > -static struct clk *mbox_ick_handle; > - > static void omap2_mbox_enable_irq(struct omap_mbox *mbox, > omap_mbox_type_t irq); > > @@ -91,14 +90,10 @@ static int omap2_mbox_startup(struct omap_mbox *mbox) > { > u32 l; > unsigned long timeout; > + struct omap_mbox_platform_data *pdata = mbox_pdev->dev.platform_data; > > - mbox_ick_handle = clk_get(NULL, "mailboxes_ick"); > - if (IS_ERR(mbox_ick_handle)) { > - printk(KERN_ERR "Could not get mailboxes_ick: %ld\n", > - PTR_ERR(mbox_ick_handle)); > - return PTR_ERR(mbox_ick_handle); > - } > - clk_enable(mbox_ick_handle); > + if (pdata->device_enable) > + pdata->device_enable(mbox_pdev); pm_runtime_get_sync(dev) > if (cpu_is_omap44xx()) { > mbox_write_reg(OMAP4_SOFTRESET, MAILBOX_SYSCONFIG); > @@ -144,9 +139,9 @@ static int omap2_mbox_startup(struct omap_mbox *mbox) > > static void omap2_mbox_shutdown(struct omap_mbox *mbox) > { > - clk_disable(mbox_ick_handle); > - clk_put(mbox_ick_handle); > - mbox_ick_handle = NULL; > + struct omap_mbox_platform_data *pdata = mbox_pdev->dev.platform_data; > + if (pdata->device_disable) > + pdata->device_disable(mbox_pdev); pm_runtime_put(dev) > } > > /* Mailbox FIFO handle functions */ > @@ -428,6 +423,8 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev) > if (!mbox_base) > return -ENOMEM; > > + mbox_pdev = pdev; please don't use a global for this. What if a future SoC has more than one mailbox? How about adding a field to struct omap_mbox? > ret = omap_mbox_register(&pdev->dev, list); > if (ret) { > iounmap(mbox_base); > diff --git a/arch/arm/plat-omap/include/plat/mailbox.h b/arch/arm/plat-omap/include/plat/mailbox.h > index 9976565..59443b1 100644 > --- a/arch/arm/plat-omap/include/plat/mailbox.h > +++ b/arch/arm/plat-omap/include/plat/mailbox.h > @@ -11,6 +11,7 @@ > > typedef u32 mbox_msg_t; > struct omap_mbox; > +struct platform_device; > > typedef int __bitwise omap_mbox_irq_t; > #define IRQ_TX ((__force omap_mbox_irq_t) 1) > @@ -59,6 +60,11 @@ struct omap_mbox { > void *priv; > }; > > +struct omap_mbox_platform_data { > + int (*device_enable)(struct platform_device *pdev); > + int (*device_disable)(struct platform_device *pdev); > +}; > + > int omap_mbox_msg_send(struct omap_mbox *, mbox_msg_t msg); > void omap_mbox_init_seq(struct omap_mbox *); Kevin