1570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen/*
2570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen *  Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de>
3570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen *  JZ4740 SoC clock support
4570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen *
5570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen *  This program is free software; you can redistribute	 it and/or modify it
6570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen *  under  the terms of	 the GNU General  Public License as published by the
7570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen *  Free Software Foundation;  either version 2 of the	License, or (at your
8570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen *  option) any later version.
9570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen *
10570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen *  You should have received a copy of the  GNU General Public License along
11570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen *  with this program; if not, write  to the Free Software Foundation, Inc.,
12570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen *  675 Mass Ave, Cambridge, MA 02139, USA.
13570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen *
14570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen */
15570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
16570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen#ifndef __MIPS_JZ4740_CLOCK_H__
17570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen#define __MIPS_JZ4740_CLOCK_H__
18570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
19570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen#include <linux/list.h>
20570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
21570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenstruct jz4740_clock_board_data {
22570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	unsigned long ext_rate;
23570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	unsigned long rtc_rate;
24570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen};
25570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
26570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenextern struct jz4740_clock_board_data jz4740_clock_bdata;
27570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
28570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenvoid jz4740_clock_suspend(void);
29570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenvoid jz4740_clock_resume(void);
30570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
31570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenstruct clk;
32570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
33570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenstruct clk_ops {
34570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	unsigned long (*get_rate)(struct clk *clk);
35570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	unsigned long (*round_rate)(struct clk *clk, unsigned long rate);
36570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	int (*set_rate)(struct clk *clk, unsigned long rate);
37570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	int (*enable)(struct clk *clk);
38570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	int (*disable)(struct clk *clk);
39570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	int (*is_enabled)(struct clk *clk);
40570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
41570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	int (*set_parent)(struct clk *clk, struct clk *parent);
42570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
43570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen};
44570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
45570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenstruct clk {
46570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	const char *name;
47570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	struct clk *parent;
48570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
49570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	uint32_t gate_bit;
50570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
51570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	const struct clk_ops *ops;
52570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
53570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	struct list_head list;
54570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
55570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen#ifdef CONFIG_DEBUG_FS
56570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	struct dentry *debugfs_entry;
57570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen	struct dentry *debugfs_parent_entry;
58570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen#endif
59570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
60570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen};
61570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
62570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen#define JZ4740_CLK_NOT_GATED ((uint32_t)-1)
63570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
64570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenint clk_is_enabled(struct clk *clk);
65570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
66570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen#ifdef CONFIG_DEBUG_FS
67570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenvoid jz4740_clock_debugfs_init(void);
68570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenvoid jz4740_clock_debugfs_add_clk(struct clk *clk);
69570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenvoid jz4740_clock_debugfs_update_parent(struct clk *clk);
70570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen#else
71570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenstatic inline void jz4740_clock_debugfs_init(void) {};
72570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenstatic inline void jz4740_clock_debugfs_add_clk(struct clk *clk) {};
73570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausenstatic inline void jz4740_clock_debugfs_update_parent(struct clk *clk) {};
74570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen#endif
75570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen
76570a0bb82f0b5c2c6324153010e72c3f0c26a7a3Lars-Peter Clausen#endif
77