xref: /openbmc/linux/arch/mips/bcm63xx/clk.c (revision 26dd3e4ff9ac1aa576c97d23d7425d2544dbc5bf)
1e7300d04SMaxime Bizon /*
2e7300d04SMaxime Bizon  * This file is subject to the terms and conditions of the GNU General Public
3e7300d04SMaxime Bizon  * License.  See the file "COPYING" in the main directory of this archive
4e7300d04SMaxime Bizon  * for more details.
5e7300d04SMaxime Bizon  *
6e7300d04SMaxime Bizon  * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
7e7300d04SMaxime Bizon  */
8e7300d04SMaxime Bizon 
9*26dd3e4fSPaul Gortmaker #include <linux/init.h>
10*26dd3e4fSPaul Gortmaker #include <linux/export.h>
11e7300d04SMaxime Bizon #include <linux/mutex.h>
12e7300d04SMaxime Bizon #include <linux/err.h>
13e7300d04SMaxime Bizon #include <linux/clk.h>
1404712f3fSMaxime Bizon #include <linux/delay.h>
15e7300d04SMaxime Bizon #include <bcm63xx_cpu.h>
16e7300d04SMaxime Bizon #include <bcm63xx_io.h>
17e7300d04SMaxime Bizon #include <bcm63xx_regs.h>
18ba00e2e5SJonas Gorski #include <bcm63xx_reset.h>
19042df4faSJonas Gorski 
20042df4faSJonas Gorski struct clk {
21042df4faSJonas Gorski 	void		(*set)(struct clk *, int);
22042df4faSJonas Gorski 	unsigned int	rate;
23042df4faSJonas Gorski 	unsigned int	usage;
24042df4faSJonas Gorski 	int		id;
25042df4faSJonas Gorski };
26e7300d04SMaxime Bizon 
27e7300d04SMaxime Bizon static DEFINE_MUTEX(clocks_mutex);
28e7300d04SMaxime Bizon 
29e7300d04SMaxime Bizon 
30e7300d04SMaxime Bizon static void clk_enable_unlocked(struct clk *clk)
31e7300d04SMaxime Bizon {
32e7300d04SMaxime Bizon 	if (clk->set && (clk->usage++) == 0)
33e7300d04SMaxime Bizon 		clk->set(clk, 1);
34e7300d04SMaxime Bizon }
35e7300d04SMaxime Bizon 
36e7300d04SMaxime Bizon static void clk_disable_unlocked(struct clk *clk)
37e7300d04SMaxime Bizon {
38e7300d04SMaxime Bizon 	if (clk->set && (--clk->usage) == 0)
39e7300d04SMaxime Bizon 		clk->set(clk, 0);
40e7300d04SMaxime Bizon }
41e7300d04SMaxime Bizon 
42e7300d04SMaxime Bizon static void bcm_hwclock_set(u32 mask, int enable)
43e7300d04SMaxime Bizon {
44e7300d04SMaxime Bizon 	u32 reg;
45e7300d04SMaxime Bizon 
46e7300d04SMaxime Bizon 	reg = bcm_perf_readl(PERF_CKCTL_REG);
47e7300d04SMaxime Bizon 	if (enable)
48e7300d04SMaxime Bizon 		reg |= mask;
49e7300d04SMaxime Bizon 	else
50e7300d04SMaxime Bizon 		reg &= ~mask;
51e7300d04SMaxime Bizon 	bcm_perf_writel(reg, PERF_CKCTL_REG);
52e7300d04SMaxime Bizon }
53e7300d04SMaxime Bizon 
54e7300d04SMaxime Bizon /*
55e7300d04SMaxime Bizon  * Ethernet MAC "misc" clock: dma clocks and main clock on 6348
56e7300d04SMaxime Bizon  */
57e7300d04SMaxime Bizon static void enet_misc_set(struct clk *clk, int enable)
58e7300d04SMaxime Bizon {
59e7300d04SMaxime Bizon 	u32 mask;
60e7300d04SMaxime Bizon 
61e7300d04SMaxime Bizon 	if (BCMCPU_IS_6338())
62e7300d04SMaxime Bizon 		mask = CKCTL_6338_ENET_EN;
63e7300d04SMaxime Bizon 	else if (BCMCPU_IS_6345())
64e7300d04SMaxime Bizon 		mask = CKCTL_6345_ENET_EN;
65e7300d04SMaxime Bizon 	else if (BCMCPU_IS_6348())
66e7300d04SMaxime Bizon 		mask = CKCTL_6348_ENET_EN;
67e7300d04SMaxime Bizon 	else
68e7300d04SMaxime Bizon 		/* BCMCPU_IS_6358 */
69e7300d04SMaxime Bizon 		mask = CKCTL_6358_EMUSB_EN;
70e7300d04SMaxime Bizon 	bcm_hwclock_set(mask, enable);
71e7300d04SMaxime Bizon }
72e7300d04SMaxime Bizon 
73e7300d04SMaxime Bizon static struct clk clk_enet_misc = {
74e7300d04SMaxime Bizon 	.set	= enet_misc_set,
75e7300d04SMaxime Bizon };
76e7300d04SMaxime Bizon 
77e7300d04SMaxime Bizon /*
78e7300d04SMaxime Bizon  * Ethernet MAC clocks: only revelant on 6358, silently enable misc
79e7300d04SMaxime Bizon  * clocks
80e7300d04SMaxime Bizon  */
81e7300d04SMaxime Bizon static void enetx_set(struct clk *clk, int enable)
82e7300d04SMaxime Bizon {
83e7300d04SMaxime Bizon 	if (enable)
84e7300d04SMaxime Bizon 		clk_enable_unlocked(&clk_enet_misc);
85e7300d04SMaxime Bizon 	else
86e7300d04SMaxime Bizon 		clk_disable_unlocked(&clk_enet_misc);
87e7300d04SMaxime Bizon 
887b933421SFlorian Fainelli 	if (BCMCPU_IS_3368() || BCMCPU_IS_6358()) {
89e7300d04SMaxime Bizon 		u32 mask;
90e7300d04SMaxime Bizon 
91e7300d04SMaxime Bizon 		if (clk->id == 0)
92e7300d04SMaxime Bizon 			mask = CKCTL_6358_ENET0_EN;
93e7300d04SMaxime Bizon 		else
94e7300d04SMaxime Bizon 			mask = CKCTL_6358_ENET1_EN;
95e7300d04SMaxime Bizon 		bcm_hwclock_set(mask, enable);
96e7300d04SMaxime Bizon 	}
97e7300d04SMaxime Bizon }
98e7300d04SMaxime Bizon 
99e7300d04SMaxime Bizon static struct clk clk_enet0 = {
100e7300d04SMaxime Bizon 	.id	= 0,
101e7300d04SMaxime Bizon 	.set	= enetx_set,
102e7300d04SMaxime Bizon };
103e7300d04SMaxime Bizon 
104e7300d04SMaxime Bizon static struct clk clk_enet1 = {
105e7300d04SMaxime Bizon 	.id	= 1,
106e7300d04SMaxime Bizon 	.set	= enetx_set,
107e7300d04SMaxime Bizon };
108e7300d04SMaxime Bizon 
109e7300d04SMaxime Bizon /*
110e7300d04SMaxime Bizon  * Ethernet PHY clock
111e7300d04SMaxime Bizon  */
112e7300d04SMaxime Bizon static void ephy_set(struct clk *clk, int enable)
113e7300d04SMaxime Bizon {
1147b933421SFlorian Fainelli 	if (BCMCPU_IS_3368() || BCMCPU_IS_6358())
115e7300d04SMaxime Bizon 		bcm_hwclock_set(CKCTL_6358_EPHY_EN, enable);
116e7300d04SMaxime Bizon }
117e7300d04SMaxime Bizon 
118e7300d04SMaxime Bizon 
119e7300d04SMaxime Bizon static struct clk clk_ephy = {
120e7300d04SMaxime Bizon 	.set	= ephy_set,
121e7300d04SMaxime Bizon };
122e7300d04SMaxime Bizon 
123e7300d04SMaxime Bizon /*
12404712f3fSMaxime Bizon  * Ethernet switch clock
12504712f3fSMaxime Bizon  */
12604712f3fSMaxime Bizon static void enetsw_set(struct clk *clk, int enable)
12704712f3fSMaxime Bizon {
1281cd1c049SJonas Gorski 	if (BCMCPU_IS_6328())
1291cd1c049SJonas Gorski 		bcm_hwclock_set(CKCTL_6328_ROBOSW_EN, enable);
1301cd1c049SJonas Gorski 	else if (BCMCPU_IS_6362())
1311cd1c049SJonas Gorski 		bcm_hwclock_set(CKCTL_6362_ROBOSW_EN, enable);
1321cd1c049SJonas Gorski 	else if (BCMCPU_IS_6368())
133d9831a41SFlorian Fainelli 		bcm_hwclock_set(CKCTL_6368_ROBOSW_EN |
13404712f3fSMaxime Bizon 				CKCTL_6368_SWPKT_USB_EN |
1351cd1c049SJonas Gorski 				CKCTL_6368_SWPKT_SAR_EN,
1361cd1c049SJonas Gorski 				enable);
1371cd1c049SJonas Gorski 	else
1381cd1c049SJonas Gorski 		return;
1391cd1c049SJonas Gorski 
14004712f3fSMaxime Bizon 	if (enable) {
14104712f3fSMaxime Bizon 		/* reset switch core afer clock change */
142ba00e2e5SJonas Gorski 		bcm63xx_core_set_reset(BCM63XX_RESET_ENETSW, 1);
14304712f3fSMaxime Bizon 		msleep(10);
144ba00e2e5SJonas Gorski 		bcm63xx_core_set_reset(BCM63XX_RESET_ENETSW, 0);
14504712f3fSMaxime Bizon 		msleep(10);
14604712f3fSMaxime Bizon 	}
14704712f3fSMaxime Bizon }
14804712f3fSMaxime Bizon 
14904712f3fSMaxime Bizon static struct clk clk_enetsw = {
15004712f3fSMaxime Bizon 	.set	= enetsw_set,
15104712f3fSMaxime Bizon };
15204712f3fSMaxime Bizon 
15304712f3fSMaxime Bizon /*
154e7300d04SMaxime Bizon  * PCM clock
155e7300d04SMaxime Bizon  */
156e7300d04SMaxime Bizon static void pcm_set(struct clk *clk, int enable)
157e7300d04SMaxime Bizon {
1587b933421SFlorian Fainelli 	if (BCMCPU_IS_3368())
1597b933421SFlorian Fainelli 		bcm_hwclock_set(CKCTL_3368_PCM_EN, enable);
1607b933421SFlorian Fainelli 	if (BCMCPU_IS_6358())
161e7300d04SMaxime Bizon 		bcm_hwclock_set(CKCTL_6358_PCM_EN, enable);
162e7300d04SMaxime Bizon }
163e7300d04SMaxime Bizon 
164e7300d04SMaxime Bizon static struct clk clk_pcm = {
165e7300d04SMaxime Bizon 	.set	= pcm_set,
166e7300d04SMaxime Bizon };
167e7300d04SMaxime Bizon 
168e7300d04SMaxime Bizon /*
169e7300d04SMaxime Bizon  * USB host clock
170e7300d04SMaxime Bizon  */
171e7300d04SMaxime Bizon static void usbh_set(struct clk *clk, int enable)
172e7300d04SMaxime Bizon {
173dd89d60cSKevin Cernekee 	if (BCMCPU_IS_6328())
174dd89d60cSKevin Cernekee 		bcm_hwclock_set(CKCTL_6328_USBH_EN, enable);
175dd89d60cSKevin Cernekee 	else if (BCMCPU_IS_6348())
176e7300d04SMaxime Bizon 		bcm_hwclock_set(CKCTL_6348_USBH_EN, enable);
1771cd1c049SJonas Gorski 	else if (BCMCPU_IS_6362())
1781cd1c049SJonas Gorski 		bcm_hwclock_set(CKCTL_6362_USBH_EN, enable);
17904712f3fSMaxime Bizon 	else if (BCMCPU_IS_6368())
180d9831a41SFlorian Fainelli 		bcm_hwclock_set(CKCTL_6368_USBH_EN, enable);
181e7300d04SMaxime Bizon }
182e7300d04SMaxime Bizon 
183e7300d04SMaxime Bizon static struct clk clk_usbh = {
184e7300d04SMaxime Bizon 	.set	= usbh_set,
185e7300d04SMaxime Bizon };
186e7300d04SMaxime Bizon 
187e7300d04SMaxime Bizon /*
188dd89d60cSKevin Cernekee  * USB device clock
189dd89d60cSKevin Cernekee  */
190dd89d60cSKevin Cernekee static void usbd_set(struct clk *clk, int enable)
191dd89d60cSKevin Cernekee {
192dd89d60cSKevin Cernekee 	if (BCMCPU_IS_6328())
193dd89d60cSKevin Cernekee 		bcm_hwclock_set(CKCTL_6328_USBD_EN, enable);
1941cd1c049SJonas Gorski 	else if (BCMCPU_IS_6362())
1951cd1c049SJonas Gorski 		bcm_hwclock_set(CKCTL_6362_USBD_EN, enable);
196dd89d60cSKevin Cernekee 	else if (BCMCPU_IS_6368())
197dd89d60cSKevin Cernekee 		bcm_hwclock_set(CKCTL_6368_USBD_EN, enable);
198dd89d60cSKevin Cernekee }
199dd89d60cSKevin Cernekee 
200dd89d60cSKevin Cernekee static struct clk clk_usbd = {
201dd89d60cSKevin Cernekee 	.set	= usbd_set,
202dd89d60cSKevin Cernekee };
203dd89d60cSKevin Cernekee 
204dd89d60cSKevin Cernekee /*
205e7300d04SMaxime Bizon  * SPI clock
206e7300d04SMaxime Bizon  */
207e7300d04SMaxime Bizon static void spi_set(struct clk *clk, int enable)
208e7300d04SMaxime Bizon {
209e7300d04SMaxime Bizon 	u32 mask;
210e7300d04SMaxime Bizon 
211e7300d04SMaxime Bizon 	if (BCMCPU_IS_6338())
212e7300d04SMaxime Bizon 		mask = CKCTL_6338_SPI_EN;
213e7300d04SMaxime Bizon 	else if (BCMCPU_IS_6348())
214e7300d04SMaxime Bizon 		mask = CKCTL_6348_SPI_EN;
2157b933421SFlorian Fainelli 	else if (BCMCPU_IS_3368() || BCMCPU_IS_6358())
216e7300d04SMaxime Bizon 		mask = CKCTL_6358_SPI_EN;
21708a41d12SJonas Gorski 	else if (BCMCPU_IS_6362())
21808a41d12SJonas Gorski 		mask = CKCTL_6362_SPI_EN;
21919372b24SFlorian Fainelli 	else
22019372b24SFlorian Fainelli 		/* BCMCPU_IS_6368 */
22119372b24SFlorian Fainelli 		mask = CKCTL_6368_SPI_EN;
222e7300d04SMaxime Bizon 	bcm_hwclock_set(mask, enable);
223e7300d04SMaxime Bizon }
224e7300d04SMaxime Bizon 
225e7300d04SMaxime Bizon static struct clk clk_spi = {
226e7300d04SMaxime Bizon 	.set	= spi_set,
227e7300d04SMaxime Bizon };
228e7300d04SMaxime Bizon 
229e7300d04SMaxime Bizon /*
2300ebe8aaeSJonas Gorski  * HSSPI clock
2310ebe8aaeSJonas Gorski  */
2320ebe8aaeSJonas Gorski static void hsspi_set(struct clk *clk, int enable)
2330ebe8aaeSJonas Gorski {
2340ebe8aaeSJonas Gorski 	u32 mask;
2350ebe8aaeSJonas Gorski 
2360ebe8aaeSJonas Gorski 	if (BCMCPU_IS_6328())
2370ebe8aaeSJonas Gorski 		mask = CKCTL_6328_HSSPI_EN;
2380ebe8aaeSJonas Gorski 	else if (BCMCPU_IS_6362())
2390ebe8aaeSJonas Gorski 		mask = CKCTL_6362_HSSPI_EN;
2400ebe8aaeSJonas Gorski 	else
2410ebe8aaeSJonas Gorski 		return;
2420ebe8aaeSJonas Gorski 
2430ebe8aaeSJonas Gorski 	bcm_hwclock_set(mask, enable);
2440ebe8aaeSJonas Gorski }
2450ebe8aaeSJonas Gorski 
2460ebe8aaeSJonas Gorski static struct clk clk_hsspi = {
2470ebe8aaeSJonas Gorski 	.set	= hsspi_set,
2480ebe8aaeSJonas Gorski };
2490ebe8aaeSJonas Gorski 
2500ebe8aaeSJonas Gorski 
2510ebe8aaeSJonas Gorski /*
25204712f3fSMaxime Bizon  * XTM clock
25304712f3fSMaxime Bizon  */
25404712f3fSMaxime Bizon static void xtm_set(struct clk *clk, int enable)
25504712f3fSMaxime Bizon {
25604712f3fSMaxime Bizon 	if (!BCMCPU_IS_6368())
25704712f3fSMaxime Bizon 		return;
25804712f3fSMaxime Bizon 
259d9831a41SFlorian Fainelli 	bcm_hwclock_set(CKCTL_6368_SAR_EN |
26004712f3fSMaxime Bizon 			CKCTL_6368_SWPKT_SAR_EN, enable);
26104712f3fSMaxime Bizon 
26204712f3fSMaxime Bizon 	if (enable) {
26304712f3fSMaxime Bizon 		/* reset sar core afer clock change */
264ba00e2e5SJonas Gorski 		bcm63xx_core_set_reset(BCM63XX_RESET_SAR, 1);
26504712f3fSMaxime Bizon 		mdelay(1);
266ba00e2e5SJonas Gorski 		bcm63xx_core_set_reset(BCM63XX_RESET_SAR, 0);
26704712f3fSMaxime Bizon 		mdelay(1);
26804712f3fSMaxime Bizon 	}
26904712f3fSMaxime Bizon }
27004712f3fSMaxime Bizon 
27104712f3fSMaxime Bizon 
27204712f3fSMaxime Bizon static struct clk clk_xtm = {
27304712f3fSMaxime Bizon 	.set	= xtm_set,
27404712f3fSMaxime Bizon };
27504712f3fSMaxime Bizon 
27604712f3fSMaxime Bizon /*
2770b55561bSFlorian Fainelli  * IPsec clock
2780b55561bSFlorian Fainelli  */
2790b55561bSFlorian Fainelli static void ipsec_set(struct clk *clk, int enable)
2800b55561bSFlorian Fainelli {
2811cd1c049SJonas Gorski 	if (BCMCPU_IS_6362())
2821cd1c049SJonas Gorski 		bcm_hwclock_set(CKCTL_6362_IPSEC_EN, enable);
2831cd1c049SJonas Gorski 	else if (BCMCPU_IS_6368())
2840b55561bSFlorian Fainelli 		bcm_hwclock_set(CKCTL_6368_IPSEC_EN, enable);
2850b55561bSFlorian Fainelli }
2860b55561bSFlorian Fainelli 
2870b55561bSFlorian Fainelli static struct clk clk_ipsec = {
2880b55561bSFlorian Fainelli 	.set	= ipsec_set,
2890b55561bSFlorian Fainelli };
2900b55561bSFlorian Fainelli 
2910b55561bSFlorian Fainelli /*
292f2d1035eSJonas Gorski  * PCIe clock
293f2d1035eSJonas Gorski  */
294f2d1035eSJonas Gorski 
295f2d1035eSJonas Gorski static void pcie_set(struct clk *clk, int enable)
296f2d1035eSJonas Gorski {
2971cd1c049SJonas Gorski 	if (BCMCPU_IS_6328())
298f2d1035eSJonas Gorski 		bcm_hwclock_set(CKCTL_6328_PCIE_EN, enable);
2991cd1c049SJonas Gorski 	else if (BCMCPU_IS_6362())
3001cd1c049SJonas Gorski 		bcm_hwclock_set(CKCTL_6362_PCIE_EN, enable);
301f2d1035eSJonas Gorski }
302f2d1035eSJonas Gorski 
303f2d1035eSJonas Gorski static struct clk clk_pcie = {
304f2d1035eSJonas Gorski 	.set	= pcie_set,
305f2d1035eSJonas Gorski };
306f2d1035eSJonas Gorski 
307f2d1035eSJonas Gorski /*
308e7300d04SMaxime Bizon  * Internal peripheral clock
309e7300d04SMaxime Bizon  */
310e7300d04SMaxime Bizon static struct clk clk_periph = {
311e7300d04SMaxime Bizon 	.rate	= (50 * 1000 * 1000),
312e7300d04SMaxime Bizon };
313e7300d04SMaxime Bizon 
314e7300d04SMaxime Bizon 
315e7300d04SMaxime Bizon /*
316e7300d04SMaxime Bizon  * Linux clock API implementation
317e7300d04SMaxime Bizon  */
318e7300d04SMaxime Bizon int clk_enable(struct clk *clk)
319e7300d04SMaxime Bizon {
320e7300d04SMaxime Bizon 	mutex_lock(&clocks_mutex);
321e7300d04SMaxime Bizon 	clk_enable_unlocked(clk);
322e7300d04SMaxime Bizon 	mutex_unlock(&clocks_mutex);
323e7300d04SMaxime Bizon 	return 0;
324e7300d04SMaxime Bizon }
325e7300d04SMaxime Bizon 
326e7300d04SMaxime Bizon EXPORT_SYMBOL(clk_enable);
327e7300d04SMaxime Bizon 
328e7300d04SMaxime Bizon void clk_disable(struct clk *clk)
329e7300d04SMaxime Bizon {
33000ca0250SMasahiro Yamada 	if (!clk)
33100ca0250SMasahiro Yamada 		return;
33200ca0250SMasahiro Yamada 
333e7300d04SMaxime Bizon 	mutex_lock(&clocks_mutex);
334e7300d04SMaxime Bizon 	clk_disable_unlocked(clk);
335e7300d04SMaxime Bizon 	mutex_unlock(&clocks_mutex);
336e7300d04SMaxime Bizon }
337e7300d04SMaxime Bizon 
338e7300d04SMaxime Bizon EXPORT_SYMBOL(clk_disable);
339e7300d04SMaxime Bizon 
340e7300d04SMaxime Bizon unsigned long clk_get_rate(struct clk *clk)
341e7300d04SMaxime Bizon {
342e7300d04SMaxime Bizon 	return clk->rate;
343e7300d04SMaxime Bizon }
344e7300d04SMaxime Bizon 
345e7300d04SMaxime Bizon EXPORT_SYMBOL(clk_get_rate);
346e7300d04SMaxime Bizon 
3477aa2d052SMarkos Chandras int clk_set_rate(struct clk *clk, unsigned long rate)
3487aa2d052SMarkos Chandras {
3497aa2d052SMarkos Chandras 	return 0;
3507aa2d052SMarkos Chandras }
3517aa2d052SMarkos Chandras EXPORT_SYMBOL_GPL(clk_set_rate);
3527aa2d052SMarkos Chandras 
3537aa2d052SMarkos Chandras long clk_round_rate(struct clk *clk, unsigned long rate)
3547aa2d052SMarkos Chandras {
3557aa2d052SMarkos Chandras 	return 0;
3567aa2d052SMarkos Chandras }
3577aa2d052SMarkos Chandras EXPORT_SYMBOL_GPL(clk_round_rate);
3587aa2d052SMarkos Chandras 
359e7300d04SMaxime Bizon struct clk *clk_get(struct device *dev, const char *id)
360e7300d04SMaxime Bizon {
361e7300d04SMaxime Bizon 	if (!strcmp(id, "enet0"))
362e7300d04SMaxime Bizon 		return &clk_enet0;
363e7300d04SMaxime Bizon 	if (!strcmp(id, "enet1"))
364e7300d04SMaxime Bizon 		return &clk_enet1;
36504712f3fSMaxime Bizon 	if (!strcmp(id, "enetsw"))
36604712f3fSMaxime Bizon 		return &clk_enetsw;
367e7300d04SMaxime Bizon 	if (!strcmp(id, "ephy"))
368e7300d04SMaxime Bizon 		return &clk_ephy;
369e7300d04SMaxime Bizon 	if (!strcmp(id, "usbh"))
370e7300d04SMaxime Bizon 		return &clk_usbh;
371dd89d60cSKevin Cernekee 	if (!strcmp(id, "usbd"))
372dd89d60cSKevin Cernekee 		return &clk_usbd;
373e7300d04SMaxime Bizon 	if (!strcmp(id, "spi"))
374e7300d04SMaxime Bizon 		return &clk_spi;
3750ebe8aaeSJonas Gorski 	if (!strcmp(id, "hsspi"))
3760ebe8aaeSJonas Gorski 		return &clk_hsspi;
37704712f3fSMaxime Bizon 	if (!strcmp(id, "xtm"))
37804712f3fSMaxime Bizon 		return &clk_xtm;
379e7300d04SMaxime Bizon 	if (!strcmp(id, "periph"))
380e7300d04SMaxime Bizon 		return &clk_periph;
3817b933421SFlorian Fainelli 	if ((BCMCPU_IS_3368() || BCMCPU_IS_6358()) && !strcmp(id, "pcm"))
382e7300d04SMaxime Bizon 		return &clk_pcm;
3831cd1c049SJonas Gorski 	if ((BCMCPU_IS_6362() || BCMCPU_IS_6368()) && !strcmp(id, "ipsec"))
3840b55561bSFlorian Fainelli 		return &clk_ipsec;
3851cd1c049SJonas Gorski 	if ((BCMCPU_IS_6328() || BCMCPU_IS_6362()) && !strcmp(id, "pcie"))
386f2d1035eSJonas Gorski 		return &clk_pcie;
387e7300d04SMaxime Bizon 	return ERR_PTR(-ENOENT);
388e7300d04SMaxime Bizon }
389e7300d04SMaxime Bizon 
390e7300d04SMaxime Bizon EXPORT_SYMBOL(clk_get);
391e7300d04SMaxime Bizon 
392e7300d04SMaxime Bizon void clk_put(struct clk *clk)
393e7300d04SMaxime Bizon {
394e7300d04SMaxime Bizon }
395e7300d04SMaxime Bizon 
396e7300d04SMaxime Bizon EXPORT_SYMBOL(clk_put);
39726b8c07fSJonas Gorski 
39826b8c07fSJonas Gorski #define HSSPI_PLL_HZ_6328	133333333
39926b8c07fSJonas Gorski #define HSSPI_PLL_HZ_6362	400000000
40026b8c07fSJonas Gorski 
40126b8c07fSJonas Gorski static int __init bcm63xx_clk_init(void)
40226b8c07fSJonas Gorski {
40326b8c07fSJonas Gorski 	switch (bcm63xx_get_cpu_id()) {
40426b8c07fSJonas Gorski 	case BCM6328_CPU_ID:
40526b8c07fSJonas Gorski 		clk_hsspi.rate = HSSPI_PLL_HZ_6328;
40626b8c07fSJonas Gorski 		break;
40726b8c07fSJonas Gorski 	case BCM6362_CPU_ID:
40826b8c07fSJonas Gorski 		clk_hsspi.rate = HSSPI_PLL_HZ_6362;
40926b8c07fSJonas Gorski 		break;
41026b8c07fSJonas Gorski 	}
41126b8c07fSJonas Gorski 
41226b8c07fSJonas Gorski 	return 0;
41326b8c07fSJonas Gorski }
41426b8c07fSJonas Gorski arch_initcall(bcm63xx_clk_init);
415