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

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

struct clk;

struct clk_ops {
	void (*init)(struct clk *clk);
	void (*enable)(struct clk *clk);
	void (*disable)(struct clk *clk);
	void (*recalc)(struct clk *clk);
17
	int (*set_rate)(struct clk *clk, unsigned long rate, int algo_id);
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 30 31 32 33
	struct module		*owner;

	struct clk		*parent;
	struct clk_ops		*ops;

	struct kref		kref;

	unsigned long		rate;
	unsigned long		flags;
M
Magnus Damm 已提交
34
	unsigned long		arch_flags;
35 36 37 38 39 40 41
};

#define CLK_ALWAYS_ENABLED	(1 << 0)
#define CLK_RATE_PROPAGATES	(1 << 1)

/* Should be defined by processor-specific code */
void arch_init_clk_ops(struct clk_ops **, int type);
P
Paul Mundt 已提交
42
int __init arch_clk_init(void);
43 44 45 46 47 48 49 50 51

/* arch/sh/kernel/cpu/clock.c */
int clk_init(void);

void clk_recalc_rate(struct clk *);

int clk_register(struct clk *);
void clk_unregister(struct clk *);

52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
static inline int clk_always_enable(const char *id)
{
	struct clk *clk;
	int ret;

	clk = clk_get(NULL, id);
	if (IS_ERR(clk))
		return PTR_ERR(clk);

	ret = clk_enable(clk);
	if (ret)
		clk_put(clk);

	return ret;
}

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
/* 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,
};
98
#endif /* __ASM_SH_CLOCK_H */