.. | .. |
---|
17 | 17 | #include <linux/regmap.h> |
---|
18 | 18 | #include <linux/dma-buf.h> |
---|
19 | 19 | #include <linux/highmem.h> |
---|
| 20 | +#include <linux/soc/rockchip/rockchip_thunderboot_service.h> |
---|
20 | 21 | |
---|
21 | 22 | #include "rkisp_tb_helper.h" |
---|
22 | 23 | |
---|
23 | 24 | static struct platform_device *rkisp_tb_pdev; |
---|
| 25 | +static struct clk_bulk_data *rkisp_tb_clk; |
---|
| 26 | +static int rkisp_tb_clk_num; |
---|
| 27 | +static struct rk_tb_client tb_cl; |
---|
24 | 28 | |
---|
25 | 29 | struct shm_data { |
---|
26 | 30 | int npages; |
---|
.. | .. |
---|
71 | 75 | { |
---|
72 | 76 | struct shm_data *data = dma_buf->priv; |
---|
73 | 77 | |
---|
74 | | - return vm_map_ram(data->pages, data->npages, 0, PAGE_KERNEL); |
---|
| 78 | + return vm_map_ram(data->pages, data->npages, 0); |
---|
75 | 79 | } |
---|
76 | 80 | |
---|
77 | 81 | static void shm_vunmap(struct dma_buf *dma_buf, void *vaddr) |
---|
.. | .. |
---|
79 | 83 | struct shm_data *data = dma_buf->priv; |
---|
80 | 84 | |
---|
81 | 85 | vm_unmap_ram(vaddr, data->npages); |
---|
82 | | -} |
---|
83 | | - |
---|
84 | | -static void *shm_kmap(struct dma_buf *dma_buf, unsigned long page_num) |
---|
85 | | -{ |
---|
86 | | - struct shm_data *data = dma_buf->priv; |
---|
87 | | - |
---|
88 | | - return kmap(data->pages[page_num]); |
---|
89 | | -} |
---|
90 | | - |
---|
91 | | -static void shm_kunmap(struct dma_buf *dma_buf, unsigned long page_num, void *addr) |
---|
92 | | -{ |
---|
93 | | - struct shm_data *data = dma_buf->priv; |
---|
94 | | - |
---|
95 | | - return kunmap(data->pages[page_num]); |
---|
96 | 86 | } |
---|
97 | 87 | |
---|
98 | 88 | static int shm_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma) |
---|
.. | .. |
---|
138 | 128 | .map_dma_buf = shm_map_dma_buf, |
---|
139 | 129 | .unmap_dma_buf = shm_unmap_dma_buf, |
---|
140 | 130 | .release = shm_release, |
---|
141 | | - .map = shm_kmap, |
---|
142 | | - .unmap = shm_kunmap, |
---|
143 | 131 | .mmap = shm_mmap, |
---|
144 | 132 | .vmap = shm_vmap, |
---|
145 | 133 | .vunmap = shm_vunmap, |
---|
.. | .. |
---|
175 | 163 | |
---|
176 | 164 | static int __maybe_unused rkisp_tb_clocks_loader_protect(void) |
---|
177 | 165 | { |
---|
| 166 | + int ret = 0; |
---|
| 167 | + |
---|
178 | 168 | if (rkisp_tb_pdev) { |
---|
179 | 169 | pm_runtime_enable(&rkisp_tb_pdev->dev); |
---|
180 | 170 | pm_runtime_get_sync(&rkisp_tb_pdev->dev); |
---|
| 171 | + if (rkisp_tb_clk_num) { |
---|
| 172 | + ret = clk_bulk_prepare_enable(rkisp_tb_clk_num, rkisp_tb_clk); |
---|
| 173 | + if (ret) |
---|
| 174 | + dev_err(&rkisp_tb_pdev->dev, "Cannot enable clock\n"); |
---|
| 175 | + } |
---|
181 | 176 | } |
---|
182 | | - return 0; |
---|
| 177 | + |
---|
| 178 | + return ret; |
---|
183 | 179 | } |
---|
184 | 180 | |
---|
185 | 181 | static int __maybe_unused rkisp_tb_clocks_loader_unprotect(void) |
---|
186 | 182 | { |
---|
187 | 183 | if (rkisp_tb_pdev) { |
---|
| 184 | + if (rkisp_tb_clk_num) |
---|
| 185 | + clk_bulk_disable_unprepare(rkisp_tb_clk_num, rkisp_tb_clk); |
---|
188 | 186 | pm_runtime_put_sync(&rkisp_tb_pdev->dev); |
---|
189 | 187 | pm_runtime_disable(&rkisp_tb_pdev->dev); |
---|
190 | 188 | } |
---|
191 | 189 | return 0; |
---|
| 190 | +} |
---|
| 191 | + |
---|
| 192 | +static void rkisp_tb_cb(void *data) |
---|
| 193 | +{ |
---|
| 194 | + rkisp_tb_clocks_loader_unprotect(); |
---|
192 | 195 | } |
---|
193 | 196 | |
---|
194 | 197 | static int __maybe_unused rkisp_tb_runtime_suspend(struct device *dev) |
---|
.. | .. |
---|
218 | 221 | static int rkisp_tb_plat_probe(struct platform_device *pdev) |
---|
219 | 222 | { |
---|
220 | 223 | rkisp_tb_pdev = pdev; |
---|
| 224 | + rkisp_tb_clk_num = devm_clk_bulk_get_all(&pdev->dev, &rkisp_tb_clk); |
---|
| 225 | + if (rkisp_tb_clk_num <= 0) { |
---|
| 226 | + dev_warn(&pdev->dev, "get clk fail:%d\n", rkisp_tb_clk_num); |
---|
| 227 | + rkisp_tb_clk_num = 0; |
---|
| 228 | + } |
---|
221 | 229 | rkisp_tb_clocks_loader_protect(); |
---|
| 230 | + |
---|
| 231 | + if (IS_ENABLED(CONFIG_ROCKCHIP_THUNDER_BOOT_SERVICE)) { |
---|
| 232 | + tb_cl.cb = rkisp_tb_cb; |
---|
| 233 | + return rk_tb_client_register_cb(&tb_cl); |
---|
| 234 | + } |
---|
| 235 | + |
---|
222 | 236 | return 0; |
---|
223 | 237 | } |
---|
224 | 238 | |
---|
.. | .. |
---|
263 | 277 | |
---|
264 | 278 | void rkisp_tb_unprotect_clk(void) |
---|
265 | 279 | { |
---|
| 280 | + if (IS_ENABLED(CONFIG_ROCKCHIP_THUNDER_BOOT_SERVICE)) |
---|
| 281 | + return; |
---|
| 282 | + |
---|
266 | 283 | rkisp_tb_clocks_loader_unprotect(); |
---|
267 | 284 | } |
---|
268 | 285 | EXPORT_SYMBOL(rkisp_tb_unprotect_clk); |
---|