2 * linux/arch/arm/mach-omap2/board-n800-dsp.c
4 * Copyright (C) 2006 Nokia Corporation.
6 * Contact: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * version 2 as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
24 #include <linux/kernel.h>
25 #include <linux/device.h>
26 #include <linux/list.h>
27 #include <linux/err.h>
28 #include <linux/clk.h>
31 #include <asm/arch/clock.h>
32 #include <asm/arch/board.h>
33 #include <asm/arch/dsp_common.h>
35 #if defined(CONFIG_OMAP_DSP)
38 * dsp peripheral device: AUDIO
40 static struct dsp_kfunc_device n800_audio_device
= {
42 .type
= DSP_KFUNC_DEV_TYPE_AUDIO
,
43 .enable
= n800_audio_enable
,
44 .disable
= n800_audio_disable
,
48 * dsp peripheral device: TIMER
50 static int dsp_timer_probe(struct dsp_kfunc_device
*kdev
, int stage
)
54 strcpy(clockname
, kdev
->name
);
55 strcat(clockname
, "_fck");
57 kdev
->fck
= clk_get(NULL
, clockname
);
58 if (IS_ERR(kdev
->fck
)) {
59 printk(KERN_ERR
"couldn't acquire %s\n", clockname
);
60 return PTR_ERR(kdev
->fck
);
62 pr_debug("%s probed successfully\n", clockname
);
64 strcpy(clockname
, kdev
->name
);
65 strcat(clockname
, "_ick");
66 kdev
->ick
= clk_get(NULL
, clockname
);
67 if (IS_ERR(kdev
->ick
)) {
68 printk(KERN_ERR
"couldn't acquire %s\n", clockname
);
71 pr_debug("%s probed successfully\n", clockname
);
77 return PTR_ERR(kdev
->ick
);
80 static int dsp_timer_remove(struct dsp_kfunc_device
*kdev
, int stage
)
84 pr_debug("%s removed successfully\n", kdev
->name
);
88 static int dsp_timer_enable(struct dsp_kfunc_device
*kdev
, int stage
)
90 pr_debug("%s enabled(%d)\n", kdev
->name
, stage
);
92 spin_lock(&kdev
->lock
);
98 clk_enable(kdev
->fck
);
99 clk_enable(kdev
->ick
);
101 spin_unlock(&kdev
->lock
);
106 static int dsp_timer_disable(struct dsp_kfunc_device
*kdev
, int stage
)
108 pr_debug("%s disabled(%d)\n", kdev
->name
, stage
);
110 spin_lock(&kdev
->lock
);
112 if (kdev
->enabled
== 0)
116 clk_disable(kdev
->ick
);
117 clk_disable(kdev
->fck
);
119 spin_unlock(&kdev
->lock
);
124 static struct dsp_kfunc_device n800_timer_device
= {
126 .type
= DSP_KFUNC_DEV_TYPE_COMMON
,
127 .probe
= dsp_timer_probe
,
128 .remove
= dsp_timer_remove
,
129 .enable
= dsp_timer_enable
,
130 .disable
= dsp_timer_disable
,
133 static struct dsp_kfunc_device
*n800_kfunc_dev
[] = {
138 void __init
n800_dsp_init(void)
141 struct dsp_kfunc_device
**p
= n800_kfunc_dev
;
143 for (i
= 0; i
< ARRAY_SIZE(n800_kfunc_dev
); i
++) {
144 ret
= dsp_kfunc_device_register(p
[i
]);
147 "KFUNC device registration failed: %s\n",
154 void __init
n800_dsp_init(void) { }
155 #endif /* CONFIG_OMAP_DSP */