This source file includes following definitions.
- omap3isp_flush
- isp_xclk_update
- isp_xclk_prepare
- isp_xclk_unprepare
- isp_xclk_enable
- isp_xclk_disable
- isp_xclk_recalc_rate
- isp_xclk_calc_divider
- isp_xclk_round_rate
- isp_xclk_set_rate
- isp_xclk_src_get
- isp_xclk_init
- isp_xclk_cleanup
- isp_enable_interrupts
- isp_disable_interrupts
- isp_core_init
- omap3isp_configure_bridge
- omap3isp_hist_dma_done
- isp_isr_dbg
- isp_isr_sbl
- isp_isr
- isp_pipeline_enable
- isp_pipeline_wait_resizer
- isp_pipeline_wait_preview
- isp_pipeline_wait_ccdc
- isp_pipeline_wait
- isp_pipeline_disable
- omap3isp_pipeline_set_stream
- omap3isp_pipeline_cancel_stream
- isp_pipeline_resume
- isp_pipeline_suspend
- isp_pipeline_is_last
- isp_suspend_module_pipeline
- isp_resume_module_pipeline
- isp_suspend_modules
- isp_resume_modules
- isp_reset
- isp_save_context
- isp_restore_context
- isp_save_ctx
- isp_restore_ctx
- omap3isp_sbl_enable
- omap3isp_sbl_disable
- omap3isp_module_sync_idle
- omap3isp_module_sync_is_stopping
- __isp_subclk_update
- omap3isp_subclk_enable
- omap3isp_subclk_disable
- isp_enable_clocks
- isp_disable_clocks
- isp_get_clocks
- __omap3isp_get
- omap3isp_get
- __omap3isp_put
- omap3isp_put
- omap3isp_print_status
- isp_pm_prepare
- isp_pm_suspend
- isp_pm_resume
- isp_pm_complete
- isp_unregister_entities
- isp_link_entity
- isp_register_entities
- isp_create_links
- isp_cleanup_modules
- isp_initialize_modules
- isp_detach_iommu
- isp_attach_iommu
- isp_remove
- isp_subdev_notifier_complete
- isp_parse_of_parallel_endpoint
- isp_parse_of_csi2_endpoint
- isp_parse_of_csi1_endpoint
- isp_alloc_isd
- isp_parse_of_endpoints
- isp_probe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 #include <asm/cacheflush.h>
43
44 #include <linux/clk.h>
45 #include <linux/clkdev.h>
46 #include <linux/delay.h>
47 #include <linux/device.h>
48 #include <linux/dma-mapping.h>
49 #include <linux/i2c.h>
50 #include <linux/interrupt.h>
51 #include <linux/mfd/syscon.h>
52 #include <linux/module.h>
53 #include <linux/omap-iommu.h>
54 #include <linux/platform_device.h>
55 #include <linux/property.h>
56 #include <linux/regulator/consumer.h>
57 #include <linux/slab.h>
58 #include <linux/sched.h>
59 #include <linux/vmalloc.h>
60
61 #ifdef CONFIG_ARM_DMA_USE_IOMMU
62 #include <asm/dma-iommu.h>
63 #endif
64
65 #include <media/v4l2-common.h>
66 #include <media/v4l2-fwnode.h>
67 #include <media/v4l2-device.h>
68 #include <media/v4l2-mc.h>
69
70 #include "isp.h"
71 #include "ispreg.h"
72 #include "ispccdc.h"
73 #include "isppreview.h"
74 #include "ispresizer.h"
75 #include "ispcsi2.h"
76 #include "ispccp2.h"
77 #include "isph3a.h"
78 #include "isphist.h"
79
80 static unsigned int autoidle;
81 module_param(autoidle, int, 0444);
82 MODULE_PARM_DESC(autoidle, "Enable OMAP3ISP AUTOIDLE support");
83
84 static void isp_save_ctx(struct isp_device *isp);
85
86 static void isp_restore_ctx(struct isp_device *isp);
87
88 static const struct isp_res_mapping isp_res_maps[] = {
89 {
90 .isp_rev = ISP_REVISION_2_0,
91 .offset = {
92
93 0x0000,
94 0x0400,
95 0x0600,
96 0x0a00,
97 0x0c00,
98 0x0e00,
99 0x1000,
100 0x1200,
101
102 0x0000,
103 0x0170,
104 },
105 .phy_type = ISP_PHY_TYPE_3430,
106 },
107 {
108 .isp_rev = ISP_REVISION_15_0,
109 .offset = {
110
111 0x0000,
112 0x0400,
113 0x0600,
114 0x0a00,
115 0x0c00,
116 0x0e00,
117 0x1000,
118 0x1200,
119
120 0x0000,
121 0x0170,
122 0x01c0,
123 0x0400,
124 0x0570,
125 0x05c0,
126 },
127 .phy_type = ISP_PHY_TYPE_3630,
128 },
129 };
130
131
132 static struct isp_reg isp_reg_list[] = {
133 {OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG, 0},
134 {OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, 0},
135 {OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, 0},
136 {0, ISP_TOK_TERM, 0}
137 };
138
139
140
141
142
143
144
145
146
147
148
149 void omap3isp_flush(struct isp_device *isp)
150 {
151 isp_reg_writel(isp, 0, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION);
152 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION);
153 }
154
155
156
157
158
159 #define to_isp_xclk(_hw) container_of(_hw, struct isp_xclk, hw)
160
161 static void isp_xclk_update(struct isp_xclk *xclk, u32 divider)
162 {
163 switch (xclk->id) {
164 case ISP_XCLK_A:
165 isp_reg_clr_set(xclk->isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
166 ISPTCTRL_CTRL_DIVA_MASK,
167 divider << ISPTCTRL_CTRL_DIVA_SHIFT);
168 break;
169 case ISP_XCLK_B:
170 isp_reg_clr_set(xclk->isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
171 ISPTCTRL_CTRL_DIVB_MASK,
172 divider << ISPTCTRL_CTRL_DIVB_SHIFT);
173 break;
174 }
175 }
176
177 static int isp_xclk_prepare(struct clk_hw *hw)
178 {
179 struct isp_xclk *xclk = to_isp_xclk(hw);
180
181 omap3isp_get(xclk->isp);
182
183 return 0;
184 }
185
186 static void isp_xclk_unprepare(struct clk_hw *hw)
187 {
188 struct isp_xclk *xclk = to_isp_xclk(hw);
189
190 omap3isp_put(xclk->isp);
191 }
192
193 static int isp_xclk_enable(struct clk_hw *hw)
194 {
195 struct isp_xclk *xclk = to_isp_xclk(hw);
196 unsigned long flags;
197
198 spin_lock_irqsave(&xclk->lock, flags);
199 isp_xclk_update(xclk, xclk->divider);
200 xclk->enabled = true;
201 spin_unlock_irqrestore(&xclk->lock, flags);
202
203 return 0;
204 }
205
206 static void isp_xclk_disable(struct clk_hw *hw)
207 {
208 struct isp_xclk *xclk = to_isp_xclk(hw);
209 unsigned long flags;
210
211 spin_lock_irqsave(&xclk->lock, flags);
212 isp_xclk_update(xclk, 0);
213 xclk->enabled = false;
214 spin_unlock_irqrestore(&xclk->lock, flags);
215 }
216
217 static unsigned long isp_xclk_recalc_rate(struct clk_hw *hw,
218 unsigned long parent_rate)
219 {
220 struct isp_xclk *xclk = to_isp_xclk(hw);
221
222 return parent_rate / xclk->divider;
223 }
224
225 static u32 isp_xclk_calc_divider(unsigned long *rate, unsigned long parent_rate)
226 {
227 u32 divider;
228
229 if (*rate >= parent_rate) {
230 *rate = parent_rate;
231 return ISPTCTRL_CTRL_DIV_BYPASS;
232 }
233
234 if (*rate == 0)
235 *rate = 1;
236
237 divider = DIV_ROUND_CLOSEST(parent_rate, *rate);
238 if (divider >= ISPTCTRL_CTRL_DIV_BYPASS)
239 divider = ISPTCTRL_CTRL_DIV_BYPASS - 1;
240
241 *rate = parent_rate / divider;
242 return divider;
243 }
244
245 static long isp_xclk_round_rate(struct clk_hw *hw, unsigned long rate,
246 unsigned long *parent_rate)
247 {
248 isp_xclk_calc_divider(&rate, *parent_rate);
249 return rate;
250 }
251
252 static int isp_xclk_set_rate(struct clk_hw *hw, unsigned long rate,
253 unsigned long parent_rate)
254 {
255 struct isp_xclk *xclk = to_isp_xclk(hw);
256 unsigned long flags;
257 u32 divider;
258
259 divider = isp_xclk_calc_divider(&rate, parent_rate);
260
261 spin_lock_irqsave(&xclk->lock, flags);
262
263 xclk->divider = divider;
264 if (xclk->enabled)
265 isp_xclk_update(xclk, divider);
266
267 spin_unlock_irqrestore(&xclk->lock, flags);
268
269 dev_dbg(xclk->isp->dev, "%s: cam_xclk%c set to %lu Hz (div %u)\n",
270 __func__, xclk->id == ISP_XCLK_A ? 'a' : 'b', rate, divider);
271 return 0;
272 }
273
274 static const struct clk_ops isp_xclk_ops = {
275 .prepare = isp_xclk_prepare,
276 .unprepare = isp_xclk_unprepare,
277 .enable = isp_xclk_enable,
278 .disable = isp_xclk_disable,
279 .recalc_rate = isp_xclk_recalc_rate,
280 .round_rate = isp_xclk_round_rate,
281 .set_rate = isp_xclk_set_rate,
282 };
283
284 static const char *isp_xclk_parent_name = "cam_mclk";
285
286 static struct clk *isp_xclk_src_get(struct of_phandle_args *clkspec, void *data)
287 {
288 unsigned int idx = clkspec->args[0];
289 struct isp_device *isp = data;
290
291 if (idx >= ARRAY_SIZE(isp->xclks))
292 return ERR_PTR(-ENOENT);
293
294 return isp->xclks[idx].clk;
295 }
296
297 static int isp_xclk_init(struct isp_device *isp)
298 {
299 struct device_node *np = isp->dev->of_node;
300 struct clk_init_data init = {};
301 unsigned int i;
302
303 for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i)
304 isp->xclks[i].clk = ERR_PTR(-EINVAL);
305
306 for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) {
307 struct isp_xclk *xclk = &isp->xclks[i];
308
309 xclk->isp = isp;
310 xclk->id = i == 0 ? ISP_XCLK_A : ISP_XCLK_B;
311 xclk->divider = 1;
312 spin_lock_init(&xclk->lock);
313
314 init.name = i == 0 ? "cam_xclka" : "cam_xclkb";
315 init.ops = &isp_xclk_ops;
316 init.parent_names = &isp_xclk_parent_name;
317 init.num_parents = 1;
318
319 xclk->hw.init = &init;
320
321
322
323
324
325
326 xclk->clk = clk_register(NULL, &xclk->hw);
327 if (IS_ERR(xclk->clk))
328 return PTR_ERR(xclk->clk);
329 }
330
331 if (np)
332 of_clk_add_provider(np, isp_xclk_src_get, isp);
333
334 return 0;
335 }
336
337 static void isp_xclk_cleanup(struct isp_device *isp)
338 {
339 struct device_node *np = isp->dev->of_node;
340 unsigned int i;
341
342 if (np)
343 of_clk_del_provider(np);
344
345 for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) {
346 struct isp_xclk *xclk = &isp->xclks[i];
347
348 if (!IS_ERR(xclk->clk))
349 clk_unregister(xclk->clk);
350 }
351 }
352
353
354
355
356
357
358
359
360
361 static void isp_enable_interrupts(struct isp_device *isp)
362 {
363 static const u32 irq = IRQ0ENABLE_CSIA_IRQ
364 | IRQ0ENABLE_CSIB_IRQ
365 | IRQ0ENABLE_CCDC_LSC_PREF_ERR_IRQ
366 | IRQ0ENABLE_CCDC_LSC_DONE_IRQ
367 | IRQ0ENABLE_CCDC_VD0_IRQ
368 | IRQ0ENABLE_CCDC_VD1_IRQ
369 | IRQ0ENABLE_HS_VS_IRQ
370 | IRQ0ENABLE_HIST_DONE_IRQ
371 | IRQ0ENABLE_H3A_AWB_DONE_IRQ
372 | IRQ0ENABLE_H3A_AF_DONE_IRQ
373 | IRQ0ENABLE_PRV_DONE_IRQ
374 | IRQ0ENABLE_RSZ_DONE_IRQ;
375
376 isp_reg_writel(isp, irq, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS);
377 isp_reg_writel(isp, irq, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE);
378 }
379
380
381
382
383
384 static void isp_disable_interrupts(struct isp_device *isp)
385 {
386 isp_reg_writel(isp, 0, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE);
387 }
388
389
390
391
392
393
394
395
396
397
398
399
400
401 static void isp_core_init(struct isp_device *isp, int idle)
402 {
403 isp_reg_writel(isp,
404 ((idle ? ISP_SYSCONFIG_MIDLEMODE_SMARTSTANDBY :
405 ISP_SYSCONFIG_MIDLEMODE_FORCESTANDBY) <<
406 ISP_SYSCONFIG_MIDLEMODE_SHIFT) |
407 ((isp->revision == ISP_REVISION_15_0) ?
408 ISP_SYSCONFIG_AUTOIDLE : 0),
409 OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG);
410
411 isp_reg_writel(isp,
412 (isp->autoidle ? ISPCTRL_SBL_AUTOIDLE : 0) |
413 ISPCTRL_SYNC_DETECT_VSRISE,
414 OMAP3_ISP_IOMEM_MAIN, ISP_CTRL);
415 }
416
417
418
419
420
421
422
423
424
425
426
427
428 void omap3isp_configure_bridge(struct isp_device *isp,
429 enum ccdc_input_entity input,
430 const struct isp_parallel_cfg *parcfg,
431 unsigned int shift, unsigned int bridge)
432 {
433 u32 ispctrl_val;
434
435 ispctrl_val = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL);
436 ispctrl_val &= ~ISPCTRL_SHIFT_MASK;
437 ispctrl_val &= ~ISPCTRL_PAR_CLK_POL_INV;
438 ispctrl_val &= ~ISPCTRL_PAR_SER_CLK_SEL_MASK;
439 ispctrl_val &= ~ISPCTRL_PAR_BRIDGE_MASK;
440 ispctrl_val |= bridge;
441
442 switch (input) {
443 case CCDC_INPUT_PARALLEL:
444 ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_PARALLEL;
445 ispctrl_val |= parcfg->clk_pol << ISPCTRL_PAR_CLK_POL_SHIFT;
446 shift += parcfg->data_lane_shift;
447 break;
448
449 case CCDC_INPUT_CSI2A:
450 ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_CSIA;
451 break;
452
453 case CCDC_INPUT_CCP2B:
454 ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_CSIB;
455 break;
456
457 case CCDC_INPUT_CSI2C:
458 ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_CSIC;
459 break;
460
461 default:
462 return;
463 }
464
465 ispctrl_val |= ((shift/2) << ISPCTRL_SHIFT_SHIFT) & ISPCTRL_SHIFT_MASK;
466
467 isp_reg_writel(isp, ispctrl_val, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL);
468 }
469
470 void omap3isp_hist_dma_done(struct isp_device *isp)
471 {
472 if (omap3isp_ccdc_busy(&isp->isp_ccdc) ||
473 omap3isp_stat_pcr_busy(&isp->isp_hist)) {
474
475 atomic_set(&isp->isp_hist.buf_err, 1);
476 dev_dbg(isp->dev,
477 "hist: Out of synchronization with CCDC. Ignoring next buffer.\n");
478 }
479 }
480
481 static inline void isp_isr_dbg(struct isp_device *isp, u32 irqstatus)
482 {
483 static const char *name[] = {
484 "CSIA_IRQ",
485 "res1",
486 "res2",
487 "CSIB_LCM_IRQ",
488 "CSIB_IRQ",
489 "res5",
490 "res6",
491 "res7",
492 "CCDC_VD0_IRQ",
493 "CCDC_VD1_IRQ",
494 "CCDC_VD2_IRQ",
495 "CCDC_ERR_IRQ",
496 "H3A_AF_DONE_IRQ",
497 "H3A_AWB_DONE_IRQ",
498 "res14",
499 "res15",
500 "HIST_DONE_IRQ",
501 "CCDC_LSC_DONE",
502 "CCDC_LSC_PREFETCH_COMPLETED",
503 "CCDC_LSC_PREFETCH_ERROR",
504 "PRV_DONE_IRQ",
505 "CBUFF_IRQ",
506 "res22",
507 "res23",
508 "RSZ_DONE_IRQ",
509 "OVF_IRQ",
510 "res26",
511 "res27",
512 "MMU_ERR_IRQ",
513 "OCP_ERR_IRQ",
514 "SEC_ERR_IRQ",
515 "HS_VS_IRQ",
516 };
517 int i;
518
519 dev_dbg(isp->dev, "ISP IRQ: ");
520
521 for (i = 0; i < ARRAY_SIZE(name); i++) {
522 if ((1 << i) & irqstatus)
523 printk(KERN_CONT "%s ", name[i]);
524 }
525 printk(KERN_CONT "\n");
526 }
527
528 static void isp_isr_sbl(struct isp_device *isp)
529 {
530 struct device *dev = isp->dev;
531 struct isp_pipeline *pipe;
532 u32 sbl_pcr;
533
534
535
536
537
538 sbl_pcr = isp_reg_readl(isp, OMAP3_ISP_IOMEM_SBL, ISPSBL_PCR);
539 isp_reg_writel(isp, sbl_pcr, OMAP3_ISP_IOMEM_SBL, ISPSBL_PCR);
540 sbl_pcr &= ~ISPSBL_PCR_CCDCPRV_2_RSZ_OVF;
541
542 if (sbl_pcr)
543 dev_dbg(dev, "SBL overflow (PCR = 0x%08x)\n", sbl_pcr);
544
545 if (sbl_pcr & ISPSBL_PCR_CSIB_WBL_OVF) {
546 pipe = to_isp_pipeline(&isp->isp_ccp2.subdev.entity);
547 if (pipe != NULL)
548 pipe->error = true;
549 }
550
551 if (sbl_pcr & ISPSBL_PCR_CSIA_WBL_OVF) {
552 pipe = to_isp_pipeline(&isp->isp_csi2a.subdev.entity);
553 if (pipe != NULL)
554 pipe->error = true;
555 }
556
557 if (sbl_pcr & ISPSBL_PCR_CCDC_WBL_OVF) {
558 pipe = to_isp_pipeline(&isp->isp_ccdc.subdev.entity);
559 if (pipe != NULL)
560 pipe->error = true;
561 }
562
563 if (sbl_pcr & ISPSBL_PCR_PRV_WBL_OVF) {
564 pipe = to_isp_pipeline(&isp->isp_prev.subdev.entity);
565 if (pipe != NULL)
566 pipe->error = true;
567 }
568
569 if (sbl_pcr & (ISPSBL_PCR_RSZ1_WBL_OVF
570 | ISPSBL_PCR_RSZ2_WBL_OVF
571 | ISPSBL_PCR_RSZ3_WBL_OVF
572 | ISPSBL_PCR_RSZ4_WBL_OVF)) {
573 pipe = to_isp_pipeline(&isp->isp_res.subdev.entity);
574 if (pipe != NULL)
575 pipe->error = true;
576 }
577
578 if (sbl_pcr & ISPSBL_PCR_H3A_AF_WBL_OVF)
579 omap3isp_stat_sbl_overflow(&isp->isp_af);
580
581 if (sbl_pcr & ISPSBL_PCR_H3A_AEAWB_WBL_OVF)
582 omap3isp_stat_sbl_overflow(&isp->isp_aewb);
583 }
584
585
586
587
588
589
590
591
592 static irqreturn_t isp_isr(int irq, void *_isp)
593 {
594 static const u32 ccdc_events = IRQ0STATUS_CCDC_LSC_PREF_ERR_IRQ |
595 IRQ0STATUS_CCDC_LSC_DONE_IRQ |
596 IRQ0STATUS_CCDC_VD0_IRQ |
597 IRQ0STATUS_CCDC_VD1_IRQ |
598 IRQ0STATUS_HS_VS_IRQ;
599 struct isp_device *isp = _isp;
600 u32 irqstatus;
601
602 irqstatus = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS);
603 isp_reg_writel(isp, irqstatus, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS);
604
605 isp_isr_sbl(isp);
606
607 if (irqstatus & IRQ0STATUS_CSIA_IRQ)
608 omap3isp_csi2_isr(&isp->isp_csi2a);
609
610 if (irqstatus & IRQ0STATUS_CSIB_IRQ)
611 omap3isp_ccp2_isr(&isp->isp_ccp2);
612
613 if (irqstatus & IRQ0STATUS_CCDC_VD0_IRQ) {
614 if (isp->isp_ccdc.output & CCDC_OUTPUT_PREVIEW)
615 omap3isp_preview_isr_frame_sync(&isp->isp_prev);
616 if (isp->isp_ccdc.output & CCDC_OUTPUT_RESIZER)
617 omap3isp_resizer_isr_frame_sync(&isp->isp_res);
618 omap3isp_stat_isr_frame_sync(&isp->isp_aewb);
619 omap3isp_stat_isr_frame_sync(&isp->isp_af);
620 omap3isp_stat_isr_frame_sync(&isp->isp_hist);
621 }
622
623 if (irqstatus & ccdc_events)
624 omap3isp_ccdc_isr(&isp->isp_ccdc, irqstatus & ccdc_events);
625
626 if (irqstatus & IRQ0STATUS_PRV_DONE_IRQ) {
627 if (isp->isp_prev.output & PREVIEW_OUTPUT_RESIZER)
628 omap3isp_resizer_isr_frame_sync(&isp->isp_res);
629 omap3isp_preview_isr(&isp->isp_prev);
630 }
631
632 if (irqstatus & IRQ0STATUS_RSZ_DONE_IRQ)
633 omap3isp_resizer_isr(&isp->isp_res);
634
635 if (irqstatus & IRQ0STATUS_H3A_AWB_DONE_IRQ)
636 omap3isp_stat_isr(&isp->isp_aewb);
637
638 if (irqstatus & IRQ0STATUS_H3A_AF_DONE_IRQ)
639 omap3isp_stat_isr(&isp->isp_af);
640
641 if (irqstatus & IRQ0STATUS_HIST_DONE_IRQ)
642 omap3isp_stat_isr(&isp->isp_hist);
643
644 omap3isp_flush(isp);
645
646 #if defined(DEBUG) && defined(ISP_ISR_DEBUG)
647 isp_isr_dbg(isp, irqstatus);
648 #endif
649
650 return IRQ_HANDLED;
651 }
652
653 static const struct media_device_ops isp_media_ops = {
654 .link_notify = v4l2_pipeline_link_notify,
655 };
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672 static int isp_pipeline_enable(struct isp_pipeline *pipe,
673 enum isp_pipeline_stream_state mode)
674 {
675 struct isp_device *isp = pipe->output->isp;
676 struct media_entity *entity;
677 struct media_pad *pad;
678 struct v4l2_subdev *subdev;
679 unsigned long flags;
680 int ret;
681
682
683
684
685
686
687 if (media_entity_enum_intersects(&pipe->ent_enum, &isp->crashed))
688 return -EIO;
689
690 spin_lock_irqsave(&pipe->lock, flags);
691 pipe->state &= ~(ISP_PIPELINE_IDLE_INPUT | ISP_PIPELINE_IDLE_OUTPUT);
692 spin_unlock_irqrestore(&pipe->lock, flags);
693
694 pipe->do_propagation = false;
695
696 entity = &pipe->output->video.entity;
697 while (1) {
698 pad = &entity->pads[0];
699 if (!(pad->flags & MEDIA_PAD_FL_SINK))
700 break;
701
702 pad = media_entity_remote_pad(pad);
703 if (!pad || !is_media_entity_v4l2_subdev(pad->entity))
704 break;
705
706 entity = pad->entity;
707 subdev = media_entity_to_v4l2_subdev(entity);
708
709 ret = v4l2_subdev_call(subdev, video, s_stream, mode);
710 if (ret < 0 && ret != -ENOIOCTLCMD)
711 return ret;
712
713 if (subdev == &isp->isp_ccdc.subdev) {
714 v4l2_subdev_call(&isp->isp_aewb.subdev, video,
715 s_stream, mode);
716 v4l2_subdev_call(&isp->isp_af.subdev, video,
717 s_stream, mode);
718 v4l2_subdev_call(&isp->isp_hist.subdev, video,
719 s_stream, mode);
720 pipe->do_propagation = true;
721 }
722
723
724 if (subdev->dev != isp->dev)
725 break;
726 }
727
728 return 0;
729 }
730
731 static int isp_pipeline_wait_resizer(struct isp_device *isp)
732 {
733 return omap3isp_resizer_busy(&isp->isp_res);
734 }
735
736 static int isp_pipeline_wait_preview(struct isp_device *isp)
737 {
738 return omap3isp_preview_busy(&isp->isp_prev);
739 }
740
741 static int isp_pipeline_wait_ccdc(struct isp_device *isp)
742 {
743 return omap3isp_stat_busy(&isp->isp_af)
744 || omap3isp_stat_busy(&isp->isp_aewb)
745 || omap3isp_stat_busy(&isp->isp_hist)
746 || omap3isp_ccdc_busy(&isp->isp_ccdc);
747 }
748
749 #define ISP_STOP_TIMEOUT msecs_to_jiffies(1000)
750
751 static int isp_pipeline_wait(struct isp_device *isp,
752 int(*busy)(struct isp_device *isp))
753 {
754 unsigned long timeout = jiffies + ISP_STOP_TIMEOUT;
755
756 while (!time_after(jiffies, timeout)) {
757 if (!busy(isp))
758 return 0;
759 }
760
761 return 1;
762 }
763
764
765
766
767
768
769
770
771
772
773
774
775
776 static int isp_pipeline_disable(struct isp_pipeline *pipe)
777 {
778 struct isp_device *isp = pipe->output->isp;
779 struct media_entity *entity;
780 struct media_pad *pad;
781 struct v4l2_subdev *subdev;
782 int failure = 0;
783 int ret;
784
785
786
787
788
789 entity = &pipe->output->video.entity;
790 while (1) {
791 pad = &entity->pads[0];
792 if (!(pad->flags & MEDIA_PAD_FL_SINK))
793 break;
794
795 pad = media_entity_remote_pad(pad);
796 if (!pad || !is_media_entity_v4l2_subdev(pad->entity))
797 break;
798
799 entity = pad->entity;
800 subdev = media_entity_to_v4l2_subdev(entity);
801
802 if (subdev == &isp->isp_ccdc.subdev) {
803 v4l2_subdev_call(&isp->isp_aewb.subdev,
804 video, s_stream, 0);
805 v4l2_subdev_call(&isp->isp_af.subdev,
806 video, s_stream, 0);
807 v4l2_subdev_call(&isp->isp_hist.subdev,
808 video, s_stream, 0);
809 }
810
811 ret = v4l2_subdev_call(subdev, video, s_stream, 0);
812
813 if (subdev == &isp->isp_res.subdev)
814 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_resizer);
815 else if (subdev == &isp->isp_prev.subdev)
816 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_preview);
817 else if (subdev == &isp->isp_ccdc.subdev)
818 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_ccdc);
819
820
821
822
823
824
825
826
827
828
829
830
831
832 if (ret) {
833 dev_info(isp->dev, "Unable to stop %s\n", subdev->name);
834 isp->stop_failure = true;
835 if (subdev == &isp->isp_prev.subdev)
836 media_entity_enum_set(&isp->crashed,
837 &subdev->entity);
838 failure = -ETIMEDOUT;
839 }
840
841
842 if (subdev->dev != isp->dev)
843 break;
844 }
845
846 return failure;
847 }
848
849
850
851
852
853
854
855
856
857
858
859
860
861 int omap3isp_pipeline_set_stream(struct isp_pipeline *pipe,
862 enum isp_pipeline_stream_state state)
863 {
864 int ret;
865
866 if (state == ISP_PIPELINE_STREAM_STOPPED)
867 ret = isp_pipeline_disable(pipe);
868 else
869 ret = isp_pipeline_enable(pipe, state);
870
871 if (ret == 0 || state == ISP_PIPELINE_STREAM_STOPPED)
872 pipe->stream_state = state;
873
874 return ret;
875 }
876
877
878
879
880
881
882
883
884
885
886 void omap3isp_pipeline_cancel_stream(struct isp_pipeline *pipe)
887 {
888 if (pipe->input)
889 omap3isp_video_cancel_stream(pipe->input);
890 if (pipe->output)
891 omap3isp_video_cancel_stream(pipe->output);
892 }
893
894
895
896
897
898
899
900 static void isp_pipeline_resume(struct isp_pipeline *pipe)
901 {
902 int singleshot = pipe->stream_state == ISP_PIPELINE_STREAM_SINGLESHOT;
903
904 omap3isp_video_resume(pipe->output, !singleshot);
905 if (singleshot)
906 omap3isp_video_resume(pipe->input, 0);
907 isp_pipeline_enable(pipe, pipe->stream_state);
908 }
909
910
911
912
913
914
915
916 static void isp_pipeline_suspend(struct isp_pipeline *pipe)
917 {
918 isp_pipeline_disable(pipe);
919 }
920
921
922
923
924
925
926
927
928
929
930 static int isp_pipeline_is_last(struct media_entity *me)
931 {
932 struct isp_pipeline *pipe;
933 struct media_pad *pad;
934
935 if (!me->pipe)
936 return 0;
937 pipe = to_isp_pipeline(me);
938 if (pipe->stream_state == ISP_PIPELINE_STREAM_STOPPED)
939 return 0;
940 pad = media_entity_remote_pad(&pipe->output->pad);
941 return pad->entity == me;
942 }
943
944
945
946
947
948
949
950
951
952 static void isp_suspend_module_pipeline(struct media_entity *me)
953 {
954 if (isp_pipeline_is_last(me))
955 isp_pipeline_suspend(to_isp_pipeline(me));
956 }
957
958
959
960
961
962
963
964
965
966 static void isp_resume_module_pipeline(struct media_entity *me)
967 {
968 if (isp_pipeline_is_last(me))
969 isp_pipeline_resume(to_isp_pipeline(me));
970 }
971
972
973
974
975
976
977
978
979 static int __maybe_unused isp_suspend_modules(struct isp_device *isp)
980 {
981 unsigned long timeout;
982
983 omap3isp_stat_suspend(&isp->isp_aewb);
984 omap3isp_stat_suspend(&isp->isp_af);
985 omap3isp_stat_suspend(&isp->isp_hist);
986 isp_suspend_module_pipeline(&isp->isp_res.subdev.entity);
987 isp_suspend_module_pipeline(&isp->isp_prev.subdev.entity);
988 isp_suspend_module_pipeline(&isp->isp_ccdc.subdev.entity);
989 isp_suspend_module_pipeline(&isp->isp_csi2a.subdev.entity);
990 isp_suspend_module_pipeline(&isp->isp_ccp2.subdev.entity);
991
992 timeout = jiffies + ISP_STOP_TIMEOUT;
993 while (omap3isp_stat_busy(&isp->isp_af)
994 || omap3isp_stat_busy(&isp->isp_aewb)
995 || omap3isp_stat_busy(&isp->isp_hist)
996 || omap3isp_preview_busy(&isp->isp_prev)
997 || omap3isp_resizer_busy(&isp->isp_res)
998 || omap3isp_ccdc_busy(&isp->isp_ccdc)) {
999 if (time_after(jiffies, timeout)) {
1000 dev_info(isp->dev, "can't stop modules.\n");
1001 return 1;
1002 }
1003 msleep(1);
1004 }
1005
1006 return 0;
1007 }
1008
1009
1010
1011
1012
1013 static void __maybe_unused isp_resume_modules(struct isp_device *isp)
1014 {
1015 omap3isp_stat_resume(&isp->isp_aewb);
1016 omap3isp_stat_resume(&isp->isp_af);
1017 omap3isp_stat_resume(&isp->isp_hist);
1018 isp_resume_module_pipeline(&isp->isp_res.subdev.entity);
1019 isp_resume_module_pipeline(&isp->isp_prev.subdev.entity);
1020 isp_resume_module_pipeline(&isp->isp_ccdc.subdev.entity);
1021 isp_resume_module_pipeline(&isp->isp_csi2a.subdev.entity);
1022 isp_resume_module_pipeline(&isp->isp_ccp2.subdev.entity);
1023 }
1024
1025
1026
1027
1028
1029 static int isp_reset(struct isp_device *isp)
1030 {
1031 unsigned long timeout = 0;
1032
1033 isp_reg_writel(isp,
1034 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG)
1035 | ISP_SYSCONFIG_SOFTRESET,
1036 OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG);
1037 while (!(isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN,
1038 ISP_SYSSTATUS) & 0x1)) {
1039 if (timeout++ > 10000) {
1040 dev_alert(isp->dev, "cannot reset ISP\n");
1041 return -ETIMEDOUT;
1042 }
1043 udelay(1);
1044 }
1045
1046 isp->stop_failure = false;
1047 media_entity_enum_zero(&isp->crashed);
1048 return 0;
1049 }
1050
1051
1052
1053
1054
1055
1056
1057 static void
1058 isp_save_context(struct isp_device *isp, struct isp_reg *reg_list)
1059 {
1060 struct isp_reg *next = reg_list;
1061
1062 for (; next->reg != ISP_TOK_TERM; next++)
1063 next->val = isp_reg_readl(isp, next->mmio_range, next->reg);
1064 }
1065
1066
1067
1068
1069
1070
1071
1072 static void
1073 isp_restore_context(struct isp_device *isp, struct isp_reg *reg_list)
1074 {
1075 struct isp_reg *next = reg_list;
1076
1077 for (; next->reg != ISP_TOK_TERM; next++)
1078 isp_reg_writel(isp, next->val, next->mmio_range, next->reg);
1079 }
1080
1081
1082
1083
1084
1085
1086
1087
1088 static void isp_save_ctx(struct isp_device *isp)
1089 {
1090 isp_save_context(isp, isp_reg_list);
1091 omap_iommu_save_ctx(isp->dev);
1092 }
1093
1094
1095
1096
1097
1098
1099
1100
1101 static void isp_restore_ctx(struct isp_device *isp)
1102 {
1103 isp_restore_context(isp, isp_reg_list);
1104 omap_iommu_restore_ctx(isp->dev);
1105 omap3isp_ccdc_restore_context(isp);
1106 omap3isp_preview_restore_context(isp);
1107 }
1108
1109
1110
1111
1112 #define OMAP3_ISP_SBL_READ (OMAP3_ISP_SBL_CSI1_READ | \
1113 OMAP3_ISP_SBL_CCDC_LSC_READ | \
1114 OMAP3_ISP_SBL_PREVIEW_READ | \
1115 OMAP3_ISP_SBL_RESIZER_READ)
1116 #define OMAP3_ISP_SBL_WRITE (OMAP3_ISP_SBL_CSI1_WRITE | \
1117 OMAP3_ISP_SBL_CSI2A_WRITE | \
1118 OMAP3_ISP_SBL_CSI2C_WRITE | \
1119 OMAP3_ISP_SBL_CCDC_WRITE | \
1120 OMAP3_ISP_SBL_PREVIEW_WRITE)
1121
1122 void omap3isp_sbl_enable(struct isp_device *isp, enum isp_sbl_resource res)
1123 {
1124 u32 sbl = 0;
1125
1126 isp->sbl_resources |= res;
1127
1128 if (isp->sbl_resources & OMAP3_ISP_SBL_CSI1_READ)
1129 sbl |= ISPCTRL_SBL_SHARED_RPORTA;
1130
1131 if (isp->sbl_resources & OMAP3_ISP_SBL_CCDC_LSC_READ)
1132 sbl |= ISPCTRL_SBL_SHARED_RPORTB;
1133
1134 if (isp->sbl_resources & OMAP3_ISP_SBL_CSI2C_WRITE)
1135 sbl |= ISPCTRL_SBL_SHARED_WPORTC;
1136
1137 if (isp->sbl_resources & OMAP3_ISP_SBL_RESIZER_WRITE)
1138 sbl |= ISPCTRL_SBL_WR0_RAM_EN;
1139
1140 if (isp->sbl_resources & OMAP3_ISP_SBL_WRITE)
1141 sbl |= ISPCTRL_SBL_WR1_RAM_EN;
1142
1143 if (isp->sbl_resources & OMAP3_ISP_SBL_READ)
1144 sbl |= ISPCTRL_SBL_RD_RAM_EN;
1145
1146 isp_reg_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, sbl);
1147 }
1148
1149 void omap3isp_sbl_disable(struct isp_device *isp, enum isp_sbl_resource res)
1150 {
1151 u32 sbl = 0;
1152
1153 isp->sbl_resources &= ~res;
1154
1155 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CSI1_READ))
1156 sbl |= ISPCTRL_SBL_SHARED_RPORTA;
1157
1158 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CCDC_LSC_READ))
1159 sbl |= ISPCTRL_SBL_SHARED_RPORTB;
1160
1161 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CSI2C_WRITE))
1162 sbl |= ISPCTRL_SBL_SHARED_WPORTC;
1163
1164 if (!(isp->sbl_resources & OMAP3_ISP_SBL_RESIZER_WRITE))
1165 sbl |= ISPCTRL_SBL_WR0_RAM_EN;
1166
1167 if (!(isp->sbl_resources & OMAP3_ISP_SBL_WRITE))
1168 sbl |= ISPCTRL_SBL_WR1_RAM_EN;
1169
1170 if (!(isp->sbl_resources & OMAP3_ISP_SBL_READ))
1171 sbl |= ISPCTRL_SBL_RD_RAM_EN;
1172
1173 isp_reg_clr(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, sbl);
1174 }
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185 int omap3isp_module_sync_idle(struct media_entity *me, wait_queue_head_t *wait,
1186 atomic_t *stopping)
1187 {
1188 struct isp_pipeline *pipe = to_isp_pipeline(me);
1189
1190 if (pipe->stream_state == ISP_PIPELINE_STREAM_STOPPED ||
1191 (pipe->stream_state == ISP_PIPELINE_STREAM_SINGLESHOT &&
1192 !isp_pipeline_ready(pipe)))
1193 return 0;
1194
1195
1196
1197
1198
1199 atomic_set(stopping, 1);
1200 smp_mb();
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211 if (isp_pipeline_is_last(me)) {
1212 struct isp_video *video = pipe->output;
1213 unsigned long flags;
1214 spin_lock_irqsave(&video->irqlock, flags);
1215 if (video->dmaqueue_flags & ISP_VIDEO_DMAQUEUE_UNDERRUN) {
1216 spin_unlock_irqrestore(&video->irqlock, flags);
1217 atomic_set(stopping, 0);
1218 smp_mb();
1219 return 0;
1220 }
1221 spin_unlock_irqrestore(&video->irqlock, flags);
1222 if (!wait_event_timeout(*wait, !atomic_read(stopping),
1223 msecs_to_jiffies(1000))) {
1224 atomic_set(stopping, 0);
1225 smp_mb();
1226 return -ETIMEDOUT;
1227 }
1228 }
1229
1230 return 0;
1231 }
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242 int omap3isp_module_sync_is_stopping(wait_queue_head_t *wait,
1243 atomic_t *stopping)
1244 {
1245 if (atomic_cmpxchg(stopping, 1, 0)) {
1246 wake_up(wait);
1247 return 1;
1248 }
1249
1250 return 0;
1251 }
1252
1253
1254
1255
1256
1257 #define ISPCTRL_CLKS_MASK (ISPCTRL_H3A_CLK_EN | \
1258 ISPCTRL_HIST_CLK_EN | \
1259 ISPCTRL_RSZ_CLK_EN | \
1260 (ISPCTRL_CCDC_CLK_EN | ISPCTRL_CCDC_RAM_EN) | \
1261 (ISPCTRL_PREV_CLK_EN | ISPCTRL_PREV_RAM_EN))
1262
1263 static void __isp_subclk_update(struct isp_device *isp)
1264 {
1265 u32 clk = 0;
1266
1267
1268 if (isp->subclk_resources &
1269 (OMAP3_ISP_SUBCLK_AEWB | OMAP3_ISP_SUBCLK_AF))
1270 clk |= ISPCTRL_H3A_CLK_EN;
1271
1272 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_HIST)
1273 clk |= ISPCTRL_HIST_CLK_EN;
1274
1275 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_RESIZER)
1276 clk |= ISPCTRL_RSZ_CLK_EN;
1277
1278
1279
1280
1281 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_CCDC)
1282 clk |= ISPCTRL_CCDC_CLK_EN | ISPCTRL_CCDC_RAM_EN;
1283
1284 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_PREVIEW)
1285 clk |= ISPCTRL_PREV_CLK_EN | ISPCTRL_PREV_RAM_EN;
1286
1287 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL,
1288 ISPCTRL_CLKS_MASK, clk);
1289 }
1290
1291 void omap3isp_subclk_enable(struct isp_device *isp,
1292 enum isp_subclk_resource res)
1293 {
1294 isp->subclk_resources |= res;
1295
1296 __isp_subclk_update(isp);
1297 }
1298
1299 void omap3isp_subclk_disable(struct isp_device *isp,
1300 enum isp_subclk_resource res)
1301 {
1302 isp->subclk_resources &= ~res;
1303
1304 __isp_subclk_update(isp);
1305 }
1306
1307
1308
1309
1310
1311
1312
1313
1314 static int isp_enable_clocks(struct isp_device *isp)
1315 {
1316 int r;
1317 unsigned long rate;
1318
1319 r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_ICK]);
1320 if (r) {
1321 dev_err(isp->dev, "failed to enable cam_ick clock\n");
1322 goto out_clk_enable_ick;
1323 }
1324 r = clk_set_rate(isp->clock[ISP_CLK_CAM_MCLK], CM_CAM_MCLK_HZ);
1325 if (r) {
1326 dev_err(isp->dev, "clk_set_rate for cam_mclk failed\n");
1327 goto out_clk_enable_mclk;
1328 }
1329 r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_MCLK]);
1330 if (r) {
1331 dev_err(isp->dev, "failed to enable cam_mclk clock\n");
1332 goto out_clk_enable_mclk;
1333 }
1334 rate = clk_get_rate(isp->clock[ISP_CLK_CAM_MCLK]);
1335 if (rate != CM_CAM_MCLK_HZ)
1336 dev_warn(isp->dev, "unexpected cam_mclk rate:\n"
1337 " expected : %d\n"
1338 " actual : %ld\n", CM_CAM_MCLK_HZ, rate);
1339 r = clk_prepare_enable(isp->clock[ISP_CLK_CSI2_FCK]);
1340 if (r) {
1341 dev_err(isp->dev, "failed to enable csi2_fck clock\n");
1342 goto out_clk_enable_csi2_fclk;
1343 }
1344 return 0;
1345
1346 out_clk_enable_csi2_fclk:
1347 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_MCLK]);
1348 out_clk_enable_mclk:
1349 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_ICK]);
1350 out_clk_enable_ick:
1351 return r;
1352 }
1353
1354
1355
1356
1357
1358 static void isp_disable_clocks(struct isp_device *isp)
1359 {
1360 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_ICK]);
1361 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_MCLK]);
1362 clk_disable_unprepare(isp->clock[ISP_CLK_CSI2_FCK]);
1363 }
1364
1365 static const char *isp_clocks[] = {
1366 "cam_ick",
1367 "cam_mclk",
1368 "csi2_96m_fck",
1369 "l3_ick",
1370 };
1371
1372 static int isp_get_clocks(struct isp_device *isp)
1373 {
1374 struct clk *clk;
1375 unsigned int i;
1376
1377 for (i = 0; i < ARRAY_SIZE(isp_clocks); ++i) {
1378 clk = devm_clk_get(isp->dev, isp_clocks[i]);
1379 if (IS_ERR(clk)) {
1380 dev_err(isp->dev, "clk_get %s failed\n", isp_clocks[i]);
1381 return PTR_ERR(clk);
1382 }
1383
1384 isp->clock[i] = clk;
1385 }
1386
1387 return 0;
1388 }
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400 static struct isp_device *__omap3isp_get(struct isp_device *isp, bool irq)
1401 {
1402 struct isp_device *__isp = isp;
1403
1404 if (isp == NULL)
1405 return NULL;
1406
1407 mutex_lock(&isp->isp_mutex);
1408 if (isp->ref_count > 0)
1409 goto out;
1410
1411 if (isp_enable_clocks(isp) < 0) {
1412 __isp = NULL;
1413 goto out;
1414 }
1415
1416
1417 if (isp->has_context)
1418 isp_restore_ctx(isp);
1419
1420 if (irq)
1421 isp_enable_interrupts(isp);
1422
1423 out:
1424 if (__isp != NULL)
1425 isp->ref_count++;
1426 mutex_unlock(&isp->isp_mutex);
1427
1428 return __isp;
1429 }
1430
1431 struct isp_device *omap3isp_get(struct isp_device *isp)
1432 {
1433 return __omap3isp_get(isp, true);
1434 }
1435
1436
1437
1438
1439
1440
1441
1442 static void __omap3isp_put(struct isp_device *isp, bool save_ctx)
1443 {
1444 if (isp == NULL)
1445 return;
1446
1447 mutex_lock(&isp->isp_mutex);
1448 BUG_ON(isp->ref_count == 0);
1449 if (--isp->ref_count == 0) {
1450 isp_disable_interrupts(isp);
1451 if (save_ctx) {
1452 isp_save_ctx(isp);
1453 isp->has_context = 1;
1454 }
1455
1456
1457
1458 if (!media_entity_enum_empty(&isp->crashed) ||
1459 isp->stop_failure)
1460 isp_reset(isp);
1461 isp_disable_clocks(isp);
1462 }
1463 mutex_unlock(&isp->isp_mutex);
1464 }
1465
1466 void omap3isp_put(struct isp_device *isp)
1467 {
1468 __omap3isp_put(isp, true);
1469 }
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479 #define ISP_PRINT_REGISTER(isp, name)\
1480 dev_dbg(isp->dev, "###ISP " #name "=0x%08x\n", \
1481 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_##name))
1482 #define SBL_PRINT_REGISTER(isp, name)\
1483 dev_dbg(isp->dev, "###SBL " #name "=0x%08x\n", \
1484 isp_reg_readl(isp, OMAP3_ISP_IOMEM_SBL, ISPSBL_##name))
1485
1486 void omap3isp_print_status(struct isp_device *isp)
1487 {
1488 dev_dbg(isp->dev, "-------------ISP Register dump--------------\n");
1489
1490 ISP_PRINT_REGISTER(isp, SYSCONFIG);
1491 ISP_PRINT_REGISTER(isp, SYSSTATUS);
1492 ISP_PRINT_REGISTER(isp, IRQ0ENABLE);
1493 ISP_PRINT_REGISTER(isp, IRQ0STATUS);
1494 ISP_PRINT_REGISTER(isp, TCTRL_GRESET_LENGTH);
1495 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_REPLAY);
1496 ISP_PRINT_REGISTER(isp, CTRL);
1497 ISP_PRINT_REGISTER(isp, TCTRL_CTRL);
1498 ISP_PRINT_REGISTER(isp, TCTRL_FRAME);
1499 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_DELAY);
1500 ISP_PRINT_REGISTER(isp, TCTRL_STRB_DELAY);
1501 ISP_PRINT_REGISTER(isp, TCTRL_SHUT_DELAY);
1502 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_LENGTH);
1503 ISP_PRINT_REGISTER(isp, TCTRL_STRB_LENGTH);
1504 ISP_PRINT_REGISTER(isp, TCTRL_SHUT_LENGTH);
1505
1506 SBL_PRINT_REGISTER(isp, PCR);
1507 SBL_PRINT_REGISTER(isp, SDR_REQ_EXP);
1508
1509 dev_dbg(isp->dev, "--------------------------------------------\n");
1510 }
1511
1512 #ifdef CONFIG_PM
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531 static int isp_pm_prepare(struct device *dev)
1532 {
1533 struct isp_device *isp = dev_get_drvdata(dev);
1534 int reset;
1535
1536 WARN_ON(mutex_is_locked(&isp->isp_mutex));
1537
1538 if (isp->ref_count == 0)
1539 return 0;
1540
1541 reset = isp_suspend_modules(isp);
1542 isp_disable_interrupts(isp);
1543 isp_save_ctx(isp);
1544 if (reset)
1545 isp_reset(isp);
1546
1547 return 0;
1548 }
1549
1550 static int isp_pm_suspend(struct device *dev)
1551 {
1552 struct isp_device *isp = dev_get_drvdata(dev);
1553
1554 WARN_ON(mutex_is_locked(&isp->isp_mutex));
1555
1556 if (isp->ref_count)
1557 isp_disable_clocks(isp);
1558
1559 return 0;
1560 }
1561
1562 static int isp_pm_resume(struct device *dev)
1563 {
1564 struct isp_device *isp = dev_get_drvdata(dev);
1565
1566 if (isp->ref_count == 0)
1567 return 0;
1568
1569 return isp_enable_clocks(isp);
1570 }
1571
1572 static void isp_pm_complete(struct device *dev)
1573 {
1574 struct isp_device *isp = dev_get_drvdata(dev);
1575
1576 if (isp->ref_count == 0)
1577 return;
1578
1579 isp_restore_ctx(isp);
1580 isp_enable_interrupts(isp);
1581 isp_resume_modules(isp);
1582 }
1583
1584 #else
1585
1586 #define isp_pm_prepare NULL
1587 #define isp_pm_suspend NULL
1588 #define isp_pm_resume NULL
1589 #define isp_pm_complete NULL
1590
1591 #endif
1592
1593 static void isp_unregister_entities(struct isp_device *isp)
1594 {
1595 media_device_unregister(&isp->media_dev);
1596
1597 omap3isp_csi2_unregister_entities(&isp->isp_csi2a);
1598 omap3isp_ccp2_unregister_entities(&isp->isp_ccp2);
1599 omap3isp_ccdc_unregister_entities(&isp->isp_ccdc);
1600 omap3isp_preview_unregister_entities(&isp->isp_prev);
1601 omap3isp_resizer_unregister_entities(&isp->isp_res);
1602 omap3isp_stat_unregister_entities(&isp->isp_aewb);
1603 omap3isp_stat_unregister_entities(&isp->isp_af);
1604 omap3isp_stat_unregister_entities(&isp->isp_hist);
1605
1606 v4l2_device_unregister(&isp->v4l2_dev);
1607 media_device_cleanup(&isp->media_dev);
1608 }
1609
1610 static int isp_link_entity(
1611 struct isp_device *isp, struct media_entity *entity,
1612 enum isp_interface_type interface)
1613 {
1614 struct media_entity *input;
1615 unsigned int flags;
1616 unsigned int pad;
1617 unsigned int i;
1618
1619
1620
1621
1622
1623
1624 switch (interface) {
1625 case ISP_INTERFACE_PARALLEL:
1626 input = &isp->isp_ccdc.subdev.entity;
1627 pad = CCDC_PAD_SINK;
1628 flags = 0;
1629 break;
1630
1631 case ISP_INTERFACE_CSI2A_PHY2:
1632 input = &isp->isp_csi2a.subdev.entity;
1633 pad = CSI2_PAD_SINK;
1634 flags = MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED;
1635 break;
1636
1637 case ISP_INTERFACE_CCP2B_PHY1:
1638 case ISP_INTERFACE_CCP2B_PHY2:
1639 input = &isp->isp_ccp2.subdev.entity;
1640 pad = CCP2_PAD_SINK;
1641 flags = 0;
1642 break;
1643
1644 case ISP_INTERFACE_CSI2C_PHY1:
1645 input = &isp->isp_csi2c.subdev.entity;
1646 pad = CSI2_PAD_SINK;
1647 flags = MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED;
1648 break;
1649
1650 default:
1651 dev_err(isp->dev, "%s: invalid interface type %u\n", __func__,
1652 interface);
1653 return -EINVAL;
1654 }
1655
1656
1657
1658
1659
1660
1661
1662 if (!input->num_pads) {
1663 dev_err(isp->dev, "%s: invalid input %u\n", entity->name,
1664 interface);
1665 return -EINVAL;
1666 }
1667
1668 for (i = 0; i < entity->num_pads; i++) {
1669 if (entity->pads[i].flags & MEDIA_PAD_FL_SOURCE)
1670 break;
1671 }
1672 if (i == entity->num_pads) {
1673 dev_err(isp->dev, "%s: no source pad in external entity %s\n",
1674 __func__, entity->name);
1675 return -EINVAL;
1676 }
1677
1678 return media_create_pad_link(entity, i, input, pad, flags);
1679 }
1680
1681 static int isp_register_entities(struct isp_device *isp)
1682 {
1683 int ret;
1684
1685 isp->media_dev.dev = isp->dev;
1686 strscpy(isp->media_dev.model, "TI OMAP3 ISP",
1687 sizeof(isp->media_dev.model));
1688 isp->media_dev.hw_revision = isp->revision;
1689 isp->media_dev.ops = &isp_media_ops;
1690 media_device_init(&isp->media_dev);
1691
1692 isp->v4l2_dev.mdev = &isp->media_dev;
1693 ret = v4l2_device_register(isp->dev, &isp->v4l2_dev);
1694 if (ret < 0) {
1695 dev_err(isp->dev, "%s: V4L2 device registration failed (%d)\n",
1696 __func__, ret);
1697 goto done;
1698 }
1699
1700
1701 ret = omap3isp_ccp2_register_entities(&isp->isp_ccp2, &isp->v4l2_dev);
1702 if (ret < 0)
1703 goto done;
1704
1705 ret = omap3isp_csi2_register_entities(&isp->isp_csi2a, &isp->v4l2_dev);
1706 if (ret < 0)
1707 goto done;
1708
1709 ret = omap3isp_ccdc_register_entities(&isp->isp_ccdc, &isp->v4l2_dev);
1710 if (ret < 0)
1711 goto done;
1712
1713 ret = omap3isp_preview_register_entities(&isp->isp_prev,
1714 &isp->v4l2_dev);
1715 if (ret < 0)
1716 goto done;
1717
1718 ret = omap3isp_resizer_register_entities(&isp->isp_res, &isp->v4l2_dev);
1719 if (ret < 0)
1720 goto done;
1721
1722 ret = omap3isp_stat_register_entities(&isp->isp_aewb, &isp->v4l2_dev);
1723 if (ret < 0)
1724 goto done;
1725
1726 ret = omap3isp_stat_register_entities(&isp->isp_af, &isp->v4l2_dev);
1727 if (ret < 0)
1728 goto done;
1729
1730 ret = omap3isp_stat_register_entities(&isp->isp_hist, &isp->v4l2_dev);
1731 if (ret < 0)
1732 goto done;
1733
1734 done:
1735 if (ret < 0)
1736 isp_unregister_entities(isp);
1737
1738 return ret;
1739 }
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750 static int isp_create_links(struct isp_device *isp)
1751 {
1752 int ret;
1753
1754
1755 ret = media_create_pad_link(
1756 &isp->isp_csi2a.subdev.entity, CSI2_PAD_SOURCE,
1757 &isp->isp_csi2a.video_out.video.entity, 0, 0);
1758 if (ret < 0)
1759 return ret;
1760
1761 ret = media_create_pad_link(
1762 &isp->isp_ccp2.video_in.video.entity, 0,
1763 &isp->isp_ccp2.subdev.entity, CCP2_PAD_SINK, 0);
1764 if (ret < 0)
1765 return ret;
1766
1767 ret = media_create_pad_link(
1768 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_OF,
1769 &isp->isp_ccdc.video_out.video.entity, 0, 0);
1770 if (ret < 0)
1771 return ret;
1772
1773 ret = media_create_pad_link(
1774 &isp->isp_prev.video_in.video.entity, 0,
1775 &isp->isp_prev.subdev.entity, PREV_PAD_SINK, 0);
1776 if (ret < 0)
1777 return ret;
1778
1779 ret = media_create_pad_link(
1780 &isp->isp_prev.subdev.entity, PREV_PAD_SOURCE,
1781 &isp->isp_prev.video_out.video.entity, 0, 0);
1782 if (ret < 0)
1783 return ret;
1784
1785 ret = media_create_pad_link(
1786 &isp->isp_res.video_in.video.entity, 0,
1787 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0);
1788 if (ret < 0)
1789 return ret;
1790
1791 ret = media_create_pad_link(
1792 &isp->isp_res.subdev.entity, RESZ_PAD_SOURCE,
1793 &isp->isp_res.video_out.video.entity, 0, 0);
1794
1795 if (ret < 0)
1796 return ret;
1797
1798
1799 ret = media_create_pad_link(
1800 &isp->isp_csi2a.subdev.entity, CSI2_PAD_SOURCE,
1801 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0);
1802 if (ret < 0)
1803 return ret;
1804
1805 ret = media_create_pad_link(
1806 &isp->isp_ccp2.subdev.entity, CCP2_PAD_SOURCE,
1807 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0);
1808 if (ret < 0)
1809 return ret;
1810
1811 ret = media_create_pad_link(
1812 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
1813 &isp->isp_prev.subdev.entity, PREV_PAD_SINK, 0);
1814 if (ret < 0)
1815 return ret;
1816
1817 ret = media_create_pad_link(
1818 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_OF,
1819 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0);
1820 if (ret < 0)
1821 return ret;
1822
1823 ret = media_create_pad_link(
1824 &isp->isp_prev.subdev.entity, PREV_PAD_SOURCE,
1825 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0);
1826 if (ret < 0)
1827 return ret;
1828
1829 ret = media_create_pad_link(
1830 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
1831 &isp->isp_aewb.subdev.entity, 0,
1832 MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
1833 if (ret < 0)
1834 return ret;
1835
1836 ret = media_create_pad_link(
1837 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
1838 &isp->isp_af.subdev.entity, 0,
1839 MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
1840 if (ret < 0)
1841 return ret;
1842
1843 ret = media_create_pad_link(
1844 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
1845 &isp->isp_hist.subdev.entity, 0,
1846 MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
1847 if (ret < 0)
1848 return ret;
1849
1850 return 0;
1851 }
1852
1853 static void isp_cleanup_modules(struct isp_device *isp)
1854 {
1855 omap3isp_h3a_aewb_cleanup(isp);
1856 omap3isp_h3a_af_cleanup(isp);
1857 omap3isp_hist_cleanup(isp);
1858 omap3isp_resizer_cleanup(isp);
1859 omap3isp_preview_cleanup(isp);
1860 omap3isp_ccdc_cleanup(isp);
1861 omap3isp_ccp2_cleanup(isp);
1862 omap3isp_csi2_cleanup(isp);
1863 omap3isp_csiphy_cleanup(isp);
1864 }
1865
1866 static int isp_initialize_modules(struct isp_device *isp)
1867 {
1868 int ret;
1869
1870 ret = omap3isp_csiphy_init(isp);
1871 if (ret < 0) {
1872 dev_err(isp->dev, "CSI PHY initialization failed\n");
1873 return ret;
1874 }
1875
1876 ret = omap3isp_csi2_init(isp);
1877 if (ret < 0) {
1878 dev_err(isp->dev, "CSI2 initialization failed\n");
1879 goto error_csi2;
1880 }
1881
1882 ret = omap3isp_ccp2_init(isp);
1883 if (ret < 0) {
1884 if (ret != -EPROBE_DEFER)
1885 dev_err(isp->dev, "CCP2 initialization failed\n");
1886 goto error_ccp2;
1887 }
1888
1889 ret = omap3isp_ccdc_init(isp);
1890 if (ret < 0) {
1891 dev_err(isp->dev, "CCDC initialization failed\n");
1892 goto error_ccdc;
1893 }
1894
1895 ret = omap3isp_preview_init(isp);
1896 if (ret < 0) {
1897 dev_err(isp->dev, "Preview initialization failed\n");
1898 goto error_preview;
1899 }
1900
1901 ret = omap3isp_resizer_init(isp);
1902 if (ret < 0) {
1903 dev_err(isp->dev, "Resizer initialization failed\n");
1904 goto error_resizer;
1905 }
1906
1907 ret = omap3isp_hist_init(isp);
1908 if (ret < 0) {
1909 dev_err(isp->dev, "Histogram initialization failed\n");
1910 goto error_hist;
1911 }
1912
1913 ret = omap3isp_h3a_aewb_init(isp);
1914 if (ret < 0) {
1915 dev_err(isp->dev, "H3A AEWB initialization failed\n");
1916 goto error_h3a_aewb;
1917 }
1918
1919 ret = omap3isp_h3a_af_init(isp);
1920 if (ret < 0) {
1921 dev_err(isp->dev, "H3A AF initialization failed\n");
1922 goto error_h3a_af;
1923 }
1924
1925 return 0;
1926
1927 error_h3a_af:
1928 omap3isp_h3a_aewb_cleanup(isp);
1929 error_h3a_aewb:
1930 omap3isp_hist_cleanup(isp);
1931 error_hist:
1932 omap3isp_resizer_cleanup(isp);
1933 error_resizer:
1934 omap3isp_preview_cleanup(isp);
1935 error_preview:
1936 omap3isp_ccdc_cleanup(isp);
1937 error_ccdc:
1938 omap3isp_ccp2_cleanup(isp);
1939 error_ccp2:
1940 omap3isp_csi2_cleanup(isp);
1941 error_csi2:
1942 omap3isp_csiphy_cleanup(isp);
1943
1944 return ret;
1945 }
1946
1947 static void isp_detach_iommu(struct isp_device *isp)
1948 {
1949 #ifdef CONFIG_ARM_DMA_USE_IOMMU
1950 arm_iommu_detach_device(isp->dev);
1951 arm_iommu_release_mapping(isp->mapping);
1952 isp->mapping = NULL;
1953 #endif
1954 }
1955
1956 static int isp_attach_iommu(struct isp_device *isp)
1957 {
1958 #ifdef CONFIG_ARM_DMA_USE_IOMMU
1959 struct dma_iommu_mapping *mapping;
1960 int ret;
1961
1962
1963
1964
1965
1966 mapping = arm_iommu_create_mapping(&platform_bus_type, SZ_1G, SZ_2G);
1967 if (IS_ERR(mapping)) {
1968 dev_err(isp->dev, "failed to create ARM IOMMU mapping\n");
1969 return PTR_ERR(mapping);
1970 }
1971
1972 isp->mapping = mapping;
1973
1974
1975 ret = arm_iommu_attach_device(isp->dev, mapping);
1976 if (ret < 0) {
1977 dev_err(isp->dev, "failed to attach device to VA mapping\n");
1978 goto error;
1979 }
1980
1981 return 0;
1982
1983 error:
1984 arm_iommu_release_mapping(isp->mapping);
1985 isp->mapping = NULL;
1986 return ret;
1987 #else
1988 return -ENODEV;
1989 #endif
1990 }
1991
1992
1993
1994
1995
1996
1997
1998 static int isp_remove(struct platform_device *pdev)
1999 {
2000 struct isp_device *isp = platform_get_drvdata(pdev);
2001
2002 v4l2_async_notifier_unregister(&isp->notifier);
2003 isp_unregister_entities(isp);
2004 isp_cleanup_modules(isp);
2005 isp_xclk_cleanup(isp);
2006
2007 __omap3isp_get(isp, false);
2008 isp_detach_iommu(isp);
2009 __omap3isp_put(isp, false);
2010
2011 media_entity_enum_cleanup(&isp->crashed);
2012 v4l2_async_notifier_cleanup(&isp->notifier);
2013
2014 kfree(isp);
2015
2016 return 0;
2017 }
2018
2019 enum isp_of_phy {
2020 ISP_OF_PHY_PARALLEL = 0,
2021 ISP_OF_PHY_CSIPHY1,
2022 ISP_OF_PHY_CSIPHY2,
2023 };
2024
2025 static int isp_subdev_notifier_complete(struct v4l2_async_notifier *async)
2026 {
2027 struct isp_device *isp = container_of(async, struct isp_device,
2028 notifier);
2029 struct v4l2_device *v4l2_dev = &isp->v4l2_dev;
2030 struct v4l2_subdev *sd;
2031 int ret;
2032
2033 ret = media_entity_enum_init(&isp->crashed, &isp->media_dev);
2034 if (ret)
2035 return ret;
2036
2037 list_for_each_entry(sd, &v4l2_dev->subdevs, list) {
2038 if (sd->notifier != &isp->notifier)
2039 continue;
2040
2041 ret = isp_link_entity(isp, &sd->entity,
2042 v4l2_subdev_to_bus_cfg(sd)->interface);
2043 if (ret < 0)
2044 return ret;
2045 }
2046
2047 ret = v4l2_device_register_subdev_nodes(&isp->v4l2_dev);
2048 if (ret < 0)
2049 return ret;
2050
2051 return media_device_register(&isp->media_dev);
2052 }
2053
2054 static void isp_parse_of_parallel_endpoint(struct device *dev,
2055 struct v4l2_fwnode_endpoint *vep,
2056 struct isp_bus_cfg *buscfg)
2057 {
2058 buscfg->interface = ISP_INTERFACE_PARALLEL;
2059 buscfg->bus.parallel.data_lane_shift = vep->bus.parallel.data_shift;
2060 buscfg->bus.parallel.clk_pol =
2061 !!(vep->bus.parallel.flags & V4L2_MBUS_PCLK_SAMPLE_FALLING);
2062 buscfg->bus.parallel.hs_pol =
2063 !!(vep->bus.parallel.flags & V4L2_MBUS_VSYNC_ACTIVE_LOW);
2064 buscfg->bus.parallel.vs_pol =
2065 !!(vep->bus.parallel.flags & V4L2_MBUS_HSYNC_ACTIVE_LOW);
2066 buscfg->bus.parallel.fld_pol =
2067 !!(vep->bus.parallel.flags & V4L2_MBUS_FIELD_EVEN_LOW);
2068 buscfg->bus.parallel.data_pol =
2069 !!(vep->bus.parallel.flags & V4L2_MBUS_DATA_ACTIVE_LOW);
2070 buscfg->bus.parallel.bt656 = vep->bus_type == V4L2_MBUS_BT656;
2071 }
2072
2073 static void isp_parse_of_csi2_endpoint(struct device *dev,
2074 struct v4l2_fwnode_endpoint *vep,
2075 struct isp_bus_cfg *buscfg)
2076 {
2077 unsigned int i;
2078
2079 buscfg->bus.csi2.lanecfg.clk.pos = vep->bus.mipi_csi2.clock_lane;
2080 buscfg->bus.csi2.lanecfg.clk.pol =
2081 vep->bus.mipi_csi2.lane_polarities[0];
2082 dev_dbg(dev, "clock lane polarity %u, pos %u\n",
2083 buscfg->bus.csi2.lanecfg.clk.pol,
2084 buscfg->bus.csi2.lanecfg.clk.pos);
2085
2086 buscfg->bus.csi2.num_data_lanes = vep->bus.mipi_csi2.num_data_lanes;
2087
2088 for (i = 0; i < buscfg->bus.csi2.num_data_lanes; i++) {
2089 buscfg->bus.csi2.lanecfg.data[i].pos =
2090 vep->bus.mipi_csi2.data_lanes[i];
2091 buscfg->bus.csi2.lanecfg.data[i].pol =
2092 vep->bus.mipi_csi2.lane_polarities[i + 1];
2093 dev_dbg(dev,
2094 "data lane %u polarity %u, pos %u\n", i,
2095 buscfg->bus.csi2.lanecfg.data[i].pol,
2096 buscfg->bus.csi2.lanecfg.data[i].pos);
2097 }
2098
2099
2100
2101
2102 buscfg->bus.csi2.crc = 1;
2103 }
2104
2105 static void isp_parse_of_csi1_endpoint(struct device *dev,
2106 struct v4l2_fwnode_endpoint *vep,
2107 struct isp_bus_cfg *buscfg)
2108 {
2109 buscfg->bus.ccp2.lanecfg.clk.pos = vep->bus.mipi_csi1.clock_lane;
2110 buscfg->bus.ccp2.lanecfg.clk.pol = vep->bus.mipi_csi1.lane_polarity[0];
2111 dev_dbg(dev, "clock lane polarity %u, pos %u\n",
2112 buscfg->bus.ccp2.lanecfg.clk.pol,
2113 buscfg->bus.ccp2.lanecfg.clk.pos);
2114
2115 buscfg->bus.ccp2.lanecfg.data[0].pos = vep->bus.mipi_csi1.data_lane;
2116 buscfg->bus.ccp2.lanecfg.data[0].pol =
2117 vep->bus.mipi_csi1.lane_polarity[1];
2118
2119 dev_dbg(dev, "data lane polarity %u, pos %u\n",
2120 buscfg->bus.ccp2.lanecfg.data[0].pol,
2121 buscfg->bus.ccp2.lanecfg.data[0].pos);
2122
2123 buscfg->bus.ccp2.strobe_clk_pol = vep->bus.mipi_csi1.clock_inv;
2124 buscfg->bus.ccp2.phy_layer = vep->bus.mipi_csi1.strobe;
2125 buscfg->bus.ccp2.ccp2_mode = vep->bus_type == V4L2_MBUS_CCP2;
2126 buscfg->bus.ccp2.vp_clk_pol = 1;
2127
2128 buscfg->bus.ccp2.crc = 1;
2129 }
2130
2131 static int isp_alloc_isd(struct isp_async_subdev **isd,
2132 struct isp_bus_cfg **buscfg)
2133 {
2134 struct isp_async_subdev *__isd;
2135
2136 __isd = kzalloc(sizeof(*__isd), GFP_KERNEL);
2137 if (!__isd)
2138 return -ENOMEM;
2139
2140 *isd = __isd;
2141 *buscfg = &__isd->bus;
2142
2143 return 0;
2144 }
2145
2146 static struct {
2147 u32 phy;
2148 u32 csi2_if;
2149 u32 csi1_if;
2150 } isp_bus_interfaces[2] = {
2151 { ISP_OF_PHY_CSIPHY1,
2152 ISP_INTERFACE_CSI2C_PHY1, ISP_INTERFACE_CCP2B_PHY1 },
2153 { ISP_OF_PHY_CSIPHY2,
2154 ISP_INTERFACE_CSI2A_PHY2, ISP_INTERFACE_CCP2B_PHY2 },
2155 };
2156
2157 static int isp_parse_of_endpoints(struct isp_device *isp)
2158 {
2159 struct fwnode_handle *ep;
2160 struct isp_async_subdev *isd = NULL;
2161 struct isp_bus_cfg *buscfg;
2162 unsigned int i;
2163
2164 ep = fwnode_graph_get_endpoint_by_id(
2165 dev_fwnode(isp->dev), ISP_OF_PHY_PARALLEL, 0,
2166 FWNODE_GRAPH_ENDPOINT_NEXT);
2167
2168 if (ep) {
2169 struct v4l2_fwnode_endpoint vep = {
2170 .bus_type = V4L2_MBUS_PARALLEL
2171 };
2172 int ret;
2173
2174 dev_dbg(isp->dev, "parsing parallel interface\n");
2175
2176 ret = v4l2_fwnode_endpoint_parse(ep, &vep);
2177
2178 if (!ret) {
2179 ret = isp_alloc_isd(&isd, &buscfg);
2180 if (ret)
2181 return ret;
2182 }
2183
2184 if (!ret) {
2185 isp_parse_of_parallel_endpoint(isp->dev, &vep, buscfg);
2186 ret = v4l2_async_notifier_add_fwnode_remote_subdev(
2187 &isp->notifier, ep, &isd->asd);
2188 }
2189
2190 fwnode_handle_put(ep);
2191 if (ret)
2192 kfree(isd);
2193 }
2194
2195 for (i = 0; i < ARRAY_SIZE(isp_bus_interfaces); i++) {
2196 struct v4l2_fwnode_endpoint vep = {
2197 .bus_type = V4L2_MBUS_CSI2_DPHY
2198 };
2199 int ret;
2200
2201 ep = fwnode_graph_get_endpoint_by_id(
2202 dev_fwnode(isp->dev), isp_bus_interfaces[i].phy, 0,
2203 FWNODE_GRAPH_ENDPOINT_NEXT);
2204
2205 if (!ep)
2206 continue;
2207
2208 dev_dbg(isp->dev, "parsing serial interface %u, node %pOF\n", i,
2209 to_of_node(ep));
2210
2211 ret = isp_alloc_isd(&isd, &buscfg);
2212 if (ret)
2213 return ret;
2214
2215 ret = v4l2_fwnode_endpoint_parse(ep, &vep);
2216 if (!ret) {
2217 buscfg->interface = isp_bus_interfaces[i].csi2_if;
2218 isp_parse_of_csi2_endpoint(isp->dev, &vep, buscfg);
2219 } else if (ret == -ENXIO) {
2220 vep = (struct v4l2_fwnode_endpoint)
2221 { .bus_type = V4L2_MBUS_CSI1 };
2222 ret = v4l2_fwnode_endpoint_parse(ep, &vep);
2223
2224 if (ret == -ENXIO) {
2225 vep = (struct v4l2_fwnode_endpoint)
2226 { .bus_type = V4L2_MBUS_CCP2 };
2227 ret = v4l2_fwnode_endpoint_parse(ep, &vep);
2228 }
2229 if (!ret) {
2230 buscfg->interface =
2231 isp_bus_interfaces[i].csi1_if;
2232 isp_parse_of_csi1_endpoint(isp->dev, &vep,
2233 buscfg);
2234 }
2235 }
2236
2237 if (!ret)
2238 ret = v4l2_async_notifier_add_fwnode_remote_subdev(
2239 &isp->notifier, ep, &isd->asd);
2240
2241 fwnode_handle_put(ep);
2242 if (ret)
2243 kfree(isd);
2244 }
2245
2246 return 0;
2247 }
2248
2249 static const struct v4l2_async_notifier_operations isp_subdev_notifier_ops = {
2250 .complete = isp_subdev_notifier_complete,
2251 };
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264 static int isp_probe(struct platform_device *pdev)
2265 {
2266 struct isp_device *isp;
2267 struct resource *mem;
2268 int ret;
2269 int i, m;
2270
2271 isp = kzalloc(sizeof(*isp), GFP_KERNEL);
2272 if (!isp) {
2273 dev_err(&pdev->dev, "could not allocate memory\n");
2274 return -ENOMEM;
2275 }
2276
2277 ret = fwnode_property_read_u32(of_fwnode_handle(pdev->dev.of_node),
2278 "ti,phy-type", &isp->phy_type);
2279 if (ret)
2280 goto error_release_isp;
2281
2282 isp->syscon = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
2283 "syscon");
2284 if (IS_ERR(isp->syscon)) {
2285 ret = PTR_ERR(isp->syscon);
2286 goto error_release_isp;
2287 }
2288
2289 ret = of_property_read_u32_index(pdev->dev.of_node,
2290 "syscon", 1, &isp->syscon_offset);
2291 if (ret)
2292 goto error_release_isp;
2293
2294 isp->autoidle = autoidle;
2295
2296 mutex_init(&isp->isp_mutex);
2297 spin_lock_init(&isp->stat_lock);
2298 v4l2_async_notifier_init(&isp->notifier);
2299 isp->dev = &pdev->dev;
2300
2301 ret = isp_parse_of_endpoints(isp);
2302 if (ret < 0)
2303 goto error;
2304
2305 isp->ref_count = 0;
2306
2307 ret = dma_coerce_mask_and_coherent(isp->dev, DMA_BIT_MASK(32));
2308 if (ret)
2309 goto error;
2310
2311 platform_set_drvdata(pdev, isp);
2312
2313
2314 isp->isp_csiphy1.vdd = devm_regulator_get(&pdev->dev, "vdd-csiphy1");
2315 isp->isp_csiphy2.vdd = devm_regulator_get(&pdev->dev, "vdd-csiphy2");
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327 for (i = 0; i < 2; i++) {
2328 unsigned int map_idx = i ? OMAP3_ISP_IOMEM_CSI2A_REGS1 : 0;
2329
2330 mem = platform_get_resource(pdev, IORESOURCE_MEM, i);
2331 isp->mmio_base[map_idx] =
2332 devm_ioremap_resource(isp->dev, mem);
2333 if (IS_ERR(isp->mmio_base[map_idx]))
2334 return PTR_ERR(isp->mmio_base[map_idx]);
2335 }
2336
2337 ret = isp_get_clocks(isp);
2338 if (ret < 0)
2339 goto error;
2340
2341 ret = clk_enable(isp->clock[ISP_CLK_CAM_ICK]);
2342 if (ret < 0)
2343 goto error;
2344
2345 isp->revision = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION);
2346 dev_info(isp->dev, "Revision %d.%d found\n",
2347 (isp->revision & 0xf0) >> 4, isp->revision & 0x0f);
2348
2349 clk_disable(isp->clock[ISP_CLK_CAM_ICK]);
2350
2351 if (__omap3isp_get(isp, false) == NULL) {
2352 ret = -ENODEV;
2353 goto error;
2354 }
2355
2356 ret = isp_reset(isp);
2357 if (ret < 0)
2358 goto error_isp;
2359
2360 ret = isp_xclk_init(isp);
2361 if (ret < 0)
2362 goto error_isp;
2363
2364
2365 for (m = 0; m < ARRAY_SIZE(isp_res_maps); m++)
2366 if (isp->revision == isp_res_maps[m].isp_rev)
2367 break;
2368
2369 if (m == ARRAY_SIZE(isp_res_maps)) {
2370 dev_err(isp->dev, "No resource map found for ISP rev %d.%d\n",
2371 (isp->revision & 0xf0) >> 4, isp->revision & 0xf);
2372 ret = -ENODEV;
2373 goto error_isp;
2374 }
2375
2376 for (i = 1; i < OMAP3_ISP_IOMEM_CSI2A_REGS1; i++)
2377 isp->mmio_base[i] =
2378 isp->mmio_base[0] + isp_res_maps[m].offset[i];
2379
2380 for (i = OMAP3_ISP_IOMEM_CSIPHY2; i < OMAP3_ISP_IOMEM_LAST; i++)
2381 isp->mmio_base[i] =
2382 isp->mmio_base[OMAP3_ISP_IOMEM_CSI2A_REGS1]
2383 + isp_res_maps[m].offset[i];
2384
2385 isp->mmio_hist_base_phys =
2386 mem->start + isp_res_maps[m].offset[OMAP3_ISP_IOMEM_HIST];
2387
2388
2389 ret = isp_attach_iommu(isp);
2390 if (ret < 0) {
2391 dev_err(&pdev->dev, "unable to attach to IOMMU\n");
2392 goto error_isp;
2393 }
2394
2395
2396 ret = platform_get_irq(pdev, 0);
2397 if (ret <= 0) {
2398 ret = -ENODEV;
2399 goto error_iommu;
2400 }
2401 isp->irq_num = ret;
2402
2403 if (devm_request_irq(isp->dev, isp->irq_num, isp_isr, IRQF_SHARED,
2404 "OMAP3 ISP", isp)) {
2405 dev_err(isp->dev, "Unable to request IRQ\n");
2406 ret = -EINVAL;
2407 goto error_iommu;
2408 }
2409
2410
2411 ret = isp_initialize_modules(isp);
2412 if (ret < 0)
2413 goto error_iommu;
2414
2415 ret = isp_register_entities(isp);
2416 if (ret < 0)
2417 goto error_modules;
2418
2419 ret = isp_create_links(isp);
2420 if (ret < 0)
2421 goto error_register_entities;
2422
2423 isp->notifier.ops = &isp_subdev_notifier_ops;
2424
2425 ret = v4l2_async_notifier_register(&isp->v4l2_dev, &isp->notifier);
2426 if (ret)
2427 goto error_register_entities;
2428
2429 isp_core_init(isp, 1);
2430 omap3isp_put(isp);
2431
2432 return 0;
2433
2434 error_register_entities:
2435 isp_unregister_entities(isp);
2436 error_modules:
2437 isp_cleanup_modules(isp);
2438 error_iommu:
2439 isp_detach_iommu(isp);
2440 error_isp:
2441 isp_xclk_cleanup(isp);
2442 __omap3isp_put(isp, false);
2443 error:
2444 v4l2_async_notifier_cleanup(&isp->notifier);
2445 mutex_destroy(&isp->isp_mutex);
2446 error_release_isp:
2447 kfree(isp);
2448
2449 return ret;
2450 }
2451
2452 static const struct dev_pm_ops omap3isp_pm_ops = {
2453 .prepare = isp_pm_prepare,
2454 .suspend = isp_pm_suspend,
2455 .resume = isp_pm_resume,
2456 .complete = isp_pm_complete,
2457 };
2458
2459 static const struct platform_device_id omap3isp_id_table[] = {
2460 { "omap3isp", 0 },
2461 { },
2462 };
2463 MODULE_DEVICE_TABLE(platform, omap3isp_id_table);
2464
2465 static const struct of_device_id omap3isp_of_table[] = {
2466 { .compatible = "ti,omap3-isp" },
2467 { },
2468 };
2469 MODULE_DEVICE_TABLE(of, omap3isp_of_table);
2470
2471 static struct platform_driver omap3isp_driver = {
2472 .probe = isp_probe,
2473 .remove = isp_remove,
2474 .id_table = omap3isp_id_table,
2475 .driver = {
2476 .name = "omap3isp",
2477 .pm = &omap3isp_pm_ops,
2478 .of_match_table = omap3isp_of_table,
2479 },
2480 };
2481
2482 module_platform_driver(omap3isp_driver);
2483
2484 MODULE_AUTHOR("Nokia Corporation");
2485 MODULE_DESCRIPTION("TI OMAP3 ISP driver");
2486 MODULE_LICENSE("GPL");
2487 MODULE_VERSION(ISP_VIDEO_DRIVER_VERSION);