Пример #1
0
Файл: csis.c Проект: SelfImp/m9
static int s3c_csis_remove(struct platform_device *pdev)
{
	s3c_csis_stop(pdev);
	kfree(s3c_csis);

	return 0;
}
Пример #2
0
static irqreturn_t s3c_csis_irq(int irq, void *dev_id)
{
	u32 cfg;

	struct platform_device *pdev = (struct platform_device *) dev_id;
	/* just clearing the pends */
	cfg = readl(s3c_csis[pdev->id]->regs + S3C_CSIS_INTSRC);
	writel(cfg, s3c_csis[pdev->id]->regs + S3C_CSIS_INTSRC);
	/* receiving non-image data is not error */
	cfg &= 0xFFFFFFFF;

#ifdef CONFIG_VIDEO_FIMC_MIPI_IRQ_DEBUG
	if (unlikely(cfg & S3C_CSIS_INTSRC_ERR)) {
		if (err_print_cnt < 30) {
			err("csis error interrupt[%d]: %#x\n", err_print_cnt, cfg);
			err_print_cnt++;
		}
	}
#endif

	if (unlikely(cfg & S3C_CSIS_INTSRC_ERR)) {
		err("csis error interrupt occured : %#x\n", cfg);
	}


#if !defined(CONFIG_MACH_U1) && !defined(CONFIG_MACH_PX) && !defined(CONFIG_MACH_ZEST) && !defined(CONFIG_MACH_KONA)
	/* Error Handling. If there is an error, we will reset camera sensor as if electric shock comes to the sensor,*/
	if (unlikely(cfg & S3C_CSIS_INTSRC_ERR_LOST_FS) ||
		unlikely(cfg & S3C_CSIS_INTSRC_ERR_LOST_FE)) {
		err("csis error interrupt occured FS | FE = 0x%x\n", cfg);
		s3c_csis_stop(pdev->id);
	}
#endif
	if(s3c_csis[pdev->id]->pktdata_enable) {
		if (unlikely(cfg & S3C_CSIS_INTSRC_NON_IMAGE_DATA)) {
			if (cfg & S3C_CSIS_INTSRC_EVEN_BEFORE) {
				/* printk(KERN_INFO "S3C_CSIS_INTSRC_EVEN_BEFORE\n"); */
				memcpy_fromio(s3c_csis[pdev->id]->bufs.pktdata,
					(s3c_csis[pdev->id]->regs + S3C_CSIS_PKTDATA_EVEN), CSIS_PKTSIZE);
			} else if (cfg & S3C_CSIS_INTSRC_EVEN_AFTER) {
				/* printk(KERN_INFO "S3C_CSIS_INTSRC_EVEN_AFTER\n"); */
				memcpy_fromio(s3c_csis[pdev->id]->bufs.pktdata,
					(s3c_csis[pdev->id]->regs + S3C_CSIS_PKTDATA_EVEN), CSIS_PKTSIZE);
			} else if (cfg & S3C_CSIS_INTSRC_ODD_BEFORE) {
				/* printk(KERN_INFO "S3C_CSIS_INTSRC_ODD_BEFORE\n"); */
				memcpy_fromio(s3c_csis[pdev->id]->bufs.pktdata,
					(s3c_csis[pdev->id]->regs + S3C_CSIS_PKTDATA_ODD), CSIS_PKTSIZE);
			} else if (cfg & S3C_CSIS_INTSRC_ODD_AFTER) {
				/* printk(KERN_INFO "S3C_CSIS_INTSRC_ODD_AFTER\n"); */
				memcpy_fromio(s3c_csis[pdev->id]->bufs.pktdata,
					(s3c_csis[pdev->id]->regs + S3C_CSIS_PKTDATA_ODD), CSIS_PKTSIZE);
			}
			/* printk(KERN_INFO "0x%x\n", s3c_csis[pdev->id]->bufs.pktdata[0x2c/4]); */
			/* printk(KERN_INFO "0x%x\n", s3c_csis[pdev->id]->bufs.pktdata[0x30/4]); */
		}
	}

	return IRQ_HANDLED;
}
Пример #3
0
static int s3c_csis_remove(struct platform_device *pdev)
{
	s3c_csis_stop(pdev->id);

	free_irq(s3c_csis[pdev->id]->irq, s3c_csis[pdev->id]);
	iounmap(s3c_csis[pdev->id]->regs);
	release_resource(s3c_csis[pdev->id]->regs_res);

	kfree(s3c_csis[pdev->id]);

	return 0;
}