Lines Matching refs:isi
97 static void isi_writel(struct atmel_isi *isi, u32 reg, u32 val) in isi_writel() argument
99 writel(val, isi->regs + reg); in isi_writel()
101 static u32 isi_readl(struct atmel_isi *isi, u32 reg) in isi_readl() argument
103 return readl(isi->regs + reg); in isi_readl()
106 static void configure_geometry(struct atmel_isi *isi, u32 width, in configure_geometry() argument
134 isi_writel(isi, ISI_CTRL, ISI_CTRL_DIS); in configure_geometry()
141 isi_writel(isi, ISI_CFG2, cfg2); in configure_geometry()
161 static irqreturn_t atmel_isi_handle_streaming(struct atmel_isi *isi) in atmel_isi_handle_streaming() argument
163 if (isi->active) { in atmel_isi_handle_streaming()
164 struct vb2_v4l2_buffer *vbuf = &isi->active->vb; in atmel_isi_handle_streaming()
165 struct frame_buffer *buf = isi->active; in atmel_isi_handle_streaming()
169 vbuf->sequence = isi->sequence++; in atmel_isi_handle_streaming()
173 if (list_empty(&isi->video_buffer_list)) { in atmel_isi_handle_streaming()
174 isi->active = NULL; in atmel_isi_handle_streaming()
177 isi->active = list_entry(isi->video_buffer_list.next, in atmel_isi_handle_streaming()
179 isi_writel(isi, ISI_DMA_C_DSCR, in atmel_isi_handle_streaming()
180 (u32)isi->active->p_dma_desc->fbd_phys); in atmel_isi_handle_streaming()
181 isi_writel(isi, ISI_DMA_C_CTRL, in atmel_isi_handle_streaming()
183 isi_writel(isi, ISI_DMA_CHER, ISI_DMA_CHSR_C_CH); in atmel_isi_handle_streaming()
191 struct atmel_isi *isi = dev_id; in isi_interrupt() local
195 spin_lock(&isi->lock); in isi_interrupt()
197 status = isi_readl(isi, ISI_STATUS); in isi_interrupt()
198 mask = isi_readl(isi, ISI_INTMASK); in isi_interrupt()
202 complete(&isi->complete); in isi_interrupt()
203 isi_writel(isi, ISI_INTDIS, ISI_CTRL_SRST); in isi_interrupt()
206 complete(&isi->complete); in isi_interrupt()
207 isi_writel(isi, ISI_INTDIS, ISI_CTRL_DIS); in isi_interrupt()
211 ret = atmel_isi_handle_streaming(isi); in isi_interrupt()
214 spin_unlock(&isi->lock); in isi_interrupt()
220 static int atmel_isi_wait_status(struct atmel_isi *isi, int wait_reset) in atmel_isi_wait_status() argument
227 init_completion(&isi->complete); in atmel_isi_wait_status()
230 isi_writel(isi, ISI_INTEN, ISI_CTRL_SRST); in atmel_isi_wait_status()
231 isi_writel(isi, ISI_CTRL, ISI_CTRL_SRST); in atmel_isi_wait_status()
233 isi_writel(isi, ISI_INTEN, ISI_CTRL_DIS); in atmel_isi_wait_status()
234 isi_writel(isi, ISI_CTRL, ISI_CTRL_DIS); in atmel_isi_wait_status()
237 timeout = wait_for_completion_timeout(&isi->complete, in atmel_isi_wait_status()
254 struct atmel_isi *isi = ici->priv; in queue_setup() local
267 alloc_ctxs[0] = isi->alloc_ctx; in queue_setup()
269 isi->sequence = 0; in queue_setup()
270 isi->active = NULL; in queue_setup()
295 struct atmel_isi *isi = ici->priv; in buffer_prepare() local
310 if (list_empty(&isi->dma_desc_head)) { in buffer_prepare()
315 desc = list_entry(isi->dma_desc_head.next, in buffer_prepare()
337 struct atmel_isi *isi = ici->priv; in buffer_cleanup() local
342 list_add(&buf->p_dma_desc->list, &isi->dma_desc_head); in buffer_cleanup()
345 static void start_dma(struct atmel_isi *isi, struct frame_buffer *buffer) in start_dma() argument
349 cfg1 = isi_readl(isi, ISI_CFG1); in start_dma()
351 isi_writel(isi, ISI_INTEN, in start_dma()
355 if (isi_readl(isi, ISI_STATUS) & ISI_CTRL_CDC) { in start_dma()
356 dev_err(isi->soc_host.icd->parent, "Already in frame handling.\n"); in start_dma()
360 isi_writel(isi, ISI_DMA_C_DSCR, (u32)buffer->p_dma_desc->fbd_phys); in start_dma()
361 isi_writel(isi, ISI_DMA_C_CTRL, ISI_DMA_CTRL_FETCH | ISI_DMA_CTRL_DONE); in start_dma()
362 isi_writel(isi, ISI_DMA_CHER, ISI_DMA_CHSR_C_CH); in start_dma()
366 cfg1 |= isi->pdata.frate | ISI_CFG1_DISCR; in start_dma()
370 isi_writel(isi, ISI_CTRL, ctrl); in start_dma()
371 isi_writel(isi, ISI_CFG1, cfg1); in start_dma()
379 struct atmel_isi *isi = ici->priv; in buffer_queue() local
383 spin_lock_irqsave(&isi->lock, flags); in buffer_queue()
384 list_add_tail(&buf->list, &isi->video_buffer_list); in buffer_queue()
386 if (isi->active == NULL) { in buffer_queue()
387 isi->active = buf; in buffer_queue()
389 start_dma(isi, buf); in buffer_queue()
391 spin_unlock_irqrestore(&isi->lock, flags); in buffer_queue()
398 struct atmel_isi *isi = ici->priv; in start_streaming() local
404 ret = atmel_isi_wait_status(isi, WAIT_ISI_RESET); in start_streaming()
411 isi_writel(isi, ISI_INTDIS, (u32)~0UL); in start_streaming()
413 configure_geometry(isi, icd->user_width, icd->user_height, in start_streaming()
416 spin_lock_irq(&isi->lock); in start_streaming()
418 isi_readl(isi, ISI_STATUS); in start_streaming()
421 start_dma(isi, isi->active); in start_streaming()
422 spin_unlock_irq(&isi->lock); in start_streaming()
432 struct atmel_isi *isi = ici->priv; in stop_streaming() local
437 spin_lock_irq(&isi->lock); in stop_streaming()
438 isi->active = NULL; in stop_streaming()
440 list_for_each_entry_safe(buf, node, &isi->video_buffer_list, list) { in stop_streaming()
444 spin_unlock_irq(&isi->lock); in stop_streaming()
448 while ((isi_readl(isi, ISI_STATUS) & ISI_CTRL_CDC) && in stop_streaming()
457 isi_writel(isi, ISI_INTDIS, in stop_streaming()
461 ret = atmel_isi_wait_status(isi, WAIT_ISI_DISABLE); in stop_streaming()
646 struct atmel_isi *isi = ici->priv; in isi_camera_try_bus_param() local
665 if ((1 << (buswidth - 1)) & isi->width_flags) in isi_camera_try_bus_param()
775 struct atmel_isi *isi = ici->priv; in isi_camera_set_bus_param() local
802 if (isi->pdata.hsync_act_low) in isi_camera_set_bus_param()
810 if (isi->pdata.vsync_act_low) in isi_camera_set_bus_param()
818 if (isi->pdata.pclk_act_falling) in isi_camera_set_bus_param()
845 if (isi->pdata.has_emb_sync) in isi_camera_set_bus_param()
847 if (isi->pdata.full_mode) in isi_camera_set_bus_param()
855 isi_writel(isi, ISI_CTRL, ISI_CTRL_DIS); in isi_camera_set_bus_param()
856 isi_writel(isi, ISI_CFG1, cfg1); in isi_camera_set_bus_param()
880 struct atmel_isi *isi = container_of(soc_host, in atmel_isi_remove() local
884 vb2_dma_contig_cleanup_ctx(isi->alloc_ctx); in atmel_isi_remove()
887 isi->p_fb_descriptors, in atmel_isi_remove()
888 isi->fb_descriptors_phys); in atmel_isi_remove()
894 static int atmel_isi_parse_dt(struct atmel_isi *isi, in atmel_isi_parse_dt() argument
902 isi->pdata.full_mode = 1; in atmel_isi_parse_dt()
903 isi->pdata.frate = ISI_CFG1_FRATE_CAPTURE_ALL; in atmel_isi_parse_dt()
920 isi->pdata.data_width_flags = ISI_DATAWIDTH_8; in atmel_isi_parse_dt()
923 isi->pdata.data_width_flags = in atmel_isi_parse_dt()
933 isi->pdata.hsync_act_low = true; in atmel_isi_parse_dt()
935 isi->pdata.vsync_act_low = true; in atmel_isi_parse_dt()
937 isi->pdata.pclk_act_falling = true; in atmel_isi_parse_dt()
940 isi->pdata.has_emb_sync = true; in atmel_isi_parse_dt()
948 struct atmel_isi *isi; in atmel_isi_probe() local
953 isi = devm_kzalloc(&pdev->dev, sizeof(struct atmel_isi), GFP_KERNEL); in atmel_isi_probe()
954 if (!isi) { in atmel_isi_probe()
959 isi->pclk = devm_clk_get(&pdev->dev, "isi_clk"); in atmel_isi_probe()
960 if (IS_ERR(isi->pclk)) in atmel_isi_probe()
961 return PTR_ERR(isi->pclk); in atmel_isi_probe()
963 ret = atmel_isi_parse_dt(isi, pdev); in atmel_isi_probe()
967 isi->active = NULL; in atmel_isi_probe()
968 spin_lock_init(&isi->lock); in atmel_isi_probe()
969 INIT_LIST_HEAD(&isi->video_buffer_list); in atmel_isi_probe()
970 INIT_LIST_HEAD(&isi->dma_desc_head); in atmel_isi_probe()
972 isi->p_fb_descriptors = dma_alloc_coherent(&pdev->dev, in atmel_isi_probe()
974 &isi->fb_descriptors_phys, in atmel_isi_probe()
976 if (!isi->p_fb_descriptors) { in atmel_isi_probe()
982 isi->dma_desc[i].p_fbd = isi->p_fb_descriptors + i; in atmel_isi_probe()
983 isi->dma_desc[i].fbd_phys = isi->fb_descriptors_phys + in atmel_isi_probe()
985 list_add(&isi->dma_desc[i].list, &isi->dma_desc_head); in atmel_isi_probe()
988 isi->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); in atmel_isi_probe()
989 if (IS_ERR(isi->alloc_ctx)) { in atmel_isi_probe()
990 ret = PTR_ERR(isi->alloc_ctx); in atmel_isi_probe()
995 isi->regs = devm_ioremap_resource(&pdev->dev, regs); in atmel_isi_probe()
996 if (IS_ERR(isi->regs)) { in atmel_isi_probe()
997 ret = PTR_ERR(isi->regs); in atmel_isi_probe()
1001 if (isi->pdata.data_width_flags & ISI_DATAWIDTH_8) in atmel_isi_probe()
1002 isi->width_flags = 1 << 7; in atmel_isi_probe()
1003 if (isi->pdata.data_width_flags & ISI_DATAWIDTH_10) in atmel_isi_probe()
1004 isi->width_flags |= 1 << 9; in atmel_isi_probe()
1012 ret = devm_request_irq(&pdev->dev, irq, isi_interrupt, 0, "isi", isi); in atmel_isi_probe()
1017 isi->irq = irq; in atmel_isi_probe()
1019 soc_host = &isi->soc_host; in atmel_isi_probe()
1022 soc_host->priv = isi; in atmel_isi_probe()
1040 vb2_dma_contig_cleanup_ctx(isi->alloc_ctx); in atmel_isi_probe()
1044 isi->p_fb_descriptors, in atmel_isi_probe()
1045 isi->fb_descriptors_phys); in atmel_isi_probe()
1054 struct atmel_isi *isi = container_of(soc_host, in atmel_isi_runtime_suspend() local
1057 clk_disable_unprepare(isi->pclk); in atmel_isi_runtime_suspend()
1064 struct atmel_isi *isi = container_of(soc_host, in atmel_isi_runtime_resume() local
1067 return clk_prepare_enable(isi->pclk); in atmel_isi_runtime_resume()