OMAP3+: ABB: initialization & transition functions
[beagleboard-validation:linux.git] / arch / arm / mach-omap2 / abb.h
1 /*
2  * OMAP Adaptive Body-Bias structure and macro definitions
3  *
4  * Copyright (C) 2011 Texas Instruments, Inc.
5  * Mike Turquette <mturquette@ti.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11
12 #ifndef __ARCH_ARM_MACH_OMAP2_ABB_H
13 #define __ARCH_ARM_MACH_OMAP2_ABB_H
14
15 #include <linux/kernel.h>
16
17 #include "voltage.h"
18
19 /* NOMINAL_OPP bypasses the ABB ldo, FAST_OPP sets it to Forward Body-Bias */
20 #define OMAP_ABB_NOMINAL_OPP    0
21 #define OMAP_ABB_FAST_OPP       1
22 #define OMAP_ABB_NO_LDO         ~0
23
24 /* Time for the ABB ldo to settle after transition (in micro-seconds) */
25 #define ABB_TRANXDONE_TIMEOUT   50
26
27 /*
28  * struct omap_abb_ops - per-OMAP operations needed for ABB transition
29  *
30  * @check_tranxdone: return status of ldo transition from PRM_IRQSTATUS
31  * @clear_tranxdone: clear ABB transition status bit from PRM_IRQSTATUS
32  */
33 struct omap_abb_ops {
34         u32 (*check_tranxdone)(u8 irq_id);
35         void (*clear_tranxdone)(u8 irq_id);
36 };
37
38 /*
39  * struct omap_abb_common - ABB data common to an OMAP family
40  *
41  * @opp_sel_mask: CTRL reg uses this to program next state of ldo
42  * @opp_change_mask: CTRL reg uses this to initiate ldo state change
43  * @sr2_wtcnt_value_mask: SETUP reg uses this to program ldo settling time
44  * @sr2en_mask: SETUP reg uses this to enable/disable ldo
45  * @active_fbb_sel_mask: SETUP reg uses this to enable/disable FBB operation
46  * @settling_time: number of micro-seconds it takes for ldo to transition
47  * @clock_cycles: settling_time is counted in multiples of clock cycles
48  * @ops: pointer to common ops for manipulating PRM_IRQSTATUS bits
49  */
50 struct omap_abb_common {
51         u32 opp_sel_mask;
52         u32 opp_change_mask;
53         u32 sr2_wtcnt_value_mask;
54         u32 sr2en_mask;
55         u32 active_fbb_sel_mask;
56         unsigned long settling_time;
57         unsigned long clock_cycles;
58         const struct omap_abb_ops *ops;
59 };
60
61 /*
62  * struct omap_abb_instance - data for each instance of ABB ldo
63  *
64  * @setup_offs: PRM register offset for initial configuration of ABB ldo
65  * @ctrl_offs: PRM register offset for active programming of ABB ldo
66  * @prm_irq_id: IRQ handle used to resolve IRQSTATUS offset & masks
67  * @enabled: track whether ABB ldo is enabled or disabled
68  * @common: pointer to common data for all ABB ldo's
69  * @_opp_sel: internally track last programmed state of ABB ldo.  DO NOT USE
70  */
71 struct omap_abb_instance {
72         u8 setup_offs;
73         u8 ctrl_offs;
74         u8 prm_irq_id;
75         bool enabled;
76         const struct omap_abb_common *common;
77         u8 _opp_sel;
78 };
79
80 extern struct omap_abb_instance omap36xx_abb_mpu;
81
82 extern struct omap_abb_instance omap4_abb_mpu;
83 extern struct omap_abb_instance omap4_abb_iva;
84
85 void omap_abb_init(struct voltagedomain *voltdm);
86 void omap_abb_enable(struct voltagedomain *voltdm);
87 void omap_abb_disble(struct voltagedomain *voltdm);
88 int omap_abb_set_opp(struct voltagedomain *voltdm);
89
90 #endif