GNU Linux-libre 4.14.290-gnu1
[releases.git] / drivers / media / platform / qcom / camss-8x16 / camss.h
1 /*
2  * camss.h
3  *
4  * Qualcomm MSM Camera Subsystem - Core
5  *
6  * Copyright (c) 2015, The Linux Foundation. All rights reserved.
7  * Copyright (C) 2015-2017 Linaro Ltd.
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 and
11  * only version 2 as published by the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  */
18 #ifndef QC_MSM_CAMSS_H
19 #define QC_MSM_CAMSS_H
20
21 #include <linux/types.h>
22 #include <media/v4l2-async.h>
23 #include <media/v4l2-device.h>
24 #include <media/v4l2-subdev.h>
25 #include <media/media-device.h>
26 #include <media/media-entity.h>
27 #include <linux/device.h>
28
29 #include "camss-csid.h"
30 #include "camss-csiphy.h"
31 #include "camss-ispif.h"
32 #include "camss-vfe.h"
33
34 #define CAMSS_CSID_NUM 2
35 #define CAMSS_CSIPHY_NUM 2
36
37 #define to_camss(ptr_module)    \
38         container_of(ptr_module, struct camss, ptr_module)
39
40 #define to_device(ptr_module)   \
41         (to_camss(ptr_module)->dev)
42
43 #define module_pointer(ptr_module, index)       \
44         ((const struct ptr_module##_device (*)[]) &(ptr_module[-(index)]))
45
46 #define to_camss_index(ptr_module, index)       \
47         container_of(module_pointer(ptr_module, index), \
48                      struct camss, ptr_module)
49
50 #define to_device_index(ptr_module, index)      \
51         (to_camss_index(ptr_module, index)->dev)
52
53 #define CAMSS_RES_MAX 15
54
55 struct resources {
56         char *regulator[CAMSS_RES_MAX];
57         char *clock[CAMSS_RES_MAX];
58         u32 clock_rate[CAMSS_RES_MAX][CAMSS_RES_MAX];
59         char *reg[CAMSS_RES_MAX];
60         char *interrupt[CAMSS_RES_MAX];
61 };
62
63 struct resources_ispif {
64         char *clock[CAMSS_RES_MAX];
65         char *clock_for_reset[CAMSS_RES_MAX];
66         char *reg[CAMSS_RES_MAX];
67         char *interrupt;
68 };
69
70 struct camss {
71         struct v4l2_device v4l2_dev;
72         struct v4l2_async_notifier notifier;
73         struct media_device media_dev;
74         struct device *dev;
75         struct csiphy_device csiphy[CAMSS_CSIPHY_NUM];
76         struct csid_device csid[CAMSS_CSID_NUM];
77         struct ispif_device ispif;
78         struct vfe_device vfe;
79         atomic_t ref_count;
80 };
81
82 struct camss_camera_interface {
83         u8 csiphy_id;
84         struct csiphy_csi2_cfg csi2;
85 };
86
87 struct camss_async_subdev {
88         struct camss_camera_interface interface;
89         struct v4l2_async_subdev asd;
90 };
91
92 struct camss_clock {
93         struct clk *clk;
94         const char *name;
95         u32 *freq;
96         u32 nfreqs;
97 };
98
99 void camss_add_clock_margin(u64 *rate);
100 int camss_enable_clocks(int nclocks, struct camss_clock *clock,
101                         struct device *dev);
102 void camss_disable_clocks(int nclocks, struct camss_clock *clock);
103 int camss_get_pixel_clock(struct media_entity *entity, u32 *pixel_clock);
104 void camss_delete(struct camss *camss);
105
106 #endif /* QC_MSM_CAMSS_H */