示例#1
0
static void hdmi_detect_timer(unsigned long data)
{
	struct hdmi *hdmi = (struct hdmi*)data;
	
	int precent =  hdmi->ops->hdmi_precent(hdmi);

	if((precent && hdmi->mode == DISP_ON_LCD) ||
			(!precent && hdmi->mode == DISP_ON_HDMI))
		hdmi_changed(hdmi, 100);
	mod_timer(&hdmi->timer, jiffies + msecs_to_jiffies(200));
}
示例#2
0
static irqreturn_t anx7150_detect_irq(int irq, void *dev_id)
{
	struct hdmi *hdmi = (struct hdmi *)dev_id;
#ifndef CONFIG_ANX7150_IRQ_USE_CHIP
	struct anx7150_pdata *anx = hdmi_get_privdata(hdmi);
	if( anx->init == IRQF_TRIGGER_RISING)
		 anx->init = IRQF_TRIGGER_FALLING;
	else
		 anx->init = IRQF_TRIGGER_RISING;
	irq_set_irq_type(anx->irq, anx->init);
#endif
	hdmi_changed(hdmi, 300);
    return IRQ_HANDLED;
}
示例#3
0
void rk610_hdmi_interrupt()
{
	char interrupt = 0;
	
	if(rk610_hdmi_i2c_read_reg(INTERRUPT_STATUS1, &interrupt))
		return;
		
	HDMIWrReg(INTERRUPT_STATUS1, interrupt);
	hdmi_dbg(rk610_hdmi->hdmi->dev, "%s interrupt %02x\n", __FUNCTION__, interrupt);
	
	if(interrupt)
		HDMIWrReg(INTERRUPT_STATUS1, interrupt);
	
	if(interrupt & m_INT_HOTPLUG)
		hdmi_changed(rk610_hdmi->hdmi, 0);
		
	if(interrupt & m_INT_EDID_READY)
		edid_ready = 1;
}
示例#4
0
static int rk610_hdmi_init(struct hdmi *hdmi)
{
	struct rk610_hdmi_inf *rk610_hdmi = hdmi_priv(hdmi);
#ifdef CONFIG_HDMI_SAVE_DATA
    int hdmi_data = hdmi_get_data();
    if(hdmi_data<0){
    hdmi_set_data((hdmi->resolution&0x7)|((hdmi->scale&0x1f)<<3));
    }
    else{
    hdmi->resolution = hdmi_data&0x7;
    hdmi->scale_set= ((hdmi_data>>3)&0x1f) + MIN_SCALE;
    hdmi->scale = hdmi->scale_set;
    }
#endif  
	RK610_DBG(&rk610_hdmi->client->dev,"%s \n",__FUNCTION__);
	rk610_hdmi->init =0;
	Rk610_hdmi_init(rk610_hdmi->client);
    hdmi_changed(hdmi,1);
	Rk610_hdmi_Set_Video(hdmi->resolution);
	Rk610_hdmi_Set_Audio(hdmi->audio_fs);
    Rk610_hdmi_Config_Done(rk610_hdmi->client);
	return 0;
}
void anx7150_task(struct anx7150_pdata *anx)
{
	int state;
	int ret;
	
	//anx->dev.anx7150_detect = anx7150_detect_device(anx);
	if(anx->dev.anx7150_detect == 0)
		goto out;
	
	state = ANX7150_Get_System_State();

	if(anx->dev.parameter_config){
		if(state > WAIT_HDMI_ENABLE)
			state = WAIT_HDMI_ENABLE;
		anx->dev.parameter_config = 0;
		anx->dev.fb_switch_state = 1;
	}
	if(anx->dev.hdmi_enable == HDMI_DISABLE && anx->dev.hdmi_auto_switch == HDMI_DISABLE){
		//if(state > WAIT_HDMI_ENABLE)
			state = HDMI_INITIAL;
	}

	state = ANX7150_Interrupt_Process(anx, state);

	switch(state){
	case HDMI_INITIAL:
		if(anx->dev.hdmi_auto_switch)
			rk29_hdmi_exit(&anx->dev);
		ANX7150_API_Initial(anx->client);
		state = WAIT_HOTPLUG;
		if(anx->dev.hdmi_auto_switch)
			anx->dev.rate = 1;
		else
			anx->dev.rate = 100;
		break;
		
	case WAIT_HOTPLUG:
		if(anx->dev.hdmi_auto_switch)
			rk29_hdmi_exit(&anx->dev);
		if(anx->dev.HPD_status){
			anx7150_plug(anx->client);
			hdmi_changed(anx->dev.hdmi, 1);
			state = READ_PARSE_EDID;
		}
		if(anx->dev.hdmi_auto_switch)
			anx->dev.rate = 50;
		else
			anx->dev.rate = 100;
		break;
		
	case READ_PARSE_EDID:
		ret = ANX7150_Parse_EDID(anx->client,&anx->dev);
		if(ret != 0){
			dev_err(&anx->client->dev, "Parse_EDID err, ret=%d\n", ret);
		}

		state = WAIT_RX_SENSE;
		if(anx->dev.hdmi_auto_switch)
			anx->dev.rate = 50;
		else
			anx->dev.rate = 100;

		break;
		
	case WAIT_RX_SENSE:
		if(ANX7150_GET_SENSE_STATE(anx->client) == 1){
			hdmi_dbg(&anx->client->dev, "reciver active\n");
			state = WAIT_HDMI_ENABLE;
			anx->dev.reciver_status = HDMI_RECIVER_ACTIVE;
			hdmi_changed(anx->dev.hdmi, 1);
		}

		if(anx->dev.hdmi_auto_switch)
			anx->dev.rate = 50;
		else
			anx->dev.rate = 100;

		break;

	case WAIT_HDMI_ENABLE:
		if(!anx->dev.hdmi_enable && anx->dev.hdmi_auto_switch)
			rk29_hdmi_exit(&anx->dev);
		if(anx->dev.hdmi_enable && 
			(anx->dev.hdmi_auto_switch || anx->init ||anx->dev.parameter_config)) {
			rk29_hdmi_enter(&anx->dev);
			anx->init = 0;
		}
		
		/*
		if(1 || anx->dev.rk29_output_status == RK29_OUTPUT_STATUS_HDMI){
			state = SYSTEM_CONFIG;
			anx->dev.rate = 1;
		}
		*/
		state = SYSTEM_CONFIG;
		if(anx->dev.hdmi_auto_switch)
			anx->dev.rate = 50;
		else
			anx->dev.rate = 100;

		break;
		
	case SYSTEM_CONFIG:
		anx->dev.resolution_real = ANX7150_Get_Optimal_resolution(anx->dev.resolution_set);
		HDMI_Set_Video_Format(anx->dev.resolution_real);
		HDMI_Set_Audio_Fs(anx->dev.i2s_Fs);
		ANX7150_API_HDCP_ONorOFF(anx->dev.hdcp_enable);
		ANX7150_API_System_Config();
		state = CONFIG_VIDEO;

		anx->dev.rate = 1;
		if(anx->dev.fb_switch_state && anx->dev.rk29_output_status == RK29_OUTPUT_STATUS_HDMI) {
			anx->dev.rk29_output_status = RK29_OUTPUT_STATUS_LCD;
			rk29_hdmi_enter(&anx->dev);
			anx->dev.fb_switch_state = 0;
		}
		break;
		
	case CONFIG_VIDEO:
		if(ANX7150_Config_Video(anx->client) == 0){
			if(ANX7150_GET_RECIVER_TYPE() == 1)
				state = CONFIG_AUDIO;
			else
				state = HDCP_AUTHENTICATION;

			anx->dev.rate = 50;
		}

		anx->dev.rate = 10;
		break;
		
	case CONFIG_AUDIO:
		ANX7150_Config_Audio(anx->client);
		state = CONFIG_PACKETS;
		anx->dev.rate = 1;
		break;
		
	case CONFIG_PACKETS:
		ANX7150_Config_Packet(anx->client);
		state = HDCP_AUTHENTICATION;
		anx->dev.rate = 1;
		break;
		
	case HDCP_AUTHENTICATION:
		ANX7150_HDCP_Process(anx->client);
		state = PLAY_BACK;
		anx->dev.rate = 100;
		break;
		
	case PLAY_BACK:
		ret = ANX7150_PLAYBACK_Process();
		if(ret == 1){
			state = CONFIG_PACKETS;
			anx->dev.rate = 1;
		}

		anx->dev.rate = 100;
		break;
	
	default:
		state = HDMI_INITIAL;
		anx->dev.rate = 100;
		break;
	}

	if(state != ANX7150_Get_System_State()){
		ANX7150_Set_System_State(anx->client, state);
	}

out:
	return;
}
示例#6
0
static int anx7150_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id)
{
    int rc = 0;
	struct hdmi *hdmi = NULL;
	struct anx7150_pdata *anx = NULL;
	struct rkdisplay_platform_data *hdmi_data = client->dev.platform_data;
	
	anx = kzalloc(sizeof(struct anx7150_pdata), GFP_KERNEL);
	if(!anx)
	{
        dev_err(&client->dev, "no memory for state\n");
        goto err_kzalloc_anx;
    }
	anx->client = client;
	anx->dev.anx7150_detect = 0;
	anx->init = 1;
	// Register HDMI device
	if(hdmi_data) {
		anx->io_pwr_pin = hdmi_data->io_pwr_pin;
		anx->io_rst_pin = hdmi_data->io_reset_pin;
		hdmi = hdmi_register(&client->dev, &anx7150_ops, hdmi_data->video_source, hdmi_data->property);
	}
	else {
		anx->io_pwr_pin = INVALID_GPIO;
		anx->io_rst_pin = INVALID_GPIO;	
		hdmi = hdmi_register(&client->dev, &anx7150_ops, DISPLAY_SOURCE_LCDC0, DISPLAY_MAIN);
	}
	if(hdmi == NULL)
	{
		dev_err(&client->dev, "fail to register hdmi\n");
		goto err_hdmi_register;
	}
	// Set HDMI private data
	hdmi_set_privdata(hdmi, anx);

    anx->dev.hdmi = hdmi;
	i2c_set_clientdata(client, anx);
	
	//Power on anx7150		
	if(anx->io_pwr_pin != INVALID_GPIO) {
		rc = gpio_request(anx->io_pwr_pin, NULL);
		if(rc) {
			gpio_free(anx->io_pwr_pin);
        	printk(KERN_ERR "request anx7150 power control gpio error\n ");
        	goto err_hdmi_register; 
		}
		else
			gpio_direction_output(anx->io_pwr_pin, GPIO_HIGH);
	}
	
    anx->dev.anx7150_detect = ANX7150_hw_detect_device(anx->client);
	if(anx->dev.anx7150_detect) {
    	HDMI_task(hdmi);
	#ifdef HDMI_USE_IRQ
		hdmi_changed(hdmi, 1);
	    if((rc = gpio_request(client->irq, "hdmi gpio")) < 0)
	    {
	        dev_err(&client->dev, "fail to request gpio %d\n", client->irq);
	        goto err_request_gpio;
	    }
	    anx->irq = gpio_to_irq(client->irq);
		anx->io_irq_pin = client->irq;
	    gpio_pull_updown(client->irq,GPIOPullDown);
	    gpio_direction_input(client->irq);
	    #ifndef CONFIG_ANX7150_IRQ_USE_CHIP
	    anx->init = IRQF_TRIGGER_RISING;
	    if((rc = request_irq(anx->irq, anx7150_detect_irq,IRQF_TRIGGER_RISING,NULL,hdmi)) <0)
	    #else
	    if((rc = request_irq(anx->irq, anx7150_detect_irq,IRQF_TRIGGER_FALLING,NULL,hdmi)) <0)
	    #endif
	    {
	        dev_err(&client->dev, "fail to request hdmi irq\n");
	        goto err_request_irq;
	    }
    #else
		queue_delayed_work(hdmi->workqueue, &hdmi->delay_work, 1);
	#endif
		hdmi_enable(hdmi);
		dev_info(&client->dev, "anx7150 probe ok\n");
	}
    else
    	goto err_request_irq;

    return 0;
	
err_request_irq:
	gpio_free(client->irq);
err_request_gpio:
	hdmi_unregister(hdmi);
err_hdmi_register:
	kfree(anx);
	anx = NULL;
err_kzalloc_anx:
	hdmi = NULL;
	dev_err(&client->dev, "anx7150 probe error\n");
	return rc;

}