static int jpeg_probe(struct platform_device *pdev) { struct class_device; int ret; struct class_device *class_dev = NULL; printk("jpeg driver probe\n"); ret = alloc_chrdev_region(&jpeg_devno, 0, 1, JPEG_DEVNAME); if(ret) { printk("Error: Can't Get Major number for JPEG Device\n"); } else { printk("Get JPEG Device Major number (%d)\n", jpeg_devno); } jpeg_cdev = cdev_alloc(); jpeg_cdev->owner = THIS_MODULE; jpeg_cdev->ops = &jpeg_fops; ret = cdev_add(jpeg_cdev, jpeg_devno, 1); jpeg_class = class_create(THIS_MODULE, JPEG_DEVNAME); class_dev = (struct class_device *)device_create(jpeg_class, NULL, jpeg_devno, NULL, JPEG_DEVNAME); spin_lock_init(&jpeg_dec_lock); spin_lock_init(&jpeg_enc_lock); // initial codec, register codec ISR dec_status = 0; enc_status = 0; _jpeg_dec_int_status = 0; _jpeg_enc_int_status = 0; init_waitqueue_head(&dec_wait_queue); init_waitqueue_head(&enc_wait_queue); mt6573_irq_set_sens(MT6573_JPG_CODEC_IRQ_LINE, MT65xx_LEVEL_SENSITIVE); mt6573_irq_unmask(MT6573_JPG_CODEC_IRQ_LINE); enable_irq(MT6573_JPG_CODEC_IRQ_LINE); if(request_irq(MT6573_JPG_CODEC_IRQ_LINE, (irq_handler_t)jpeg_drv_isr, 0, "jpeg_driver" , NULL)) { printk("JPEG Codec Driver request irq failed\n"); } printk("JPEG Probe Done\n"); NOT_REFERENCED(class_dev); return 0; }
static __tcmfunc irqreturn_t _TVC_InterruptHandler(int irq, void *dev_id) { TVC_REG_IRQ_STS status = TVC_REG->IRQ_STATUS; mt6573_irq_mask(MT6573_TVC_IRQ_LINE); //printk("_TVC_InterruptHandler, status: %x\n", status); if (1 == status.IRQ2) { status.IRQ2 = 0; printk("[WARN][TVC] Overrun !!\n"); } if (1 == status.IRQ0) { status.IRQ0 = 0; //printk("wake up tvc_checkline!!\n"); wake_up_interruptible(&_tvcContext.tvc_checkline); } OUTREG32(&TVC_REG->IRQ_STATUS, AS_UINT32(&status)); mt6573_irq_unmask(MT6573_TVC_IRQ_LINE); return IRQ_HANDLED; }
//static irqreturn_t jpeg_drv_isr(int irq, void *dev_id) static __tcmfunc irqreturn_t jpeg_drv_isr(int irq, void *dev_id) { JPEG_MSG("JPEG Codec Interrupt\n"); //jpeg_reg_dump(); if(irq == MT6573_JPG_CODEC_IRQ_LINE) { mt6573_irq_mask(MT6573_JPG_CODEC_IRQ_LINE); if(jpeg_isr_dec_lisr() == 0) { wake_up_interruptible(&dec_wait_queue); } if(jpeg_isr_enc_lisr() == 0) { wake_up_interruptible(&enc_wait_queue); } mt6573_irq_unmask(MT6573_JPG_CODEC_IRQ_LINE); } return IRQ_HANDLED; }