From patchwork Tue Jun 2 08:53:54 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Magnus Damm X-Patchwork-Id: 27425 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 n528vI5J016597 for ; Tue, 2 Jun 2009 08:57:19 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753435AbZFBI5I (ORCPT ); Tue, 2 Jun 2009 04:57:08 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755781AbZFBI5I (ORCPT ); Tue, 2 Jun 2009 04:57:08 -0400 Received: from wa-out-1112.google.com ([209.85.146.181]:51477 "EHLO wa-out-1112.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754906AbZFBI5F (ORCPT ); Tue, 2 Jun 2009 04:57:05 -0400 Received: by wa-out-1112.google.com with SMTP id j5so1673158wah.21 for ; Tue, 02 Jun 2009 01:57:08 -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:date:message-id :subject; bh=76sRYPx1fPkIC7xJQVCuJCzkkRZNw1bbKdQyBXBoSeg=; b=KDdkuw828bu6t19ujUpuIBfROlRQNoOE1al9o1FhwcLGyX0Xllcscf1Y0KebOlkIwr TJQvUABpsWmRmOKNp0SAADTKCNmSfy6cwbA8d0XWIXxsx0NO6WbQVOi27bGVC87Xqvza zcqhtd73xsljHvLcezekzCtZvwWszpcK0gusY= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:date:message-id:subject; b=WDiVua+UAY/VloSK5XaDwmJ+01qgwbEcPOQ9tHc6iRh0Jzwc2OXS4tcQPipqVbuVPi wJUhLleOozKY6UuNk2VwiMjF4mElgVRwCFlUHHnSqEzYmcPOvQpouEHWGg2O+eRHzx7C zYdnAeCA27t32nd4vkN43sjTe7ZaKJZ/zAOXQ= Received: by 10.114.112.2 with SMTP id k2mr3440661wac.53.1243933027971; Tue, 02 Jun 2009 01:57:07 -0700 (PDT) Received: from rx1.opensource.se (210.5.32.202.bf.2iij.net [202.32.5.210]) by mx.google.com with ESMTPS id k2sm16828775rvb.6.2009.06.02.01.57.06 (version=TLSv1/SSLv3 cipher=RC4-MD5); Tue, 02 Jun 2009 01:57:07 -0700 (PDT) From: Magnus Damm To: linux-sh@vger.kernel.org Cc: Magnus Damm , lethal@linux-sh.org Date: Tue, 02 Jun 2009 17:53:54 +0900 Message-Id: <20090602085354.26895.36340.sendpatchset@rx1.opensource.se> Subject: [PATCH] sh: clock div6 helper code Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org From: Magnus Damm This patch adds div6 clock helper code. The div6 clocks are simply 6-bit divide-by-n modules where n is 1 to 64. Needed for vclk on sh7722, sh7723, sh7343 and sh7366. sh7724 needs this even more for vclk, fclka, fclkb, irdaclk and spuclk. Signed-off-by: Magnus Damm --- arch/sh/include/asm/clock.h | 10 +++++ arch/sh/kernel/cpu/clock-cpg.c | 71 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 75 insertions(+), 6 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html --- 0001/arch/sh/include/asm/clock.h +++ work/arch/sh/include/asm/clock.h 2009-06-02 16:44:33.000000000 +0900 @@ -145,4 +145,14 @@ int sh_clk_mstp32_register(struct clk *c int sh_clk_div4_register(struct clk *clks, int nr, struct clk_div_mult_table *table); +#define SH_CLK_DIV6(_name, _parent, _reg, _flags) \ +{ \ + .name = _name, \ + .parent = _parent, \ + .enable_reg = (void __iomem *)_reg, \ + .flags = _flags, \ +} + +int sh_clk_div6_register(struct clk *clks, int nr); + #endif /* __ASM_SH_CLOCK_H */ --- 0004/arch/sh/kernel/cpu/clock-cpg.c +++ work/arch/sh/kernel/cpu/clock-cpg.c 2009-06-02 16:44:53.000000000 +0900 @@ -38,6 +38,70 @@ int __init sh_clk_mstp32_register(struct return ret; } +static long sh_clk_div_round_rate(struct clk *clk, unsigned long rate) +{ + return clk_rate_table_round(clk, clk->freq_table, rate); +} + +static int sh_clk_div6_divisors[64] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64 +}; + +static struct clk_div_mult_table sh_clk_div6_table = { + .divisors = sh_clk_div6_divisors, + .nr_divisors = ARRAY_SIZE(sh_clk_div6_divisors), +}; + +static unsigned long sh_clk_div6_recalc(struct clk *clk) +{ + struct clk_div_mult_table *table = &sh_clk_div6_table; + unsigned int idx; + + clk_rate_table_build(clk, clk->freq_table, table->nr_divisors, + table, NULL); + + idx = __raw_readl(clk->enable_reg) & 0x003f; + + return clk->freq_table[idx].frequency; +} + +static struct clk_ops sh_clk_div6_clk_ops = { + .recalc = sh_clk_div6_recalc, + .round_rate = sh_clk_div_round_rate, +}; + +int __init sh_clk_div6_register(struct clk *clks, int nr) +{ + struct clk *clkp; + void *freq_table; + int nr_divs = sh_clk_div6_table.nr_divisors; + int freq_table_size = sizeof(struct cpufreq_frequency_table); + int ret = 0; + int k; + + freq_table_size *= (nr_divs + 1); + + freq_table = alloc_bootmem(freq_table_size * nr); + if (!freq_table) + return -ENOMEM; + + for (k = 0; !ret && (k < nr); k++) { + clkp = clks + k; + + clkp->ops = &sh_clk_div6_clk_ops; + clkp->id = -1; + clkp->freq_table = freq_table + (k * freq_table_size); + clkp->freq_table[nr_divs].frequency = CPUFREQ_TABLE_END; + + ret = clk_register(clkp); + } + + return ret; +} + static unsigned long sh_clk_div4_recalc(struct clk *clk) { struct clk_div_mult_table *table = clk->priv; @@ -51,14 +115,9 @@ static unsigned long sh_clk_div4_recalc( return clk->freq_table[idx].frequency; } -static long sh_clk_div4_round_rate(struct clk *clk, unsigned long rate) -{ - return clk_rate_table_round(clk, clk->freq_table, rate); -} - static struct clk_ops sh_clk_div4_clk_ops = { .recalc = sh_clk_div4_recalc, - .round_rate = sh_clk_div4_round_rate, + .round_rate = sh_clk_div_round_rate, }; int __init sh_clk_div4_register(struct clk *clks, int nr,