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)); }
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; }
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; }
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; }
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; }