Lines Matching refs:isi
98 static void isi_writel(struct atmel_isi *isi, u32 reg, u32 val) in isi_writel() argument
100 writel(val, isi->regs + reg); in isi_writel()
102 static u32 isi_readl(struct atmel_isi *isi, u32 reg) in isi_readl() argument
104 return readl(isi->regs + reg); in isi_readl()
107 static int configure_geometry(struct atmel_isi *isi, u32 width, in configure_geometry() argument
134 isi_writel(isi, ISI_CTRL, ISI_CTRL_DIS); in configure_geometry()
136 cfg2 = isi_readl(isi, ISI_CFG2); in configure_geometry()
148 isi_writel(isi, ISI_CFG2, cfg2); in configure_geometry()
153 static irqreturn_t atmel_isi_handle_streaming(struct atmel_isi *isi) in atmel_isi_handle_streaming() argument
155 if (isi->active) { in atmel_isi_handle_streaming()
156 struct vb2_buffer *vb = &isi->active->vb; in atmel_isi_handle_streaming()
157 struct frame_buffer *buf = isi->active; in atmel_isi_handle_streaming()
161 vb->v4l2_buf.sequence = isi->sequence++; in atmel_isi_handle_streaming()
165 if (list_empty(&isi->video_buffer_list)) { in atmel_isi_handle_streaming()
166 isi->active = NULL; in atmel_isi_handle_streaming()
169 isi->active = list_entry(isi->video_buffer_list.next, in atmel_isi_handle_streaming()
171 isi_writel(isi, ISI_DMA_C_DSCR, in atmel_isi_handle_streaming()
172 (u32)isi->active->p_dma_desc->fbd_phys); in atmel_isi_handle_streaming()
173 isi_writel(isi, ISI_DMA_C_CTRL, in atmel_isi_handle_streaming()
175 isi_writel(isi, ISI_DMA_CHER, ISI_DMA_CHSR_C_CH); in atmel_isi_handle_streaming()
183 struct atmel_isi *isi = dev_id; in isi_interrupt() local
187 spin_lock(&isi->lock); in isi_interrupt()
189 status = isi_readl(isi, ISI_STATUS); in isi_interrupt()
190 mask = isi_readl(isi, ISI_INTMASK); in isi_interrupt()
194 complete(&isi->complete); in isi_interrupt()
195 isi_writel(isi, ISI_INTDIS, ISI_CTRL_SRST); in isi_interrupt()
198 complete(&isi->complete); in isi_interrupt()
199 isi_writel(isi, ISI_INTDIS, ISI_CTRL_DIS); in isi_interrupt()
203 ret = atmel_isi_handle_streaming(isi); in isi_interrupt()
206 spin_unlock(&isi->lock); in isi_interrupt()
212 static int atmel_isi_wait_status(struct atmel_isi *isi, int wait_reset) in atmel_isi_wait_status() argument
219 init_completion(&isi->complete); in atmel_isi_wait_status()
222 isi_writel(isi, ISI_INTEN, ISI_CTRL_SRST); in atmel_isi_wait_status()
223 isi_writel(isi, ISI_CTRL, ISI_CTRL_SRST); in atmel_isi_wait_status()
225 isi_writel(isi, ISI_INTEN, ISI_CTRL_DIS); in atmel_isi_wait_status()
226 isi_writel(isi, ISI_CTRL, ISI_CTRL_DIS); in atmel_isi_wait_status()
229 timeout = wait_for_completion_timeout(&isi->complete, in atmel_isi_wait_status()
246 struct atmel_isi *isi = ici->priv; in queue_setup() local
259 alloc_ctxs[0] = isi->alloc_ctx; in queue_setup()
261 isi->sequence = 0; in queue_setup()
262 isi->active = NULL; in queue_setup()
285 struct atmel_isi *isi = ici->priv; in buffer_prepare() local
300 if (list_empty(&isi->dma_desc_head)) { in buffer_prepare()
305 desc = list_entry(isi->dma_desc_head.next, in buffer_prepare()
326 struct atmel_isi *isi = ici->priv; in buffer_cleanup() local
331 list_add(&buf->p_dma_desc->list, &isi->dma_desc_head); in buffer_cleanup()
334 static void start_dma(struct atmel_isi *isi, struct frame_buffer *buffer) in start_dma() argument
338 cfg1 = isi_readl(isi, ISI_CFG1); in start_dma()
340 isi_writel(isi, ISI_INTEN, in start_dma()
344 if (isi_readl(isi, ISI_STATUS) & ISI_CTRL_CDC) { in start_dma()
345 dev_err(isi->soc_host.icd->parent, "Already in frame handling.\n"); in start_dma()
349 isi_writel(isi, ISI_DMA_C_DSCR, (u32)buffer->p_dma_desc->fbd_phys); in start_dma()
350 isi_writel(isi, ISI_DMA_C_CTRL, ISI_DMA_CTRL_FETCH | ISI_DMA_CTRL_DONE); in start_dma()
351 isi_writel(isi, ISI_DMA_CHER, ISI_DMA_CHSR_C_CH); in start_dma()
355 cfg1 |= isi->pdata.frate | ISI_CFG1_DISCR; in start_dma()
359 isi_writel(isi, ISI_CTRL, ctrl); in start_dma()
360 isi_writel(isi, ISI_CFG1, cfg1); in start_dma()
367 struct atmel_isi *isi = ici->priv; in buffer_queue() local
371 spin_lock_irqsave(&isi->lock, flags); in buffer_queue()
372 list_add_tail(&buf->list, &isi->video_buffer_list); in buffer_queue()
374 if (isi->active == NULL) { in buffer_queue()
375 isi->active = buf; in buffer_queue()
377 start_dma(isi, buf); in buffer_queue()
379 spin_unlock_irqrestore(&isi->lock, flags); in buffer_queue()
386 struct atmel_isi *isi = ici->priv; in start_streaming() local
390 ret = atmel_isi_wait_status(isi, WAIT_ISI_RESET); in start_streaming()
396 isi_writel(isi, ISI_INTDIS, (u32)~0UL); in start_streaming()
398 spin_lock_irq(&isi->lock); in start_streaming()
400 isi_readl(isi, ISI_STATUS); in start_streaming()
403 start_dma(isi, isi->active); in start_streaming()
404 spin_unlock_irq(&isi->lock); in start_streaming()
414 struct atmel_isi *isi = ici->priv; in stop_streaming() local
419 spin_lock_irq(&isi->lock); in stop_streaming()
420 isi->active = NULL; in stop_streaming()
422 list_for_each_entry_safe(buf, node, &isi->video_buffer_list, list) { in stop_streaming()
426 spin_unlock_irq(&isi->lock); in stop_streaming()
430 while ((isi_readl(isi, ISI_STATUS) & ISI_CTRL_CDC) && in stop_streaming()
441 isi_writel(isi, ISI_INTDIS, in stop_streaming()
445 ret = atmel_isi_wait_status(isi, WAIT_ISI_DISABLE); in stop_streaming()
486 struct atmel_isi *isi = ici->priv; in isi_camera_set_fmt() local
516 ret = configure_geometry(isi, pix->width, pix->height, xlate->code); in isi_camera_set_fmt()
619 struct atmel_isi *isi = ici->priv; in isi_camera_try_bus_param() local
638 if ((1 << (buswidth - 1)) & isi->width_flags) in isi_camera_try_bus_param()
726 struct atmel_isi *isi = ici->priv; in isi_camera_clock_start() local
729 ret = clk_prepare_enable(isi->pclk); in isi_camera_clock_start()
733 if (!IS_ERR(isi->mck)) { in isi_camera_clock_start()
734 ret = clk_prepare_enable(isi->mck); in isi_camera_clock_start()
736 clk_disable_unprepare(isi->pclk); in isi_camera_clock_start()
747 struct atmel_isi *isi = ici->priv; in isi_camera_clock_stop() local
749 if (!IS_ERR(isi->mck)) in isi_camera_clock_stop()
750 clk_disable_unprepare(isi->mck); in isi_camera_clock_stop()
751 clk_disable_unprepare(isi->pclk); in isi_camera_clock_stop()
776 struct atmel_isi *isi = ici->priv; in isi_camera_set_bus_param() local
803 if (isi->pdata.hsync_act_low) in isi_camera_set_bus_param()
811 if (isi->pdata.vsync_act_low) in isi_camera_set_bus_param()
819 if (isi->pdata.pclk_act_falling) in isi_camera_set_bus_param()
841 if (isi->pdata.has_emb_sync) in isi_camera_set_bus_param()
843 if (isi->pdata.full_mode) in isi_camera_set_bus_param()
848 isi_writel(isi, ISI_CTRL, ISI_CTRL_DIS); in isi_camera_set_bus_param()
849 isi_writel(isi, ISI_CFG1, cfg1); in isi_camera_set_bus_param()
873 struct atmel_isi *isi = container_of(soc_host, in atmel_isi_remove() local
877 vb2_dma_contig_cleanup_ctx(isi->alloc_ctx); in atmel_isi_remove()
880 isi->p_fb_descriptors, in atmel_isi_remove()
881 isi->fb_descriptors_phys); in atmel_isi_remove()
886 static int atmel_isi_probe_dt(struct atmel_isi *isi, in atmel_isi_probe_dt() argument
894 isi->pdata.full_mode = 1; in atmel_isi_probe_dt()
895 isi->pdata.mck_hz = ISI_DEFAULT_MCLK_FREQ; in atmel_isi_probe_dt()
896 isi->pdata.frate = ISI_CFG1_FRATE_CAPTURE_ALL; in atmel_isi_probe_dt()
912 isi->pdata.data_width_flags = ISI_DATAWIDTH_8; in atmel_isi_probe_dt()
915 isi->pdata.data_width_flags = in atmel_isi_probe_dt()
934 struct atmel_isi *isi; in atmel_isi_probe() local
948 isi = devm_kzalloc(&pdev->dev, sizeof(struct atmel_isi), GFP_KERNEL); in atmel_isi_probe()
949 if (!isi) { in atmel_isi_probe()
954 isi->pclk = devm_clk_get(&pdev->dev, "isi_clk"); in atmel_isi_probe()
955 if (IS_ERR(isi->pclk)) in atmel_isi_probe()
956 return PTR_ERR(isi->pclk); in atmel_isi_probe()
959 memcpy(&isi->pdata, pdata, sizeof(isi->pdata)); in atmel_isi_probe()
961 ret = atmel_isi_probe_dt(isi, pdev); in atmel_isi_probe()
966 isi->active = NULL; in atmel_isi_probe()
967 spin_lock_init(&isi->lock); in atmel_isi_probe()
968 INIT_LIST_HEAD(&isi->video_buffer_list); in atmel_isi_probe()
969 INIT_LIST_HEAD(&isi->dma_desc_head); in atmel_isi_probe()
976 isi->mck = devm_clk_get(dev, "isi_mck"); in atmel_isi_probe()
977 if (!IS_ERR(isi->mck)) { in atmel_isi_probe()
981 ret = clk_set_rate(isi->mck, isi->pdata.mck_hz); in atmel_isi_probe()
986 isi->p_fb_descriptors = dma_alloc_coherent(&pdev->dev, in atmel_isi_probe()
988 &isi->fb_descriptors_phys, in atmel_isi_probe()
990 if (!isi->p_fb_descriptors) { in atmel_isi_probe()
996 isi->dma_desc[i].p_fbd = isi->p_fb_descriptors + i; in atmel_isi_probe()
997 isi->dma_desc[i].fbd_phys = isi->fb_descriptors_phys + in atmel_isi_probe()
999 list_add(&isi->dma_desc[i].list, &isi->dma_desc_head); in atmel_isi_probe()
1002 isi->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); in atmel_isi_probe()
1003 if (IS_ERR(isi->alloc_ctx)) { in atmel_isi_probe()
1004 ret = PTR_ERR(isi->alloc_ctx); in atmel_isi_probe()
1009 isi->regs = devm_ioremap_resource(&pdev->dev, regs); in atmel_isi_probe()
1010 if (IS_ERR(isi->regs)) { in atmel_isi_probe()
1011 ret = PTR_ERR(isi->regs); in atmel_isi_probe()
1015 if (isi->pdata.data_width_flags & ISI_DATAWIDTH_8) in atmel_isi_probe()
1016 isi->width_flags = 1 << 7; in atmel_isi_probe()
1017 if (isi->pdata.data_width_flags & ISI_DATAWIDTH_10) in atmel_isi_probe()
1018 isi->width_flags |= 1 << 9; in atmel_isi_probe()
1020 isi_writel(isi, ISI_CTRL, ISI_CTRL_DIS); in atmel_isi_probe()
1028 ret = devm_request_irq(&pdev->dev, irq, isi_interrupt, 0, "isi", isi); in atmel_isi_probe()
1033 isi->irq = irq; in atmel_isi_probe()
1035 soc_host = &isi->soc_host; in atmel_isi_probe()
1038 soc_host->priv = isi; in atmel_isi_probe()
1042 if (isi->pdata.asd_sizes) { in atmel_isi_probe()
1043 soc_host->asd = isi->pdata.asd; in atmel_isi_probe()
1044 soc_host->asd_sizes = isi->pdata.asd_sizes; in atmel_isi_probe()
1057 vb2_dma_contig_cleanup_ctx(isi->alloc_ctx); in atmel_isi_probe()
1061 isi->p_fb_descriptors, in atmel_isi_probe()
1062 isi->fb_descriptors_phys); in atmel_isi_probe()