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
43
44
45
46
47
48
49
50
51
52
53
54
55#include <asm/cacheflush.h>
56
57#include <linux/clk.h>
58#include <linux/delay.h>
59#include <linux/device.h>
60#include <linux/dma-mapping.h>
61#include <linux/i2c.h>
62#include <linux/interrupt.h>
63#include <linux/module.h>
64#include <linux/omap-iommu.h>
65#include <linux/platform_device.h>
66#include <linux/regulator/consumer.h>
67#include <linux/slab.h>
68#include <linux/sched.h>
69#include <linux/vmalloc.h>
70
71#include <media/v4l2-common.h>
72#include <media/v4l2-device.h>
73
74#include "isp.h"
75#include "ispreg.h"
76#include "ispccdc.h"
77#include "isppreview.h"
78#include "ispresizer.h"
79#include "ispcsi2.h"
80#include "ispccp2.h"
81#include "isph3a.h"
82#include "isphist.h"
83
84static unsigned int autoidle;
85module_param(autoidle, int, 0444);
86MODULE_PARM_DESC(autoidle, "Enable OMAP3ISP AUTOIDLE support");
87
88static void isp_save_ctx(struct isp_device *isp);
89
90static void isp_restore_ctx(struct isp_device *isp);
91
92static const struct isp_res_mapping isp_res_maps[] = {
93 {
94 .isp_rev = ISP_REVISION_2_0,
95 .map = 1 << OMAP3_ISP_IOMEM_MAIN |
96 1 << OMAP3_ISP_IOMEM_CCP2 |
97 1 << OMAP3_ISP_IOMEM_CCDC |
98 1 << OMAP3_ISP_IOMEM_HIST |
99 1 << OMAP3_ISP_IOMEM_H3A |
100 1 << OMAP3_ISP_IOMEM_PREV |
101 1 << OMAP3_ISP_IOMEM_RESZ |
102 1 << OMAP3_ISP_IOMEM_SBL |
103 1 << OMAP3_ISP_IOMEM_CSI2A_REGS1 |
104 1 << OMAP3_ISP_IOMEM_CSIPHY2 |
105 1 << OMAP3_ISP_IOMEM_343X_CONTROL_CSIRXFE,
106 },
107 {
108 .isp_rev = ISP_REVISION_15_0,
109 .map = 1 << OMAP3_ISP_IOMEM_MAIN |
110 1 << OMAP3_ISP_IOMEM_CCP2 |
111 1 << OMAP3_ISP_IOMEM_CCDC |
112 1 << OMAP3_ISP_IOMEM_HIST |
113 1 << OMAP3_ISP_IOMEM_H3A |
114 1 << OMAP3_ISP_IOMEM_PREV |
115 1 << OMAP3_ISP_IOMEM_RESZ |
116 1 << OMAP3_ISP_IOMEM_SBL |
117 1 << OMAP3_ISP_IOMEM_CSI2A_REGS1 |
118 1 << OMAP3_ISP_IOMEM_CSIPHY2 |
119 1 << OMAP3_ISP_IOMEM_CSI2A_REGS2 |
120 1 << OMAP3_ISP_IOMEM_CSI2C_REGS1 |
121 1 << OMAP3_ISP_IOMEM_CSIPHY1 |
122 1 << OMAP3_ISP_IOMEM_CSI2C_REGS2 |
123 1 << OMAP3_ISP_IOMEM_3630_CONTROL_CAMERA_PHY_CTRL,
124 },
125};
126
127
128static struct isp_reg isp_reg_list[] = {
129 {OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG, 0},
130 {OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, 0},
131 {OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, 0},
132 {0, ISP_TOK_TERM, 0}
133};
134
135
136
137
138
139
140
141
142
143
144
145void omap3isp_flush(struct isp_device *isp)
146{
147 isp_reg_writel(isp, 0, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION);
148 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION);
149}
150
151
152
153
154
155static void isp_enable_interrupts(struct isp_device *isp)
156{
157 static const u32 irq = IRQ0ENABLE_CSIA_IRQ
158 | IRQ0ENABLE_CSIB_IRQ
159 | IRQ0ENABLE_CCDC_LSC_PREF_ERR_IRQ
160 | IRQ0ENABLE_CCDC_LSC_DONE_IRQ
161 | IRQ0ENABLE_CCDC_VD0_IRQ
162 | IRQ0ENABLE_CCDC_VD1_IRQ
163 | IRQ0ENABLE_HS_VS_IRQ
164 | IRQ0ENABLE_HIST_DONE_IRQ
165 | IRQ0ENABLE_H3A_AWB_DONE_IRQ
166 | IRQ0ENABLE_H3A_AF_DONE_IRQ
167 | IRQ0ENABLE_PRV_DONE_IRQ
168 | IRQ0ENABLE_RSZ_DONE_IRQ;
169
170 isp_reg_writel(isp, irq, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS);
171 isp_reg_writel(isp, irq, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE);
172}
173
174
175
176
177
178static void isp_disable_interrupts(struct isp_device *isp)
179{
180 isp_reg_writel(isp, 0, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE);
181}
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196static u32 isp_set_xclk(struct isp_device *isp, u32 xclk, u8 xclksel)
197{
198 u32 divisor;
199 u32 currentxclk;
200 unsigned long mclk_hz;
201
202 if (!omap3isp_get(isp))
203 return 0;
204
205 mclk_hz = clk_get_rate(isp->clock[ISP_CLK_CAM_MCLK]);
206
207 if (xclk >= mclk_hz) {
208 divisor = ISPTCTRL_CTRL_DIV_BYPASS;
209 currentxclk = mclk_hz;
210 } else if (xclk >= 2) {
211 divisor = mclk_hz / xclk;
212 if (divisor >= ISPTCTRL_CTRL_DIV_BYPASS)
213 divisor = ISPTCTRL_CTRL_DIV_BYPASS - 1;
214 currentxclk = mclk_hz / divisor;
215 } else {
216 divisor = xclk;
217 currentxclk = 0;
218 }
219
220 switch (xclksel) {
221 case ISP_XCLK_A:
222 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
223 ISPTCTRL_CTRL_DIVA_MASK,
224 divisor << ISPTCTRL_CTRL_DIVA_SHIFT);
225 dev_dbg(isp->dev, "isp_set_xclk(): cam_xclka set to %d Hz\n",
226 currentxclk);
227 break;
228 case ISP_XCLK_B:
229 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
230 ISPTCTRL_CTRL_DIVB_MASK,
231 divisor << ISPTCTRL_CTRL_DIVB_SHIFT);
232 dev_dbg(isp->dev, "isp_set_xclk(): cam_xclkb set to %d Hz\n",
233 currentxclk);
234 break;
235 case ISP_XCLK_NONE:
236 default:
237 omap3isp_put(isp);
238 dev_dbg(isp->dev, "ISP_ERR: isp_set_xclk(): Invalid requested "
239 "xclk. Must be 0 (A) or 1 (B).\n");
240 return -EINVAL;
241 }
242
243
244 if (divisor >= 2 && isp->xclk_divisor[xclksel - 1] < 2)
245 omap3isp_get(isp);
246
247 else if (divisor < 2 && isp->xclk_divisor[xclksel - 1] >= 2)
248 omap3isp_put(isp);
249
250 isp->xclk_divisor[xclksel - 1] = divisor;
251
252 omap3isp_put(isp);
253
254 return currentxclk;
255}
256
257
258
259
260
261
262
263
264
265
266
267
268
269static void isp_core_init(struct isp_device *isp, int idle)
270{
271 isp_reg_writel(isp,
272 ((idle ? ISP_SYSCONFIG_MIDLEMODE_SMARTSTANDBY :
273 ISP_SYSCONFIG_MIDLEMODE_FORCESTANDBY) <<
274 ISP_SYSCONFIG_MIDLEMODE_SHIFT) |
275 ((isp->revision == ISP_REVISION_15_0) ?
276 ISP_SYSCONFIG_AUTOIDLE : 0),
277 OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG);
278
279 isp_reg_writel(isp,
280 (isp->autoidle ? ISPCTRL_SBL_AUTOIDLE : 0) |
281 ISPCTRL_SYNC_DETECT_VSRISE,
282 OMAP3_ISP_IOMEM_MAIN, ISP_CTRL);
283}
284
285
286
287
288
289
290
291
292
293
294
295
296void omap3isp_configure_bridge(struct isp_device *isp,
297 enum ccdc_input_entity input,
298 const struct isp_parallel_platform_data *pdata,
299 unsigned int shift, unsigned int bridge)
300{
301 u32 ispctrl_val;
302
303 ispctrl_val = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL);
304 ispctrl_val &= ~ISPCTRL_SHIFT_MASK;
305 ispctrl_val &= ~ISPCTRL_PAR_CLK_POL_INV;
306 ispctrl_val &= ~ISPCTRL_PAR_SER_CLK_SEL_MASK;
307 ispctrl_val &= ~ISPCTRL_PAR_BRIDGE_MASK;
308 ispctrl_val |= bridge;
309
310 switch (input) {
311 case CCDC_INPUT_PARALLEL:
312 ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_PARALLEL;
313 ispctrl_val |= pdata->clk_pol << ISPCTRL_PAR_CLK_POL_SHIFT;
314 shift += pdata->data_lane_shift * 2;
315 break;
316
317 case CCDC_INPUT_CSI2A:
318 ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_CSIA;
319 break;
320
321 case CCDC_INPUT_CCP2B:
322 ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_CSIB;
323 break;
324
325 case CCDC_INPUT_CSI2C:
326 ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_CSIC;
327 break;
328
329 default:
330 return;
331 }
332
333 ispctrl_val |= ((shift/2) << ISPCTRL_SHIFT_SHIFT) & ISPCTRL_SHIFT_MASK;
334
335 isp_reg_writel(isp, ispctrl_val, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL);
336}
337
338void omap3isp_hist_dma_done(struct isp_device *isp)
339{
340 if (omap3isp_ccdc_busy(&isp->isp_ccdc) ||
341 omap3isp_stat_pcr_busy(&isp->isp_hist)) {
342
343 atomic_set(&isp->isp_hist.buf_err, 1);
344 dev_dbg(isp->dev, "hist: Out of synchronization with "
345 "CCDC. Ignoring next buffer.\n");
346 }
347}
348
349static inline void isp_isr_dbg(struct isp_device *isp, u32 irqstatus)
350{
351 static const char *name[] = {
352 "CSIA_IRQ",
353 "res1",
354 "res2",
355 "CSIB_LCM_IRQ",
356 "CSIB_IRQ",
357 "res5",
358 "res6",
359 "res7",
360 "CCDC_VD0_IRQ",
361 "CCDC_VD1_IRQ",
362 "CCDC_VD2_IRQ",
363 "CCDC_ERR_IRQ",
364 "H3A_AF_DONE_IRQ",
365 "H3A_AWB_DONE_IRQ",
366 "res14",
367 "res15",
368 "HIST_DONE_IRQ",
369 "CCDC_LSC_DONE",
370 "CCDC_LSC_PREFETCH_COMPLETED",
371 "CCDC_LSC_PREFETCH_ERROR",
372 "PRV_DONE_IRQ",
373 "CBUFF_IRQ",
374 "res22",
375 "res23",
376 "RSZ_DONE_IRQ",
377 "OVF_IRQ",
378 "res26",
379 "res27",
380 "MMU_ERR_IRQ",
381 "OCP_ERR_IRQ",
382 "SEC_ERR_IRQ",
383 "HS_VS_IRQ",
384 };
385 int i;
386
387 dev_dbg(isp->dev, "ISP IRQ: ");
388
389 for (i = 0; i < ARRAY_SIZE(name); i++) {
390 if ((1 << i) & irqstatus)
391 printk(KERN_CONT "%s ", name[i]);
392 }
393 printk(KERN_CONT "\n");
394}
395
396static void isp_isr_sbl(struct isp_device *isp)
397{
398 struct device *dev = isp->dev;
399 struct isp_pipeline *pipe;
400 u32 sbl_pcr;
401
402
403
404
405
406 sbl_pcr = isp_reg_readl(isp, OMAP3_ISP_IOMEM_SBL, ISPSBL_PCR);
407 isp_reg_writel(isp, sbl_pcr, OMAP3_ISP_IOMEM_SBL, ISPSBL_PCR);
408 sbl_pcr &= ~ISPSBL_PCR_CCDCPRV_2_RSZ_OVF;
409
410 if (sbl_pcr)
411 dev_dbg(dev, "SBL overflow (PCR = 0x%08x)\n", sbl_pcr);
412
413 if (sbl_pcr & ISPSBL_PCR_CSIB_WBL_OVF) {
414 pipe = to_isp_pipeline(&isp->isp_ccp2.subdev.entity);
415 if (pipe != NULL)
416 pipe->error = true;
417 }
418
419 if (sbl_pcr & ISPSBL_PCR_CSIA_WBL_OVF) {
420 pipe = to_isp_pipeline(&isp->isp_csi2a.subdev.entity);
421 if (pipe != NULL)
422 pipe->error = true;
423 }
424
425 if (sbl_pcr & ISPSBL_PCR_CCDC_WBL_OVF) {
426 pipe = to_isp_pipeline(&isp->isp_ccdc.subdev.entity);
427 if (pipe != NULL)
428 pipe->error = true;
429 }
430
431 if (sbl_pcr & ISPSBL_PCR_PRV_WBL_OVF) {
432 pipe = to_isp_pipeline(&isp->isp_prev.subdev.entity);
433 if (pipe != NULL)
434 pipe->error = true;
435 }
436
437 if (sbl_pcr & (ISPSBL_PCR_RSZ1_WBL_OVF
438 | ISPSBL_PCR_RSZ2_WBL_OVF
439 | ISPSBL_PCR_RSZ3_WBL_OVF
440 | ISPSBL_PCR_RSZ4_WBL_OVF)) {
441 pipe = to_isp_pipeline(&isp->isp_res.subdev.entity);
442 if (pipe != NULL)
443 pipe->error = true;
444 }
445
446 if (sbl_pcr & ISPSBL_PCR_H3A_AF_WBL_OVF)
447 omap3isp_stat_sbl_overflow(&isp->isp_af);
448
449 if (sbl_pcr & ISPSBL_PCR_H3A_AEAWB_WBL_OVF)
450 omap3isp_stat_sbl_overflow(&isp->isp_aewb);
451}
452
453
454
455
456
457
458
459
460
461
462
463static irqreturn_t isp_isr(int irq, void *_isp)
464{
465 static const u32 ccdc_events = IRQ0STATUS_CCDC_LSC_PREF_ERR_IRQ |
466 IRQ0STATUS_CCDC_LSC_DONE_IRQ |
467 IRQ0STATUS_CCDC_VD0_IRQ |
468 IRQ0STATUS_CCDC_VD1_IRQ |
469 IRQ0STATUS_HS_VS_IRQ;
470 struct isp_device *isp = _isp;
471 u32 irqstatus;
472
473 irqstatus = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS);
474 isp_reg_writel(isp, irqstatus, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0STATUS);
475
476 isp_isr_sbl(isp);
477
478 if (irqstatus & IRQ0STATUS_CSIA_IRQ)
479 omap3isp_csi2_isr(&isp->isp_csi2a);
480
481 if (irqstatus & IRQ0STATUS_CSIB_IRQ)
482 omap3isp_ccp2_isr(&isp->isp_ccp2);
483
484 if (irqstatus & IRQ0STATUS_CCDC_VD0_IRQ) {
485 if (isp->isp_ccdc.output & CCDC_OUTPUT_PREVIEW)
486 omap3isp_preview_isr_frame_sync(&isp->isp_prev);
487 if (isp->isp_ccdc.output & CCDC_OUTPUT_RESIZER)
488 omap3isp_resizer_isr_frame_sync(&isp->isp_res);
489 omap3isp_stat_isr_frame_sync(&isp->isp_aewb);
490 omap3isp_stat_isr_frame_sync(&isp->isp_af);
491 omap3isp_stat_isr_frame_sync(&isp->isp_hist);
492 }
493
494 if (irqstatus & ccdc_events)
495 omap3isp_ccdc_isr(&isp->isp_ccdc, irqstatus & ccdc_events);
496
497 if (irqstatus & IRQ0STATUS_PRV_DONE_IRQ) {
498 if (isp->isp_prev.output & PREVIEW_OUTPUT_RESIZER)
499 omap3isp_resizer_isr_frame_sync(&isp->isp_res);
500 omap3isp_preview_isr(&isp->isp_prev);
501 }
502
503 if (irqstatus & IRQ0STATUS_RSZ_DONE_IRQ)
504 omap3isp_resizer_isr(&isp->isp_res);
505
506 if (irqstatus & IRQ0STATUS_H3A_AWB_DONE_IRQ)
507 omap3isp_stat_isr(&isp->isp_aewb);
508
509 if (irqstatus & IRQ0STATUS_H3A_AF_DONE_IRQ)
510 omap3isp_stat_isr(&isp->isp_af);
511
512 if (irqstatus & IRQ0STATUS_HIST_DONE_IRQ)
513 omap3isp_stat_isr(&isp->isp_hist);
514
515 omap3isp_flush(isp);
516
517#if defined(DEBUG) && defined(ISP_ISR_DEBUG)
518 isp_isr_dbg(isp, irqstatus);
519#endif
520
521 return IRQ_HANDLED;
522}
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551static int isp_pipeline_pm_use_count(struct media_entity *entity)
552{
553 struct media_entity_graph graph;
554 int use = 0;
555
556 media_entity_graph_walk_start(&graph, entity);
557
558 while ((entity = media_entity_graph_walk_next(&graph))) {
559 if (media_entity_type(entity) == MEDIA_ENT_T_DEVNODE)
560 use += entity->use_count;
561 }
562
563 return use;
564}
565
566
567
568
569
570
571
572
573
574
575
576
577static int isp_pipeline_pm_power_one(struct media_entity *entity, int change)
578{
579 struct v4l2_subdev *subdev;
580 int ret;
581
582 subdev = media_entity_type(entity) == MEDIA_ENT_T_V4L2_SUBDEV
583 ? media_entity_to_v4l2_subdev(entity) : NULL;
584
585 if (entity->use_count == 0 && change > 0 && subdev != NULL) {
586 ret = v4l2_subdev_call(subdev, core, s_power, 1);
587 if (ret < 0 && ret != -ENOIOCTLCMD)
588 return ret;
589 }
590
591 entity->use_count += change;
592 WARN_ON(entity->use_count < 0);
593
594 if (entity->use_count == 0 && change < 0 && subdev != NULL)
595 v4l2_subdev_call(subdev, core, s_power, 0);
596
597 return 0;
598}
599
600
601
602
603
604
605
606
607
608
609
610static int isp_pipeline_pm_power(struct media_entity *entity, int change)
611{
612 struct media_entity_graph graph;
613 struct media_entity *first = entity;
614 int ret = 0;
615
616 if (!change)
617 return 0;
618
619 media_entity_graph_walk_start(&graph, entity);
620
621 while (!ret && (entity = media_entity_graph_walk_next(&graph)))
622 if (media_entity_type(entity) != MEDIA_ENT_T_DEVNODE)
623 ret = isp_pipeline_pm_power_one(entity, change);
624
625 if (!ret)
626 return 0;
627
628 media_entity_graph_walk_start(&graph, first);
629
630 while ((first = media_entity_graph_walk_next(&graph))
631 && first != entity)
632 if (media_entity_type(first) != MEDIA_ENT_T_DEVNODE)
633 isp_pipeline_pm_power_one(first, -change);
634
635 return ret;
636}
637
638
639
640
641
642
643
644
645
646
647
648
649
650int omap3isp_pipeline_pm_use(struct media_entity *entity, int use)
651{
652 int change = use ? 1 : -1;
653 int ret;
654
655 mutex_lock(&entity->parent->graph_mutex);
656
657
658 entity->use_count += change;
659 WARN_ON(entity->use_count < 0);
660
661
662 ret = isp_pipeline_pm_power(entity, change);
663 if (ret < 0)
664 entity->use_count -= change;
665
666 mutex_unlock(&entity->parent->graph_mutex);
667
668 return ret;
669}
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685static int isp_pipeline_link_notify(struct media_pad *source,
686 struct media_pad *sink, u32 flags)
687{
688 int source_use = isp_pipeline_pm_use_count(source->entity);
689 int sink_use = isp_pipeline_pm_use_count(sink->entity);
690 int ret;
691
692 if (!(flags & MEDIA_LNK_FL_ENABLED)) {
693
694 isp_pipeline_pm_power(source->entity, -sink_use);
695 isp_pipeline_pm_power(sink->entity, -source_use);
696 return 0;
697 }
698
699 ret = isp_pipeline_pm_power(source->entity, sink_use);
700 if (ret < 0)
701 return ret;
702
703 ret = isp_pipeline_pm_power(sink->entity, source_use);
704 if (ret < 0)
705 isp_pipeline_pm_power(source->entity, -sink_use);
706
707 return ret;
708}
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725static int isp_pipeline_enable(struct isp_pipeline *pipe,
726 enum isp_pipeline_stream_state mode)
727{
728 struct isp_device *isp = pipe->output->isp;
729 struct media_entity *entity;
730 struct media_pad *pad;
731 struct v4l2_subdev *subdev;
732 unsigned long flags;
733 int ret;
734
735
736
737
738
739
740
741
742 if ((pipe->entities & isp->crashed) &
743 (1U << isp->isp_prev.subdev.entity.id))
744 return -EIO;
745
746 spin_lock_irqsave(&pipe->lock, flags);
747 pipe->state &= ~(ISP_PIPELINE_IDLE_INPUT | ISP_PIPELINE_IDLE_OUTPUT);
748 spin_unlock_irqrestore(&pipe->lock, flags);
749
750 pipe->do_propagation = false;
751
752 entity = &pipe->output->video.entity;
753 while (1) {
754 pad = &entity->pads[0];
755 if (!(pad->flags & MEDIA_PAD_FL_SINK))
756 break;
757
758 pad = media_entity_remote_source(pad);
759 if (pad == NULL ||
760 media_entity_type(pad->entity) != MEDIA_ENT_T_V4L2_SUBDEV)
761 break;
762
763 entity = pad->entity;
764 subdev = media_entity_to_v4l2_subdev(entity);
765
766 ret = v4l2_subdev_call(subdev, video, s_stream, mode);
767 if (ret < 0 && ret != -ENOIOCTLCMD)
768 return ret;
769
770 if (subdev == &isp->isp_ccdc.subdev) {
771 v4l2_subdev_call(&isp->isp_aewb.subdev, video,
772 s_stream, mode);
773 v4l2_subdev_call(&isp->isp_af.subdev, video,
774 s_stream, mode);
775 v4l2_subdev_call(&isp->isp_hist.subdev, video,
776 s_stream, mode);
777 pipe->do_propagation = true;
778 }
779 }
780
781 return 0;
782}
783
784static int isp_pipeline_wait_resizer(struct isp_device *isp)
785{
786 return omap3isp_resizer_busy(&isp->isp_res);
787}
788
789static int isp_pipeline_wait_preview(struct isp_device *isp)
790{
791 return omap3isp_preview_busy(&isp->isp_prev);
792}
793
794static int isp_pipeline_wait_ccdc(struct isp_device *isp)
795{
796 return omap3isp_stat_busy(&isp->isp_af)
797 || omap3isp_stat_busy(&isp->isp_aewb)
798 || omap3isp_stat_busy(&isp->isp_hist)
799 || omap3isp_ccdc_busy(&isp->isp_ccdc);
800}
801
802#define ISP_STOP_TIMEOUT msecs_to_jiffies(1000)
803
804static int isp_pipeline_wait(struct isp_device *isp,
805 int(*busy)(struct isp_device *isp))
806{
807 unsigned long timeout = jiffies + ISP_STOP_TIMEOUT;
808
809 while (!time_after(jiffies, timeout)) {
810 if (!busy(isp))
811 return 0;
812 }
813
814 return 1;
815}
816
817
818
819
820
821
822
823
824
825
826
827
828
829static int isp_pipeline_disable(struct isp_pipeline *pipe)
830{
831 struct isp_device *isp = pipe->output->isp;
832 struct media_entity *entity;
833 struct media_pad *pad;
834 struct v4l2_subdev *subdev;
835 int failure = 0;
836 int ret;
837
838
839
840
841
842 entity = &pipe->output->video.entity;
843 while (1) {
844 pad = &entity->pads[0];
845 if (!(pad->flags & MEDIA_PAD_FL_SINK))
846 break;
847
848 pad = media_entity_remote_source(pad);
849 if (pad == NULL ||
850 media_entity_type(pad->entity) != MEDIA_ENT_T_V4L2_SUBDEV)
851 break;
852
853 entity = pad->entity;
854 subdev = media_entity_to_v4l2_subdev(entity);
855
856 if (subdev == &isp->isp_ccdc.subdev) {
857 v4l2_subdev_call(&isp->isp_aewb.subdev,
858 video, s_stream, 0);
859 v4l2_subdev_call(&isp->isp_af.subdev,
860 video, s_stream, 0);
861 v4l2_subdev_call(&isp->isp_hist.subdev,
862 video, s_stream, 0);
863 }
864
865 v4l2_subdev_call(subdev, video, s_stream, 0);
866
867 if (subdev == &isp->isp_res.subdev)
868 ret = isp_pipeline_wait(isp, isp_pipeline_wait_resizer);
869 else if (subdev == &isp->isp_prev.subdev)
870 ret = isp_pipeline_wait(isp, isp_pipeline_wait_preview);
871 else if (subdev == &isp->isp_ccdc.subdev)
872 ret = isp_pipeline_wait(isp, isp_pipeline_wait_ccdc);
873 else
874 ret = 0;
875
876 if (ret) {
877 dev_info(isp->dev, "Unable to stop %s\n", subdev->name);
878
879
880
881
882 isp->crashed |= 1U << subdev->entity.id;
883 failure = -ETIMEDOUT;
884 }
885 }
886
887 return failure;
888}
889
890
891
892
893
894
895
896
897
898
899
900
901
902int omap3isp_pipeline_set_stream(struct isp_pipeline *pipe,
903 enum isp_pipeline_stream_state state)
904{
905 int ret;
906
907 if (state == ISP_PIPELINE_STREAM_STOPPED)
908 ret = isp_pipeline_disable(pipe);
909 else
910 ret = isp_pipeline_enable(pipe, state);
911
912 if (ret == 0 || state == ISP_PIPELINE_STREAM_STOPPED)
913 pipe->stream_state = state;
914
915 return ret;
916}
917
918
919
920
921
922
923
924static void isp_pipeline_resume(struct isp_pipeline *pipe)
925{
926 int singleshot = pipe->stream_state == ISP_PIPELINE_STREAM_SINGLESHOT;
927
928 omap3isp_video_resume(pipe->output, !singleshot);
929 if (singleshot)
930 omap3isp_video_resume(pipe->input, 0);
931 isp_pipeline_enable(pipe, pipe->stream_state);
932}
933
934
935
936
937
938
939
940static void isp_pipeline_suspend(struct isp_pipeline *pipe)
941{
942 isp_pipeline_disable(pipe);
943}
944
945
946
947
948
949
950
951
952
953
954static int isp_pipeline_is_last(struct media_entity *me)
955{
956 struct isp_pipeline *pipe;
957 struct media_pad *pad;
958
959 if (!me->pipe)
960 return 0;
961 pipe = to_isp_pipeline(me);
962 if (pipe->stream_state == ISP_PIPELINE_STREAM_STOPPED)
963 return 0;
964 pad = media_entity_remote_source(&pipe->output->pad);
965 return pad->entity == me;
966}
967
968
969
970
971
972
973
974
975
976static void isp_suspend_module_pipeline(struct media_entity *me)
977{
978 if (isp_pipeline_is_last(me))
979 isp_pipeline_suspend(to_isp_pipeline(me));
980}
981
982
983
984
985
986
987
988
989
990static void isp_resume_module_pipeline(struct media_entity *me)
991{
992 if (isp_pipeline_is_last(me))
993 isp_pipeline_resume(to_isp_pipeline(me));
994}
995
996
997
998
999
1000
1001
1002
1003static int isp_suspend_modules(struct isp_device *isp)
1004{
1005 unsigned long timeout;
1006
1007 omap3isp_stat_suspend(&isp->isp_aewb);
1008 omap3isp_stat_suspend(&isp->isp_af);
1009 omap3isp_stat_suspend(&isp->isp_hist);
1010 isp_suspend_module_pipeline(&isp->isp_res.subdev.entity);
1011 isp_suspend_module_pipeline(&isp->isp_prev.subdev.entity);
1012 isp_suspend_module_pipeline(&isp->isp_ccdc.subdev.entity);
1013 isp_suspend_module_pipeline(&isp->isp_csi2a.subdev.entity);
1014 isp_suspend_module_pipeline(&isp->isp_ccp2.subdev.entity);
1015
1016 timeout = jiffies + ISP_STOP_TIMEOUT;
1017 while (omap3isp_stat_busy(&isp->isp_af)
1018 || omap3isp_stat_busy(&isp->isp_aewb)
1019 || omap3isp_stat_busy(&isp->isp_hist)
1020 || omap3isp_preview_busy(&isp->isp_prev)
1021 || omap3isp_resizer_busy(&isp->isp_res)
1022 || omap3isp_ccdc_busy(&isp->isp_ccdc)) {
1023 if (time_after(jiffies, timeout)) {
1024 dev_info(isp->dev, "can't stop modules.\n");
1025 return 1;
1026 }
1027 msleep(1);
1028 }
1029
1030 return 0;
1031}
1032
1033
1034
1035
1036
1037static void isp_resume_modules(struct isp_device *isp)
1038{
1039 omap3isp_stat_resume(&isp->isp_aewb);
1040 omap3isp_stat_resume(&isp->isp_af);
1041 omap3isp_stat_resume(&isp->isp_hist);
1042 isp_resume_module_pipeline(&isp->isp_res.subdev.entity);
1043 isp_resume_module_pipeline(&isp->isp_prev.subdev.entity);
1044 isp_resume_module_pipeline(&isp->isp_ccdc.subdev.entity);
1045 isp_resume_module_pipeline(&isp->isp_csi2a.subdev.entity);
1046 isp_resume_module_pipeline(&isp->isp_ccp2.subdev.entity);
1047}
1048
1049
1050
1051
1052
1053static int isp_reset(struct isp_device *isp)
1054{
1055 unsigned long timeout = 0;
1056
1057 isp_reg_writel(isp,
1058 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG)
1059 | ISP_SYSCONFIG_SOFTRESET,
1060 OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG);
1061 while (!(isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN,
1062 ISP_SYSSTATUS) & 0x1)) {
1063 if (timeout++ > 10000) {
1064 dev_alert(isp->dev, "cannot reset ISP\n");
1065 return -ETIMEDOUT;
1066 }
1067 udelay(1);
1068 }
1069
1070 isp->crashed = 0;
1071 return 0;
1072}
1073
1074
1075
1076
1077
1078
1079
1080static void
1081isp_save_context(struct isp_device *isp, struct isp_reg *reg_list)
1082{
1083 struct isp_reg *next = reg_list;
1084
1085 for (; next->reg != ISP_TOK_TERM; next++)
1086 next->val = isp_reg_readl(isp, next->mmio_range, next->reg);
1087}
1088
1089
1090
1091
1092
1093
1094
1095static void
1096isp_restore_context(struct isp_device *isp, struct isp_reg *reg_list)
1097{
1098 struct isp_reg *next = reg_list;
1099
1100 for (; next->reg != ISP_TOK_TERM; next++)
1101 isp_reg_writel(isp, next->val, next->mmio_range, next->reg);
1102}
1103
1104
1105
1106
1107
1108
1109
1110
1111static void isp_save_ctx(struct isp_device *isp)
1112{
1113 isp_save_context(isp, isp_reg_list);
1114 omap_iommu_save_ctx(isp->dev);
1115}
1116
1117
1118
1119
1120
1121
1122
1123
1124static void isp_restore_ctx(struct isp_device *isp)
1125{
1126 isp_restore_context(isp, isp_reg_list);
1127 omap_iommu_restore_ctx(isp->dev);
1128 omap3isp_ccdc_restore_context(isp);
1129 omap3isp_preview_restore_context(isp);
1130}
1131
1132
1133
1134
1135#define OMAP3_ISP_SBL_READ (OMAP3_ISP_SBL_CSI1_READ | \
1136 OMAP3_ISP_SBL_CCDC_LSC_READ | \
1137 OMAP3_ISP_SBL_PREVIEW_READ | \
1138 OMAP3_ISP_SBL_RESIZER_READ)
1139#define OMAP3_ISP_SBL_WRITE (OMAP3_ISP_SBL_CSI1_WRITE | \
1140 OMAP3_ISP_SBL_CSI2A_WRITE | \
1141 OMAP3_ISP_SBL_CSI2C_WRITE | \
1142 OMAP3_ISP_SBL_CCDC_WRITE | \
1143 OMAP3_ISP_SBL_PREVIEW_WRITE)
1144
1145void omap3isp_sbl_enable(struct isp_device *isp, enum isp_sbl_resource res)
1146{
1147 u32 sbl = 0;
1148
1149 isp->sbl_resources |= res;
1150
1151 if (isp->sbl_resources & OMAP3_ISP_SBL_CSI1_READ)
1152 sbl |= ISPCTRL_SBL_SHARED_RPORTA;
1153
1154 if (isp->sbl_resources & OMAP3_ISP_SBL_CCDC_LSC_READ)
1155 sbl |= ISPCTRL_SBL_SHARED_RPORTB;
1156
1157 if (isp->sbl_resources & OMAP3_ISP_SBL_CSI2C_WRITE)
1158 sbl |= ISPCTRL_SBL_SHARED_WPORTC;
1159
1160 if (isp->sbl_resources & OMAP3_ISP_SBL_RESIZER_WRITE)
1161 sbl |= ISPCTRL_SBL_WR0_RAM_EN;
1162
1163 if (isp->sbl_resources & OMAP3_ISP_SBL_WRITE)
1164 sbl |= ISPCTRL_SBL_WR1_RAM_EN;
1165
1166 if (isp->sbl_resources & OMAP3_ISP_SBL_READ)
1167 sbl |= ISPCTRL_SBL_RD_RAM_EN;
1168
1169 isp_reg_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, sbl);
1170}
1171
1172void omap3isp_sbl_disable(struct isp_device *isp, enum isp_sbl_resource res)
1173{
1174 u32 sbl = 0;
1175
1176 isp->sbl_resources &= ~res;
1177
1178 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CSI1_READ))
1179 sbl |= ISPCTRL_SBL_SHARED_RPORTA;
1180
1181 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CCDC_LSC_READ))
1182 sbl |= ISPCTRL_SBL_SHARED_RPORTB;
1183
1184 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CSI2C_WRITE))
1185 sbl |= ISPCTRL_SBL_SHARED_WPORTC;
1186
1187 if (!(isp->sbl_resources & OMAP3_ISP_SBL_RESIZER_WRITE))
1188 sbl |= ISPCTRL_SBL_WR0_RAM_EN;
1189
1190 if (!(isp->sbl_resources & OMAP3_ISP_SBL_WRITE))
1191 sbl |= ISPCTRL_SBL_WR1_RAM_EN;
1192
1193 if (!(isp->sbl_resources & OMAP3_ISP_SBL_READ))
1194 sbl |= ISPCTRL_SBL_RD_RAM_EN;
1195
1196 isp_reg_clr(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, sbl);
1197}
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208int omap3isp_module_sync_idle(struct media_entity *me, wait_queue_head_t *wait,
1209 atomic_t *stopping)
1210{
1211 struct isp_pipeline *pipe = to_isp_pipeline(me);
1212
1213 if (pipe->stream_state == ISP_PIPELINE_STREAM_STOPPED ||
1214 (pipe->stream_state == ISP_PIPELINE_STREAM_SINGLESHOT &&
1215 !isp_pipeline_ready(pipe)))
1216 return 0;
1217
1218
1219
1220
1221
1222 atomic_set(stopping, 1);
1223 smp_mb();
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234 if (isp_pipeline_is_last(me)) {
1235 struct isp_video *video = pipe->output;
1236 unsigned long flags;
1237 spin_lock_irqsave(&video->queue->irqlock, flags);
1238 if (video->dmaqueue_flags & ISP_VIDEO_DMAQUEUE_UNDERRUN) {
1239 spin_unlock_irqrestore(&video->queue->irqlock, flags);
1240 atomic_set(stopping, 0);
1241 smp_mb();
1242 return 0;
1243 }
1244 spin_unlock_irqrestore(&video->queue->irqlock, flags);
1245 if (!wait_event_timeout(*wait, !atomic_read(stopping),
1246 msecs_to_jiffies(1000))) {
1247 atomic_set(stopping, 0);
1248 smp_mb();
1249 return -ETIMEDOUT;
1250 }
1251 }
1252
1253 return 0;
1254}
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265int omap3isp_module_sync_is_stopping(wait_queue_head_t *wait,
1266 atomic_t *stopping)
1267{
1268 if (atomic_cmpxchg(stopping, 1, 0)) {
1269 wake_up(wait);
1270 return 1;
1271 }
1272
1273 return 0;
1274}
1275
1276
1277
1278
1279
1280#define ISPCTRL_CLKS_MASK (ISPCTRL_H3A_CLK_EN | \
1281 ISPCTRL_HIST_CLK_EN | \
1282 ISPCTRL_RSZ_CLK_EN | \
1283 (ISPCTRL_CCDC_CLK_EN | ISPCTRL_CCDC_RAM_EN) | \
1284 (ISPCTRL_PREV_CLK_EN | ISPCTRL_PREV_RAM_EN))
1285
1286static void __isp_subclk_update(struct isp_device *isp)
1287{
1288 u32 clk = 0;
1289
1290
1291 if (isp->subclk_resources &
1292 (OMAP3_ISP_SUBCLK_AEWB | OMAP3_ISP_SUBCLK_AF))
1293 clk |= ISPCTRL_H3A_CLK_EN;
1294
1295 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_HIST)
1296 clk |= ISPCTRL_HIST_CLK_EN;
1297
1298 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_RESIZER)
1299 clk |= ISPCTRL_RSZ_CLK_EN;
1300
1301
1302
1303
1304 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_CCDC)
1305 clk |= ISPCTRL_CCDC_CLK_EN | ISPCTRL_CCDC_RAM_EN;
1306
1307 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_PREVIEW)
1308 clk |= ISPCTRL_PREV_CLK_EN | ISPCTRL_PREV_RAM_EN;
1309
1310 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL,
1311 ISPCTRL_CLKS_MASK, clk);
1312}
1313
1314void omap3isp_subclk_enable(struct isp_device *isp,
1315 enum isp_subclk_resource res)
1316{
1317 isp->subclk_resources |= res;
1318
1319 __isp_subclk_update(isp);
1320}
1321
1322void omap3isp_subclk_disable(struct isp_device *isp,
1323 enum isp_subclk_resource res)
1324{
1325 isp->subclk_resources &= ~res;
1326
1327 __isp_subclk_update(isp);
1328}
1329
1330
1331
1332
1333
1334
1335
1336
1337static int isp_enable_clocks(struct isp_device *isp)
1338{
1339 int r;
1340 unsigned long rate;
1341
1342 r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_ICK]);
1343 if (r) {
1344 dev_err(isp->dev, "failed to enable cam_ick clock\n");
1345 goto out_clk_enable_ick;
1346 }
1347 r = clk_set_rate(isp->clock[ISP_CLK_CAM_MCLK], CM_CAM_MCLK_HZ);
1348 if (r) {
1349 dev_err(isp->dev, "clk_set_rate for cam_mclk failed\n");
1350 goto out_clk_enable_mclk;
1351 }
1352 r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_MCLK]);
1353 if (r) {
1354 dev_err(isp->dev, "failed to enable cam_mclk clock\n");
1355 goto out_clk_enable_mclk;
1356 }
1357 rate = clk_get_rate(isp->clock[ISP_CLK_CAM_MCLK]);
1358 if (rate != CM_CAM_MCLK_HZ)
1359 dev_warn(isp->dev, "unexpected cam_mclk rate:\n"
1360 " expected : %d\n"
1361 " actual : %ld\n", CM_CAM_MCLK_HZ, rate);
1362 r = clk_prepare_enable(isp->clock[ISP_CLK_CSI2_FCK]);
1363 if (r) {
1364 dev_err(isp->dev, "failed to enable csi2_fck clock\n");
1365 goto out_clk_enable_csi2_fclk;
1366 }
1367 return 0;
1368
1369out_clk_enable_csi2_fclk:
1370 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_MCLK]);
1371out_clk_enable_mclk:
1372 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_ICK]);
1373out_clk_enable_ick:
1374 return r;
1375}
1376
1377
1378
1379
1380
1381static void isp_disable_clocks(struct isp_device *isp)
1382{
1383 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_ICK]);
1384 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_MCLK]);
1385 clk_disable_unprepare(isp->clock[ISP_CLK_CSI2_FCK]);
1386}
1387
1388static const char *isp_clocks[] = {
1389 "cam_ick",
1390 "cam_mclk",
1391 "csi2_96m_fck",
1392 "l3_ick",
1393};
1394
1395static int isp_get_clocks(struct isp_device *isp)
1396{
1397 struct clk *clk;
1398 unsigned int i;
1399
1400 for (i = 0; i < ARRAY_SIZE(isp_clocks); ++i) {
1401 clk = devm_clk_get(isp->dev, isp_clocks[i]);
1402 if (IS_ERR(clk)) {
1403 dev_err(isp->dev, "clk_get %s failed\n", isp_clocks[i]);
1404 return PTR_ERR(clk);
1405 }
1406
1407 isp->clock[i] = clk;
1408 }
1409
1410 return 0;
1411}
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423static struct isp_device *__omap3isp_get(struct isp_device *isp, bool irq)
1424{
1425 struct isp_device *__isp = isp;
1426
1427 if (isp == NULL)
1428 return NULL;
1429
1430 mutex_lock(&isp->isp_mutex);
1431 if (isp->ref_count > 0)
1432 goto out;
1433
1434 if (isp_enable_clocks(isp) < 0) {
1435 __isp = NULL;
1436 goto out;
1437 }
1438
1439
1440 if (isp->has_context)
1441 isp_restore_ctx(isp);
1442
1443 if (irq)
1444 isp_enable_interrupts(isp);
1445
1446out:
1447 if (__isp != NULL)
1448 isp->ref_count++;
1449 mutex_unlock(&isp->isp_mutex);
1450
1451 return __isp;
1452}
1453
1454struct isp_device *omap3isp_get(struct isp_device *isp)
1455{
1456 return __omap3isp_get(isp, true);
1457}
1458
1459
1460
1461
1462
1463
1464
1465void omap3isp_put(struct isp_device *isp)
1466{
1467 if (isp == NULL)
1468 return;
1469
1470 mutex_lock(&isp->isp_mutex);
1471 BUG_ON(isp->ref_count == 0);
1472 if (--isp->ref_count == 0) {
1473 isp_disable_interrupts(isp);
1474 if (isp->domain) {
1475 isp_save_ctx(isp);
1476 isp->has_context = 1;
1477 }
1478
1479
1480
1481 if (isp->crashed)
1482 isp_reset(isp);
1483 isp_disable_clocks(isp);
1484 }
1485 mutex_unlock(&isp->isp_mutex);
1486}
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496#define ISP_PRINT_REGISTER(isp, name)\
1497 dev_dbg(isp->dev, "###ISP " #name "=0x%08x\n", \
1498 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_##name))
1499#define SBL_PRINT_REGISTER(isp, name)\
1500 dev_dbg(isp->dev, "###SBL " #name "=0x%08x\n", \
1501 isp_reg_readl(isp, OMAP3_ISP_IOMEM_SBL, ISPSBL_##name))
1502
1503void omap3isp_print_status(struct isp_device *isp)
1504{
1505 dev_dbg(isp->dev, "-------------ISP Register dump--------------\n");
1506
1507 ISP_PRINT_REGISTER(isp, SYSCONFIG);
1508 ISP_PRINT_REGISTER(isp, SYSSTATUS);
1509 ISP_PRINT_REGISTER(isp, IRQ0ENABLE);
1510 ISP_PRINT_REGISTER(isp, IRQ0STATUS);
1511 ISP_PRINT_REGISTER(isp, TCTRL_GRESET_LENGTH);
1512 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_REPLAY);
1513 ISP_PRINT_REGISTER(isp, CTRL);
1514 ISP_PRINT_REGISTER(isp, TCTRL_CTRL);
1515 ISP_PRINT_REGISTER(isp, TCTRL_FRAME);
1516 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_DELAY);
1517 ISP_PRINT_REGISTER(isp, TCTRL_STRB_DELAY);
1518 ISP_PRINT_REGISTER(isp, TCTRL_SHUT_DELAY);
1519 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_LENGTH);
1520 ISP_PRINT_REGISTER(isp, TCTRL_STRB_LENGTH);
1521 ISP_PRINT_REGISTER(isp, TCTRL_SHUT_LENGTH);
1522
1523 SBL_PRINT_REGISTER(isp, PCR);
1524 SBL_PRINT_REGISTER(isp, SDR_REQ_EXP);
1525
1526 dev_dbg(isp->dev, "--------------------------------------------\n");
1527}
1528
1529#ifdef CONFIG_PM
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548static int isp_pm_prepare(struct device *dev)
1549{
1550 struct isp_device *isp = dev_get_drvdata(dev);
1551 int reset;
1552
1553 WARN_ON(mutex_is_locked(&isp->isp_mutex));
1554
1555 if (isp->ref_count == 0)
1556 return 0;
1557
1558 reset = isp_suspend_modules(isp);
1559 isp_disable_interrupts(isp);
1560 isp_save_ctx(isp);
1561 if (reset)
1562 isp_reset(isp);
1563
1564 return 0;
1565}
1566
1567static int isp_pm_suspend(struct device *dev)
1568{
1569 struct isp_device *isp = dev_get_drvdata(dev);
1570
1571 WARN_ON(mutex_is_locked(&isp->isp_mutex));
1572
1573 if (isp->ref_count)
1574 isp_disable_clocks(isp);
1575
1576 return 0;
1577}
1578
1579static int isp_pm_resume(struct device *dev)
1580{
1581 struct isp_device *isp = dev_get_drvdata(dev);
1582
1583 if (isp->ref_count == 0)
1584 return 0;
1585
1586 return isp_enable_clocks(isp);
1587}
1588
1589static void isp_pm_complete(struct device *dev)
1590{
1591 struct isp_device *isp = dev_get_drvdata(dev);
1592
1593 if (isp->ref_count == 0)
1594 return;
1595
1596 isp_restore_ctx(isp);
1597 isp_enable_interrupts(isp);
1598 isp_resume_modules(isp);
1599}
1600
1601#else
1602
1603#define isp_pm_prepare NULL
1604#define isp_pm_suspend NULL
1605#define isp_pm_resume NULL
1606#define isp_pm_complete NULL
1607
1608#endif
1609
1610static void isp_unregister_entities(struct isp_device *isp)
1611{
1612 omap3isp_csi2_unregister_entities(&isp->isp_csi2a);
1613 omap3isp_ccp2_unregister_entities(&isp->isp_ccp2);
1614 omap3isp_ccdc_unregister_entities(&isp->isp_ccdc);
1615 omap3isp_preview_unregister_entities(&isp->isp_prev);
1616 omap3isp_resizer_unregister_entities(&isp->isp_res);
1617 omap3isp_stat_unregister_entities(&isp->isp_aewb);
1618 omap3isp_stat_unregister_entities(&isp->isp_af);
1619 omap3isp_stat_unregister_entities(&isp->isp_hist);
1620
1621 v4l2_device_unregister(&isp->v4l2_dev);
1622 media_device_unregister(&isp->media_dev);
1623}
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636static struct v4l2_subdev *
1637isp_register_subdev_group(struct isp_device *isp,
1638 struct isp_subdev_i2c_board_info *board_info)
1639{
1640 struct v4l2_subdev *sensor = NULL;
1641 unsigned int first;
1642
1643 if (board_info->board_info == NULL)
1644 return NULL;
1645
1646 for (first = 1; board_info->board_info; ++board_info, first = 0) {
1647 struct v4l2_subdev *subdev;
1648 struct i2c_adapter *adapter;
1649
1650 adapter = i2c_get_adapter(board_info->i2c_adapter_id);
1651 if (adapter == NULL) {
1652 dev_err(isp->dev, "%s: Unable to get I2C adapter %d for "
1653 "device %s\n", __func__,
1654 board_info->i2c_adapter_id,
1655 board_info->board_info->type);
1656 continue;
1657 }
1658
1659 subdev = v4l2_i2c_new_subdev_board(&isp->v4l2_dev, adapter,
1660 board_info->board_info, NULL);
1661 if (subdev == NULL) {
1662 dev_err(isp->dev, "%s: Unable to register subdev %s\n",
1663 __func__, board_info->board_info->type);
1664 continue;
1665 }
1666
1667 if (first)
1668 sensor = subdev;
1669 }
1670
1671 return sensor;
1672}
1673
1674static int isp_register_entities(struct isp_device *isp)
1675{
1676 struct isp_platform_data *pdata = isp->pdata;
1677 struct isp_v4l2_subdevs_group *subdevs;
1678 int ret;
1679
1680 isp->media_dev.dev = isp->dev;
1681 strlcpy(isp->media_dev.model, "TI OMAP3 ISP",
1682 sizeof(isp->media_dev.model));
1683 isp->media_dev.hw_revision = isp->revision;
1684 isp->media_dev.link_notify = isp_pipeline_link_notify;
1685 ret = media_device_register(&isp->media_dev);
1686 if (ret < 0) {
1687 dev_err(isp->dev, "%s: Media device registration failed (%d)\n",
1688 __func__, ret);
1689 return ret;
1690 }
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
1735 for (subdevs = pdata->subdevs; subdevs && subdevs->subdevs; ++subdevs) {
1736 struct v4l2_subdev *sensor;
1737 struct media_entity *input;
1738 unsigned int flags;
1739 unsigned int pad;
1740 unsigned int i;
1741
1742 sensor = isp_register_subdev_group(isp, subdevs->subdevs);
1743 if (sensor == NULL)
1744 continue;
1745
1746 sensor->host_priv = subdevs;
1747
1748
1749
1750
1751
1752
1753 switch (subdevs->interface) {
1754 case ISP_INTERFACE_PARALLEL:
1755 input = &isp->isp_ccdc.subdev.entity;
1756 pad = CCDC_PAD_SINK;
1757 flags = 0;
1758 break;
1759
1760 case ISP_INTERFACE_CSI2A_PHY2:
1761 input = &isp->isp_csi2a.subdev.entity;
1762 pad = CSI2_PAD_SINK;
1763 flags = MEDIA_LNK_FL_IMMUTABLE
1764 | MEDIA_LNK_FL_ENABLED;
1765 break;
1766
1767 case ISP_INTERFACE_CCP2B_PHY1:
1768 case ISP_INTERFACE_CCP2B_PHY2:
1769 input = &isp->isp_ccp2.subdev.entity;
1770 pad = CCP2_PAD_SINK;
1771 flags = 0;
1772 break;
1773
1774 case ISP_INTERFACE_CSI2C_PHY1:
1775 input = &isp->isp_csi2c.subdev.entity;
1776 pad = CSI2_PAD_SINK;
1777 flags = MEDIA_LNK_FL_IMMUTABLE
1778 | MEDIA_LNK_FL_ENABLED;
1779 break;
1780
1781 default:
1782 dev_err(isp->dev, "%s: invalid interface type %u\n",
1783 __func__, subdevs->interface);
1784 ret = -EINVAL;
1785 goto done;
1786 }
1787
1788 for (i = 0; i < sensor->entity.num_pads; i++) {
1789 if (sensor->entity.pads[i].flags & MEDIA_PAD_FL_SOURCE)
1790 break;
1791 }
1792 if (i == sensor->entity.num_pads) {
1793 dev_err(isp->dev,
1794 "%s: no source pad in external entity\n",
1795 __func__);
1796 ret = -EINVAL;
1797 goto done;
1798 }
1799
1800 ret = media_entity_create_link(&sensor->entity, i, input, pad,
1801 flags);
1802 if (ret < 0)
1803 goto done;
1804 }
1805
1806 ret = v4l2_device_register_subdev_nodes(&isp->v4l2_dev);
1807
1808done:
1809 if (ret < 0)
1810 isp_unregister_entities(isp);
1811
1812 return ret;
1813}
1814
1815static void isp_cleanup_modules(struct isp_device *isp)
1816{
1817 omap3isp_h3a_aewb_cleanup(isp);
1818 omap3isp_h3a_af_cleanup(isp);
1819 omap3isp_hist_cleanup(isp);
1820 omap3isp_resizer_cleanup(isp);
1821 omap3isp_preview_cleanup(isp);
1822 omap3isp_ccdc_cleanup(isp);
1823 omap3isp_ccp2_cleanup(isp);
1824 omap3isp_csi2_cleanup(isp);
1825}
1826
1827static int isp_initialize_modules(struct isp_device *isp)
1828{
1829 int ret;
1830
1831 ret = omap3isp_csiphy_init(isp);
1832 if (ret < 0) {
1833 dev_err(isp->dev, "CSI PHY initialization failed\n");
1834 goto error_csiphy;
1835 }
1836
1837 ret = omap3isp_csi2_init(isp);
1838 if (ret < 0) {
1839 dev_err(isp->dev, "CSI2 initialization failed\n");
1840 goto error_csi2;
1841 }
1842
1843 ret = omap3isp_ccp2_init(isp);
1844 if (ret < 0) {
1845 dev_err(isp->dev, "CCP2 initialization failed\n");
1846 goto error_ccp2;
1847 }
1848
1849 ret = omap3isp_ccdc_init(isp);
1850 if (ret < 0) {
1851 dev_err(isp->dev, "CCDC initialization failed\n");
1852 goto error_ccdc;
1853 }
1854
1855 ret = omap3isp_preview_init(isp);
1856 if (ret < 0) {
1857 dev_err(isp->dev, "Preview initialization failed\n");
1858 goto error_preview;
1859 }
1860
1861 ret = omap3isp_resizer_init(isp);
1862 if (ret < 0) {
1863 dev_err(isp->dev, "Resizer initialization failed\n");
1864 goto error_resizer;
1865 }
1866
1867 ret = omap3isp_hist_init(isp);
1868 if (ret < 0) {
1869 dev_err(isp->dev, "Histogram initialization failed\n");
1870 goto error_hist;
1871 }
1872
1873 ret = omap3isp_h3a_aewb_init(isp);
1874 if (ret < 0) {
1875 dev_err(isp->dev, "H3A AEWB initialization failed\n");
1876 goto error_h3a_aewb;
1877 }
1878
1879 ret = omap3isp_h3a_af_init(isp);
1880 if (ret < 0) {
1881 dev_err(isp->dev, "H3A AF initialization failed\n");
1882 goto error_h3a_af;
1883 }
1884
1885
1886 ret = media_entity_create_link(
1887 &isp->isp_csi2a.subdev.entity, CSI2_PAD_SOURCE,
1888 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0);
1889 if (ret < 0)
1890 goto error_link;
1891
1892 ret = media_entity_create_link(
1893 &isp->isp_ccp2.subdev.entity, CCP2_PAD_SOURCE,
1894 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0);
1895 if (ret < 0)
1896 goto error_link;
1897
1898 ret = media_entity_create_link(
1899 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
1900 &isp->isp_prev.subdev.entity, PREV_PAD_SINK, 0);
1901 if (ret < 0)
1902 goto error_link;
1903
1904 ret = media_entity_create_link(
1905 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_OF,
1906 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0);
1907 if (ret < 0)
1908 goto error_link;
1909
1910 ret = media_entity_create_link(
1911 &isp->isp_prev.subdev.entity, PREV_PAD_SOURCE,
1912 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0);
1913 if (ret < 0)
1914 goto error_link;
1915
1916 ret = media_entity_create_link(
1917 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
1918 &isp->isp_aewb.subdev.entity, 0,
1919 MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
1920 if (ret < 0)
1921 goto error_link;
1922
1923 ret = media_entity_create_link(
1924 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
1925 &isp->isp_af.subdev.entity, 0,
1926 MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
1927 if (ret < 0)
1928 goto error_link;
1929
1930 ret = media_entity_create_link(
1931 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
1932 &isp->isp_hist.subdev.entity, 0,
1933 MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
1934 if (ret < 0)
1935 goto error_link;
1936
1937 return 0;
1938
1939error_link:
1940 omap3isp_h3a_af_cleanup(isp);
1941error_h3a_af:
1942 omap3isp_h3a_aewb_cleanup(isp);
1943error_h3a_aewb:
1944 omap3isp_hist_cleanup(isp);
1945error_hist:
1946 omap3isp_resizer_cleanup(isp);
1947error_resizer:
1948 omap3isp_preview_cleanup(isp);
1949error_preview:
1950 omap3isp_ccdc_cleanup(isp);
1951error_ccdc:
1952 omap3isp_ccp2_cleanup(isp);
1953error_ccp2:
1954 omap3isp_csi2_cleanup(isp);
1955error_csi2:
1956error_csiphy:
1957 return ret;
1958}
1959
1960
1961
1962
1963
1964
1965
1966static int isp_remove(struct platform_device *pdev)
1967{
1968 struct isp_device *isp = platform_get_drvdata(pdev);
1969
1970 isp_unregister_entities(isp);
1971 isp_cleanup_modules(isp);
1972
1973 __omap3isp_get(isp, false);
1974 iommu_detach_device(isp->domain, &pdev->dev);
1975 iommu_domain_free(isp->domain);
1976 isp->domain = NULL;
1977 omap3isp_put(isp);
1978
1979 return 0;
1980}
1981
1982static int isp_map_mem_resource(struct platform_device *pdev,
1983 struct isp_device *isp,
1984 enum isp_mem_resources res)
1985{
1986 struct resource *mem;
1987
1988
1989
1990 mem = platform_get_resource(pdev, IORESOURCE_MEM, res);
1991 if (!mem) {
1992 dev_err(isp->dev, "no mem resource?\n");
1993 return -ENODEV;
1994 }
1995
1996 if (!devm_request_mem_region(isp->dev, mem->start, resource_size(mem),
1997 pdev->name)) {
1998 dev_err(isp->dev,
1999 "cannot reserve camera register I/O region\n");
2000 return -ENODEV;
2001 }
2002 isp->mmio_base_phys[res] = mem->start;
2003 isp->mmio_size[res] = resource_size(mem);
2004
2005
2006 isp->mmio_base[res] = devm_ioremap_nocache(isp->dev,
2007 isp->mmio_base_phys[res],
2008 isp->mmio_size[res]);
2009 if (!isp->mmio_base[res]) {
2010 dev_err(isp->dev, "cannot map camera register I/O region\n");
2011 return -ENODEV;
2012 }
2013
2014 return 0;
2015}
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028static int isp_probe(struct platform_device *pdev)
2029{
2030 struct isp_platform_data *pdata = pdev->dev.platform_data;
2031 struct isp_device *isp;
2032 int ret;
2033 int i, m;
2034
2035 if (pdata == NULL)
2036 return -EINVAL;
2037
2038 isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL);
2039 if (!isp) {
2040 dev_err(&pdev->dev, "could not allocate memory\n");
2041 return -ENOMEM;
2042 }
2043
2044 isp->autoidle = autoidle;
2045 isp->platform_cb.set_xclk = isp_set_xclk;
2046
2047 mutex_init(&isp->isp_mutex);
2048 spin_lock_init(&isp->stat_lock);
2049
2050 isp->dev = &pdev->dev;
2051 isp->pdata = pdata;
2052 isp->ref_count = 0;
2053
2054 isp->raw_dmamask = DMA_BIT_MASK(32);
2055 isp->dev->dma_mask = &isp->raw_dmamask;
2056 isp->dev->coherent_dma_mask = DMA_BIT_MASK(32);
2057
2058 platform_set_drvdata(pdev, isp);
2059
2060
2061 isp->isp_csiphy1.vdd = devm_regulator_get(&pdev->dev, "VDD_CSIPHY1");
2062 isp->isp_csiphy2.vdd = devm_regulator_get(&pdev->dev, "VDD_CSIPHY2");
2063
2064
2065
2066
2067
2068
2069 ret = isp_map_mem_resource(pdev, isp, OMAP3_ISP_IOMEM_MAIN);
2070 if (ret < 0)
2071 goto error;
2072
2073 ret = isp_get_clocks(isp);
2074 if (ret < 0)
2075 goto error;
2076
2077 ret = clk_enable(isp->clock[ISP_CLK_CAM_ICK]);
2078 if (ret < 0)
2079 goto error;
2080
2081 isp->revision = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION);
2082 dev_info(isp->dev, "Revision %d.%d found\n",
2083 (isp->revision & 0xf0) >> 4, isp->revision & 0x0f);
2084
2085 clk_disable(isp->clock[ISP_CLK_CAM_ICK]);
2086
2087 if (__omap3isp_get(isp, false) == NULL) {
2088 ret = -ENODEV;
2089 goto error;
2090 }
2091
2092 ret = isp_reset(isp);
2093 if (ret < 0)
2094 goto error_isp;
2095
2096
2097 for (m = 0; m < ARRAY_SIZE(isp_res_maps); m++)
2098 if (isp->revision == isp_res_maps[m].isp_rev)
2099 break;
2100
2101 if (m == ARRAY_SIZE(isp_res_maps)) {
2102 dev_err(isp->dev, "No resource map found for ISP rev %d.%d\n",
2103 (isp->revision & 0xf0) >> 4, isp->revision & 0xf);
2104 ret = -ENODEV;
2105 goto error_isp;
2106 }
2107
2108 for (i = 1; i < OMAP3_ISP_IOMEM_LAST; i++) {
2109 if (isp_res_maps[m].map & 1 << i) {
2110 ret = isp_map_mem_resource(pdev, isp, i);
2111 if (ret)
2112 goto error_isp;
2113 }
2114 }
2115
2116 isp->domain = iommu_domain_alloc(pdev->dev.bus);
2117 if (!isp->domain) {
2118 dev_err(isp->dev, "can't alloc iommu domain\n");
2119 ret = -ENOMEM;
2120 goto error_isp;
2121 }
2122
2123 ret = iommu_attach_device(isp->domain, &pdev->dev);
2124 if (ret) {
2125 dev_err(&pdev->dev, "can't attach iommu device: %d\n", ret);
2126 goto free_domain;
2127 }
2128
2129
2130 isp->irq_num = platform_get_irq(pdev, 0);
2131 if (isp->irq_num <= 0) {
2132 dev_err(isp->dev, "No IRQ resource\n");
2133 ret = -ENODEV;
2134 goto detach_dev;
2135 }
2136
2137 if (devm_request_irq(isp->dev, isp->irq_num, isp_isr, IRQF_SHARED,
2138 "OMAP3 ISP", isp)) {
2139 dev_err(isp->dev, "Unable to request IRQ\n");
2140 ret = -EINVAL;
2141 goto detach_dev;
2142 }
2143
2144
2145 ret = isp_initialize_modules(isp);
2146 if (ret < 0)
2147 goto detach_dev;
2148
2149 ret = isp_register_entities(isp);
2150 if (ret < 0)
2151 goto error_modules;
2152
2153 isp_core_init(isp, 1);
2154 omap3isp_put(isp);
2155
2156 return 0;
2157
2158error_modules:
2159 isp_cleanup_modules(isp);
2160detach_dev:
2161 iommu_detach_device(isp->domain, &pdev->dev);
2162free_domain:
2163 iommu_domain_free(isp->domain);
2164error_isp:
2165 omap3isp_put(isp);
2166error:
2167 platform_set_drvdata(pdev, NULL);
2168
2169 mutex_destroy(&isp->isp_mutex);
2170
2171 return ret;
2172}
2173
2174static const struct dev_pm_ops omap3isp_pm_ops = {
2175 .prepare = isp_pm_prepare,
2176 .suspend = isp_pm_suspend,
2177 .resume = isp_pm_resume,
2178 .complete = isp_pm_complete,
2179};
2180
2181static struct platform_device_id omap3isp_id_table[] = {
2182 { "omap3isp", 0 },
2183 { },
2184};
2185MODULE_DEVICE_TABLE(platform, omap3isp_id_table);
2186
2187static struct platform_driver omap3isp_driver = {
2188 .probe = isp_probe,
2189 .remove = isp_remove,
2190 .id_table = omap3isp_id_table,
2191 .driver = {
2192 .owner = THIS_MODULE,
2193 .name = "omap3isp",
2194 .pm = &omap3isp_pm_ops,
2195 },
2196};
2197
2198module_platform_driver(omap3isp_driver);
2199
2200MODULE_AUTHOR("Nokia Corporation");
2201MODULE_DESCRIPTION("TI OMAP3 ISP driver");
2202MODULE_LICENSE("GPL");
2203MODULE_VERSION(ISP_VIDEO_DRIVER_VERSION);
2204