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