Hi, JC

>> +struct atmel_isi;
> do we really this here?
Not really. I'll remove this.

>> +
>> [snip]
>>  
>>  if VIDEO_CAPTURE_DRIVERS && VIDEO_V4L2
>> +config VIDEO_ATMEL_ISI
>> +    tristate "ATMEL Image Sensor Interface (ISI) support"
>> +    depends on VIDEO_DEV && SOC_CAMERA
> depends on AT91 if the drivers is at91 specific or avr32 otherwise
I'll add that. I think now it is only supported AT91. I am not sure for the 
AVR32 part

>> +    select VIDEOBUF2_DMA_CONTIG
>> +    default n
> it's n by default  please remove
I'll change that.

>> [snip]
>> +
>> +/* Frame buffer descriptor
>> + *  Used by the ISI module as a linked list for the DMA controller.
>> + */
>> +struct fbd {
>> +    /* Physical address of the frame buffer */
>> +    u32 fb_address;
>> +#if defined(CONFIG_ARCH_AT91SAM9G45) ||\
>> +    defined(CONFIG_ARCH_AT91SAM9X5)
>> +    /* DMA Control Register(only in HISI2) */
>> +    u32 dma_ctrl;
>> +#endif
> no ifdef in the struct
I'll remove this #if. I think for the non-HISI2 version, like AT91SAM9263, we 
should define another FBD structure which not includes dma_ctrl.

>> +    /* Physical address of the next fbd */
>> +    u32 next_fbd_address;
>> +};
>> +
>> +#if defined(CONFIG_ARCH_AT91SAM9G45) ||\
>> +    defined(CONFIG_ARCH_AT91SAM9X5)
>> +static void set_dma_ctrl(struct fbd *fb_desc, u32 ctrl) {
>> +    fb_desc->dma_ctrl = ctrl;
>> +}
>> +#else
>> +static void set_dma_ctrl(struct fbd *fb_desc, u32 ctrl) { } #endif
> no ifdef here also as we want to have multi soc support
I'll remove this #if also.

>> [snip]
>> +    /* State of the ISI module in capturing mode */
>> +    int                             state;
>> +
>> +    /* Capture/streaming wait queue for waiting for SOF */
>> +    wait_queue_head_t               capture_wq;
>> +
>> +    struct v4l2_device              v4l2_dev;
>> +
>> +    struct vb2_alloc_ctx            *alloc_ctx;
>> +
>> +    struct clk                      *pclk;
>> +    struct platform_device          *pdev;
> do you really need to store the pdev?
I'll remove this. It is no use.

>> +    unsigned int                    irq;
>> +
>> +    struct isi_platform_data        *pdata;
>> +    unsigned long                   platform_flags;
>> +
>> +    struct list_head                video_buffer_list;
>> +    struct frame_buffer             *active;
>> +
>> +    struct soc_camera_device        *icd;
>> +    struct soc_camera_host          soc_host;
>> +};
>> +
>> +static int configure_geometry(struct atmel_isi *isi, u32 width,
>> +                    u32 height, enum v4l2_mbus_pixelcode code) {
>> +    u32 cfg2, cr, ctrl;
>> +
>> +    cr = 0;
> please move this in default
I'll remove this cr line. Seems it is not needed. cr will be initialized by the 
following code.

>> [snip]
>> +
>> +    size = bytes_per_line * icd->user_height;
>> +
>> +    if (0 == *nbuffers)
> please invert the test
I'll fix it.

>> +            *nbuffers = MAX_BUFFER_NUMS;
>> +    if (*nbuffers > MAX_BUFFER_NUMS)
>> +            *nbuffers = MAX_BUFFER_NUMS;
>> +
>> +    while (size * *nbuffers > vid_limit * 1024 * 1024)
>> +            (*nbuffers)--;
>> +
>> +    *nplanes = 1;
>> +    sizes[0] = size;
>> +    alloc_ctxs[0] = dev->alloc_ctx;
>> +
>> +    dev->sequence = 0;
>> +    dev->active = NULL;
>> +
>> +    dev_dbg(icd->dev.parent, "%s, count=%d, size=%ld\n", __func__,
>> +            *nbuffers, size);
>> +
>> +    return 0;
>> +}
>> +
>> +
>> +static void start_dma(struct atmel_isi *isi, struct frame_buffer 
>> +*buffer) {
>> +    u32 ctrl, cfg1;
> please add ine ligne here
OK. I'll change that.

>> +    ctrl = isi_readl(isi, V2_CTRL);
>> +    cfg1 = isi_readl(isi, V2_CFG1);
>> +    /* Enable irq: cxfr for the codec path, pxfr for the preview path */
>> +    isi_writel(isi, V2_INTEN,
>> +                    ISI_BIT(V2_CXFR_DONE) | ISI_BIT(V2_PXFR_DONE));
>> +
>> +    /* Enable codec path */
>> +    ctrl |= ISI_BIT(V2_CDC);
>> +    /* Check if already in a frame */
>> +    while (isi_readl(isi, V2_STATUS) & ISI_BIT(V2_CDC))
>> +            cpu_relax();
> no timeout?
I'll add time out code and test it.

>> +
>> +    /* Write the address of the first frame buffer in the C_ADDR reg
>> +    * write the address of the first descriptor(link list of buffer)
>> +    * in the C_DSCR reg, and enable dma channel.
>> +    */
>> +    isi_writel(isi, V2_DMA_C_DSCR, (__pa(&(buffer->fb_desc))));
>> +    isi_writel(isi, V2_DMA_C_CTRL,
>> +                    ISI_BIT(V2_DMA_FETCH) | ISI_BIT(V2_DMA_DONE));
>> +    isi_writel(isi, V2_DMA_CHER, ISI_BIT(V2_DMA_C_CH_EN));
>> +
>> +    /* Enable linked list */
>> +    cfg1 |= ISI_BF(V2_FRATE, isi->pdata->frate) | ISI_BIT(V2_DISCR);
>> +
>> +    /* Enable ISI module*/
>> +    ctrl |= ISI_BIT(V2_ENABLE);
>> +    isi_writel(isi, V2_CTRL, ctrl);
>> +    isi_writel(isi, V2_CFG1, cfg1);
>> +}
>> +
>> +
>> +/* abort streaming and wait for last buffer */ static int 
>> +stop_streaming(struct vb2_queue *vq) {
>> +    struct soc_camera_device *icd = soc_camera_from_vb2q(vq);
>> +    struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
>> +    struct atmel_isi *isi = ici->priv;
>> +
>> +    spin_lock_irq(&isi->lock);
>> +    isi->still_capture = 0;
>> +    isi->active = NULL;
>> +
>> +    while (isi_readl(isi, V2_STATUS) & ISI_BIT(V2_CDC))
>> +            cpu_relax();
> ditto
I'll fix it too.

>> +
>> +    /* Disble codec path */
>> +    isi_writel(isi, V2_CTRL, isi_readl(isi, V2_CTRL) & (~ISI_BIT(V2_CDC)));
>> +    /* Disable interrupts */
>> +    isi_writel(isi, V2_INTDIS,
>> +                    ISI_BIT(V2_CXFR_DONE) | ISI_BIT(V2_PXFR_DONE));
>> +    /* Disable ISI module*/
>> +    isi_writel(isi, V2_CTRL, isi_readl(isi, V2_CTRL) | ISI_BIT(V2_DIS));
>> +

>> +
>> +static int __init atmel_isi_probe(struct platform_device *pdev) {
>> +    unsigned int irq;
>> +    struct atmel_isi *isi;
>> +    struct clk *pclk;
>> +    struct resource *regs;
>> +    int ret;
>> +    struct device *dev = &pdev->dev;
>> +    struct isi_platform_data *pdata;
>> +    struct soc_camera_host *soc_host;
>> +
>> +    regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>> +    if (!regs)
>> +            return -ENXIO;
>> +
>> +    pclk = clk_get(&pdev->dev, "isi_clk");
>> +    if (IS_ERR(pclk))
>> +            return PTR_ERR(pclk);
>> +
>> +    clk_enable(pclk);
> do we really need to always enable the clock?
> normally we need to enable it just when we use the device and disable asap
Yes, you are right. I will move such code to the 
camera_add_device/camera_remove_device functions

> do you plane toadd the pm?
You mean the power resume/suspend function for ISI, right? Not planned yet. But 
if I have time I will try this.

Thank you for the comments. I will fix it in V2 patch.

Best Regards,
Josh Wu
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to