ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / powergate-ops-t1xx.c
1 /*
2  * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  */
14
15 #include <linux/delay.h>
16 #include <linux/tegra-powergate.h>
17
18 #include "powergate-priv.h"
19
20 int tegra1xx_powergate(int id, struct powergate_partition_info *pg_info)
21 {
22         int ret;
23
24         /* If first clk_ptr is null, fill clk info for the partition */
25         if (!pg_info->clk_info[0].clk_ptr)
26                 get_clk_info(pg_info);
27
28         ret = partition_clk_enable(pg_info);
29         if (ret)
30                 WARN(1, "Couldn't enable clock");
31
32         udelay(10);
33
34         tegra_powergate_mc_flush(id);
35
36         udelay(10);
37
38         powergate_partition_assert_reset(pg_info);
39
40         udelay(10);
41
42         /* Powergating is done only if refcnt of all clks is 0 */
43         partition_clk_disable(pg_info);
44
45         udelay(10);
46
47         ret = tegra_powergate_set(id, false);
48         if (ret)
49                 goto err_power_off;
50
51         return 0;
52
53 err_power_off:
54         WARN(1, "Could not Powergate Partition %d", id);
55         return ret;
56 }
57
58 int tegra1xx_unpowergate(int id, struct powergate_partition_info *pg_info)
59 {
60         int ret;
61
62         /* If first clk_ptr is null, fill clk info for the partition */
63         if (!pg_info->clk_info[0].clk_ptr)
64                 get_clk_info(pg_info);
65
66         if (tegra_powergate_is_powered(id))
67                 return tegra_powergate_reset_module(pg_info);
68
69         ret = tegra_powergate_set(id, true);
70         if (ret)
71                 goto err_power;
72
73         udelay(10);
74
75         /* Un-Powergating fails if all clks are not enabled */
76         ret = partition_clk_enable(pg_info);
77         if (ret)
78                 goto err_clk_on;
79
80         udelay(10);
81
82         ret = tegra_powergate_remove_clamping(id);
83         if (ret)
84                 goto err_clamp;
85
86         udelay(10);
87
88         powergate_partition_deassert_reset(pg_info);
89
90         udelay(10);
91
92         tegra_powergate_mc_flush_done(id);
93
94         udelay(10);
95
96         /* Disable all clks enabled earlier. Drivers should enable clks */
97         partition_clk_disable(pg_info);
98
99         return 0;
100
101 err_clamp:
102         partition_clk_disable(pg_info);
103 err_clk_on:
104         powergate_module(id);
105 err_power:
106         WARN(1, "Could not Un-Powergate %d", id);
107         return ret;
108 }