ARM64: DTS: Add rk3399-firefly uart4 device, node as /dev/ttyS1
[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 <linux/gpio.h>
32 #include <linux/rockchip/cpu.h>
33 #include <linux/rockchip/iomap.h>
34 #include <linux/rockchip/grf.h>
35 #include <asm/uaccess.h>
36 #include <linux/of.h>
37 #include <linux/of_device.h>
38 #include <linux/pinctrl/consumer.h>
39 #include <linux/of_address.h>
40 #include <linux/of_irq.h>
41 #include <linux/of_gpio.h>
42 #include <linux/rockchip/cpu.h>
43 #include <media/camsys_head.h>
44 #include <linux/rockchip-iovmm.h>
45
46 /*
47 *               C A M S Y S   D R I V E R   V E R S I O N
48 *
49 *v0.0.1:
50 *        1) test version;
51 *v0.0.2:
52 *        1) add mipi csi phy;
53 *v0.0.3:
54 *        1) add support cif phy for marvin;
55 *v0.0.4:
56 *        1) add clock information in struct camsys_devio_name_s;
57 *v0.0.5:
58 *        1) set isp clock at 32MHz;
59 *v0.0.6:
60 *        1) iomux d0 d1 for cif phy raw10 in rk319x after i2c operated;
61 *        2) check mis value in camsys_irq_connect;
62                 3) add soft rest callback;
63 *v0.7.0:
64                 1) check extdev is activate or not before delete from
65                 camsys_dev active list;
66 *v0.8.0:
67                 1) fix deregister a unregister extdev oops
68                 in camsys_extdev_deregister;
69 *v0.9.0: 1) set isp freq to 210M
70 *v0.a.0: 
71                 1) fix camsys_i2c_write and camsys_i2c_write
72                 can't support reg_size=0;
73 *v0.b.0:
74                 1) control ddr freq by marvin self other than by clk unit.
75 *v0.c.0:
76 *        1) add flash_trigger_out control
77 *v0.d.0:
78 *        1) add Isp_SoftRst for rk3288;
79 *v0.e.0:
80 *        1) isp_clk 208.8M for 1lane, isp_clk 416.6M for 2lane;
81 *v0.f.0:
82                 1) mi_mis register may read erro, this may cause
83                 mistaken mi frame_end irqs.
84 *v0.0x10.0:
85                 1) add flash_prelight control.
86 *v0.0x11.0:
87                 1) raise qos of isp up to the same as lcdc.
88 *v0.0x12.0:
89                 1) support iommu.
90 *v0.0x13.0:
91                 1) camsys_extdev_register return failed when this
92                 dev_id has been registered;
93                 2) add support JPG irq connect;
94 *v0.0x14.0:
95                 1) camsys_extdev_register return -EBUSY when this
96                 dev_id has been registered;
97 *v0.0x15.0:
98                 1) check extdev name when dev_id has been registered;
99 *v0.0x16.0:
100                 1) enable or disable IOMMU just depending
101                 on CONFIG_ROCKCHIP_IOMMU.
102 *v0.0x17.0:
103                 1) isp iommu status depend on vpu iommu status.
104 *v0.0x18.0:
105                 1) add flashlight RT8547 driver
106                 2) support torch mode
107 *v0.0x19.0:
108                 1) set CONFIG_CAMSYS_DRV disable as default,
109                 enable in defconfig file if needed.
110 *v0.0x1a.0:
111                 1) vpu_node changed from "vpu_service" to "rockchip,vpu_sub"
112 *v0.0x1b.0:
113                 1) use of_find_node_by_name to get vpu node
114                 instead of of_find_compatible_node
115 *v0.0x1c.0:
116                 1) support rk3368.
117 *v0.0x1d.0:
118                 1) enable aclk_rga for rk3368, otherwise,
119                 isp reset will cause system halted.
120 *v0.0x1e.0:
121                 1) dts remove aclk_rga, change aclk_isp
122                 from <clk_gates17 0> to <&clk_gates16 0>.
123                 2) add rl3369 pd_isp enable/disable.
124 *v0.0x1f.0:
125                 1) GPIO(gpio7 GPIO_B5) is EBUSY
126                 when register after factory reset,
127                 but after power on ,it's normal.
128 *v0.0x20.0:
129                 1) rk3368 camera: hold vio0 noc clock during the camera work,
130                 fixed isp iommu stall failed.
131 *v0.0x21.0:
132                 1) add isp-dvp-d4d11 iomux support.
133 *v0.0x21.1:
134                 1) support rk3368-sheep kernel ver4.4.
135 *v0.0x21.2:
136                 1) support rk3399.
137 *v0.0x21.3:
138                 1) some modifications.
139 *v0.0x21.4:
140                 1) modify for rk3399.
141 *v0.0x21.5:
142                 1) modify for mipiphy hsfreqrange.
143 *v0.0x21.6:
144                 1) support drm iommu.
145 *v0.0x21.7:
146 *       1) remove memset function wrong called code.
147 *v0.0x21.8:
148 *       1) flash module exist risk, fix up it.
149 *v0.0x21.9:
150         1) fix drm iommu crash.
151         if process cameraserver was died during streaming, iommu resource
152         was not released correctly. when cameraserver was recovered and
153         streaming again, iommu resource may be conflicted.
154 *v0.0x21.0xa:
155         1) clock clk_vio0_noc would cause mipi lcdc no display on 3368h, remove it.
156 *v0.0x21.0xb:
157         1) some log is boring, so set print level more high.
158 */
159 #define CAMSYS_DRIVER_VERSION                   KERNEL_VERSION(0, 0x21, 0xb)
160
161 #define CAMSYS_PLATFORM_DRV_NAME                "RockChip-CamSys"
162 #define CAMSYS_PLATFORM_MARVIN_NAME             "Platform_MarvinDev"
163 #define CAMSYS_PLATFORM_CIF0_NAME               "Platform_Cif0Dev"
164 #define CAMSYS_PLATFORM_CIF1_NAME               "Platform_Cif1Dev"
165
166 #define CAMSYS_REGISTER_RES_NAME                "CamSys_RegMem"
167 #define CAMSYS_REGISTER_MIPIPHY_RES_NAME        "CamSys_RegMem_MipiPhy"
168 #define CAMSYS_IRQ_RES_NAME                     "CamSys_Irq"
169
170 #define CAMSYS_REGISTER_MEM_NAME                CAMSYS_REGISTER_RES_NAME
171 #define CAMSYS_I2C_MEM_NAME                     "CamSys_I2cMem"
172 #define CAMSYS_MIPIPHY_MEM_NAME                 \
173         CAMSYS_REGISTER_MIPIPHY_RES_NAME
174
175 #define CAMSYS_NAMELEN_MIN(a)                   \
176         ((strlen(a) > (CAMSYS_NAME_LEN-1))?(CAMSYS_NAME_LEN-1):strlen(a))
177 #define CAMSYS_IRQPOOL_NUM                      128
178 #define CAMSYS_DMA_BUF_MAX_NUM                  32
179
180 extern unsigned int camsys_debug;
181
182 #define camsys_trace(level, msg, ...) \
183         do { \
184                 if (camsys_debug >= level) \
185                         printk("D%d:%s(%d): " msg "\n", level,\
186                         __FUNCTION__, __LINE__, ## __VA_ARGS__); \
187         } while (0)
188
189 #define camsys_warn(msg, ...)  \
190         printk(KERN_ERR "W:%s(%d): " msg "\n", __FUNCTION__,\
191         __LINE__, ## __VA_ARGS__)
192 #define camsys_err(msg, ...)   \
193         printk(KERN_ERR "E:%s(%d): " msg "\n", __FUNCTION__,\
194         __LINE__, ## __VA_ARGS__)
195
196 typedef struct camsys_irqstas_s {
197         camsys_irqsta_t       sta;
198         struct list_head      list;
199 } camsys_irqstas_t;
200
201 typedef struct camsys_irqpool_s {
202         pid_t                 pid;
203         unsigned int          timeout;/* us */
204         unsigned int          mis;
205         unsigned int          icr;
206         spinlock_t            lock;/* lock for list */
207         camsys_irqstas_t      pool[CAMSYS_IRQPOOL_NUM];
208         struct list_head      active;
209         struct list_head      deactive;
210
211         struct list_head      list;
212
213         wait_queue_head_t     done;
214 } camsys_irqpool_t;
215
216 typedef struct camsys_irq_s {
217         unsigned int          irq_id;
218         /* lock for timeout and irq_connect in ioctl */
219         spinlock_t            lock;
220         struct list_head      irq_pool;
221 } camsys_irq_t;
222
223 typedef struct camsys_meminfo_s {
224         unsigned char name[32];
225         unsigned long phy_base;
226         unsigned long vir_base;
227         unsigned int size;
228         unsigned int vmas;
229         struct list_head list;
230 } camsys_meminfo_t;
231
232 typedef struct camsys_devmems_s {
233         camsys_meminfo_t *registermem;
234         camsys_meminfo_t *i2cmem;
235         struct list_head memslist;
236 } camsys_devmems_t;
237
238 typedef struct camsys_regulator_s {
239         struct regulator  *ldo;
240         int               min_uv;
241         int               max_uv;
242 } camsys_regulator_t;
243
244 typedef struct camsys_gpio_s {
245         unsigned int      io;
246         unsigned int      active;
247 } camsys_gpio_t;
248 typedef struct camsys_flash_s {
249         camsys_gpio_t        fl;
250         camsys_gpio_t        fl_en;
251         void *ext_fsh_dev;
252 } camsys_flash_t;
253 typedef struct camsys_extdev_s {
254         unsigned char            dev_name[CAMSYS_NAME_LEN];
255         unsigned int             dev_id;
256         camsys_regulator_t       avdd;
257         camsys_regulator_t       dovdd;
258         camsys_regulator_t       dvdd;
259         camsys_regulator_t       afvdd;
260         camsys_gpio_t            pwrdn;
261         camsys_gpio_t            rst;
262         camsys_gpio_t            afpwr;
263         camsys_gpio_t            afpwrdn;
264         camsys_gpio_t            pwren;
265         camsys_flash_t           fl;
266         camsys_extdev_phy_t      phy;
267         camsys_extdev_clk_t      clk;
268         unsigned int             dev_cfg;
269         struct platform_device *pdev;
270         struct list_head         list;
271         struct list_head         active;
272 } camsys_extdev_t;
273
274         typedef struct camsys_phyinfo_s {
275         unsigned int             phycnt;
276         void                     *clk;
277         camsys_meminfo_t         *reg;
278         int (*clkin_cb)(void *ptr, unsigned int on);
279         int (*ops)(void *ptr, camsys_mipiphy_t *phy);
280         int (*remove)(struct platform_device *pdev);
281 } camsys_phyinfo_t;
282
283 typedef struct camsys_exdevs_s {
284         struct mutex          mut;
285         struct list_head      list;
286         struct list_head      active;
287 } camsys_exdevs_t;
288
289 typedef struct camsys_dma_buf_s {
290         struct dma_buf *dma_buf;
291         struct dma_buf_attachment *attach;
292         struct sg_table *sgt;
293         dma_addr_t dma_addr;
294         int fd;
295 } camsys_dma_buf_t;
296
297 typedef struct camsys_dev_s {
298         unsigned int          dev_id;
299         camsys_irq_t          irq;
300         camsys_devmems_t      devmems;
301         struct miscdevice     miscdev;
302         void                  *clk;
303         camsys_phyinfo_t      *mipiphy;
304         camsys_phyinfo_t      cifphy;
305
306         camsys_exdevs_t       extdevs;
307         struct list_head      list;
308         struct platform_device *pdev;
309
310         void                  *soc;
311
312         camsys_meminfo_t     *csiphy_reg;
313         camsys_meminfo_t     *dsiphy_reg;
314         camsys_meminfo_t     *isp0_reg;
315
316         unsigned long         rk_grf_base;
317         unsigned long         rk_cru_base;
318         unsigned long         rk_isp_base;
319
320         struct iommu_domain *domain;
321         camsys_dma_buf_t dma_buf[CAMSYS_DMA_BUF_MAX_NUM];
322         int dma_buf_cnt;
323
324         int (*clkin_cb)(void *ptr, unsigned int on);
325         int (*clkout_cb)(void *ptr, unsigned int on, unsigned int clk);
326         int (*reset_cb)(void *ptr, unsigned int on);
327
328         int (*phy_cb)
329                 (camsys_extdev_t *extdev,
330                 camsys_sysctrl_t *devctl, void *ptr);
331         int (*iomux)(camsys_extdev_t *extdev, void *ptr);
332         int (*platform_remove)(struct platform_device *pdev);
333         int (*flash_trigger_cb)(void *ptr, int mode, unsigned int on);
334         int (*iommu_cb)(void *ptr, camsys_sysctrl_t *devctl);
335 } camsys_dev_t;
336
337
338 static inline camsys_extdev_t *camsys_find_extdev(
339 unsigned int dev_id, camsys_dev_t *camsys_dev)
340 {
341         camsys_extdev_t *extdev = NULL;
342
343         if (!list_empty(&camsys_dev->extdevs.list)) {
344                 list_for_each_entry(extdev,
345                         &camsys_dev->extdevs.list, list) {
346                         if (extdev->dev_id == dev_id) {
347                                 return extdev;
348                         }
349                 }
350         }
351         return NULL;
352 }
353
354 static inline camsys_meminfo_t *camsys_find_devmem(
355 char *name, camsys_dev_t *camsys_dev)
356 {
357         camsys_meminfo_t *devmem;
358
359         if (!list_empty(&camsys_dev->devmems.memslist)) {
360                 list_for_each_entry(devmem,
361                         &camsys_dev->devmems.memslist, list) {
362                         if (strcmp(devmem->name, name) == 0) {
363                                 return devmem;
364                         }
365                 }
366         }
367         camsys_err("%s memory have not been find in %s!",
368                 name, dev_name(camsys_dev->miscdev.this_device));
369         return NULL;
370 }
371
372 static inline int camsys_sysctl_extdev(
373 camsys_extdev_t *extdev, camsys_sysctrl_t *devctl, camsys_dev_t *camsys_dev)
374 {
375         int err = 0;
376         camsys_regulator_t *regulator;
377         camsys_gpio_t *gpio;
378
379         if ((devctl->ops > CamSys_Vdd_Start_Tag) &&
380                 (devctl->ops < CamSys_Vdd_End_Tag)) {
381                 regulator = &extdev->avdd;
382                 regulator += devctl->ops-1;
383
384                 if (!IS_ERR_OR_NULL(regulator->ldo)) {
385                         if (devctl->on) {
386                                 err = regulator_set_voltage(
387                                         regulator->ldo, regulator->min_uv,
388                                         regulator->max_uv);
389                                 err |= regulator_enable(regulator->ldo);
390                                 camsys_trace(1,
391                                         "Sysctl %d success, regulator set (%d,%d) uv!",
392                                         devctl->ops, regulator->min_uv,
393                                         regulator->max_uv);
394                         } else {
395                                 while (regulator_is_enabled(regulator->ldo) > 0)
396                                         regulator_disable(regulator->ldo);
397                                 camsys_trace(1,
398                                         "Sysctl %d success, regulator off!",
399                                         devctl->ops);
400                         }
401                 } else {
402                         err = -EINVAL;
403                         goto end;
404                 }
405         } else if ((devctl->ops > CamSys_Gpio_Start_Tag) &&
406                 (devctl->ops < CamSys_Gpio_End_Tag)) {
407                 gpio = &extdev->pwrdn;
408                 gpio += devctl->ops - CamSys_Gpio_Start_Tag -1;
409
410                 if (gpio->io != 0xffffffff) {
411                         if (devctl->on) {
412                                 gpio_direction_output(gpio->io, gpio->active);
413                                 gpio_set_value(gpio->io, gpio->active);
414                                 camsys_trace(1,
415                                         "Sysctl %d success, gpio(%d) set %d",
416                                         devctl->ops, gpio->io, gpio->active);
417                         } else {
418                                 gpio_direction_output(gpio->io, !gpio->active);
419                                 gpio_set_value(gpio->io, !gpio->active);
420                                 camsys_trace(1,
421                                         "Sysctl %d success, gpio(%d) set %d",
422                                         devctl->ops, gpio->io, !gpio->active);
423                         }
424                 } else {
425                         camsys_trace(1, "Sysctl %d not do, because gpio is NULL",
426                                 devctl->ops);
427                         err = -EINVAL;
428                         goto end;
429                 }
430         } else if (devctl->ops == CamSys_ClkIn) {
431                 if (camsys_dev->clkout_cb)
432                         camsys_dev->clkout_cb
433                                 (camsys_dev, devctl->on,
434                                 extdev->clk.in_rate);
435         } else if (devctl->ops == CamSys_Phy) {
436                 if (camsys_dev->phy_cb)
437                         (camsys_dev->phy_cb)
438                                 (extdev, devctl,
439                                 (void *)camsys_dev);
440         }
441
442 end:
443         return err;
444 }
445
446 extern struct file_operations camsys_fops;
447 #endif