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
660static const struct media_device_ops isp_media_ops = {
661 .link_notify = v4l2_pipeline_link_notify,
662};
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679static int isp_pipeline_enable(struct isp_pipeline *pipe,
680 enum isp_pipeline_stream_state mode)
681{
682 struct isp_device *isp = pipe->output->isp;
683 struct media_entity *entity;
684 struct media_pad *pad;
685 struct v4l2_subdev *subdev;
686 unsigned long flags;
687 int ret;
688
689
690
691
692
693
694 if (media_entity_enum_intersects(&pipe->ent_enum, &isp->crashed))
695 return -EIO;
696
697 spin_lock_irqsave(&pipe->lock, flags);
698 pipe->state &= ~(ISP_PIPELINE_IDLE_INPUT | ISP_PIPELINE_IDLE_OUTPUT);
699 spin_unlock_irqrestore(&pipe->lock, flags);
700
701 pipe->do_propagation = false;
702
703 entity = &pipe->output->video.entity;
704 while (1) {
705 pad = &entity->pads[0];
706 if (!(pad->flags & MEDIA_PAD_FL_SINK))
707 break;
708
709 pad = media_entity_remote_pad(pad);
710 if (!pad || !is_media_entity_v4l2_subdev(pad->entity))
711 break;
712
713 entity = pad->entity;
714 subdev = media_entity_to_v4l2_subdev(entity);
715
716 ret = v4l2_subdev_call(subdev, video, s_stream, mode);
717 if (ret < 0 && ret != -ENOIOCTLCMD)
718 return ret;
719
720 if (subdev == &isp->isp_ccdc.subdev) {
721 v4l2_subdev_call(&isp->isp_aewb.subdev, video,
722 s_stream, mode);
723 v4l2_subdev_call(&isp->isp_af.subdev, video,
724 s_stream, mode);
725 v4l2_subdev_call(&isp->isp_hist.subdev, video,
726 s_stream, mode);
727 pipe->do_propagation = true;
728 }
729 }
730
731 return 0;
732}
733
734static int isp_pipeline_wait_resizer(struct isp_device *isp)
735{
736 return omap3isp_resizer_busy(&isp->isp_res);
737}
738
739static int isp_pipeline_wait_preview(struct isp_device *isp)
740{
741 return omap3isp_preview_busy(&isp->isp_prev);
742}
743
744static int isp_pipeline_wait_ccdc(struct isp_device *isp)
745{
746 return omap3isp_stat_busy(&isp->isp_af)
747 || omap3isp_stat_busy(&isp->isp_aewb)
748 || omap3isp_stat_busy(&isp->isp_hist)
749 || omap3isp_ccdc_busy(&isp->isp_ccdc);
750}
751
752#define ISP_STOP_TIMEOUT msecs_to_jiffies(1000)
753
754static int isp_pipeline_wait(struct isp_device *isp,
755 int(*busy)(struct isp_device *isp))
756{
757 unsigned long timeout = jiffies + ISP_STOP_TIMEOUT;
758
759 while (!time_after(jiffies, timeout)) {
760 if (!busy(isp))
761 return 0;
762 }
763
764 return 1;
765}
766
767
768
769
770
771
772
773
774
775
776
777
778
779static int isp_pipeline_disable(struct isp_pipeline *pipe)
780{
781 struct isp_device *isp = pipe->output->isp;
782 struct media_entity *entity;
783 struct media_pad *pad;
784 struct v4l2_subdev *subdev;
785 int failure = 0;
786 int ret;
787
788
789
790
791
792 entity = &pipe->output->video.entity;
793 while (1) {
794 pad = &entity->pads[0];
795 if (!(pad->flags & MEDIA_PAD_FL_SINK))
796 break;
797
798 pad = media_entity_remote_pad(pad);
799 if (!pad || !is_media_entity_v4l2_subdev(pad->entity))
800 break;
801
802 entity = pad->entity;
803 subdev = media_entity_to_v4l2_subdev(entity);
804
805 if (subdev == &isp->isp_ccdc.subdev) {
806 v4l2_subdev_call(&isp->isp_aewb.subdev,
807 video, s_stream, 0);
808 v4l2_subdev_call(&isp->isp_af.subdev,
809 video, s_stream, 0);
810 v4l2_subdev_call(&isp->isp_hist.subdev,
811 video, s_stream, 0);
812 }
813
814 ret = v4l2_subdev_call(subdev, video, s_stream, 0);
815
816 if (subdev == &isp->isp_res.subdev)
817 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_resizer);
818 else if (subdev == &isp->isp_prev.subdev)
819 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_preview);
820 else if (subdev == &isp->isp_ccdc.subdev)
821 ret |= isp_pipeline_wait(isp, isp_pipeline_wait_ccdc);
822
823
824
825
826
827
828
829
830
831
832
833
834
835 if (ret) {
836 dev_info(isp->dev, "Unable to stop %s\n", subdev->name);
837 isp->stop_failure = true;
838 if (subdev == &isp->isp_prev.subdev)
839 media_entity_enum_set(&isp->crashed,
840 &subdev->entity);
841 failure = -ETIMEDOUT;
842 }
843 }
844
845 return failure;
846}
847
848
849
850
851
852
853
854
855
856
857
858
859
860int omap3isp_pipeline_set_stream(struct isp_pipeline *pipe,
861 enum isp_pipeline_stream_state state)
862{
863 int ret;
864
865 if (state == ISP_PIPELINE_STREAM_STOPPED)
866 ret = isp_pipeline_disable(pipe);
867 else
868 ret = isp_pipeline_enable(pipe, state);
869
870 if (ret == 0 || state == ISP_PIPELINE_STREAM_STOPPED)
871 pipe->stream_state = state;
872
873 return ret;
874}
875
876
877
878
879
880
881
882
883
884
885void omap3isp_pipeline_cancel_stream(struct isp_pipeline *pipe)
886{
887 if (pipe->input)
888 omap3isp_video_cancel_stream(pipe->input);
889 if (pipe->output)
890 omap3isp_video_cancel_stream(pipe->output);
891}
892
893
894
895
896
897
898
899static void isp_pipeline_resume(struct isp_pipeline *pipe)
900{
901 int singleshot = pipe->stream_state == ISP_PIPELINE_STREAM_SINGLESHOT;
902
903 omap3isp_video_resume(pipe->output, !singleshot);
904 if (singleshot)
905 omap3isp_video_resume(pipe->input, 0);
906 isp_pipeline_enable(pipe, pipe->stream_state);
907}
908
909
910
911
912
913
914
915static void isp_pipeline_suspend(struct isp_pipeline *pipe)
916{
917 isp_pipeline_disable(pipe);
918}
919
920
921
922
923
924
925
926
927
928
929static int isp_pipeline_is_last(struct media_entity *me)
930{
931 struct isp_pipeline *pipe;
932 struct media_pad *pad;
933
934 if (!me->pipe)
935 return 0;
936 pipe = to_isp_pipeline(me);
937 if (pipe->stream_state == ISP_PIPELINE_STREAM_STOPPED)
938 return 0;
939 pad = media_entity_remote_pad(&pipe->output->pad);
940 return pad->entity == me;
941}
942
943
944
945
946
947
948
949
950
951static void isp_suspend_module_pipeline(struct media_entity *me)
952{
953 if (isp_pipeline_is_last(me))
954 isp_pipeline_suspend(to_isp_pipeline(me));
955}
956
957
958
959
960
961
962
963
964
965static void isp_resume_module_pipeline(struct media_entity *me)
966{
967 if (isp_pipeline_is_last(me))
968 isp_pipeline_resume(to_isp_pipeline(me));
969}
970
971
972
973
974
975
976
977
978static int isp_suspend_modules(struct isp_device *isp)
979{
980 unsigned long timeout;
981
982 omap3isp_stat_suspend(&isp->isp_aewb);
983 omap3isp_stat_suspend(&isp->isp_af);
984 omap3isp_stat_suspend(&isp->isp_hist);
985 isp_suspend_module_pipeline(&isp->isp_res.subdev.entity);
986 isp_suspend_module_pipeline(&isp->isp_prev.subdev.entity);
987 isp_suspend_module_pipeline(&isp->isp_ccdc.subdev.entity);
988 isp_suspend_module_pipeline(&isp->isp_csi2a.subdev.entity);
989 isp_suspend_module_pipeline(&isp->isp_ccp2.subdev.entity);
990
991 timeout = jiffies + ISP_STOP_TIMEOUT;
992 while (omap3isp_stat_busy(&isp->isp_af)
993 || omap3isp_stat_busy(&isp->isp_aewb)
994 || omap3isp_stat_busy(&isp->isp_hist)
995 || omap3isp_preview_busy(&isp->isp_prev)
996 || omap3isp_resizer_busy(&isp->isp_res)
997 || omap3isp_ccdc_busy(&isp->isp_ccdc)) {
998 if (time_after(jiffies, timeout)) {
999 dev_info(isp->dev, "can't stop modules.\n");
1000 return 1;
1001 }
1002 msleep(1);
1003 }
1004
1005 return 0;
1006}
1007
1008
1009
1010
1011
1012static void isp_resume_modules(struct isp_device *isp)
1013{
1014 omap3isp_stat_resume(&isp->isp_aewb);
1015 omap3isp_stat_resume(&isp->isp_af);
1016 omap3isp_stat_resume(&isp->isp_hist);
1017 isp_resume_module_pipeline(&isp->isp_res.subdev.entity);
1018 isp_resume_module_pipeline(&isp->isp_prev.subdev.entity);
1019 isp_resume_module_pipeline(&isp->isp_ccdc.subdev.entity);
1020 isp_resume_module_pipeline(&isp->isp_csi2a.subdev.entity);
1021 isp_resume_module_pipeline(&isp->isp_ccp2.subdev.entity);
1022}
1023
1024
1025
1026
1027
1028static int isp_reset(struct isp_device *isp)
1029{
1030 unsigned long timeout = 0;
1031
1032 isp_reg_writel(isp,
1033 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG)
1034 | ISP_SYSCONFIG_SOFTRESET,
1035 OMAP3_ISP_IOMEM_MAIN, ISP_SYSCONFIG);
1036 while (!(isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN,
1037 ISP_SYSSTATUS) & 0x1)) {
1038 if (timeout++ > 10000) {
1039 dev_alert(isp->dev, "cannot reset ISP\n");
1040 return -ETIMEDOUT;
1041 }
1042 udelay(1);
1043 }
1044
1045 isp->stop_failure = false;
1046 media_entity_enum_zero(&isp->crashed);
1047 return 0;
1048}
1049
1050
1051
1052
1053
1054
1055
1056static void
1057isp_save_context(struct isp_device *isp, struct isp_reg *reg_list)
1058{
1059 struct isp_reg *next = reg_list;
1060
1061 for (; next->reg != ISP_TOK_TERM; next++)
1062 next->val = isp_reg_readl(isp, next->mmio_range, next->reg);
1063}
1064
1065
1066
1067
1068
1069
1070
1071static void
1072isp_restore_context(struct isp_device *isp, struct isp_reg *reg_list)
1073{
1074 struct isp_reg *next = reg_list;
1075
1076 for (; next->reg != ISP_TOK_TERM; next++)
1077 isp_reg_writel(isp, next->val, next->mmio_range, next->reg);
1078}
1079
1080
1081
1082
1083
1084
1085
1086
1087static void isp_save_ctx(struct isp_device *isp)
1088{
1089 isp_save_context(isp, isp_reg_list);
1090 omap_iommu_save_ctx(isp->dev);
1091}
1092
1093
1094
1095
1096
1097
1098
1099
1100static void isp_restore_ctx(struct isp_device *isp)
1101{
1102 isp_restore_context(isp, isp_reg_list);
1103 omap_iommu_restore_ctx(isp->dev);
1104 omap3isp_ccdc_restore_context(isp);
1105 omap3isp_preview_restore_context(isp);
1106}
1107
1108
1109
1110
1111#define OMAP3_ISP_SBL_READ (OMAP3_ISP_SBL_CSI1_READ | \
1112 OMAP3_ISP_SBL_CCDC_LSC_READ | \
1113 OMAP3_ISP_SBL_PREVIEW_READ | \
1114 OMAP3_ISP_SBL_RESIZER_READ)
1115#define OMAP3_ISP_SBL_WRITE (OMAP3_ISP_SBL_CSI1_WRITE | \
1116 OMAP3_ISP_SBL_CSI2A_WRITE | \
1117 OMAP3_ISP_SBL_CSI2C_WRITE | \
1118 OMAP3_ISP_SBL_CCDC_WRITE | \
1119 OMAP3_ISP_SBL_PREVIEW_WRITE)
1120
1121void omap3isp_sbl_enable(struct isp_device *isp, enum isp_sbl_resource res)
1122{
1123 u32 sbl = 0;
1124
1125 isp->sbl_resources |= res;
1126
1127 if (isp->sbl_resources & OMAP3_ISP_SBL_CSI1_READ)
1128 sbl |= ISPCTRL_SBL_SHARED_RPORTA;
1129
1130 if (isp->sbl_resources & OMAP3_ISP_SBL_CCDC_LSC_READ)
1131 sbl |= ISPCTRL_SBL_SHARED_RPORTB;
1132
1133 if (isp->sbl_resources & OMAP3_ISP_SBL_CSI2C_WRITE)
1134 sbl |= ISPCTRL_SBL_SHARED_WPORTC;
1135
1136 if (isp->sbl_resources & OMAP3_ISP_SBL_RESIZER_WRITE)
1137 sbl |= ISPCTRL_SBL_WR0_RAM_EN;
1138
1139 if (isp->sbl_resources & OMAP3_ISP_SBL_WRITE)
1140 sbl |= ISPCTRL_SBL_WR1_RAM_EN;
1141
1142 if (isp->sbl_resources & OMAP3_ISP_SBL_READ)
1143 sbl |= ISPCTRL_SBL_RD_RAM_EN;
1144
1145 isp_reg_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, sbl);
1146}
1147
1148void omap3isp_sbl_disable(struct isp_device *isp, enum isp_sbl_resource res)
1149{
1150 u32 sbl = 0;
1151
1152 isp->sbl_resources &= ~res;
1153
1154 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CSI1_READ))
1155 sbl |= ISPCTRL_SBL_SHARED_RPORTA;
1156
1157 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CCDC_LSC_READ))
1158 sbl |= ISPCTRL_SBL_SHARED_RPORTB;
1159
1160 if (!(isp->sbl_resources & OMAP3_ISP_SBL_CSI2C_WRITE))
1161 sbl |= ISPCTRL_SBL_SHARED_WPORTC;
1162
1163 if (!(isp->sbl_resources & OMAP3_ISP_SBL_RESIZER_WRITE))
1164 sbl |= ISPCTRL_SBL_WR0_RAM_EN;
1165
1166 if (!(isp->sbl_resources & OMAP3_ISP_SBL_WRITE))
1167 sbl |= ISPCTRL_SBL_WR1_RAM_EN;
1168
1169 if (!(isp->sbl_resources & OMAP3_ISP_SBL_READ))
1170 sbl |= ISPCTRL_SBL_RD_RAM_EN;
1171
1172 isp_reg_clr(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL, sbl);
1173}
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184int omap3isp_module_sync_idle(struct media_entity *me, wait_queue_head_t *wait,
1185 atomic_t *stopping)
1186{
1187 struct isp_pipeline *pipe = to_isp_pipeline(me);
1188
1189 if (pipe->stream_state == ISP_PIPELINE_STREAM_STOPPED ||
1190 (pipe->stream_state == ISP_PIPELINE_STREAM_SINGLESHOT &&
1191 !isp_pipeline_ready(pipe)))
1192 return 0;
1193
1194
1195
1196
1197
1198 atomic_set(stopping, 1);
1199 smp_mb();
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210 if (isp_pipeline_is_last(me)) {
1211 struct isp_video *video = pipe->output;
1212 unsigned long flags;
1213 spin_lock_irqsave(&video->irqlock, flags);
1214 if (video->dmaqueue_flags & ISP_VIDEO_DMAQUEUE_UNDERRUN) {
1215 spin_unlock_irqrestore(&video->irqlock, flags);
1216 atomic_set(stopping, 0);
1217 smp_mb();
1218 return 0;
1219 }
1220 spin_unlock_irqrestore(&video->irqlock, flags);
1221 if (!wait_event_timeout(*wait, !atomic_read(stopping),
1222 msecs_to_jiffies(1000))) {
1223 atomic_set(stopping, 0);
1224 smp_mb();
1225 return -ETIMEDOUT;
1226 }
1227 }
1228
1229 return 0;
1230}
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241int omap3isp_module_sync_is_stopping(wait_queue_head_t *wait,
1242 atomic_t *stopping)
1243{
1244 if (atomic_cmpxchg(stopping, 1, 0)) {
1245 wake_up(wait);
1246 return 1;
1247 }
1248
1249 return 0;
1250}
1251
1252
1253
1254
1255
1256#define ISPCTRL_CLKS_MASK (ISPCTRL_H3A_CLK_EN | \
1257 ISPCTRL_HIST_CLK_EN | \
1258 ISPCTRL_RSZ_CLK_EN | \
1259 (ISPCTRL_CCDC_CLK_EN | ISPCTRL_CCDC_RAM_EN) | \
1260 (ISPCTRL_PREV_CLK_EN | ISPCTRL_PREV_RAM_EN))
1261
1262static void __isp_subclk_update(struct isp_device *isp)
1263{
1264 u32 clk = 0;
1265
1266
1267 if (isp->subclk_resources &
1268 (OMAP3_ISP_SUBCLK_AEWB | OMAP3_ISP_SUBCLK_AF))
1269 clk |= ISPCTRL_H3A_CLK_EN;
1270
1271 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_HIST)
1272 clk |= ISPCTRL_HIST_CLK_EN;
1273
1274 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_RESIZER)
1275 clk |= ISPCTRL_RSZ_CLK_EN;
1276
1277
1278
1279
1280 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_CCDC)
1281 clk |= ISPCTRL_CCDC_CLK_EN | ISPCTRL_CCDC_RAM_EN;
1282
1283 if (isp->subclk_resources & OMAP3_ISP_SUBCLK_PREVIEW)
1284 clk |= ISPCTRL_PREV_CLK_EN | ISPCTRL_PREV_RAM_EN;
1285
1286 isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL,
1287 ISPCTRL_CLKS_MASK, clk);
1288}
1289
1290void omap3isp_subclk_enable(struct isp_device *isp,
1291 enum isp_subclk_resource res)
1292{
1293 isp->subclk_resources |= res;
1294
1295 __isp_subclk_update(isp);
1296}
1297
1298void omap3isp_subclk_disable(struct isp_device *isp,
1299 enum isp_subclk_resource res)
1300{
1301 isp->subclk_resources &= ~res;
1302
1303 __isp_subclk_update(isp);
1304}
1305
1306
1307
1308
1309
1310
1311
1312
1313static int isp_enable_clocks(struct isp_device *isp)
1314{
1315 int r;
1316 unsigned long rate;
1317
1318 r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_ICK]);
1319 if (r) {
1320 dev_err(isp->dev, "failed to enable cam_ick clock\n");
1321 goto out_clk_enable_ick;
1322 }
1323 r = clk_set_rate(isp->clock[ISP_CLK_CAM_MCLK], CM_CAM_MCLK_HZ);
1324 if (r) {
1325 dev_err(isp->dev, "clk_set_rate for cam_mclk failed\n");
1326 goto out_clk_enable_mclk;
1327 }
1328 r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_MCLK]);
1329 if (r) {
1330 dev_err(isp->dev, "failed to enable cam_mclk clock\n");
1331 goto out_clk_enable_mclk;
1332 }
1333 rate = clk_get_rate(isp->clock[ISP_CLK_CAM_MCLK]);
1334 if (rate != CM_CAM_MCLK_HZ)
1335 dev_warn(isp->dev, "unexpected cam_mclk rate:\n"
1336 " expected : %d\n"
1337 " actual : %ld\n", CM_CAM_MCLK_HZ, rate);
1338 r = clk_prepare_enable(isp->clock[ISP_CLK_CSI2_FCK]);
1339 if (r) {
1340 dev_err(isp->dev, "failed to enable csi2_fck clock\n");
1341 goto out_clk_enable_csi2_fclk;
1342 }
1343 return 0;
1344
1345out_clk_enable_csi2_fclk:
1346 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_MCLK]);
1347out_clk_enable_mclk:
1348 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_ICK]);
1349out_clk_enable_ick:
1350 return r;
1351}
1352
1353
1354
1355
1356
1357static void isp_disable_clocks(struct isp_device *isp)
1358{
1359 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_ICK]);
1360 clk_disable_unprepare(isp->clock[ISP_CLK_CAM_MCLK]);
1361 clk_disable_unprepare(isp->clock[ISP_CLK_CSI2_FCK]);
1362}
1363
1364static const char *isp_clocks[] = {
1365 "cam_ick",
1366 "cam_mclk",
1367 "csi2_96m_fck",
1368 "l3_ick",
1369};
1370
1371static int isp_get_clocks(struct isp_device *isp)
1372{
1373 struct clk *clk;
1374 unsigned int i;
1375
1376 for (i = 0; i < ARRAY_SIZE(isp_clocks); ++i) {
1377 clk = devm_clk_get(isp->dev, isp_clocks[i]);
1378 if (IS_ERR(clk)) {
1379 dev_err(isp->dev, "clk_get %s failed\n", isp_clocks[i]);
1380 return PTR_ERR(clk);
1381 }
1382
1383 isp->clock[i] = clk;
1384 }
1385
1386 return 0;
1387}
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399static struct isp_device *__omap3isp_get(struct isp_device *isp, bool irq)
1400{
1401 struct isp_device *__isp = isp;
1402
1403 if (isp == NULL)
1404 return NULL;
1405
1406 mutex_lock(&isp->isp_mutex);
1407 if (isp->ref_count > 0)
1408 goto out;
1409
1410 if (isp_enable_clocks(isp) < 0) {
1411 __isp = NULL;
1412 goto out;
1413 }
1414
1415
1416 if (isp->has_context)
1417 isp_restore_ctx(isp);
1418
1419 if (irq)
1420 isp_enable_interrupts(isp);
1421
1422out:
1423 if (__isp != NULL)
1424 isp->ref_count++;
1425 mutex_unlock(&isp->isp_mutex);
1426
1427 return __isp;
1428}
1429
1430struct isp_device *omap3isp_get(struct isp_device *isp)
1431{
1432 return __omap3isp_get(isp, true);
1433}
1434
1435
1436
1437
1438
1439
1440
1441static void __omap3isp_put(struct isp_device *isp, bool save_ctx)
1442{
1443 if (isp == NULL)
1444 return;
1445
1446 mutex_lock(&isp->isp_mutex);
1447 BUG_ON(isp->ref_count == 0);
1448 if (--isp->ref_count == 0) {
1449 isp_disable_interrupts(isp);
1450 if (save_ctx) {
1451 isp_save_ctx(isp);
1452 isp->has_context = 1;
1453 }
1454
1455
1456
1457 if (!media_entity_enum_empty(&isp->crashed) ||
1458 isp->stop_failure)
1459 isp_reset(isp);
1460 isp_disable_clocks(isp);
1461 }
1462 mutex_unlock(&isp->isp_mutex);
1463}
1464
1465void omap3isp_put(struct isp_device *isp)
1466{
1467 __omap3isp_put(isp, true);
1468}
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478#define ISP_PRINT_REGISTER(isp, name)\
1479 dev_dbg(isp->dev, "###ISP " #name "=0x%08x\n", \
1480 isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_##name))
1481#define SBL_PRINT_REGISTER(isp, name)\
1482 dev_dbg(isp->dev, "###SBL " #name "=0x%08x\n", \
1483 isp_reg_readl(isp, OMAP3_ISP_IOMEM_SBL, ISPSBL_##name))
1484
1485void omap3isp_print_status(struct isp_device *isp)
1486{
1487 dev_dbg(isp->dev, "-------------ISP Register dump--------------\n");
1488
1489 ISP_PRINT_REGISTER(isp, SYSCONFIG);
1490 ISP_PRINT_REGISTER(isp, SYSSTATUS);
1491 ISP_PRINT_REGISTER(isp, IRQ0ENABLE);
1492 ISP_PRINT_REGISTER(isp, IRQ0STATUS);
1493 ISP_PRINT_REGISTER(isp, TCTRL_GRESET_LENGTH);
1494 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_REPLAY);
1495 ISP_PRINT_REGISTER(isp, CTRL);
1496 ISP_PRINT_REGISTER(isp, TCTRL_CTRL);
1497 ISP_PRINT_REGISTER(isp, TCTRL_FRAME);
1498 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_DELAY);
1499 ISP_PRINT_REGISTER(isp, TCTRL_STRB_DELAY);
1500 ISP_PRINT_REGISTER(isp, TCTRL_SHUT_DELAY);
1501 ISP_PRINT_REGISTER(isp, TCTRL_PSTRB_LENGTH);
1502 ISP_PRINT_REGISTER(isp, TCTRL_STRB_LENGTH);
1503 ISP_PRINT_REGISTER(isp, TCTRL_SHUT_LENGTH);
1504
1505 SBL_PRINT_REGISTER(isp, PCR);
1506 SBL_PRINT_REGISTER(isp, SDR_REQ_EXP);
1507
1508 dev_dbg(isp->dev, "--------------------------------------------\n");
1509}
1510
1511#ifdef CONFIG_PM
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530static int isp_pm_prepare(struct device *dev)
1531{
1532 struct isp_device *isp = dev_get_drvdata(dev);
1533 int reset;
1534
1535 WARN_ON(mutex_is_locked(&isp->isp_mutex));
1536
1537 if (isp->ref_count == 0)
1538 return 0;
1539
1540 reset = isp_suspend_modules(isp);
1541 isp_disable_interrupts(isp);
1542 isp_save_ctx(isp);
1543 if (reset)
1544 isp_reset(isp);
1545
1546 return 0;
1547}
1548
1549static int isp_pm_suspend(struct device *dev)
1550{
1551 struct isp_device *isp = dev_get_drvdata(dev);
1552
1553 WARN_ON(mutex_is_locked(&isp->isp_mutex));
1554
1555 if (isp->ref_count)
1556 isp_disable_clocks(isp);
1557
1558 return 0;
1559}
1560
1561static int isp_pm_resume(struct device *dev)
1562{
1563 struct isp_device *isp = dev_get_drvdata(dev);
1564
1565 if (isp->ref_count == 0)
1566 return 0;
1567
1568 return isp_enable_clocks(isp);
1569}
1570
1571static void isp_pm_complete(struct device *dev)
1572{
1573 struct isp_device *isp = dev_get_drvdata(dev);
1574
1575 if (isp->ref_count == 0)
1576 return;
1577
1578 isp_restore_ctx(isp);
1579 isp_enable_interrupts(isp);
1580 isp_resume_modules(isp);
1581}
1582
1583#else
1584
1585#define isp_pm_prepare NULL
1586#define isp_pm_suspend NULL
1587#define isp_pm_resume NULL
1588#define isp_pm_complete NULL
1589
1590#endif
1591
1592static void isp_unregister_entities(struct isp_device *isp)
1593{
1594 omap3isp_csi2_unregister_entities(&isp->isp_csi2a);
1595 omap3isp_ccp2_unregister_entities(&isp->isp_ccp2);
1596 omap3isp_ccdc_unregister_entities(&isp->isp_ccdc);
1597 omap3isp_preview_unregister_entities(&isp->isp_prev);
1598 omap3isp_resizer_unregister_entities(&isp->isp_res);
1599 omap3isp_stat_unregister_entities(&isp->isp_aewb);
1600 omap3isp_stat_unregister_entities(&isp->isp_af);
1601 omap3isp_stat_unregister_entities(&isp->isp_hist);
1602
1603 v4l2_device_unregister(&isp->v4l2_dev);
1604 media_device_unregister(&isp->media_dev);
1605 media_device_cleanup(&isp->media_dev);
1606}
1607
1608static int isp_link_entity(
1609 struct isp_device *isp, struct media_entity *entity,
1610 enum isp_interface_type interface)
1611{
1612 struct media_entity *input;
1613 unsigned int flags;
1614 unsigned int pad;
1615 unsigned int i;
1616
1617
1618
1619
1620
1621
1622 switch (interface) {
1623 case ISP_INTERFACE_PARALLEL:
1624 input = &isp->isp_ccdc.subdev.entity;
1625 pad = CCDC_PAD_SINK;
1626 flags = 0;
1627 break;
1628
1629 case ISP_INTERFACE_CSI2A_PHY2:
1630 input = &isp->isp_csi2a.subdev.entity;
1631 pad = CSI2_PAD_SINK;
1632 flags = MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED;
1633 break;
1634
1635 case ISP_INTERFACE_CCP2B_PHY1:
1636 case ISP_INTERFACE_CCP2B_PHY2:
1637 input = &isp->isp_ccp2.subdev.entity;
1638 pad = CCP2_PAD_SINK;
1639 flags = 0;
1640 break;
1641
1642 case ISP_INTERFACE_CSI2C_PHY1:
1643 input = &isp->isp_csi2c.subdev.entity;
1644 pad = CSI2_PAD_SINK;
1645 flags = MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED;
1646 break;
1647
1648 default:
1649 dev_err(isp->dev, "%s: invalid interface type %u\n", __func__,
1650 interface);
1651 return -EINVAL;
1652 }
1653
1654
1655
1656
1657
1658
1659
1660 if (!input->num_pads) {
1661 dev_err(isp->dev, "%s: invalid input %u\n", entity->name,
1662 interface);
1663 return -EINVAL;
1664 }
1665
1666 for (i = 0; i < entity->num_pads; i++) {
1667 if (entity->pads[i].flags & MEDIA_PAD_FL_SOURCE)
1668 break;
1669 }
1670 if (i == entity->num_pads) {
1671 dev_err(isp->dev, "%s: no source pad in external entity\n",
1672 __func__);
1673 return -EINVAL;
1674 }
1675
1676 return media_create_pad_link(entity, i, input, pad, flags);
1677}
1678
1679static int isp_register_entities(struct isp_device *isp)
1680{
1681 int ret;
1682
1683 isp->media_dev.dev = isp->dev;
1684 strlcpy(isp->media_dev.model, "TI OMAP3 ISP",
1685 sizeof(isp->media_dev.model));
1686 isp->media_dev.hw_revision = isp->revision;
1687 isp->media_dev.ops = &isp_media_ops;
1688 media_device_init(&isp->media_dev);
1689
1690 isp->v4l2_dev.mdev = &isp->media_dev;
1691 ret = v4l2_device_register(isp->dev, &isp->v4l2_dev);
1692 if (ret < 0) {
1693 dev_err(isp->dev, "%s: V4L2 device registration failed (%d)\n",
1694 __func__, ret);
1695 goto done;
1696 }
1697
1698
1699 ret = omap3isp_ccp2_register_entities(&isp->isp_ccp2, &isp->v4l2_dev);
1700 if (ret < 0)
1701 goto done;
1702
1703 ret = omap3isp_csi2_register_entities(&isp->isp_csi2a, &isp->v4l2_dev);
1704 if (ret < 0)
1705 goto done;
1706
1707 ret = omap3isp_ccdc_register_entities(&isp->isp_ccdc, &isp->v4l2_dev);
1708 if (ret < 0)
1709 goto done;
1710
1711 ret = omap3isp_preview_register_entities(&isp->isp_prev,
1712 &isp->v4l2_dev);
1713 if (ret < 0)
1714 goto done;
1715
1716 ret = omap3isp_resizer_register_entities(&isp->isp_res, &isp->v4l2_dev);
1717 if (ret < 0)
1718 goto done;
1719
1720 ret = omap3isp_stat_register_entities(&isp->isp_aewb, &isp->v4l2_dev);
1721 if (ret < 0)
1722 goto done;
1723
1724 ret = omap3isp_stat_register_entities(&isp->isp_af, &isp->v4l2_dev);
1725 if (ret < 0)
1726 goto done;
1727
1728 ret = omap3isp_stat_register_entities(&isp->isp_hist, &isp->v4l2_dev);
1729 if (ret < 0)
1730 goto done;
1731
1732done:
1733 if (ret < 0)
1734 isp_unregister_entities(isp);
1735
1736 return ret;
1737}
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748static int isp_create_links(struct isp_device *isp)
1749{
1750 int ret;
1751
1752
1753 ret = media_create_pad_link(
1754 &isp->isp_csi2a.subdev.entity, CSI2_PAD_SOURCE,
1755 &isp->isp_csi2a.video_out.video.entity, 0, 0);
1756 if (ret < 0)
1757 return ret;
1758
1759 ret = media_create_pad_link(
1760 &isp->isp_ccp2.video_in.video.entity, 0,
1761 &isp->isp_ccp2.subdev.entity, CCP2_PAD_SINK, 0);
1762 if (ret < 0)
1763 return ret;
1764
1765 ret = media_create_pad_link(
1766 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_OF,
1767 &isp->isp_ccdc.video_out.video.entity, 0, 0);
1768 if (ret < 0)
1769 return ret;
1770
1771 ret = media_create_pad_link(
1772 &isp->isp_prev.video_in.video.entity, 0,
1773 &isp->isp_prev.subdev.entity, PREV_PAD_SINK, 0);
1774 if (ret < 0)
1775 return ret;
1776
1777 ret = media_create_pad_link(
1778 &isp->isp_prev.subdev.entity, PREV_PAD_SOURCE,
1779 &isp->isp_prev.video_out.video.entity, 0, 0);
1780 if (ret < 0)
1781 return ret;
1782
1783 ret = media_create_pad_link(
1784 &isp->isp_res.video_in.video.entity, 0,
1785 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0);
1786 if (ret < 0)
1787 return ret;
1788
1789 ret = media_create_pad_link(
1790 &isp->isp_res.subdev.entity, RESZ_PAD_SOURCE,
1791 &isp->isp_res.video_out.video.entity, 0, 0);
1792
1793 if (ret < 0)
1794 return ret;
1795
1796
1797 ret = media_create_pad_link(
1798 &isp->isp_csi2a.subdev.entity, CSI2_PAD_SOURCE,
1799 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0);
1800 if (ret < 0)
1801 return ret;
1802
1803 ret = media_create_pad_link(
1804 &isp->isp_ccp2.subdev.entity, CCP2_PAD_SOURCE,
1805 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SINK, 0);
1806 if (ret < 0)
1807 return ret;
1808
1809 ret = media_create_pad_link(
1810 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
1811 &isp->isp_prev.subdev.entity, PREV_PAD_SINK, 0);
1812 if (ret < 0)
1813 return ret;
1814
1815 ret = media_create_pad_link(
1816 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_OF,
1817 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0);
1818 if (ret < 0)
1819 return ret;
1820
1821 ret = media_create_pad_link(
1822 &isp->isp_prev.subdev.entity, PREV_PAD_SOURCE,
1823 &isp->isp_res.subdev.entity, RESZ_PAD_SINK, 0);
1824 if (ret < 0)
1825 return ret;
1826
1827 ret = media_create_pad_link(
1828 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
1829 &isp->isp_aewb.subdev.entity, 0,
1830 MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
1831 if (ret < 0)
1832 return ret;
1833
1834 ret = media_create_pad_link(
1835 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
1836 &isp->isp_af.subdev.entity, 0,
1837 MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
1838 if (ret < 0)
1839 return ret;
1840
1841 ret = media_create_pad_link(
1842 &isp->isp_ccdc.subdev.entity, CCDC_PAD_SOURCE_VP,
1843 &isp->isp_hist.subdev.entity, 0,
1844 MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
1845 if (ret < 0)
1846 return ret;
1847
1848 return 0;
1849}
1850
1851static void isp_cleanup_modules(struct isp_device *isp)
1852{
1853 omap3isp_h3a_aewb_cleanup(isp);
1854 omap3isp_h3a_af_cleanup(isp);
1855 omap3isp_hist_cleanup(isp);
1856 omap3isp_resizer_cleanup(isp);
1857 omap3isp_preview_cleanup(isp);
1858 omap3isp_ccdc_cleanup(isp);
1859 omap3isp_ccp2_cleanup(isp);
1860 omap3isp_csi2_cleanup(isp);
1861}
1862
1863static int isp_initialize_modules(struct isp_device *isp)
1864{
1865 int ret;
1866
1867 ret = omap3isp_csiphy_init(isp);
1868 if (ret < 0) {
1869 dev_err(isp->dev, "CSI PHY initialization failed\n");
1870 goto error_csiphy;
1871 }
1872
1873 ret = omap3isp_csi2_init(isp);
1874 if (ret < 0) {
1875 dev_err(isp->dev, "CSI2 initialization failed\n");
1876 goto error_csi2;
1877 }
1878
1879 ret = omap3isp_ccp2_init(isp);
1880 if (ret < 0) {
1881 dev_err(isp->dev, "CCP2 initialization failed\n");
1882 goto error_ccp2;
1883 }
1884
1885 ret = omap3isp_ccdc_init(isp);
1886 if (ret < 0) {
1887 dev_err(isp->dev, "CCDC initialization failed\n");
1888 goto error_ccdc;
1889 }
1890
1891 ret = omap3isp_preview_init(isp);
1892 if (ret < 0) {
1893 dev_err(isp->dev, "Preview initialization failed\n");
1894 goto error_preview;
1895 }
1896
1897 ret = omap3isp_resizer_init(isp);
1898 if (ret < 0) {
1899 dev_err(isp->dev, "Resizer initialization failed\n");
1900 goto error_resizer;
1901 }
1902
1903 ret = omap3isp_hist_init(isp);
1904 if (ret < 0) {
1905 dev_err(isp->dev, "Histogram initialization failed\n");
1906 goto error_hist;
1907 }
1908
1909 ret = omap3isp_h3a_aewb_init(isp);
1910 if (ret < 0) {
1911 dev_err(isp->dev, "H3A AEWB initialization failed\n");
1912 goto error_h3a_aewb;
1913 }
1914
1915 ret = omap3isp_h3a_af_init(isp);
1916 if (ret < 0) {
1917 dev_err(isp->dev, "H3A AF initialization failed\n");
1918 goto error_h3a_af;
1919 }
1920
1921 return 0;
1922
1923error_h3a_af:
1924 omap3isp_h3a_aewb_cleanup(isp);
1925error_h3a_aewb:
1926 omap3isp_hist_cleanup(isp);
1927error_hist:
1928 omap3isp_resizer_cleanup(isp);
1929error_resizer:
1930 omap3isp_preview_cleanup(isp);
1931error_preview:
1932 omap3isp_ccdc_cleanup(isp);
1933error_ccdc:
1934 omap3isp_ccp2_cleanup(isp);
1935error_ccp2:
1936 omap3isp_csi2_cleanup(isp);
1937error_csi2:
1938error_csiphy:
1939 return ret;
1940}
1941
1942static void isp_detach_iommu(struct isp_device *isp)
1943{
1944 arm_iommu_release_mapping(isp->mapping);
1945 isp->mapping = NULL;
1946 iommu_group_remove_device(isp->dev);
1947}
1948
1949static int isp_attach_iommu(struct isp_device *isp)
1950{
1951 struct dma_iommu_mapping *mapping;
1952 struct iommu_group *group;
1953 int ret;
1954
1955
1956 group = iommu_group_alloc();
1957 if (IS_ERR(group)) {
1958 dev_err(isp->dev, "failed to allocate IOMMU group\n");
1959 return PTR_ERR(group);
1960 }
1961
1962 ret = iommu_group_add_device(group, isp->dev);
1963 iommu_group_put(group);
1964
1965 if (ret < 0) {
1966 dev_err(isp->dev, "failed to add device to IPMMU group\n");
1967 return ret;
1968 }
1969
1970
1971
1972
1973
1974 mapping = arm_iommu_create_mapping(&platform_bus_type, SZ_1G, SZ_2G);
1975 if (IS_ERR(mapping)) {
1976 dev_err(isp->dev, "failed to create ARM IOMMU mapping\n");
1977 ret = PTR_ERR(mapping);
1978 goto error;
1979 }
1980
1981 isp->mapping = mapping;
1982
1983
1984 ret = arm_iommu_attach_device(isp->dev, mapping);
1985 if (ret < 0) {
1986 dev_err(isp->dev, "failed to attach device to VA mapping\n");
1987 goto error;
1988 }
1989
1990 return 0;
1991
1992error:
1993 isp_detach_iommu(isp);
1994 return ret;
1995}
1996
1997
1998
1999
2000
2001
2002
2003static int isp_remove(struct platform_device *pdev)
2004{
2005 struct isp_device *isp = platform_get_drvdata(pdev);
2006
2007 v4l2_async_notifier_unregister(&isp->notifier);
2008 isp_unregister_entities(isp);
2009 isp_cleanup_modules(isp);
2010 isp_xclk_cleanup(isp);
2011
2012 __omap3isp_get(isp, false);
2013 isp_detach_iommu(isp);
2014 __omap3isp_put(isp, false);
2015
2016 media_entity_enum_cleanup(&isp->crashed);
2017
2018 return 0;
2019}
2020
2021enum isp_of_phy {
2022 ISP_OF_PHY_PARALLEL = 0,
2023 ISP_OF_PHY_CSIPHY1,
2024 ISP_OF_PHY_CSIPHY2,
2025};
2026
2027static int isp_of_parse_node(struct device *dev, struct device_node *node,
2028 struct isp_async_subdev *isd)
2029{
2030 struct isp_bus_cfg *buscfg = &isd->bus;
2031 struct v4l2_of_endpoint vep;
2032 unsigned int i;
2033 int ret;
2034
2035 ret = v4l2_of_parse_endpoint(node, &vep);
2036 if (ret)
2037 return ret;
2038
2039 dev_dbg(dev, "parsing endpoint %s, interface %u\n", node->full_name,
2040 vep.base.port);
2041
2042 switch (vep.base.port) {
2043 case ISP_OF_PHY_PARALLEL:
2044 buscfg->interface = ISP_INTERFACE_PARALLEL;
2045 buscfg->bus.parallel.data_lane_shift =
2046 vep.bus.parallel.data_shift;
2047 buscfg->bus.parallel.clk_pol =
2048 !!(vep.bus.parallel.flags
2049 & V4L2_MBUS_PCLK_SAMPLE_FALLING);
2050 buscfg->bus.parallel.hs_pol =
2051 !!(vep.bus.parallel.flags & V4L2_MBUS_VSYNC_ACTIVE_LOW);
2052 buscfg->bus.parallel.vs_pol =
2053 !!(vep.bus.parallel.flags & V4L2_MBUS_HSYNC_ACTIVE_LOW);
2054 buscfg->bus.parallel.fld_pol =
2055 !!(vep.bus.parallel.flags & V4L2_MBUS_FIELD_EVEN_LOW);
2056 buscfg->bus.parallel.data_pol =
2057 !!(vep.bus.parallel.flags & V4L2_MBUS_DATA_ACTIVE_LOW);
2058 break;
2059
2060 case ISP_OF_PHY_CSIPHY1:
2061 case ISP_OF_PHY_CSIPHY2:
2062
2063 switch (vep.base.port) {
2064 case ISP_OF_PHY_CSIPHY1:
2065 buscfg->interface = ISP_INTERFACE_CSI2C_PHY1;
2066 break;
2067 case ISP_OF_PHY_CSIPHY2:
2068 buscfg->interface = ISP_INTERFACE_CSI2A_PHY2;
2069 break;
2070 }
2071 buscfg->bus.csi2.lanecfg.clk.pos = vep.bus.mipi_csi2.clock_lane;
2072 buscfg->bus.csi2.lanecfg.clk.pol =
2073 vep.bus.mipi_csi2.lane_polarities[0];
2074 dev_dbg(dev, "clock lane polarity %u, pos %u\n",
2075 buscfg->bus.csi2.lanecfg.clk.pol,
2076 buscfg->bus.csi2.lanecfg.clk.pos);
2077
2078 for (i = 0; i < ISP_CSIPHY2_NUM_DATA_LANES; i++) {
2079 buscfg->bus.csi2.lanecfg.data[i].pos =
2080 vep.bus.mipi_csi2.data_lanes[i];
2081 buscfg->bus.csi2.lanecfg.data[i].pol =
2082 vep.bus.mipi_csi2.lane_polarities[i + 1];
2083 dev_dbg(dev, "data lane %u polarity %u, pos %u\n", i,
2084 buscfg->bus.csi2.lanecfg.data[i].pol,
2085 buscfg->bus.csi2.lanecfg.data[i].pos);
2086 }
2087
2088
2089
2090
2091
2092
2093 buscfg->bus.csi2.crc = 1;
2094 break;
2095
2096 default:
2097 dev_warn(dev, "%s: invalid interface %u\n", node->full_name,
2098 vep.base.port);
2099 break;
2100 }
2101
2102 return 0;
2103}
2104
2105static int isp_of_parse_nodes(struct device *dev,
2106 struct v4l2_async_notifier *notifier)
2107{
2108 struct device_node *node = NULL;
2109
2110 notifier->subdevs = devm_kcalloc(
2111 dev, ISP_MAX_SUBDEVS, sizeof(*notifier->subdevs), GFP_KERNEL);
2112 if (!notifier->subdevs)
2113 return -ENOMEM;
2114
2115 while (notifier->num_subdevs < ISP_MAX_SUBDEVS &&
2116 (node = of_graph_get_next_endpoint(dev->of_node, node))) {
2117 struct isp_async_subdev *isd;
2118
2119 isd = devm_kzalloc(dev, sizeof(*isd), GFP_KERNEL);
2120 if (!isd) {
2121 of_node_put(node);
2122 return -ENOMEM;
2123 }
2124
2125 notifier->subdevs[notifier->num_subdevs] = &isd->asd;
2126
2127 if (isp_of_parse_node(dev, node, isd)) {
2128 of_node_put(node);
2129 return -EINVAL;
2130 }
2131
2132 isd->asd.match.of.node = of_graph_get_remote_port_parent(node);
2133 of_node_put(node);
2134 if (!isd->asd.match.of.node) {
2135 dev_warn(dev, "bad remote port parent\n");
2136 return -EINVAL;
2137 }
2138
2139 isd->asd.match_type = V4L2_ASYNC_MATCH_OF;
2140 notifier->num_subdevs++;
2141 }
2142
2143 return notifier->num_subdevs;
2144}
2145
2146static int isp_subdev_notifier_bound(struct v4l2_async_notifier *async,
2147 struct v4l2_subdev *subdev,
2148 struct v4l2_async_subdev *asd)
2149{
2150 struct isp_async_subdev *isd =
2151 container_of(asd, struct isp_async_subdev, asd);
2152
2153 isd->sd = subdev;
2154 isd->sd->host_priv = &isd->bus;
2155
2156 return 0;
2157}
2158
2159static int isp_subdev_notifier_complete(struct v4l2_async_notifier *async)
2160{
2161 struct isp_device *isp = container_of(async, struct isp_device,
2162 notifier);
2163 struct v4l2_device *v4l2_dev = &isp->v4l2_dev;
2164 struct v4l2_subdev *sd;
2165 struct isp_bus_cfg *bus;
2166 int ret;
2167
2168 ret = media_entity_enum_init(&isp->crashed, &isp->media_dev);
2169 if (ret)
2170 return ret;
2171
2172 list_for_each_entry(sd, &v4l2_dev->subdevs, list) {
2173
2174 if (sd->host_priv) {
2175 bus = (struct isp_bus_cfg *)sd->host_priv;
2176 ret = isp_link_entity(isp, &sd->entity, bus->interface);
2177 if (ret < 0)
2178 return ret;
2179 }
2180 }
2181
2182 ret = v4l2_device_register_subdev_nodes(&isp->v4l2_dev);
2183 if (ret < 0)
2184 return ret;
2185
2186 return media_device_register(&isp->media_dev);
2187}
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200static int isp_probe(struct platform_device *pdev)
2201{
2202 struct isp_device *isp;
2203 struct resource *mem;
2204 int ret;
2205 int i, m;
2206
2207 isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL);
2208 if (!isp) {
2209 dev_err(&pdev->dev, "could not allocate memory\n");
2210 return -ENOMEM;
2211 }
2212
2213 ret = of_property_read_u32(pdev->dev.of_node, "ti,phy-type",
2214 &isp->phy_type);
2215 if (ret)
2216 return ret;
2217
2218 isp->syscon = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
2219 "syscon");
2220 if (IS_ERR(isp->syscon))
2221 return PTR_ERR(isp->syscon);
2222
2223 ret = of_property_read_u32_index(pdev->dev.of_node, "syscon", 1,
2224 &isp->syscon_offset);
2225 if (ret)
2226 return ret;
2227
2228 ret = isp_of_parse_nodes(&pdev->dev, &isp->notifier);
2229 if (ret < 0)
2230 return ret;
2231
2232 isp->autoidle = autoidle;
2233
2234 mutex_init(&isp->isp_mutex);
2235 spin_lock_init(&isp->stat_lock);
2236
2237 isp->dev = &pdev->dev;
2238 isp->ref_count = 0;
2239
2240 ret = dma_coerce_mask_and_coherent(isp->dev, DMA_BIT_MASK(32));
2241 if (ret)
2242 goto error;
2243
2244 platform_set_drvdata(pdev, isp);
2245
2246
2247 isp->isp_csiphy1.vdd = devm_regulator_get(&pdev->dev, "vdd-csiphy1");
2248 isp->isp_csiphy2.vdd = devm_regulator_get(&pdev->dev, "vdd-csiphy2");
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260 for (i = 0; i < 2; i++) {
2261 unsigned int map_idx = i ? OMAP3_ISP_IOMEM_CSI2A_REGS1 : 0;
2262
2263 mem = platform_get_resource(pdev, IORESOURCE_MEM, i);
2264 isp->mmio_base[map_idx] =
2265 devm_ioremap_resource(isp->dev, mem);
2266 if (IS_ERR(isp->mmio_base[map_idx]))
2267 return PTR_ERR(isp->mmio_base[map_idx]);
2268 }
2269
2270 ret = isp_get_clocks(isp);
2271 if (ret < 0)
2272 goto error;
2273
2274 ret = clk_enable(isp->clock[ISP_CLK_CAM_ICK]);
2275 if (ret < 0)
2276 goto error;
2277
2278 isp->revision = isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION);
2279 dev_info(isp->dev, "Revision %d.%d found\n",
2280 (isp->revision & 0xf0) >> 4, isp->revision & 0x0f);
2281
2282 clk_disable(isp->clock[ISP_CLK_CAM_ICK]);
2283
2284 if (__omap3isp_get(isp, false) == NULL) {
2285 ret = -ENODEV;
2286 goto error;
2287 }
2288
2289 ret = isp_reset(isp);
2290 if (ret < 0)
2291 goto error_isp;
2292
2293 ret = isp_xclk_init(isp);
2294 if (ret < 0)
2295 goto error_isp;
2296
2297
2298 for (m = 0; m < ARRAY_SIZE(isp_res_maps); m++)
2299 if (isp->revision == isp_res_maps[m].isp_rev)
2300 break;
2301
2302 if (m == ARRAY_SIZE(isp_res_maps)) {
2303 dev_err(isp->dev, "No resource map found for ISP rev %d.%d\n",
2304 (isp->revision & 0xf0) >> 4, isp->revision & 0xf);
2305 ret = -ENODEV;
2306 goto error_isp;
2307 }
2308
2309 for (i = 1; i < OMAP3_ISP_IOMEM_CSI2A_REGS1; i++)
2310 isp->mmio_base[i] =
2311 isp->mmio_base[0] + isp_res_maps[m].offset[i];
2312
2313 for (i = OMAP3_ISP_IOMEM_CSIPHY2; i < OMAP3_ISP_IOMEM_LAST; i++)
2314 isp->mmio_base[i] =
2315 isp->mmio_base[OMAP3_ISP_IOMEM_CSI2A_REGS1]
2316 + isp_res_maps[m].offset[i];
2317
2318 isp->mmio_hist_base_phys =
2319 mem->start + isp_res_maps[m].offset[OMAP3_ISP_IOMEM_HIST];
2320
2321
2322 ret = isp_attach_iommu(isp);
2323 if (ret < 0) {
2324 dev_err(&pdev->dev, "unable to attach to IOMMU\n");
2325 goto error_isp;
2326 }
2327
2328
2329 ret = platform_get_irq(pdev, 0);
2330 if (ret <= 0) {
2331 dev_err(isp->dev, "No IRQ resource\n");
2332 ret = -ENODEV;
2333 goto error_iommu;
2334 }
2335 isp->irq_num = ret;
2336
2337 if (devm_request_irq(isp->dev, isp->irq_num, isp_isr, IRQF_SHARED,
2338 "OMAP3 ISP", isp)) {
2339 dev_err(isp->dev, "Unable to request IRQ\n");
2340 ret = -EINVAL;
2341 goto error_iommu;
2342 }
2343
2344
2345 ret = isp_initialize_modules(isp);
2346 if (ret < 0)
2347 goto error_iommu;
2348
2349 ret = isp_register_entities(isp);
2350 if (ret < 0)
2351 goto error_modules;
2352
2353 ret = isp_create_links(isp);
2354 if (ret < 0)
2355 goto error_register_entities;
2356
2357 isp->notifier.bound = isp_subdev_notifier_bound;
2358 isp->notifier.complete = isp_subdev_notifier_complete;
2359
2360 ret = v4l2_async_notifier_register(&isp->v4l2_dev, &isp->notifier);
2361 if (ret)
2362 goto error_register_entities;
2363
2364 isp_core_init(isp, 1);
2365 omap3isp_put(isp);
2366
2367 return 0;
2368
2369error_register_entities:
2370 isp_unregister_entities(isp);
2371error_modules:
2372 isp_cleanup_modules(isp);
2373error_iommu:
2374 isp_detach_iommu(isp);
2375error_isp:
2376 isp_xclk_cleanup(isp);
2377 __omap3isp_put(isp, false);
2378error:
2379 mutex_destroy(&isp->isp_mutex);
2380
2381 return ret;
2382}
2383
2384static const struct dev_pm_ops omap3isp_pm_ops = {
2385 .prepare = isp_pm_prepare,
2386 .suspend = isp_pm_suspend,
2387 .resume = isp_pm_resume,
2388 .complete = isp_pm_complete,
2389};
2390
2391static struct platform_device_id omap3isp_id_table[] = {
2392 { "omap3isp", 0 },
2393 { },
2394};
2395MODULE_DEVICE_TABLE(platform, omap3isp_id_table);
2396
2397static const struct of_device_id omap3isp_of_table[] = {
2398 { .compatible = "ti,omap3-isp" },
2399 { },
2400};
2401MODULE_DEVICE_TABLE(of, omap3isp_of_table);
2402
2403static struct platform_driver omap3isp_driver = {
2404 .probe = isp_probe,
2405 .remove = isp_remove,
2406 .id_table = omap3isp_id_table,
2407 .driver = {
2408 .name = "omap3isp",
2409 .pm = &omap3isp_pm_ops,
2410 .of_match_table = omap3isp_of_table,
2411 },
2412};
2413
2414module_platform_driver(omap3isp_driver);
2415
2416MODULE_AUTHOR("Nokia Corporation");
2417MODULE_DESCRIPTION("TI OMAP3 ISP driver");
2418MODULE_LICENSE("GPL");
2419MODULE_VERSION(ISP_VIDEO_DRIVER_VERSION);
2420