Merge branch 'develop-3.0' of ssh://10.10.10.29/rk/kernel into hwg
[firefly-linux-kernel-4.4.55.git] / drivers / i2c / busses / i2c-rk30.h
1 #ifndef __RK30_I2C_H__
2 #define __RK30_I2C_H__
3
4 #include <linux/kernel.h>
5 #include <linux/module.h>
6 #include <linux/wakelock.h>
7 #include <linux/i2c.h>
8 #include <linux/init.h>
9 #include <linux/time.h>
10 #include <linux/interrupt.h>
11 #include <linux/delay.h>
12 #include <linux/errno.h>
13 #include <linux/err.h>
14 #include <linux/platform_device.h>
15 #include <linux/clk.h>
16 #include <linux/cpufreq.h>
17 #include <linux/slab.h>
18 #include <linux/io.h>
19
20 #include <mach/board.h>
21 #include <mach/iomux.h>
22 #include <asm/irq.h>
23
24 #if 0
25 #define i2c_dbg(dev, format, arg...)            \
26         dev_printk(KERN_INFO , dev , format , ## arg)
27 #else
28 #define i2c_dbg(dev, format, arg...)
29 #endif
30
31 #define i2c_writel                 writel_relaxed
32 #define i2c_readl                  readl_relaxed
33
34 #define I2C_WAIT_TIMEOUT            200  //100ms
35
36 #define rk30_set_bit(p, v, b)        (((p) & ~(1 << (b))) | ((v) << (b)))
37 #define rk30_get_bit(p, b)           (((p) & (1 << (b))) >> (b))
38
39 #define rk30_set_bits(p, v, b, m)       (((p) & ~(m)) | ((v) << (b)))
40 #define rk30_get_bits(p, b, m)      (((p) & (m)) >> (b))
41
42 #define rk30_ceil(x, y) \
43         ({ unsigned long __x = (x), __y = (y); (__x + __y - 1) / __y; })
44
45 #define GRF_I2C_CON_BASE            (RK30_GRF_BASE + GRF_SOC_CON1)
46 #define I2C_ADAP_SEL_BIT(nr)        ((nr) + 11)
47 #define I2C_ADAP_SEL_MASK(nr)        ((nr) + 27)
48 enum rk30_i2c_state {
49         STATE_IDLE,
50         STATE_START,
51         STATE_READ,
52         STATE_WRITE,
53         STATE_STOP
54 };
55 struct rk30_i2c {
56         spinlock_t                  lock;
57         wait_queue_head_t       wait;
58         unsigned int            suspended:1;
59
60         struct i2c_msg          *msg;
61         unsigned int            msg_num;
62         unsigned int            msg_idx;
63         unsigned int            msg_ptr;
64
65         unsigned int            tx_setup;
66         unsigned int            irq;
67
68         enum rk30_i2c_state     state;
69         unsigned long           clkrate;
70
71         void __iomem            *regs;
72         void __iomem        *con_base;
73         struct clk                  *clk;
74         struct device           *dev;
75         struct resource         *ioarea;
76         struct i2c_adapter      adap;
77     
78         unsigned long           scl_rate;
79         unsigned long           i2c_rate;
80         unsigned int        addr;
81         unsigned int        mode;
82         unsigned int        count;
83
84         struct wake_lock    idlelock[5];
85         int is_div_from_arm[5];
86
87 #ifdef CONFIG_CPU_FREQ
88         struct notifier_block   freq_transition;
89 #endif
90
91         void (*i2c_init_hw)(struct rk30_i2c *, unsigned long scl_rate);
92         void (*i2c_set_clk)(struct rk30_i2c *, unsigned long);
93         irqreturn_t (*i2c_irq)(int, void *);
94 };
95 void i2c_adap_sel(struct rk30_i2c *i2c, int nr, int adap_type);
96 int i2c_add_rk29_adapter(struct i2c_adapter *);
97 int i2c_add_rk30_adapter(struct i2c_adapter *);
98 #endif