int   dsp_check_status(struct audiodsp_priv *priv)
{
	unsigned dsp_halt_score = 0;
	unsigned ablevel  = 0;
	int  pcmlevel = 0; 
	if(DSP_RD(DSP_STATUS) != DSP_STATUS_RUNING)
		return 1;	
	ablevel =READ_MPEG_REG(AIU_MEM_AIFIFO_LEVEL);
	pcmlevel = dsp_codec_get_bufer_data_len(priv);
	if((ablevel == priv->last_ablevel && ablevel > 50*1024)&& \
	    (pcmlevel == priv->last_pcmlevel && pcmlevel < 512)){
	    	priv->last_ablevel = ablevel;
		priv->last_pcmlevel = 	pcmlevel;
	    	printk("dsp not working ............\n");
	    	return 0;
	}
    	priv->last_ablevel = ablevel;
	priv->last_pcmlevel = 	pcmlevel;	
	return 1;
}
static unsigned long audiodsp_drop_pcm(unsigned long size)
{
	struct audiodsp_priv *priv = audiodsp_privdata();
	size_t len;
	int count;
	unsigned long drop_bytes = size;

	mutex_lock(&priv->stream_buffer_mutex);
	if(priv->stream_buffer_mem == NULL || !priv->dsp_is_started)
		goto err;
	
	while(drop_bytes > 0){
		len =dsp_codec_get_bufer_data_len(priv);
		if(drop_bytes >= len){
			dsp_codec_inc_rd_addr(priv, len);
			drop_bytes -= len;
			msleep(50);
			count++;
			if(count > 20)
			    break;
		}
		else {
			dsp_codec_inc_rd_addr(priv, drop_bytes);
			drop_bytes = 0;
		}	
	}

	mutex_unlock(&priv->stream_buffer_mutex);
	if(count > 10)
		printk("drop pcm data timeout! count = %d\n", count);
	
	return (size - drop_bytes);
	
err:
		mutex_unlock(&priv->stream_buffer_mutex);
		printk("error, can not drop pcm data!\n");
		return 0;
}