14ed37394SMagnus Damm /*
24ed37394SMagnus Damm  * arch/sh/kernel/cpu/sh4a/clock-sh7366.c
34ed37394SMagnus Damm  *
44ed37394SMagnus Damm  * SH7366 clock framework support
54ed37394SMagnus Damm  *
64ed37394SMagnus Damm  * Copyright (C) 2009 Magnus Damm
74ed37394SMagnus Damm  *
84ed37394SMagnus Damm  * This program is free software; you can redistribute it and/or modify
94ed37394SMagnus Damm  * it under the terms of the GNU General Public License as published by
104ed37394SMagnus Damm  * the Free Software Foundation; either version 2 of the License
114ed37394SMagnus Damm  *
124ed37394SMagnus Damm  * This program is distributed in the hope that it will be useful,
134ed37394SMagnus Damm  * but WITHOUT ANY WARRANTY; without even the implied warranty of
144ed37394SMagnus Damm  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
154ed37394SMagnus Damm  * GNU General Public License for more details.
164ed37394SMagnus Damm  *
174ed37394SMagnus Damm  * You should have received a copy of the GNU General Public License
184ed37394SMagnus Damm  * along with this program; if not, write to the Free Software
194ed37394SMagnus Damm  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
204ed37394SMagnus Damm  */
214ed37394SMagnus Damm #include <linux/init.h>
224ed37394SMagnus Damm #include <linux/kernel.h>
234ed37394SMagnus Damm #include <linux/io.h>
246d803ba7SJean-Christop PLAGNIOL-VILLARD #include <linux/clkdev.h>
254ed37394SMagnus Damm #include <asm/clock.h>
264ed37394SMagnus Damm 
274ed37394SMagnus Damm /* SH7366 registers */
284ed37394SMagnus Damm #define FRQCR		0xa4150000
294ed37394SMagnus Damm #define VCLKCR		0xa4150004
304ed37394SMagnus Damm #define SCLKACR		0xa4150008
314ed37394SMagnus Damm #define SCLKBCR		0xa415000c
324ed37394SMagnus Damm #define PLLCR		0xa4150024
334ed37394SMagnus Damm #define MSTPCR0		0xa4150030
344ed37394SMagnus Damm #define MSTPCR1		0xa4150034
354ed37394SMagnus Damm #define MSTPCR2		0xa4150038
364ed37394SMagnus Damm #define DLLFRQ		0xa4150050
374ed37394SMagnus Damm 
384ed37394SMagnus Damm /* Fixed 32 KHz root clock for RTC and Power Management purposes */
394ed37394SMagnus Damm static struct clk r_clk = {
404ed37394SMagnus Damm 	.rate           = 32768,
414ed37394SMagnus Damm };
424ed37394SMagnus Damm 
434ed37394SMagnus Damm /*
444ed37394SMagnus Damm  * Default rate for the root input clock, reset this with clk_set_rate()
454ed37394SMagnus Damm  * from the platform code.
464ed37394SMagnus Damm  */
474ed37394SMagnus Damm struct clk extal_clk = {
484ed37394SMagnus Damm 	.rate		= 33333333,
494ed37394SMagnus Damm };
504ed37394SMagnus Damm 
514ed37394SMagnus Damm /* The dll block multiplies the 32khz r_clk, may be used instead of extal */
524ed37394SMagnus Damm static unsigned long dll_recalc(struct clk *clk)
534ed37394SMagnus Damm {
544ed37394SMagnus Damm 	unsigned long mult;
554ed37394SMagnus Damm 
564ed37394SMagnus Damm 	if (__raw_readl(PLLCR) & 0x1000)
574ed37394SMagnus Damm 		mult = __raw_readl(DLLFRQ);
584ed37394SMagnus Damm 	else
594ed37394SMagnus Damm 		mult = 0;
604ed37394SMagnus Damm 
614ed37394SMagnus Damm 	return clk->parent->rate * mult;
624ed37394SMagnus Damm }
634ed37394SMagnus Damm 
6433cb61a4SMagnus Damm static struct sh_clk_ops dll_clk_ops = {
654ed37394SMagnus Damm 	.recalc		= dll_recalc,
664ed37394SMagnus Damm };
674ed37394SMagnus Damm 
684ed37394SMagnus Damm static struct clk dll_clk = {
694ed37394SMagnus Damm 	.ops		= &dll_clk_ops,
704ed37394SMagnus Damm 	.parent		= &r_clk,
714ed37394SMagnus Damm 	.flags		= CLK_ENABLE_ON_INIT,
724ed37394SMagnus Damm };
734ed37394SMagnus Damm 
744ed37394SMagnus Damm static unsigned long pll_recalc(struct clk *clk)
754ed37394SMagnus Damm {
764ed37394SMagnus Damm 	unsigned long mult = 1;
774ed37394SMagnus Damm 	unsigned long div = 1;
784ed37394SMagnus Damm 
794ed37394SMagnus Damm 	if (__raw_readl(PLLCR) & 0x4000)
804ed37394SMagnus Damm 		mult = (((__raw_readl(FRQCR) >> 24) & 0x1f) + 1);
814ed37394SMagnus Damm 	else
824ed37394SMagnus Damm 		div = 2;
834ed37394SMagnus Damm 
844ed37394SMagnus Damm 	return (clk->parent->rate * mult) / div;
854ed37394SMagnus Damm }
864ed37394SMagnus Damm 
8733cb61a4SMagnus Damm static struct sh_clk_ops pll_clk_ops = {
884ed37394SMagnus Damm 	.recalc		= pll_recalc,
894ed37394SMagnus Damm };
904ed37394SMagnus Damm 
914ed37394SMagnus Damm static struct clk pll_clk = {
924ed37394SMagnus Damm 	.ops		= &pll_clk_ops,
934ed37394SMagnus Damm 	.flags		= CLK_ENABLE_ON_INIT,
944ed37394SMagnus Damm };
954ed37394SMagnus Damm 
964ed37394SMagnus Damm struct clk *main_clks[] = {
974ed37394SMagnus Damm 	&r_clk,
984ed37394SMagnus Damm 	&extal_clk,
994ed37394SMagnus Damm 	&dll_clk,
1004ed37394SMagnus Damm 	&pll_clk,
1014ed37394SMagnus Damm };
1024ed37394SMagnus Damm 
1034ed37394SMagnus Damm static int multipliers[] = { 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
1044ed37394SMagnus Damm static int divisors[] = { 1, 3, 2, 5, 3, 4, 5, 6, 8, 10, 12, 16, 20 };
1054ed37394SMagnus Damm 
1060a5f337eSMagnus Damm static struct clk_div_mult_table div4_div_mult_table = {
1074ed37394SMagnus Damm 	.divisors = divisors,
1084ed37394SMagnus Damm 	.nr_divisors = ARRAY_SIZE(divisors),
1094ed37394SMagnus Damm 	.multipliers = multipliers,
1104ed37394SMagnus Damm 	.nr_multipliers = ARRAY_SIZE(multipliers),
1114ed37394SMagnus Damm };
1124ed37394SMagnus Damm 
1130a5f337eSMagnus Damm static struct clk_div4_table div4_table = {
1140a5f337eSMagnus Damm 	.div_mult_table = &div4_div_mult_table,
1150a5f337eSMagnus Damm };
1160a5f337eSMagnus Damm 
1174ed37394SMagnus Damm enum { DIV4_I, DIV4_U, DIV4_SH, DIV4_B, DIV4_B3, DIV4_P,
1184ed37394SMagnus Damm        DIV4_SIUA, DIV4_SIUB, DIV4_NR };
1194ed37394SMagnus Damm 
120914ebf0bSMagnus Damm #define DIV4(_reg, _bit, _mask, _flags) \
121914ebf0bSMagnus Damm   SH_CLK_DIV4(&pll_clk, _reg, _bit, _mask, _flags)
1224ed37394SMagnus Damm 
1234ed37394SMagnus Damm struct clk div4_clks[DIV4_NR] = {
124914ebf0bSMagnus Damm 	[DIV4_I] = DIV4(FRQCR, 20, 0x1fef, CLK_ENABLE_ON_INIT),
125914ebf0bSMagnus Damm 	[DIV4_U] = DIV4(FRQCR, 16, 0x1fff, CLK_ENABLE_ON_INIT),
126914ebf0bSMagnus Damm 	[DIV4_SH] = DIV4(FRQCR, 12, 0x1fff, CLK_ENABLE_ON_INIT),
127914ebf0bSMagnus Damm 	[DIV4_B] = DIV4(FRQCR, 8, 0x1fff, CLK_ENABLE_ON_INIT),
128914ebf0bSMagnus Damm 	[DIV4_B3] = DIV4(FRQCR, 4, 0x1fff, CLK_ENABLE_ON_INIT),
129914ebf0bSMagnus Damm 	[DIV4_P] = DIV4(FRQCR, 0, 0x1fff, 0),
130914ebf0bSMagnus Damm 	[DIV4_SIUA] = DIV4(SCLKACR, 0, 0x1fff, 0),
131914ebf0bSMagnus Damm 	[DIV4_SIUB] = DIV4(SCLKBCR, 0, 0x1fff, 0),
1324ed37394SMagnus Damm };
1334ed37394SMagnus Damm 
134098ec49bSMagnus Damm enum { DIV6_V, DIV6_NR };
135098ec49bSMagnus Damm 
136098ec49bSMagnus Damm struct clk div6_clks[DIV6_NR] = {
1379e1985e1SMagnus Damm 	[DIV6_V] = SH_CLK_DIV6(&pll_clk, VCLKCR, 0),
1384ed37394SMagnus Damm };
1394ed37394SMagnus Damm 
140c77a9c3eSMagnus Damm #define MSTP(_parent, _reg, _bit, _flags) \
141c77a9c3eSMagnus Damm   SH_CLK_MSTP32(_parent, _reg, _bit, _flags)
1424ed37394SMagnus Damm 
1434780683aSMagnus Damm enum { MSTP031, MSTP030, MSTP029, MSTP028, MSTP026,
1444780683aSMagnus Damm        MSTP023, MSTP022, MSTP021, MSTP020, MSTP019, MSTP018, MSTP017, MSTP016,
1454780683aSMagnus Damm        MSTP015, MSTP014, MSTP013, MSTP012, MSTP011, MSTP010,
1464780683aSMagnus Damm        MSTP007, MSTP006, MSTP005, MSTP002, MSTP001,
1474780683aSMagnus Damm        MSTP109, MSTP100,
1484780683aSMagnus Damm        MSTP227, MSTP226, MSTP224, MSTP223, MSTP222, MSTP218, MSTP217,
1494780683aSMagnus Damm        MSTP211, MSTP207, MSTP205, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,
1504780683aSMagnus Damm        MSTP_NR };
1514780683aSMagnus Damm 
1524780683aSMagnus Damm static struct clk mstp_clks[MSTP_NR] = {
1534ed37394SMagnus Damm 	/* See page 52 of Datasheet V0.40: Overview -> Block Diagram */
154c77a9c3eSMagnus Damm 	[MSTP031] = MSTP(&div4_clks[DIV4_I], MSTPCR0, 31, CLK_ENABLE_ON_INIT),
155c77a9c3eSMagnus Damm 	[MSTP030] = MSTP(&div4_clks[DIV4_I], MSTPCR0, 30, CLK_ENABLE_ON_INIT),
156c77a9c3eSMagnus Damm 	[MSTP029] = MSTP(&div4_clks[DIV4_I], MSTPCR0, 29, CLK_ENABLE_ON_INIT),
157c77a9c3eSMagnus Damm 	[MSTP028] = MSTP(&div4_clks[DIV4_SH], MSTPCR0, 28, CLK_ENABLE_ON_INIT),
158c77a9c3eSMagnus Damm 	[MSTP026] = MSTP(&div4_clks[DIV4_B], MSTPCR0, 26, CLK_ENABLE_ON_INIT),
159c77a9c3eSMagnus Damm 	[MSTP023] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 23, 0),
160c77a9c3eSMagnus Damm 	[MSTP022] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 22, 0),
161c77a9c3eSMagnus Damm 	[MSTP021] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 21, 0),
162c77a9c3eSMagnus Damm 	[MSTP020] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 20, 0),
163c77a9c3eSMagnus Damm 	[MSTP019] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 19, 0),
164c77a9c3eSMagnus Damm 	[MSTP017] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 17, 0),
165c77a9c3eSMagnus Damm 	[MSTP015] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 15, 0),
166c77a9c3eSMagnus Damm 	[MSTP014] = MSTP(&r_clk, MSTPCR0, 14, 0),
167c77a9c3eSMagnus Damm 	[MSTP013] = MSTP(&r_clk, MSTPCR0, 13, 0),
168c77a9c3eSMagnus Damm 	[MSTP011] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 11, 0),
169c77a9c3eSMagnus Damm 	[MSTP010] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 10, 0),
170c77a9c3eSMagnus Damm 	[MSTP007] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 7, 0),
171c77a9c3eSMagnus Damm 	[MSTP006] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 6, 0),
172c77a9c3eSMagnus Damm 	[MSTP005] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 5, 0),
173c77a9c3eSMagnus Damm 	[MSTP002] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 2, 0),
174c77a9c3eSMagnus Damm 	[MSTP001] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 1, 0),
1754ed37394SMagnus Damm 
176c77a9c3eSMagnus Damm 	[MSTP109] = MSTP(&div4_clks[DIV4_P], MSTPCR1, 9, 0),
1774ed37394SMagnus Damm 
178c77a9c3eSMagnus Damm 	[MSTP227] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 27, 0),
179c77a9c3eSMagnus Damm 	[MSTP226] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 26, 0),
180c77a9c3eSMagnus Damm 	[MSTP224] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 24, 0),
181c77a9c3eSMagnus Damm 	[MSTP223] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 23, 0),
182c77a9c3eSMagnus Damm 	[MSTP222] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 22, 0),
183c77a9c3eSMagnus Damm 	[MSTP218] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 18, 0),
184c77a9c3eSMagnus Damm 	[MSTP217] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 17, 0),
185c77a9c3eSMagnus Damm 	[MSTP211] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 11, 0),
186c77a9c3eSMagnus Damm 	[MSTP207] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 7, CLK_ENABLE_ON_INIT),
187c77a9c3eSMagnus Damm 	[MSTP205] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 5, 0),
188c77a9c3eSMagnus Damm 	[MSTP204] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 4, 0),
189c77a9c3eSMagnus Damm 	[MSTP203] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 3, 0),
190c77a9c3eSMagnus Damm 	[MSTP202] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 2, CLK_ENABLE_ON_INIT),
191c77a9c3eSMagnus Damm 	[MSTP201] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 1, CLK_ENABLE_ON_INIT),
192c77a9c3eSMagnus Damm 	[MSTP200] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 0, 0),
1934ed37394SMagnus Damm };
1944ed37394SMagnus Damm 
195098ec49bSMagnus Damm static struct clk_lookup lookups[] = {
19659aa69d9SMagnus Damm 	/* main clocks */
19759aa69d9SMagnus Damm 	CLKDEV_CON_ID("rclk", &r_clk),
19859aa69d9SMagnus Damm 	CLKDEV_CON_ID("extal", &extal_clk),
19959aa69d9SMagnus Damm 	CLKDEV_CON_ID("dll_clk", &dll_clk),
20059aa69d9SMagnus Damm 	CLKDEV_CON_ID("pll_clk", &pll_clk),
20159aa69d9SMagnus Damm 
20240956e75SMagnus Damm 	/* DIV4 clocks */
20340956e75SMagnus Damm 	CLKDEV_CON_ID("cpu_clk", &div4_clks[DIV4_I]),
20440956e75SMagnus Damm 	CLKDEV_CON_ID("umem_clk", &div4_clks[DIV4_U]),
20540956e75SMagnus Damm 	CLKDEV_CON_ID("shyway_clk", &div4_clks[DIV4_SH]),
20640956e75SMagnus Damm 	CLKDEV_CON_ID("bus_clk", &div4_clks[DIV4_B]),
20740956e75SMagnus Damm 	CLKDEV_CON_ID("b3_clk", &div4_clks[DIV4_B3]),
20840956e75SMagnus Damm 	CLKDEV_CON_ID("peripheral_clk", &div4_clks[DIV4_P]),
20940956e75SMagnus Damm 	CLKDEV_CON_ID("siua_clk", &div4_clks[DIV4_SIUA]),
21040956e75SMagnus Damm 	CLKDEV_CON_ID("siub_clk", &div4_clks[DIV4_SIUB]),
21140956e75SMagnus Damm 
212098ec49bSMagnus Damm 	/* DIV6 clocks */
213098ec49bSMagnus Damm 	CLKDEV_CON_ID("video_clk", &div6_clks[DIV6_V]),
214b87cecefSMagnus Damm 
215b87cecefSMagnus Damm 	/* MSTP32 clocks */
216b87cecefSMagnus Damm 	CLKDEV_CON_ID("tlb0", &mstp_clks[MSTP031]),
217b87cecefSMagnus Damm 	CLKDEV_CON_ID("ic0", &mstp_clks[MSTP030]),
218b87cecefSMagnus Damm 	CLKDEV_CON_ID("oc0", &mstp_clks[MSTP029]),
219b87cecefSMagnus Damm 	CLKDEV_CON_ID("rsmem0", &mstp_clks[MSTP028]),
220b87cecefSMagnus Damm 	CLKDEV_CON_ID("xymem0", &mstp_clks[MSTP026]),
221b87cecefSMagnus Damm 	CLKDEV_CON_ID("intc3", &mstp_clks[MSTP023]),
222b87cecefSMagnus Damm 	CLKDEV_CON_ID("intc0", &mstp_clks[MSTP022]),
223b87cecefSMagnus Damm 	CLKDEV_CON_ID("dmac0", &mstp_clks[MSTP021]),
224b87cecefSMagnus Damm 	CLKDEV_CON_ID("sh0", &mstp_clks[MSTP020]),
225b87cecefSMagnus Damm 	CLKDEV_CON_ID("hudi0", &mstp_clks[MSTP019]),
226b87cecefSMagnus Damm 	CLKDEV_CON_ID("ubc0", &mstp_clks[MSTP017]),
227b87cecefSMagnus Damm 	CLKDEV_CON_ID("tmu_fck", &mstp_clks[MSTP015]),
228b87cecefSMagnus Damm 	CLKDEV_CON_ID("cmt_fck", &mstp_clks[MSTP014]),
229b87cecefSMagnus Damm 	CLKDEV_CON_ID("rwdt0", &mstp_clks[MSTP013]),
230b87cecefSMagnus Damm 	CLKDEV_CON_ID("mfi0", &mstp_clks[MSTP011]),
231b87cecefSMagnus Damm 	CLKDEV_CON_ID("flctl0", &mstp_clks[MSTP010]),
232ee0c2effSKuninori Morimoto 
233ee0c2effSKuninori Morimoto 	CLKDEV_ICK_ID("sci_fck", "sh-sci.0", &mstp_clks[MSTP007]),
234ee0c2effSKuninori Morimoto 	CLKDEV_ICK_ID("sci_fck", "sh-sci.1", &mstp_clks[MSTP006]),
235ee0c2effSKuninori Morimoto 	CLKDEV_ICK_ID("sci_fck", "sh-sci.2", &mstp_clks[MSTP005]),
236ee0c2effSKuninori Morimoto 
237b87cecefSMagnus Damm 	CLKDEV_CON_ID("msiof0", &mstp_clks[MSTP002]),
238b87cecefSMagnus Damm 	CLKDEV_CON_ID("sbr0", &mstp_clks[MSTP001]),
23954f7c116SKuninori Morimoto 	CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP109]),
240b87cecefSMagnus Damm 	CLKDEV_CON_ID("icb0", &mstp_clks[MSTP227]),
241b87cecefSMagnus Damm 	CLKDEV_CON_ID("meram0", &mstp_clks[MSTP226]),
242b87cecefSMagnus Damm 	CLKDEV_CON_ID("dacy1", &mstp_clks[MSTP224]),
243b87cecefSMagnus Damm 	CLKDEV_CON_ID("dacy0", &mstp_clks[MSTP223]),
244b87cecefSMagnus Damm 	CLKDEV_CON_ID("tsif0", &mstp_clks[MSTP222]),
245b87cecefSMagnus Damm 	CLKDEV_CON_ID("sdhi0", &mstp_clks[MSTP218]),
246b87cecefSMagnus Damm 	CLKDEV_CON_ID("mmcif0", &mstp_clks[MSTP217]),
247b87cecefSMagnus Damm 	CLKDEV_CON_ID("usbf0", &mstp_clks[MSTP211]),
248b87cecefSMagnus Damm 	CLKDEV_CON_ID("veu1", &mstp_clks[MSTP207]),
249b87cecefSMagnus Damm 	CLKDEV_CON_ID("vou0", &mstp_clks[MSTP205]),
250b87cecefSMagnus Damm 	CLKDEV_CON_ID("beu0", &mstp_clks[MSTP204]),
251b87cecefSMagnus Damm 	CLKDEV_CON_ID("ceu0", &mstp_clks[MSTP203]),
252b87cecefSMagnus Damm 	CLKDEV_CON_ID("veu0", &mstp_clks[MSTP202]),
253b87cecefSMagnus Damm 	CLKDEV_CON_ID("vpu0", &mstp_clks[MSTP201]),
254b87cecefSMagnus Damm 	CLKDEV_CON_ID("lcdc0", &mstp_clks[MSTP200]),
255098ec49bSMagnus Damm };
256098ec49bSMagnus Damm 
2574ed37394SMagnus Damm int __init arch_clk_init(void)
2584ed37394SMagnus Damm {
2594ed37394SMagnus Damm 	int k, ret = 0;
2604ed37394SMagnus Damm 
2614ed37394SMagnus Damm 	/* autodetect extal or dll configuration */
2624ed37394SMagnus Damm 	if (__raw_readl(PLLCR) & 0x1000)
2634ed37394SMagnus Damm 		pll_clk.parent = &dll_clk;
2644ed37394SMagnus Damm 	else
2654ed37394SMagnus Damm 		pll_clk.parent = &extal_clk;
2664ed37394SMagnus Damm 
2674ed37394SMagnus Damm 	for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
2684ed37394SMagnus Damm 		ret = clk_register(main_clks[k]);
2694ed37394SMagnus Damm 
270098ec49bSMagnus Damm 	clkdev_add_table(lookups, ARRAY_SIZE(lookups));
271098ec49bSMagnus Damm 
2724ed37394SMagnus Damm 	if (!ret)
2734ed37394SMagnus Damm 		ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table);
2744ed37394SMagnus Damm 
2754ed37394SMagnus Damm 	if (!ret)
276098ec49bSMagnus Damm 		ret = sh_clk_div6_register(div6_clks, DIV6_NR);
2774ed37394SMagnus Damm 
2784ed37394SMagnus Damm 	if (!ret)
2794780683aSMagnus Damm 		ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR);
2804ed37394SMagnus Damm 
2814ed37394SMagnus Damm 	return ret;
2824ed37394SMagnus Damm }
283