From patchwork Wed Jun 3 13:20:12 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jarkko Nikula X-Patchwork-Id: 27666 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n53DK3xT007381 for ; Wed, 3 Jun 2009 13:20:04 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753406AbZFCNT7 (ORCPT ); Wed, 3 Jun 2009 09:19:59 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753483AbZFCNT7 (ORCPT ); Wed, 3 Jun 2009 09:19:59 -0400 Received: from fg-out-1718.google.com ([72.14.220.159]:22959 "EHLO fg-out-1718.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753406AbZFCNT7 (ORCPT ); Wed, 3 Jun 2009 09:19:59 -0400 Received: by fg-out-1718.google.com with SMTP id d23so1146986fga.17 for ; Wed, 03 Jun 2009 06:19:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:date:from:to:cc:subject :message-id:in-reply-to:references:x-mailer:mime-version :content-type:content-transfer-encoding; bh=HSbDO5gMqQPWfr6il9KQfMR9L8pflZ5NIEZ4Hvc/cME=; b=L1xuDtzXn2aCkht8xjtNvNPtmWJTydR7fZeA/EhgPwIVr1yc3ejuagwKWcN3+gvAwx AU9DXLdhhzVgxMoU7A2czJvhhpIm2oKQfKgYhpgIM45nsnqJjMgn7ZHha5EiGcHWZjnS T7xo90Jb8l6L6kPXgH6LeSLqm/IOIspbXurw0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=date:from:to:cc:subject:message-id:in-reply-to:references:x-mailer :mime-version:content-type:content-transfer-encoding; b=GAakal38xtremvdTIcD+raWcGo1oiAc6pym2PY2Tb4yuqOm0F+9GTKxejy61SAE6Qy r9HvEzgfXvbw51R6OTK7oMM00QCQbHirmxWqzOn0aM2K5ubohQu6T4EYoJNxZv3nFFDT NgoywEEqSSf7VA06Xt2I62/E6AI47ocknMxOU= Received: by 10.86.96.12 with SMTP id t12mr1092835fgb.77.1244035198997; Wed, 03 Jun 2009 06:19:58 -0700 (PDT) Received: from mylly (host-94-101-4-66.taloyhtioverkot.fi [94.101.4.66]) by mx.google.com with ESMTPS id 4sm270704fgg.18.2009.06.03.06.19.56 (version=TLSv1/SSLv3 cipher=RC4-MD5); Wed, 03 Jun 2009 06:19:57 -0700 (PDT) Date: Wed, 3 Jun 2009 16:20:12 +0300 From: Jarkko Nikula To: Tony Lindgren Cc: Hugo Vincent , linux-omap@vger.kernel.org Subject: Re: [PATCH] OMAP3 Overo: add EXPORT_SYMBOLs for Overo ASoC audio to be built as a module. Message-Id: <20090603162012.877be077.jhnikula@gmail.com> In-Reply-To: <20090602173543.GE27332@atomide.com> References: <5a7b8b7b0906011802y4abc5ba6m8813d6884825e805@mail.gmail.com> <20090602173543.GE27332@atomide.com> X-Mailer: Sylpheed 2.6.0 (GTK+ 2.16.1; i486-pc-linux-gnu) Mime-Version: 1.0 Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org On Tue, 2 Jun 2009 10:35:43 -0700 Tony Lindgren wrote: > * Hugo Vincent [090601 18:03]: > > I'm pretty new to kernel development, so I don't know any potential > > problems with doing this, but without this, audio/ASoC support must be > > built into the kernel (modpost fails when trying to build as modules), > > whereas with this patch, it can be built and used as a module. > > > > Comments? > > To me it looks like we should rather fix sound/soc/omap/omap-mcbsp.c > to use the clock framework rather than access omap_ctrl_read/write > directly. > Yeah, I have something like below in my mind. I don't know is this idea working but at least I know there is need to define McBSP FCLK parent clocks for 24xx similar way as they are defined for 34xx and to figure out something for the FIXMEs. McBSP module is enabling the clocks at request time but fclk must be off in order to change its parent. diff --git a/arch/arm/plat-omap/include/mach/mcbsp.h b/arch/arm/plat-omap/include/mach/mcbsp.h index bb154ea..3ebbe3f 100644 --- a/arch/arm/plat-omap/include/mach/mcbsp.h +++ b/arch/arm/plat-omap/include/mach/mcbsp.h @@ -389,6 +389,7 @@ int omap_mcbsp_request(unsigned int id); void omap_mcbsp_free(unsigned int id); void omap_mcbsp_start(unsigned int id); void omap_mcbsp_stop(unsigned int id); +int omap_mcbsp_set_fclk_src(unsigned int id, const char *clk_name); void omap_mcbsp_xmit_word(unsigned int id, u32 word); u32 omap_mcbsp_recv_word(unsigned int id); diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c index efa0e01..f36c6a6 100644 --- a/arch/arm/plat-omap/mcbsp.c +++ b/arch/arm/plat-omap/mcbsp.c @@ -398,6 +398,30 @@ void omap_mcbsp_stop(unsigned int id) } EXPORT_SYMBOL(omap_mcbsp_stop); +int omap_mcbsp_set_fclk_src(unsigned int id, const char *clk_name) +{ + struct omap_mcbsp *mcbsp; + struct clk *fclk_src; + int err; + + if (!omap_mcbsp_check_valid_id(id)) { + printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); + return -ENODEV; + } + + mcbsp = id_to_mcbsp_ptr(id); + fclk_src = clk_get(mcbsp->dev, clk_name); + if (IS_ERR(fclk_src)) + return PTR_ERR(fclk_src); + clk_disable(mcbsp->fclk); /* FIXME, Hack! */ + err = clk_set_parent(mcbsp->fclk, fclk_src); + clk_enable(mcbsp->fclk); /* FIXME, Hack! */ + clk_put(fclk_src); + + return err; +} +EXPORT_SYMBOL(omap_mcbsp_set_fclk_src); + /* polled mcbsp i/o operations */ int omap_mcbsp_pollwrite(unsigned int id, u16 buf) { diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 9126142..d03a3c0 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c @@ -397,8 +397,7 @@ static int omap_mcbsp_dai_set_clkdiv(struct snd_soc_dai *cpu_dai, static int omap_mcbsp_dai_set_clks_src(struct omap_mcbsp_data *mcbsp_data, int clk_id) { - int sel_bit; - u16 reg, reg_devconf1 = OMAP243X_CONTROL_DEVCONF1; + const char *clks_src; if (cpu_class_is_omap1()) { /* OMAP1's can use only external source clock */ @@ -408,43 +407,16 @@ static int omap_mcbsp_dai_set_clks_src(struct omap_mcbsp_data *mcbsp_data, return 0; } - if (cpu_is_omap2420() && mcbsp_data->bus_id > 1) - return -EINVAL; - - if (cpu_is_omap343x()) - reg_devconf1 = OMAP343X_CONTROL_DEVCONF1; - - switch (mcbsp_data->bus_id) { - case 0: - reg = OMAP2_CONTROL_DEVCONF0; - sel_bit = 2; - break; - case 1: - reg = OMAP2_CONTROL_DEVCONF0; - sel_bit = 6; - break; - case 2: - reg = reg_devconf1; - sel_bit = 0; - break; - case 3: - reg = reg_devconf1; - sel_bit = 2; - break; - case 4: - reg = reg_devconf1; - sel_bit = 4; - break; - default: - return -EINVAL; + if (clk_id == OMAP_MCBSP_SYSCLK_CLKS_FCLK) { + if (cpu_is_omap24xx()) + clks_src = "func_96m_ck"; + if (cpu_is_omap343x()) + clks_src = "core_96m_fck"; + } else { + clks_src = "mcbsp_clks"; } - if (clk_id == OMAP_MCBSP_SYSCLK_CLKS_FCLK) - omap_ctrl_writel(omap_ctrl_readl(reg) & ~(1 << sel_bit), reg); - else - omap_ctrl_writel(omap_ctrl_readl(reg) | (1 << sel_bit), reg); - - return 0; + return omap_mcbsp_set_fclk_src(mcbsp_data->bus_id, clks_src); } static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai,