static int asuspec_chip_init(struct i2c_client *client) { int ret_val = 0; int i = 0; ec_chip->op_mode = 0; for ( i = 0; i < 10; i++){ ret_val = asuspec_i2c_test(client); if (ret_val < 0) msleep(300); else break; } if(ret_val < 0){ goto fail_to_access_ec; } for ( i=0; i<8; i++){ asuspec_i2c_read_data(client); } if (asuspec_dockram_read_data(0x01) < 0){ goto fail_to_access_ec; } strcpy(ec_chip->ec_model_name, &ec_chip->i2c_dm_data[1]); ASUSPEC_NOTICE("Model Name: %s\n", ec_chip->ec_model_name); if (asuspec_dockram_read_data(0x02) < 0){ goto fail_to_access_ec; } strcpy(ec_chip->ec_version, &ec_chip->i2c_dm_data[1]); ASUSPEC_NOTICE("EC-FW Version: %s\n", ec_chip->ec_version); if (asuspec_dockram_read_data(0x03) < 0){ goto fail_to_access_ec; } ASUSPEC_INFO("EC-Config Format: %s\n", &ec_chip->i2c_dm_data[1]); if (asuspec_dockram_read_data(0x04) < 0){ goto fail_to_access_ec; } strcpy(ec_chip->ec_pcba, &ec_chip->i2c_dm_data[1]); ASUSPEC_NOTICE("PCBA Version: %s\n", ec_chip->ec_pcba); if(factory_mode == 2) asuspec_enter_factory_mode(); else asuspec_enter_normal_mode(); ec_chip->status = 1; switch_set_state(&ec_chip->pad_sdev, !ec_chip->pad_sdev.state); fail_to_access_ec: return 0; }
static void asuspec_smi(void){ if (ec_chip->i2c_data[2] == ASUSPEC_SMI_HANDSHAKING){ ASUSPEC_NOTICE("ASUSPEC_SMI_HANDSHAKING\n"); if(ec_chip->status == 0){ asuspec_chip_init(ec_chip->client); } ec_chip->ec_in_s3 = 0; } else if (ec_chip->i2c_data[2] == ASUSPEC_SMI_RESET){ ASUSPEC_NOTICE("ASUSPEC_SMI_RESET\n"); queue_delayed_work(asuspec_wq, &ec_chip->asuspec_init_work, 0); } else if (ec_chip->i2c_data[2] == ASUSPEC_SMI_WAKE){ ASUSPEC_NOTICE("ASUSPEC_SMI_WAKE\n"); } }
/* * functions definition */ int asuspec_audio_recording(int record_enable){ if (record_enable) asuspec_send_ec_req(); ec_chip->audio_recording = record_enable; ASUSPEC_NOTICE("audio_recording = %d\n", ec_chip->audio_recording); return 0; }
static void asuspec_enter_s3_work_function(struct work_struct *dat) { int ret_val = 0; int i = 0; mutex_lock(&ec_chip->state_change_lock); if (ec_chip->op_mode){ ASUSPEC_ERR("It's not allowed to access dockram under FW update mode.\n"); mutex_unlock(&ec_chip->state_change_lock); return ; } if (ec_chip->pad_pid == TEGRA3_PROJECT_P1801) asuspec_storage_info_update(); ec_chip->ec_in_s3 = 1; for ( i = 0; i < 3; i++ ){ ret_val = asuspec_dockram_read_data(0x0A); if (ret_val < 0){ ASUSPEC_ERR("fail to get control flag\n"); msleep(100); } else break; } ec_chip->i2c_dm_data[0] = 8; ec_chip->i2c_dm_data[5] = ec_chip->i2c_dm_data[5] | 0x02; for ( i = 0; i < 3; i++ ){ ret_val = asuspec_dockram_write_data(0x0A,9); if (ret_val < 0){ ASUSPEC_ERR("Send s3 command fail\n"); msleep(100); } else { ASUSPEC_NOTICE("EC in S3\n"); break; } } mutex_unlock(&ec_chip->state_change_lock); }
static void asuspec_work_function(struct work_struct *dat) { int gpio = asuspec_apwake_gpio; int irq = gpio_to_irq(gpio); int ret_val = 0; ret_val = asuspec_i2c_read_data(ec_chip->client); enable_irq(irq); ASUSPEC_NOTICE("0x%x 0x%x 0x%x 0x%x\n", ec_chip->i2c_data[0], ec_chip->i2c_data[1], ec_chip->i2c_data[2], ec_chip->i2c_data[3]); if (ret_val < 0){ return ; } if (ec_chip->i2c_data[1] & ASUSPEC_OBF_MASK){ if (ec_chip->i2c_data[1] & ASUSPEC_SMI_MASK){ asuspec_smi(); return ; } } }
static void asuspec_smi(void){ if (ec_chip->i2c_data[2] == ASUSPEC_SMI_HANDSHAKING){ ASUSPEC_NOTICE("ASUSPEC_SMI_HANDSHAKING\n"); if(ec_chip->status == 0){ asuspec_chip_init(ec_chip->client); } ec_chip->ec_in_s3 = 0; } else if (ec_chip->i2c_data[2] == ASUSPEC_SMI_RESET){ ASUSPEC_NOTICE("ASUSPEC_SMI_RESET\n"); queue_delayed_work(asuspec_wq, &ec_chip->asuspec_init_work, 0); } else if (ec_chip->i2c_data[2] == ASUSPEC_SMI_WAKE){ ASUSPEC_NOTICE("ASUSPEC_SMI_WAKE\n"); } else if (ec_chip->i2c_data[2] == APOWER_SMI_S5){ ASUSPEC_NOTICE("APOWER_POWEROFF\n"); asuspec_switch_apower_state(APOWER_POWEROFF); } else if (ec_chip->i2c_data[2] == APOWER_SMI_NOTIFY_SHUTDOWN){ ASUSPEC_NOTICE("APOWER_NOTIFY_SHUTDOWN\n"); asuspec_switch_apower_state(APOWER_NOTIFY_SHUTDOWN); } else if (ec_chip->i2c_data[2] == APOWER_SMI_RESUME){ ASUSPEC_NOTICE("APOWER_SMI_RESUME\n"); asuspec_switch_apower_state(APOWER_RESUME); } }
static void asuspec_send_ec_req(void){ ASUSPEC_NOTICE("send EC_Request\n"); gpio_set_value(asuspec_ecreq_gpio, 0); msleep(DELAY_TIME_MS); gpio_set_value(asuspec_ecreq_gpio, 1); }