149214640f52506fbba00eb998fc39f10653a840aPaul Walmsley/* 249214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * OMAP2xxx APLL clock control functions 349214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * 449214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * Copyright (C) 2005-2008 Texas Instruments, Inc. 549214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * Copyright (C) 2004-2010 Nokia Corporation 649214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * 749214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * Contacts: 849214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * Richard Woodruff <r-woodruff2@ti.com> 949214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * Paul Walmsley 1049214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * 1149214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * Based on earlier work by Tuukka Tikkanen, Tony Lindgren, 1249214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * Gordon McNutt and RidgeRun, Inc. 1349214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * 1449214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * This program is free software; you can redistribute it and/or modify 1549214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * it under the terms of the GNU General Public License version 2 as 1649214640f52506fbba00eb998fc39f10653a840aPaul Walmsley * published by the Free Software Foundation. 1749214640f52506fbba00eb998fc39f10653a840aPaul Walmsley */ 1849214640f52506fbba00eb998fc39f10653a840aPaul Walmsley#undef DEBUG 1949214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 2049214640f52506fbba00eb998fc39f10653a840aPaul Walmsley#include <linux/kernel.h> 2149214640f52506fbba00eb998fc39f10653a840aPaul Walmsley#include <linux/clk.h> 2249214640f52506fbba00eb998fc39f10653a840aPaul Walmsley#include <linux/io.h> 2349214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 2449214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 2549214640f52506fbba00eb998fc39f10653a840aPaul Walmsley#include "clock.h" 2649214640f52506fbba00eb998fc39f10653a840aPaul Walmsley#include "clock2xxx.h" 27ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#include "cm2xxx.h" 2849214640f52506fbba00eb998fc39f10653a840aPaul Walmsley#include "cm-regbits-24xx.h" 2949214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 3049214640f52506fbba00eb998fc39f10653a840aPaul Walmsley/* CM_CLKEN_PLL.EN_{54,96}M_PLL options (24XX) */ 3149214640f52506fbba00eb998fc39f10653a840aPaul Walmsley#define EN_APLL_STOPPED 0 3249214640f52506fbba00eb998fc39f10653a840aPaul Walmsley#define EN_APLL_LOCKED 3 3349214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 3449214640f52506fbba00eb998fc39f10653a840aPaul Walmsley/* CM_CLKSEL1_PLL.APLLS_CLKIN options (24XX) */ 3549214640f52506fbba00eb998fc39f10653a840aPaul Walmsley#define APLLS_CLKIN_19_2MHZ 0 3649214640f52506fbba00eb998fc39f10653a840aPaul Walmsley#define APLLS_CLKIN_13MHZ 2 3749214640f52506fbba00eb998fc39f10653a840aPaul Walmsley#define APLLS_CLKIN_12MHZ 3 3849214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 3949214640f52506fbba00eb998fc39f10653a840aPaul Walmsley/* Private functions */ 4049214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 417a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley/** 427a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley * omap2xxx_clk_apll_locked - is the APLL locked? 437a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley * @hw: struct clk_hw * of the APLL to check 447a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley * 457a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley * If the APLL IP block referred to by @hw indicates that it's locked, 467a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley * return true; otherwise, return false. 477a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley */ 487a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsleystatic bool omap2xxx_clk_apll_locked(struct clk_hw *hw) 497a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley{ 507a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley struct clk_hw_omap *clk = to_clk_hw_omap(hw); 517a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley u32 r, apll_mask; 527a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley 537a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley apll_mask = EN_APLL_LOCKED << clk->enable_bit; 547a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley 55cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo r = omap2xxx_cm_get_pll_status(); 567a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley 577a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley return ((r & apll_mask) == apll_mask) ? true : false; 587a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley} 597a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley 60ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayakint omap2_clk_apll96_enable(struct clk_hw *hw) 6149214640f52506fbba00eb998fc39f10653a840aPaul Walmsley{ 62b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley return omap2xxx_cm_apll96_enable(); 6349214640f52506fbba00eb998fc39f10653a840aPaul Walmsley} 6449214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 65ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayakint omap2_clk_apll54_enable(struct clk_hw *hw) 6649214640f52506fbba00eb998fc39f10653a840aPaul Walmsley{ 67b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley return omap2xxx_cm_apll54_enable(); 6849214640f52506fbba00eb998fc39f10653a840aPaul Walmsley} 6949214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 70ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayakstatic void _apll96_allow_idle(struct clk_hw_omap *clk) 7192618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley{ 7292618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley omap2xxx_cm_set_apll96_auto_low_power_stop(); 7392618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley} 7492618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley 75ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayakstatic void _apll96_deny_idle(struct clk_hw_omap *clk) 7692618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley{ 7792618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley omap2xxx_cm_set_apll96_disable_autoidle(); 7892618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley} 7992618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley 80ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayakstatic void _apll54_allow_idle(struct clk_hw_omap *clk) 8192618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley{ 8292618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley omap2xxx_cm_set_apll54_auto_low_power_stop(); 8392618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley} 8492618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley 85ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayakstatic void _apll54_deny_idle(struct clk_hw_omap *clk) 8692618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley{ 8792618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley omap2xxx_cm_set_apll54_disable_autoidle(); 8892618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley} 8992618ff8b025419960e2e845983f0f49b0cb57a9Paul Walmsley 90ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayakvoid omap2_clk_apll96_disable(struct clk_hw *hw) 9149214640f52506fbba00eb998fc39f10653a840aPaul Walmsley{ 92b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley omap2xxx_cm_apll96_disable(); 93b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley} 9449214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 95ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayakvoid omap2_clk_apll54_disable(struct clk_hw *hw) 96b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley{ 97b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley omap2xxx_cm_apll54_disable(); 9849214640f52506fbba00eb998fc39f10653a840aPaul Walmsley} 9949214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 1007a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsleyunsigned long omap2_clk_apll54_recalc(struct clk_hw *hw, 1017a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley unsigned long parent_rate) 1027a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley{ 1037a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley return (omap2xxx_clk_apll_locked(hw)) ? 54000000 : 0; 1047a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley} 1057a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley 1067a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsleyunsigned long omap2_clk_apll96_recalc(struct clk_hw *hw, 1077a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley unsigned long parent_rate) 1087a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley{ 1097a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley return (omap2xxx_clk_apll_locked(hw)) ? 96000000 : 0; 1107a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley} 1117a2bd1cc3926327c0393deb52e8300af75b1c9e1Paul Walmsley 11249214640f52506fbba00eb998fc39f10653a840aPaul Walmsley/* Public data */ 113ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayakconst struct clk_hw_omap_ops clkhwops_apll54 = { 114ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayak .allow_idle = _apll54_allow_idle, 115ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayak .deny_idle = _apll54_deny_idle, 116ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayak}; 11749214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 118ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayakconst struct clk_hw_omap_ops clkhwops_apll96 = { 119ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayak .allow_idle = _apll96_allow_idle, 120ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayak .deny_idle = _apll96_deny_idle, 121ed1ebc4948fdfe4c68865e5543b4a68e5a55973bRajendra Nayak}; 12249214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 12349214640f52506fbba00eb998fc39f10653a840aPaul Walmsley/* Public functions */ 12449214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 12549214640f52506fbba00eb998fc39f10653a840aPaul Walmsleyu32 omap2xxx_get_apll_clkin(void) 12649214640f52506fbba00eb998fc39f10653a840aPaul Walmsley{ 12749214640f52506fbba00eb998fc39f10653a840aPaul Walmsley u32 aplls, srate = 0; 12849214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 129cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo aplls = omap2xxx_cm_get_pll_config(); 13049214640f52506fbba00eb998fc39f10653a840aPaul Walmsley aplls &= OMAP24XX_APLLS_CLKIN_MASK; 13149214640f52506fbba00eb998fc39f10653a840aPaul Walmsley aplls >>= OMAP24XX_APLLS_CLKIN_SHIFT; 13249214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 13349214640f52506fbba00eb998fc39f10653a840aPaul Walmsley if (aplls == APLLS_CLKIN_19_2MHZ) 13449214640f52506fbba00eb998fc39f10653a840aPaul Walmsley srate = 19200000; 13549214640f52506fbba00eb998fc39f10653a840aPaul Walmsley else if (aplls == APLLS_CLKIN_13MHZ) 13649214640f52506fbba00eb998fc39f10653a840aPaul Walmsley srate = 13000000; 13749214640f52506fbba00eb998fc39f10653a840aPaul Walmsley else if (aplls == APLLS_CLKIN_12MHZ) 13849214640f52506fbba00eb998fc39f10653a840aPaul Walmsley srate = 12000000; 13949214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 14049214640f52506fbba00eb998fc39f10653a840aPaul Walmsley return srate; 14149214640f52506fbba00eb998fc39f10653a840aPaul Walmsley} 14249214640f52506fbba00eb998fc39f10653a840aPaul Walmsley 143