e652aec383e63ea92a53dfd82c9939975b197ecd
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / rk_camsys / camsys_internal.h
1 #ifndef __RKCAMSYS_INTERNAL_H__
2 #define __RKCAMSYS_INTERNAL_H__
3
4 #include <linux/module.h>
5 #include <linux/moduleparam.h>
6 #include <linux/init.h>
7 #include <linux/delay.h>
8 #include <linux/device.h>
9 #include <linux/kernel.h>       
10 #include <linux/slab.h>
11 #include <linux/i2c.h>
12 #include <linux/io.h>
13 #include <linux/fs.h>   
14 #include <linux/interrupt.h>
15 #include <linux/errno.h>
16 #include <linux/err.h>
17 #include <linux/types.h>        
18 #include <linux/proc_fs.h>
19 #include <linux/fcntl.h>        
20 #include <linux/clk.h>
21 #include <linux/seq_file.h>
22 #include <linux/cdev.h>
23 #include <linux/miscdevice.h> 
24 #include <linux/version.h>
25 #include <linux/device.h>
26 #include <linux/platform_device.h>
27 #include <linux/list.h>
28 #include <linux/mutex.h>
29 #include <linux/regulator/machine.h>
30 #include <linux/log2.h>
31 //#include <mach/io.h>
32 //#include <mach/gpio.h>
33 //#include <mach/iomux.h>
34 //#include <mach/cru.h>
35 #include <linux/rockchip/cpu.h>
36 #include <linux/rockchip/iomap.h>
37 #include <linux/rockchip/grf.h>
38
39 #include <asm/gpio.h>
40 #include <asm/system.h> 
41 #include <asm/uaccess.h>
42
43 #include <linux/of.h>
44 #include <linux/of_device.h>
45 #include <linux/pinctrl/consumer.h>
46 #include <linux/of_address.h>
47 #include <linux/of_irq.h>
48 #include <media/camsys_head.h>
49 /*
50 *               C A M S Y S   D R I V E R   V E R S I O N 
51 *
52 *v0.0.1:
53 *        1) test version;
54 *v0.0.2:
55 *        1) add mipi csi phy;
56 *v0.0.3:
57 *        1) add support cif phy for marvin;
58 *v0.0.4:
59 *        1) add clock information in struct camsys_devio_name_s;
60 *v0.0.5:
61 *        1) set isp clock at 32MHz;
62 *v0.0.6:
63 *        1) iomux d0 d1 for cif phy raw10 in rk319x after i2c operated;
64 *        2) check mis value in camsys_irq_connect;
65 *        3) add soft rest callback;
66 *v0.0.7:
67 *        1) check extdev is activate or not before delete from camsys_dev active list;
68 */
69 #define CAMSYS_DRIVER_VERSION                   KERNEL_VERSION(0,0,6)
70
71
72 #define CAMSYS_PLATFORM_DRV_NAME                "RockChip-CamSys"
73 #define CAMSYS_PLATFORM_MARVIN_NAME             "Platform_MarvinDev"
74 #define CAMSYS_PLATFORM_CIF0_NAME               "Platform_Cif0Dev"
75 #define CAMSYS_PLATFORM_CIF1_NAME               "Platform_Cif1Dev"
76
77 #define CAMSYS_REGISTER_RES_NAME                "CamSys_RegMem"
78 #define CAMSYS_REGISTER_MIPIPHY_RES_NAME        "CamSys_RegMem_MipiPhy"
79 #define CAMSYS_IRQ_RES_NAME                     "CamSys_Irq"
80
81 #define CAMSYS_REGISTER_MEM_NAME                CAMSYS_REGISTER_RES_NAME
82 #define CAMSYS_I2C_MEM_NAME                     "CamSys_I2cMem"
83
84 #define CAMSYS_NAMELEN_MIN(a)                   ((strlen(a)>(CAMSYS_NAME_LEN-1))?(CAMSYS_NAME_LEN-1):strlen(a))
85 #define CAMSYS_IRQPOOL_NUM                      128
86
87 extern unsigned int camsys_debug;
88
89 #define camsys_trace(level, msg,...) \
90         do { \
91                 if (camsys_debug >= level) \
92                         printk("D%d:%s(%d): " msg "\n",level, __FUNCTION__,__LINE__, ## __VA_ARGS__); \
93         } while (0)
94
95 #define camsys_warn(msg,...)  printk(KERN_ERR "W:%s(%d): " msg "\n", __FUNCTION__,__LINE__, ## __VA_ARGS__)
96 #define camsys_err(msg,...)   printk(KERN_ERR "E:%s(%d): " msg "\n", __FUNCTION__,__LINE__, ## __VA_ARGS__)
97
98
99 typedef struct camsys_irqstas_s {
100     camsys_irqsta_t       sta;
101     struct list_head      list;
102 } camsys_irqstas_t;
103
104 typedef struct camsys_irqpool_s {
105     pid_t                 pid;
106     unsigned int          timeout;             //us
107     unsigned int          mis;
108     unsigned int          icr;
109     
110
111     spinlock_t            lock;                       // lock for list
112     camsys_irqstas_t      pool[CAMSYS_IRQPOOL_NUM];
113     struct list_head      active;
114     struct list_head      deactive;
115
116     struct list_head      list;
117
118     wait_queue_head_t     done;
119 } camsys_irqpool_t;
120
121 typedef struct camsys_irq_s {
122     unsigned int          irq_id;
123
124     spinlock_t            lock;             //lock for timeout and irq_connect in ioctl
125     //unsigned int          timeout;
126     
127     //wait_queue_head_t     irq_done;
128
129     struct list_head      irq_pool;
130 } camsys_irq_t;
131
132 typedef struct camsys_meminfo_s {
133     unsigned char name[32];
134     unsigned int phy_base;
135     unsigned int vir_base;
136     unsigned int size;
137     unsigned int vmas;
138
139     struct list_head list;
140     
141 } camsys_meminfo_t;
142
143 typedef struct camsys_devmems_s {
144     camsys_meminfo_t *registermem;
145     camsys_meminfo_t *i2cmem;
146     struct list_head memslist;
147 } camsys_devmems_t;
148
149 typedef struct camsys_regulator_s {
150     struct regulator  *ldo;
151     int               min_uv;
152     int               max_uv;
153 } camsys_regulator_t;
154
155 typedef struct camsys_gpio_s {
156     unsigned int      io;
157     unsigned int      active;
158 } camsys_gpio_t;
159 typedef struct camsys_flash_s {
160     camsys_gpio_t        fl;
161 } camsys_flash_t;
162 typedef struct camsys_extdev_s {
163     unsigned int             dev_id;
164     camsys_regulator_t       avdd;
165     camsys_regulator_t       dovdd;
166     camsys_regulator_t       dvdd;
167     camsys_regulator_t       afvdd;
168     
169     camsys_gpio_t            pwrdn;
170     camsys_gpio_t            rst;
171     camsys_gpio_t            afpwr;
172     camsys_gpio_t            afpwrdn;
173         camsys_gpio_t            pwren;
174
175     camsys_flash_t           fl;
176
177     camsys_extdev_phy_t      phy;
178     camsys_extdev_clk_t      clk;
179     
180     unsigned int             dev_cfg;
181
182     struct platform_device *pdev;
183     
184     struct list_head         list;
185     struct list_head         active;
186 } camsys_extdev_t;
187
188 typedef struct camsys_phyinfo_s {
189     void               *clk;
190     camsys_meminfo_t   *reg;    
191
192     int (*clkin_cb)(void *ptr, unsigned int on);
193     int (*ops) (void *phy, void *phyinfo, unsigned int on);
194     int (*remove)(struct platform_device *pdev);
195 } camsys_phyinfo_t;
196
197 typedef struct camsys_exdevs_s {
198     struct mutex          mut;
199     struct list_head      list;
200     struct list_head      active;
201 } camsys_exdevs_t;
202
203 typedef struct camsys_dev_s {
204     unsigned int          dev_id;         
205
206     camsys_irq_t          irq;
207     camsys_devmems_t      devmems;
208     struct miscdevice     miscdev;  
209     void                  *clk;
210
211     camsys_phyinfo_t      mipiphy;
212     camsys_phyinfo_t      cifphy;
213
214     camsys_exdevs_t       extdevs;    
215     struct list_head      list;
216     struct platform_device *pdev;
217
218     int (*clkin_cb)(void *ptr, unsigned int on);
219     int (*clkout_cb)(void *ptr,unsigned int on,unsigned int clk);
220     int (*reset_cb)(void *ptr);
221     int (*phy_cb) (camsys_extdev_phy_t *phy,void* ptr, unsigned int on);
222     int (*iomux)(camsys_extdev_t *extdev,void *ptr);
223     int (*platform_remove)(struct platform_device *pdev);
224 } camsys_dev_t;
225
226
227 static inline camsys_extdev_t* camsys_find_extdev(unsigned int dev_id, camsys_dev_t *camsys_dev)
228 {
229     camsys_extdev_t *extdev;
230
231     if (!list_empty(&camsys_dev->extdevs.list)) {
232         list_for_each_entry(extdev, &camsys_dev->extdevs.list, list) {
233             if (extdev->dev_id == dev_id) {
234                 return extdev;
235             }
236         }
237     }    
238     return NULL;
239 }
240
241 static inline camsys_meminfo_t* camsys_find_devmem(char *name, camsys_dev_t *camsys_dev)
242 {
243     camsys_meminfo_t *devmem;
244
245     if (!list_empty(&camsys_dev->devmems.memslist)) {
246         list_for_each_entry(devmem, &camsys_dev->devmems.memslist, list) {
247             if (strcmp(devmem->name, name) == 0) {
248                 return devmem;
249             }
250         }
251     }
252     camsys_err("%s memory have not been find in %s!",name,dev_name(camsys_dev->miscdev.this_device));
253     return NULL;
254 }
255
256
257 static inline int camsys_sysctl_extdev(camsys_extdev_t *extdev, camsys_sysctrl_t *devctl, camsys_dev_t *camsys_dev)
258 {
259     int err = 0;
260     camsys_regulator_t *regulator;
261     camsys_gpio_t *gpio;
262     
263     if (devctl->ops < CamSys_Vdd_Tag) {
264         regulator = &extdev->avdd;
265         regulator += devctl->ops;
266
267         //printk("regulator: %p  regulator->ldo: %p\n",regulator,regulator->ldo);
268         if (!IS_ERR_OR_NULL(regulator->ldo)) {
269             if (devctl->on) {
270                 regulator_set_voltage(regulator->ldo,regulator->min_uv,regulator->max_uv);
271                 regulator_enable(regulator->ldo);
272                 camsys_trace(1,"Sysctl %d success, regulator set (%d,%d) uv!",devctl->ops, regulator->min_uv,regulator->max_uv);
273             } else {
274                 while(regulator_is_enabled(regulator->ldo)>0)   
275                                 regulator_disable(regulator->ldo);
276                             camsys_trace(1,"Sysctl %d success, regulator off!",devctl->ops);
277             }
278         } else {
279             camsys_err("Sysctl %d failed, because regulator ldo is NULL!",devctl->ops);
280             err = -EINVAL;
281             goto end;
282         }
283     } else if (devctl->ops < CamSys_Gpio_Tag) {
284         gpio = &extdev->pwrdn;
285         gpio += devctl->ops - CamSys_Vdd_Tag -1;
286
287         if (gpio->io != 0xffffffff) {
288             if (devctl->on) {
289                 gpio_direction_output(gpio->io, gpio->active);
290                 gpio_set_value(gpio->io, gpio->active);
291                 camsys_trace(1,"Sysctl %d success, gpio(%d) set %d",devctl->ops, gpio->io, gpio->active);
292             } else {
293                 gpio_direction_output(gpio->io, !gpio->active);
294                 gpio_set_value(gpio->io, !gpio->active);
295                 camsys_trace(1,"Sysctl %d success, gpio(%d) set %d",devctl->ops, gpio->io, !gpio->active);
296             }
297         } else {
298             camsys_err("Sysctl %d failed, because gpio is NULL!",devctl->ops);
299             err = -EINVAL;
300             goto end;
301         }
302     } else if (devctl->ops == CamSys_ClkIn) {
303         if (camsys_dev->clkout_cb)
304             camsys_dev->clkout_cb(camsys_dev,devctl->on,extdev->clk.in_rate);
305         if (camsys_dev->phy_cb)
306             camsys_dev->phy_cb(&extdev->phy, camsys_dev, devctl->on);
307     }
308
309 end:
310     return err;
311 }
312
313 extern struct file_operations camsys_fops;
314 #endif