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