static void slimport_cable_plug_proc(struct anx7808_data *anx7808) { int status = 0; if (gpio_get_value_cansleep(anx7808->gpio_cbl_det)) { /* debounce time for avoiding glitch */ msleep(50); if (gpio_get_value_cansleep(anx7808->gpio_cbl_det)) { if (sp_tx_pd_mode) { /* first turn on hpd */ if (anx7808->hdmi_sp_ops->set_upstream_hpd) { status = anx7808->hdmi_sp_ops->set_upstream_hpd( anx7808->hdmi_pdev, 1); if (status) pr_err("failed to turn on hpd\n"); } sp_tx_hardware_poweron(); sp_tx_power_on(SP_TX_PWR_REG); sp_tx_power_on(SP_TX_PWR_TOTAL); hdmi_rx_initialization(); sp_tx_initialization(); sp_tx_vbus_poweron(); if (!sp_tx_get_cable_type(1)) { pr_err("AUX ERR\n"); sp_tx_power_down_and_init(); return; } sp_tx_rx_type_backup = sp_tx_rx_type; } switch (sp_tx_rx_type) { case RX_HDMI: if (sp_tx_get_hdmi_connection()) sp_tx_set_sys_state(STATE_PARSE_EDID); break; case RX_DP: if (sp_tx_get_dp_connection()) sp_tx_set_sys_state(STATE_PARSE_EDID); break; case RX_VGA_GEN: if (sp_tx_get_vga_connection()) sp_tx_set_sys_state(STATE_PARSE_EDID); break; case RX_VGA_9832: if (sp_tx_get_vga_connection()) { sp_tx_send_message(MSG_CLEAR_IRQ); sp_tx_set_sys_state(STATE_PARSE_EDID); } break; case RX_NULL: default: break; } } } else if (sp_tx_pd_mode == 0) { sp_tx_power_down_and_init(); } }
static void slimport_cable_plug_proc(struct anx7808_data *anx7808) { struct anx7808_platform_data *pdata = anx7808->pdata; if (gpio_get_value_cansleep(pdata->gpio_cbl_det)) { mdelay(100); if (gpio_get_value_cansleep(pdata->gpio_cbl_det)) { if (sp_tx_pd_mode) { sp_tx_pd_mode = 0; #ifdef CONFIG_SLIMPORT_DYNAMIC_HPD slimport_set_hdmi_hpd(1); #endif sp_tx_hardware_poweron(); sp_tx_power_on(SP_TX_PWR_REG); sp_tx_power_on(SP_TX_PWR_TOTAL); hdmi_rx_initialization(); sp_tx_initialization(); sp_tx_vbus_poweron(); msleep(200); if (!sp_tx_get_cable_type()) { pr_err("%s %s:AUX ERR\n", LOG_TAG, __func__); sp_tx_vbus_powerdown(); sp_tx_power_down(SP_TX_PWR_REG); sp_tx_power_down(SP_TX_PWR_TOTAL); sp_tx_hardware_powerdown(); sp_tx_pd_mode = 1; sp_tx_link_config_done = 0; sp_tx_hw_lt_enable = 0; sp_tx_hw_lt_done = 0; sp_tx_rx_type = RX_NULL; sp_tx_rx_type_backup = RX_NULL; sp_tx_set_sys_state(STATE_CABLE_PLUG); return; } sp_tx_rx_type_backup = sp_tx_rx_type; } switch (sp_tx_rx_type) { case RX_HDMI: if (sp_tx_get_hdmi_connection()) sp_tx_set_sys_state(STATE_PARSE_EDID); break; case RX_DP: if (sp_tx_get_dp_connection()) sp_tx_set_sys_state(STATE_PARSE_EDID); break; case RX_VGA_GEN: if (sp_tx_get_vga_connection()) sp_tx_set_sys_state(STATE_PARSE_EDID); break; case RX_VGA_9832: if (sp_tx_get_vga_connection()) { sp_tx_send_message(MSG_CLEAR_IRQ); sp_tx_set_sys_state(STATE_PARSE_EDID); } break; case RX_NULL: default: break; } } } else if (sp_tx_pd_mode == 0) { sp_tx_vbus_powerdown(); sp_tx_power_down(SP_TX_PWR_REG); sp_tx_power_down(SP_TX_PWR_TOTAL); sp_tx_hardware_powerdown(); sp_tx_pd_mode = 1; sp_tx_link_config_done = 0; sp_tx_hw_lt_enable = 0; sp_tx_hw_lt_done = 0; sp_tx_rx_type = RX_NULL; sp_tx_rx_type_backup = RX_NULL; sp_tx_set_sys_state(STATE_CABLE_PLUG); } }
static void slimport_cable_plug_proc(struct anx7808_data *anx7808) { if (gpio_get_value_cansleep(anx7808->pdata->gpio_cbl_det)) { msleep(50); if (gpio_get_value_cansleep(anx7808->pdata->gpio_cbl_det)) { if (sp_tx_pd_mode) { sp_tx_pd_mode = 0; sp_tx_hardware_poweron(); sp_tx_power_on(SP_TX_PWR_REG); sp_tx_power_on(SP_TX_PWR_TOTAL); #ifdef CONFIG_CHARGER_SMB345 sp_tx_pull_down_id(TRUE); #endif hdmi_rx_initialization(); sp_tx_initialization(); sp_tx_vbus_poweron(); msleep(200); if (!sp_tx_get_cable_type()) { SP_DEV_ERR("%s:AUX ERR\n", __func__); sp_tx_vbus_powerdown(); #ifdef CONFIG_CHARGER_SMB345 sp_tx_pull_down_id(FALSE); #endif sp_tx_power_down(SP_TX_PWR_REG); sp_tx_power_down(SP_TX_PWR_TOTAL); sp_tx_hardware_powerdown(); sp_tx_pd_mode = 1; sp_tx_link_config_done = 0; sp_tx_hw_lt_enable = 0; sp_tx_hw_lt_done = 0; sp_tx_rx_type = RX_NULL; sp_tx_rx_type_backup = RX_NULL; sp_tx_set_sys_state(STATE_CABLE_PLUG); return; } sp_tx_rx_type_backup = sp_tx_rx_type; } switch (sp_tx_rx_type) { case RX_HDMI: if (sp_tx_get_hdmi_connection()) sp_tx_set_sys_state(STATE_PARSE_EDID); break; case RX_DP: if (sp_tx_get_dp_connection()) sp_tx_set_sys_state(STATE_PARSE_EDID); break; case RX_VGA_GEN: if (sp_tx_get_vga_connection()) sp_tx_set_sys_state(STATE_PARSE_EDID); break; case RX_VGA_9832: if (sp_tx_get_vga_connection()) { sp_tx_send_message(MSG_CLEAR_IRQ); sp_tx_set_sys_state(STATE_PARSE_EDID); } break; case RX_NULL: default: break; } } } else if (sp_tx_pd_mode == 0) { sp_tx_vbus_powerdown(); #ifdef CONFIG_CHARGER_SMB345 sp_tx_pull_down_id(FALSE); #endif sp_tx_power_down(SP_TX_PWR_REG); sp_tx_power_down(SP_TX_PWR_TOTAL); sp_tx_hardware_powerdown(); sp_tx_pd_mode = 1; sp_tx_link_config_done = 0; sp_tx_hw_lt_enable = 0; sp_tx_hw_lt_done = 0; sp_tx_rx_type = RX_NULL; sp_tx_rx_type_backup = RX_NULL; sp_tx_set_sys_state(STATE_CABLE_PLUG); } }
static void slimport_cable_plug_proc(struct anx7808_data *anx7808) { int Pad_HW_ID = 0; /// printk("+++++++++++++slimport_cable_plug_proc+++++++++++++++++++\n"); if (gpio_get_value_cansleep(anx7808->pdata->gpio_cbl_det) ) { msleep(50); if (gpio_get_value_cansleep(anx7808->pdata->gpio_cbl_det) ) { // printk("slimport_cable_plug_proc start\n"); if (sp_tx_pd_mode) { /// printk("=================slimport_cable_plug_proc (1) ===============\n"); //ASUS_BSP +++ : larry lai for pad solution if(sp_tx_get_asus_id()) { #ifdef CONFIG_EEPROM_NUVOTON Pad_HW_ID = AX_MicroP_IsMydpNewSKU(); #else Pad_HW_ID = -1; // default TV mode #endif if (Pad_HW_ID == 1) { printk("### [myDP] DP Pad detect ###\n"); sp_tx_asus_pad = 1; myDP_DP_Dongle = 1; } else if (Pad_HW_ID == 0) { printk("### [myDP] HDMI Pad detect ###\n"); sp_tx_asus_pad = 1; myDP_DP_Dongle = 0; } else { if (myDP_force_pad_mode) { if (myDP_DP_Dongle) { printk("[myDP] DP Pad detect ###\n"); sp_tx_asus_pad = 1; myDP_DP_Dongle = 1; } else { printk("[myDP] HDMI Pad detect ###\n"); sp_tx_asus_pad = 1; myDP_DP_Dongle = 0; } } else { printk("### [myDP] Fail detect Pad , force TV mode ###\n"); sp_tx_asus_pad = 0; myDP_DP_Dongle = 0; } } } else nv_touch_mode(4); //ASUS_BSP Deeo : notify touch while plug out HDMI 4: AC //ASUS_BSP --- : larry lai for pad solution //sp_tx_hardware_chip_enable(anx7808_client); sp_tx_hardware_poweron(anx7808_client); sp_tx_pd_mode = 0; //ANX : (ver:20130105) diff with ANX slimport driver, comment it ??? //// msleep(200); sp_tx_power_on(SP_TX_PWR_REG); sp_tx_power_on(SP_TX_PWR_TOTAL); /// printk("=================slimport_cable_plug_proc (2) ===============\n"); //ANX : (ver:0.2) sp_tx_pull_down_id(TRUE); hdmi_rx_initialization(); /// printk("=================slimport_cable_plug_proc (3) ===============\n"); sp_tx_initialization(); /// printk("=================slimport_cable_plug_proc (4) ===============\n"); //ASUS_BSP +++ : larry lai for pad solution if (!sp_tx_asus_pad) { sp_tx_vbus_poweron(); msleep(200); } else { msleep(20); } //ASUS_BSP --- : larry lai for pad solution if (!sp_tx_get_cable_type()) { DEV_ERR("%s:AUX ERR\n", __func__); sp_tx_vbus_powerdown(); //ANX : (ver:0.2) sp_tx_pull_down_id(FALSE); sp_tx_power_down(SP_TX_PWR_REG); sp_tx_power_down(SP_TX_PWR_TOTAL); // sp_tx_hardware_chip_disable(anx7808_client); sp_tx_hardware_powerdown(anx7808_client); sp_tx_pd_mode = 1; sp_tx_link_config_done = 0; sp_tx_hw_lt_enable = 0; sp_tx_hw_lt_done = 0; sp_tx_rx_type = RX_NULL; sp_tx_rx_type_backup = RX_NULL; //ANX +++: (ver:20130105) pad solution sp_tx_asus_pad = 0; //ANX ---: (ver:20130105) pad solution sp_tx_set_sys_state(STATE_CABLE_PLUG); return; } /// printk("=================slimport_cable_plug_proc (5) ===============\n"); sp_tx_rx_type_backup = sp_tx_rx_type; } switch(sp_tx_rx_type) { case RX_HDMI: /// printk("=================slimport_cable_plug_proc (RX_HDMI) ===============\n"); if(sp_tx_get_hdmi_connection()){ printk("==== (RX_HDMI) ===\n"); //ANX +++: (ver:20130105) pad solution if(sp_tx_asus_pad) { //skip EDID read hdmi_rx_set_hpd(1); hdmi_rx_set_termination(1); sp_tx_set_sys_state(STATE_CONFIG_HDMI); } else { sp_tx_set_sys_state(STATE_PARSE_EDID); } //ANX ---: (ver:20130105) pad solution } break; case RX_DP: if(sp_tx_get_dp_connection()) { printk("==== (RX_DP) ===\n"); if(sp_tx_asus_pad) { //skip EDID read hdmi_rx_set_hpd(1); hdmi_rx_set_termination(1); sp_tx_set_sys_state(STATE_CONFIG_HDMI); } else { sp_tx_set_sys_state(STATE_PARSE_EDID); } } break; case RX_VGA: if(sp_tx_get_vga_connection()){ sp_tx_send_message(MSG_CLEAR_IRQ); sp_tx_set_sys_state(STATE_PARSE_EDID); } break; case RX_NULL: default: break; } } } else if (sp_tx_pd_mode == 0) { sp_tx_vbus_powerdown(); //ANX : (ver:0.2) sp_tx_pull_down_id(FALSE); sp_tx_power_down(SP_TX_PWR_REG); sp_tx_power_down(SP_TX_PWR_TOTAL); sp_tx_hardware_powerdown(anx7808_client); // sp_tx_hardware_chip_disable(anx7808_client); sp_tx_pd_mode = 1; sp_tx_link_config_done = 0; sp_tx_hw_lt_enable = 0; sp_tx_hw_lt_done = 0; sp_tx_rx_type = RX_NULL; sp_tx_rx_type_backup = RX_NULL; //ANX +++: (ver:20130105) pad solution sp_tx_asus_pad = 0; //ANX ---: (ver:20130105) pad solution sp_tx_set_sys_state(STATE_CABLE_PLUG); } }
static int dp_reset_pd_function(const char *val, struct kernel_param *kp) { int ret=0; int old_val = dp_pd_value; struct anx7808_platform_data *pdata = anx7808_client->dev.platform_data; if (ret) return ret; if (dp_pd_value > 0xf) { dp_pd_value = old_val; return -EINVAL; } ret = param_set_int(val, kp); if(dp_pd_value==0){ /* gpio_set_value(pdata->gpio_usb_select, 0); msleep(20); gpio_set_value(pdata->gpio_usb_select, 1); msleep(500); gpio_set_value(pdata->gpio_usb_select, 0); msleep(20); gpio_set_value(pdata->gpio_usb_select, 1); msleep(500); */ unchar ch, cl; uint n; sp_read_reg(RX_P0, HDMI_RX_HTOTAL_LOW, &cl); sp_read_reg(RX_P0, HDMI_RX_HTOTAL_HIGH, &ch); n = ch; n = (n << 8) + cl; printk("ANX7808 RX cur_h_res = 0x%x\n", n); sp_read_reg(RX_P0, HDMI_RX_VTOTAL_LOW, &cl); sp_read_reg(RX_P0, HDMI_RX_VTOTAL_HIGH, &ch); n = ch; n = (n << 8) + cl; printk("ANX7808 RX cur_v_res = 0x%x\n", n); sp_read_reg(RX_P0, HDMI_RX_VID_PCLK_CNTR_REG, &cl); printk("ANX7808 RX cur_pix_clk = 0x%x\n", cl); sp_read_reg(RX_P0, HDMI_RX_HDMI_STATUS_REG, &cl); printk("ANX7808 RX dvi_status = 0x%x\n", ((cl & HDMI_MODE) == HDMI_MODE)); }else if (dp_pd_value==1) { gpio_set_value(pdata->gpio_usb_select, 0); msleep(20); gpio_set_value(pdata->gpio_usb_select, 1); msleep(20); gpio_set_value(pdata->gpio_usb_select, 0); msleep(20); gpio_set_value(pdata->gpio_usb_select, 1); msleep(20); gpio_set_value(pdata->gpio_usb_select, 0); msleep(20); gpio_set_value(pdata->gpio_usb_select, 1); msleep(20); gpio_set_value(pdata->gpio_usb_select, 0); msleep(20); gpio_set_value(pdata->gpio_usb_select, 1); } else if (dp_pd_value==2) { sp_tx_hardware_power_set(1); } else if (dp_pd_value==3) { sp_tx_hardware_power_set(0); } else if (dp_pd_value==4) { sp_tx_hardware_poweron(anx7808_client); } else if (dp_pd_value==5) { sp_tx_hardware_powerdown(anx7808_client); } else if (dp_pd_value==6) { unchar c1=0; /* unchar addr_tmp = 0x50; switch(addr_tmp) { case 0x50: c= 0; break; case 0x8c: c= 1; break; case 0x70: c= 7; break; case 0x72: c = 5; break; case 0x7a: c = 6; break; default : break; } */ i2c_master_read_reg(0, 0x0B, &c1); printk("[myDP] 7730reg 0x50, 0x0B=%x\n", (uint)c1); msleep(1); i2c_master_read_reg(5, 0xE3, &c1); printk("[myDP] 7730reg 0x72, 0xE3=%x\n", (uint)c1); msleep(1); i2c_master_read_reg(0, 0x06, &c1); printk("[myDP] 7730reg 0x50, 0x06=%x\n", (uint)c1); msleep(1); i2c_master_read_reg(5, 0x06, &c1); printk("[myDP] 7730reg 0x72, 0x06=%x\n", (uint)c1); i2c_master_read_reg(0, 0x05, &c1); printk("[myDP] 7730reg 0x50, 0x05=%x\n", (uint)c1); } else if (dp_pd_value==7) { unchar c=0; printk("[myDP] write 7730reg 0, 0x06 bit5\n"); i2c_master_read_reg(0,0x06, &c); c = c | 0x20; i2c_master_write_reg(0,0x06, c); } else if (dp_pd_value==8) { unchar c=0; printk("[myDP] write 7730reg 0, 0x06 bit3\n"); i2c_master_read_reg(0,0x06, &c); c = c | 0x08; i2c_master_write_reg(0,0x06, c); } else if (dp_pd_value==9) { unchar c=0; printk("[myDP] write 7730reg 0, 0x06 bit2\n"); i2c_master_read_reg(0,0x06, &c); c = c | 0x04; i2c_master_write_reg(0,0x06, c); } else if (dp_pd_value==10) { unchar c=0; printk("[myDP] write 7730reg 0, 0x06 bit0\n"); i2c_master_read_reg(0,0x06, &c); c = c | 0x01; i2c_master_write_reg(0,0x06, c); } else if (dp_pd_value==11) { unchar c=0; printk("[myDP] write 7730reg 5, 0x06 bit5\n"); i2c_master_read_reg(5,0x06, &c); c = c | 0x20; i2c_master_write_reg(5,0x06, c); } else if (dp_pd_value==12) { myDP_TV_mode = 1; } else if (dp_pd_value==13) { myDP_TV_mode = 0; } else if (dp_pd_value==14) { // printk("[myDP shell] switch to myDP\n"); // gpio_set_value(pdata->gpio_usb_select, 1); myDP_DP_Dongle = 1; } else if (dp_pd_value==15) { // printk("[myDP shell] switch to USB\n"); // gpio_set_value(pdata->gpio_usb_select, 0); myDP_DP_Dongle = 0; } return 0; }