~ubuntu-branches/ubuntu/precise/linux-linaro-u8500/precise

« back to all changes in this revision

Viewing changes to arch/arm/mach-msm/clock-debug.c

  • Committer: Bazaar Package Importer
  • Author(s): John Rigby, Upstream Fixes, Andy Green, John Rigby
  • Date: 2011-04-14 12:16:06 UTC
  • Revision ID: james.westby@ubuntu.com-20110414121606-b77podkyqgr2oix7
Tags: 2.6.38-1002.3
[ Upstream Fixes ]

* MUSB: shutdown: Make sure block is awake before doing shutdown
  - LP: #745737
* Fixed gpio polarity of gpio USB-phy reset.
  - LP: #747639

[ Andy Green ]

* LINARO: SAUCE: disable CONFIG_OMAP_RESET_CLOCKS
  - LP: #752900

[ John Rigby ]

* Rebase to new upstreams:
  Linux v2.6.38.1
  linaro-linux-2.6.38-upstream-29Mar2011
  Ubuntu-2.6.38-7.35
* SAUCE: OMAP4: clock: wait for module to become accessible on
  a clk enable
  - LP: #745737
* Rebase to new upstreams:
  Linux v2.6.38.2
  linaro-linux-2.6.38-upstream-5Apr2011
  Ubuntu-2.6.38-8.41
  - LP: #732842
* Update configs for device tree, dvfs and lttng
* LINARO: add building of dtb's
* LINARO: SAUCE: Disable lowest operating freqs on omap34xx
  - LP: #732912

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2007 Google, Inc.
 
3
 * Copyright (c) 2007-2010, Code Aurora Forum. All rights reserved.
 
4
 *
 
5
 * This software is licensed under the terms of the GNU General Public
 
6
 * License version 2, as published by the Free Software Foundation, and
 
7
 * may be copied, distributed, and modified under those terms.
 
8
 *
 
9
 * This program is distributed in the hope that it will be useful,
 
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
 * GNU General Public License for more details.
 
13
 *
 
14
 */
 
15
 
 
16
#include <linux/kernel.h>
 
17
#include <linux/module.h>
 
18
#include <linux/ctype.h>
 
19
#include <linux/debugfs.h>
 
20
#include <linux/clk.h>
 
21
#include "clock.h"
 
22
 
 
23
static int clock_debug_rate_set(void *data, u64 val)
 
24
{
 
25
        struct clk *clock = data;
 
26
        int ret;
 
27
 
 
28
        /* Only increases to max rate will succeed, but that's actually good
 
29
         * for debugging purposes so we don't check for error. */
 
30
        if (clock->flags & CLK_MAX)
 
31
                clk_set_max_rate(clock, val);
 
32
        if (clock->flags & CLK_MIN)
 
33
                ret = clk_set_min_rate(clock, val);
 
34
        else
 
35
                ret = clk_set_rate(clock, val);
 
36
        if (ret != 0)
 
37
                printk(KERN_ERR "clk_set%s_rate failed (%d)\n",
 
38
                        (clock->flags & CLK_MIN) ? "_min" : "", ret);
 
39
        return ret;
 
40
}
 
41
 
 
42
static int clock_debug_rate_get(void *data, u64 *val)
 
43
{
 
44
        struct clk *clock = data;
 
45
        *val = clk_get_rate(clock);
 
46
        return 0;
 
47
}
 
48
 
 
49
DEFINE_SIMPLE_ATTRIBUTE(clock_rate_fops, clock_debug_rate_get,
 
50
                        clock_debug_rate_set, "%llu\n");
 
51
 
 
52
static int clock_debug_enable_set(void *data, u64 val)
 
53
{
 
54
        struct clk *clock = data;
 
55
        int rc = 0;
 
56
 
 
57
        if (val)
 
58
                rc = clock->ops->enable(clock->id);
 
59
        else
 
60
                clock->ops->disable(clock->id);
 
61
 
 
62
        return rc;
 
63
}
 
64
 
 
65
static int clock_debug_enable_get(void *data, u64 *val)
 
66
{
 
67
        struct clk *clock = data;
 
68
 
 
69
        *val = clock->ops->is_enabled(clock->id);
 
70
 
 
71
        return 0;
 
72
}
 
73
 
 
74
DEFINE_SIMPLE_ATTRIBUTE(clock_enable_fops, clock_debug_enable_get,
 
75
                        clock_debug_enable_set, "%llu\n");
 
76
 
 
77
static int clock_debug_local_get(void *data, u64 *val)
 
78
{
 
79
        struct clk *clock = data;
 
80
 
 
81
        *val = clock->ops->is_local(clock->id);
 
82
 
 
83
        return 0;
 
84
}
 
85
 
 
86
DEFINE_SIMPLE_ATTRIBUTE(clock_local_fops, clock_debug_local_get,
 
87
                        NULL, "%llu\n");
 
88
 
 
89
static struct dentry *debugfs_base;
 
90
 
 
91
int __init clock_debug_init(void)
 
92
{
 
93
        debugfs_base = debugfs_create_dir("clk", NULL);
 
94
        if (!debugfs_base)
 
95
                return -ENOMEM;
 
96
        return 0;
 
97
}
 
98
 
 
99
int __init clock_debug_add(struct clk *clock)
 
100
{
 
101
        char temp[50], *ptr;
 
102
        struct dentry *clk_dir;
 
103
 
 
104
        if (!debugfs_base)
 
105
                return -ENOMEM;
 
106
 
 
107
        strncpy(temp, clock->dbg_name, ARRAY_SIZE(temp)-1);
 
108
        for (ptr = temp; *ptr; ptr++)
 
109
                *ptr = tolower(*ptr);
 
110
 
 
111
        clk_dir = debugfs_create_dir(temp, debugfs_base);
 
112
        if (!clk_dir)
 
113
                return -ENOMEM;
 
114
 
 
115
        if (!debugfs_create_file("rate", S_IRUGO | S_IWUSR, clk_dir,
 
116
                                clock, &clock_rate_fops))
 
117
                goto error;
 
118
 
 
119
        if (!debugfs_create_file("enable", S_IRUGO | S_IWUSR, clk_dir,
 
120
                                clock, &clock_enable_fops))
 
121
                goto error;
 
122
 
 
123
        if (!debugfs_create_file("is_local", S_IRUGO, clk_dir, clock,
 
124
                                &clock_local_fops))
 
125
                goto error;
 
126
        return 0;
 
127
error:
 
128
        debugfs_remove_recursive(clk_dir);
 
129
        return -ENOMEM;
 
130
}