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