clock.h 1.9 KB
Newer Older
1 2 3 4 5
#ifndef __ASM_SH_CLOCK_H
#define __ASM_SH_CLOCK_H

#include <linux/list.h>
#include <linux/seq_file.h>
P
Paul Mundt 已提交
6
#include <linux/clk.h>
7
#include <linux/err.h>
8 9 10 11 12

struct clk;

struct clk_ops {
	void (*init)(struct clk *clk);
13
	int (*enable)(struct clk *clk);
14
	void (*disable)(struct clk *clk);
15
	unsigned long (*recalc)(struct clk *clk);
16
	int (*set_rate)(struct clk *clk, unsigned long rate, int algo_id);
17
	int (*set_parent)(struct clk *clk, struct clk *parent);
18
	long (*round_rate)(struct clk *clk, unsigned long rate);
19 20 21 22 23
};

struct clk {
	struct list_head	node;
	const char		*name;
P
Paul Mundt 已提交
24
	int			id;
25 26 27 28 29
	struct module		*owner;

	struct clk		*parent;
	struct clk_ops		*ops;

30 31 32
	struct list_head	children;
	struct list_head	sibling;	/* node for children */

33
	int			usecount;
34 35 36

	unsigned long		rate;
	unsigned long		flags;
M
Magnus Damm 已提交
37
	unsigned long		arch_flags;
38 39
};

40 41 42 43 44 45 46
struct clk_lookup {
	struct list_head	node;
	const char		*dev_id;
	const char		*con_id;
	struct clk		*clk;
};

47
#define CLK_ENABLE_ON_INIT	(1 << 0)
48 49 50

/* Should be defined by processor-specific code */
void arch_init_clk_ops(struct clk_ops **, int type);
P
Paul Mundt 已提交
51
int __init arch_clk_init(void);
52 53 54

/* arch/sh/kernel/cpu/clock.c */
int clk_init(void);
55 56 57
unsigned long followparent_recalc(struct clk *);
void recalculate_root_clocks(void);
void propagate_rate(struct clk *);
58
int clk_reparent(struct clk *child, struct clk *parent);
59 60 61
int clk_register(struct clk *);
void clk_unregister(struct clk *);

62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
/* the exported API, in addition to clk_set_rate */
/**
 * clk_set_rate_ex - set the clock rate for a clock source, with additional parameter
 * @clk: clock source
 * @rate: desired clock rate in Hz
 * @algo_id: algorithm id to be passed down to ops->set_rate
 *
 * Returns success (0) or negative errno.
 */
int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id);

enum clk_sh_algo_id {
	NO_CHANGE = 0,

	IUS_N1_N1,
	IUS_322,
	IUS_522,
	IUS_N11,

	SB_N1,

	SB3_N1,
	SB3_32,
	SB3_43,
	SB3_54,

	BP_N1,

	IP_N1,
};
92

93
#endif /* __ASM_SH_CLOCK_H */