aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/mach-s3c2440/camera/camif_fsm.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-s3c2440/camera/camif_fsm.c')
-rw-r--r--arch/arm/mach-s3c2440/camera/camif_fsm.c432
1 files changed, 0 insertions, 432 deletions
diff --git a/arch/arm/mach-s3c2440/camera/camif_fsm.c b/arch/arm/mach-s3c2440/camera/camif_fsm.c
deleted file mode 100644
index b534aca3d49..00000000000
--- a/arch/arm/mach-s3c2440/camera/camif_fsm.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- Copyright (C) 2004 Samsung Electronics
- SW.LEE <hitchcar@sec.samsung.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-*/
-
-#include <linux/version.h>
-#include <linux/module.h>
-#include <linux/delay.h>
-#include <linux/errno.h>
-#include <linux/fs.h>
-#include <linux/kernel.h>
-#include <linux/major.h>
-#include <linux/slab.h>
-#include <linux/poll.h>
-#include <linux/signal.h>
-#include <linux/ioport.h>
-#include <linux/sched.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/kmod.h>
-#include <linux/vmalloc.h>
-#include <linux/init.h>
-#include <linux/pagemap.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/semaphore.h>
-#include <linux/miscdevice.h>
-
-#define CONFIG_VIDEO_V4L1_COMPAT
-#include <linux/videodev.h>
-#include "camif.h"
-
-//#define SW_DEBUG
-static void camif_start_p_with_c(camif_cfg_t *cfg);
-
-#include "camif.h"
-const char *fsm_version =
- "$Id: camif_fsm.c,v 1.3 2004/04/27 10:26:28 swlee Exp $";
-
-
-/*
- * FSM function is the place where Synchronization in not necessary
- * because IRS calls this functions.
- */
-
-ssize_t camif_p_1fsm_start(camif_cfg_t *cfg)
-{
- //camif_reset(CAMIF_RESET,0);
- cfg->exec = CAMIF_DMA_ON;
- camif_capture_start(cfg);
- camif_last_irq_en(cfg);
- cfg->status = CAMIF_STARTED;
- cfg->fsm = CAMIF_1nd_INT;
- return 0;
-}
-
-
-ssize_t camif_p_2fsm_start(camif_cfg_t *cfg)
-{
- camif_reset(CAMIF_RESET,0);/* FIFO Count goes to zero */
- cfg->exec = CAMIF_DMA_ON;
- camif_capture_start(cfg);
- cfg->status = CAMIF_STARTED;
- cfg->fsm = CAMIF_1nd_INT;
- return 0;
-}
-
-
-ssize_t camif_4fsm_start(camif_cfg_t *cfg)
-{
- camif_reset(CAMIF_RESET,0); /* FIFO Count goes to zero */
- cfg->exec = CAMIF_DMA_ON;
- camif_capture_start(cfg);
- cfg->status = CAMIF_STARTED;
- cfg->fsm = CAMIF_1nd_INT;
- cfg->perf.frames = 0;
- return 0;
-}
-
-
-/* Policy:
- cfg->perf.frames set in camif_fsm.c
- cfg->status set in video-driver.c
- */
-
-/*
- * Don't insert camif_reset(CAM_RESET, 0 ) into this func
- */
-ssize_t camif_p_stop(camif_cfg_t *cfg)
-{
- cfg->exec = CAMIF_DMA_OFF;
-// cfg->status = CAMIF_STOPPED;
- camif_capture_stop(cfg);
- cfg->perf.frames = 0; /* Dupplicated ? */
- return 0;
-}
-
-/* When C working, P asks C to play togehter */
-/* Only P must call this function */
-void camif_start_c_with_p (camif_cfg_t *cfg, camif_cfg_t *other)
-{
-// cfg->gc->other = get_camif(CODEC_MINOR);
- cfg->gc->other = other;
- camif_start_p_with_c(cfg);
-}
-
-static void camif_start_p_with_c(camif_cfg_t *cfg)
-{
- camif_cfg_t *other = (camif_cfg_t *)cfg->gc->other;
- /* Preview Stop */
- cfg->exec = CAMIF_DMA_OFF;
- camif_capture_stop(cfg);
- /* Start P and C */
- camif_reset(CAMIF_RESET, 0);
- cfg->exec =CAMIF_BOTH_DMA_ON;
- camif_capture_start(cfg);
- cfg->fsm = CAMIF_1nd_INT; /* For Preview */
- if(!other) panic("Unexpected Error \n");
- other->fsm = CAMIF_1nd_INT; /* For Preview */
-}
-
-static void camif_auto_restart(camif_cfg_t *cfg)
-{
-// if (cfg->dma_type & CAMIF_CODEC) return;
- if (cfg->auto_restart)
- camif_start_p_with_c(cfg);
-}
-
-
-/* Supposed that PREVIEW already running
- * request PREVIEW to start with Codec
- */
-static int camif_check_global(camif_cfg_t *cfg)
-{
- int ret = 0;
-
- if (down_interruptible(&cfg->gc->lock))
- return -ERESTARTSYS;
- if ( cfg->gc->status & CWANT2START ) {
- cfg->gc->status &= ~CWANT2START;
- cfg->auto_restart = 1;
- ret = 1;
- }
- else {
- ret = 0; /* There is no codec */
- cfg->auto_restart = 0; /* Duplicated ..Dummy */
- }
-
- up(&cfg->gc->lock);
-
- return ret;
-}
-
-/*
- * 1nd INT : Start Interrupt
- * Xnd INT : enable Last IRQ : pingpong get the valid data
- * Ynd INT : Stop Codec or Preview : pingpong get the valid data
- * Znd INT : Last IRQ : valid data
- */
-#define CHECK_FREQ 5
-int camif_enter_p_4fsm(camif_cfg_t *cfg)
-{
- int ret = 0;
-
- cfg->perf.frames++;
- if (cfg->fsm == CAMIF_NORMAL_INT)
- if (cfg->perf.frames % CHECK_FREQ == 0)
- ret = camif_check_global(cfg);
- if (ret > 0) cfg->fsm = CAMIF_Xnd_INT; /* Codec wait for Preview */
-
- switch (cfg->fsm) {
- case CAMIF_1nd_INT: /* Start IRQ */
- cfg->fsm = CAMIF_NORMAL_INT;
- ret = INSTANT_SKIP;
- DPRINTK(KERN_INFO "1nd INT \n");
- break;
- case CAMIF_NORMAL_INT:
- cfg->status = CAMIF_INT_HAPPEN;
- cfg->fsm = CAMIF_NORMAL_INT;
- ret = INSTANT_GO;
- DPRINTK(KERN_INFO "NORMAL INT \n");
- break;
- case CAMIF_Xnd_INT:
- camif_last_irq_en(cfg);/* IRQ for Enabling LAST IRQ */
- cfg->status = CAMIF_INT_HAPPEN;
- cfg->fsm = CAMIF_Ynd_INT;
- ret = INSTANT_GO;
- DPRINTK(KERN_INFO "Xnd INT \n");
- break;
- case CAMIF_Ynd_INT: /* Capture Stop */
- cfg->exec = CAMIF_DMA_OFF;
- cfg->status = CAMIF_INT_HAPPEN;
- camif_capture_stop(cfg);
- cfg->fsm = CAMIF_Znd_INT;
- ret = INSTANT_GO;
- DPRINTK(KERN_INFO "Ynd INT \n");
- break;
- case CAMIF_Znd_INT: /* LAST IRQ (Dummy IRQ */
- cfg->fsm = CAMIF_DUMMY_INT;
- cfg->status = CAMIF_INT_HAPPEN;
- ret = INSTANT_GO;
- camif_auto_restart(cfg); /* Automatically Restart Camera */
- DPRINTK(KERN_INFO "Znd INT \n");
- break;
- case CAMIF_DUMMY_INT:
- cfg->status = CAMIF_STOPPED; /* Dupplicate ? */
- ret = INSTANT_SKIP;
-// DPRINTK(KERN_INFO "Dummy INT \n");
- break;
- default:
- printk(KERN_INFO "Unexpect INT %d \n",cfg->fsm);
- ret = INSTANT_SKIP;
- break;
- }
- return ret;
-}
-
-
-/*
- * NO autorestart included in this function
- */
-int camif_enter_c_4fsm(camif_cfg_t *cfg)
-{
- int ret;
-
- cfg->perf.frames++;
-#if 0
- if ( (cfg->fsm==CAMIF_NORMAL_INT)
- && (cfg->perf.frames>cfg->restart_limit-1)
- )
- cfg->fsm = CAMIF_Xnd_INT;
-#endif
- switch (cfg->fsm) {
- case CAMIF_1nd_INT: /* Start IRQ */
- cfg->fsm = CAMIF_NORMAL_INT;
-// cfg->status = CAMIF_STARTED; /* need this to meet auto-restart */
- ret = INSTANT_SKIP;
- DPRINTK(KERN_INFO "1nd INT \n");
- break;
- case CAMIF_NORMAL_INT:
- cfg->status = CAMIF_INT_HAPPEN;
- cfg->fsm = CAMIF_NORMAL_INT;
- ret = INSTANT_GO;
- DPRINTK(KERN_INFO "NORMALd INT \n");
- break;
- case CAMIF_Xnd_INT:
- camif_last_irq_en(cfg);/* IRQ for Enabling LAST IRQ */
- cfg->status = CAMIF_INT_HAPPEN;
- cfg->fsm = CAMIF_Ynd_INT;
- ret = INSTANT_GO;
- DPRINTK(KERN_INFO "Xnd INT \n");
- break;
- case CAMIF_Ynd_INT: /* Capture Stop */
- cfg->exec = CAMIF_DMA_OFF;
- cfg->status = CAMIF_INT_HAPPEN;
- camif_capture_stop(cfg);
- cfg->fsm = CAMIF_Znd_INT;
- ret = INSTANT_GO;
- DPRINTK(KERN_INFO "Ynd INT \n");
- break;
- case CAMIF_Znd_INT: /* LAST IRQ (Dummy IRQ */
- cfg->fsm = CAMIF_DUMMY_INT;
- cfg->status = CAMIF_INT_HAPPEN;
- ret = INSTANT_GO;
- DPRINTK(KERN_INFO "Znd INT \n");
- break;
- case CAMIF_DUMMY_INT:
- cfg->status = CAMIF_STOPPED; /* Dupplicate ? */
- ret = INSTANT_SKIP;
- break;
- default:
- printk(KERN_INFO "Unexpect INT %d \n",cfg->fsm);
- ret = INSTANT_SKIP;
- break;
- }
- return ret;
-}
-
-/* 4 Interrups State Machine is for two pingpong
- * 1nd INT : Start Interrupt
- * Xnd INT : enable Last IRQ : pingpong get the valid data
- * Ynd INT : Stop Codec or Preview : pingpong get the valid data
- * Znd INT : Last IRQ : valid data
- *
- * Note:
- * Before calling this func, you must call camif_reset
- */
-
-int camif_enter_2fsm(camif_cfg_t *cfg) /* Codec FSM */
-{
- int ret;
-
- cfg->perf.frames++;
- switch (cfg->fsm) {
- case CAMIF_1nd_INT: /* Start IRQ */
- cfg->fsm = CAMIF_Xnd_INT;
- ret = INSTANT_SKIP;
-// printk(KERN_INFO "1nd INT \n");
- break;
- case CAMIF_Xnd_INT:
- camif_last_irq_en(cfg);/* IRQ for Enabling LAST IRQ */
- cfg->now_frame_num = 0;
- cfg->status = CAMIF_INT_HAPPEN;
- cfg->fsm = CAMIF_Ynd_INT;
- ret = INSTANT_GO;
-// printk(KERN_INFO "2nd INT \n");
- break;
- case CAMIF_Ynd_INT: /* Capture Stop */
- cfg->exec = CAMIF_DMA_OFF;
- cfg->now_frame_num = 1;
- cfg->status = CAMIF_INT_HAPPEN;
- camif_capture_stop(cfg);
- cfg->fsm = CAMIF_Znd_INT;
- ret = INSTANT_GO;
-// printk(KERN_INFO "Ynd INT \n");
- break;
- case CAMIF_Znd_INT: /* LAST IRQ (Dummy IRQ */
- cfg->now_frame_num = 0;
-// cfg->fsm = CAMIF_DUMMY_INT;
- cfg->status = CAMIF_INT_HAPPEN;
- ret = INSTANT_GO;
-// printk(KERN_INFO "Znd INT \n");
- break;
- case CAMIF_DUMMY_INT:
- cfg->status = CAMIF_STOPPED; /* Dupplicate ? */
- ret = INSTANT_SKIP;
- printk(KERN_INFO "Dummy INT \n");
- break;
- default: /* CAMIF_PENDING_INT */
- printk(KERN_INFO "Unexpect INT \n");
- ret = INSTANT_SKIP;
- break;
- }
- return ret;
-}
-
-
-/* 2 Interrups State Machine is for one pingpong
- * 1nd INT : Stop Codec or Preview : pingpong get the valid data
- * 2nd INT : Last IRQ : dummy data
- */
-int camif_enter_1fsm(camif_cfg_t *cfg) /* Codec FSM */
-{
- int ret;
-
- cfg->perf.frames++;
- switch (cfg->fsm) {
- case CAMIF_Ynd_INT: /* IRQ for Enabling LAST IRQ */
- cfg->exec = CAMIF_DMA_OFF;
- camif_capture_stop(cfg);
- cfg->fsm = CAMIF_Znd_INT;
- ret = INSTANT_SKIP;
- // printk(KERN_INFO "Ynd INT \n");
- break;
- case CAMIF_Znd_INT: /* LAST IRQ (Dummy IRQ */
- cfg->fsm = CAMIF_DUMMY_INT;
- cfg->status = CAMIF_INT_HAPPEN;
- ret = INSTANT_GO;
- // printk(KERN_INFO "Znd INT \n");
- break;
- case CAMIF_DUMMY_INT:
- cfg->status = CAMIF_STOPPED; /* Dupplicate ? */
- ret = INSTANT_SKIP;
- printk(KERN_INFO "Dummy INT \n");
- break;
- default:
- printk(KERN_INFO "Unexpect INT \n");
- ret = INSTANT_SKIP;
- break;
- }
- return ret;
-}
-
-
-/*
- * GLOBAL STATUS CONTROL FUNCTION
- *
- */
-
-
-/* Supposed that PREVIEW already running
- * request PREVIEW to start with Codec
- */
-int camif_callback_start(camif_cfg_t *cfg)
-{
- int doit = 1;
- while (doit) {
- if (down_interruptible(&cfg->gc->lock)) {
- return -ERESTARTSYS;
- }
- cfg->gc->status = CWANT2START;
- cfg->gc->other = cfg;
- up(&cfg->gc->lock);
- doit = 0;
- }
- return 0;
-}
-
-/*
- * Return status of Preview Machine
- ret value :
- 0: Preview is not working
- X: Codec must follow PREVIEW start
-*/
-int camif_check_preview(camif_cfg_t *cfg)
-{
- int ret = 0;
-
- if (down_interruptible(&cfg->gc->lock)) {
- ret = -ERESTARTSYS;
- return ret;
- }
- if (cfg->gc->user == 1) ret = 0;
- // else if (cfg->gc->status & PNOTWORKING) ret = 0;
- else ret = 1;
- up(&cfg->gc->lock);
- return ret;
-}
-
-
-
-
-/*
- * Local variables:
- * c-basic-offset: 8
- * End:
- */