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_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); }
int asuspec_is_usb_charger(int charger_enable){ int ret = 0; if (ec_chip->ec_in_s3){ asuspec_send_ec_req(); msleep(200); } ret = asuspec_dockram_read_data(0x0A); if (ret < 0){ ASUSPEC_ERR("Fail to access control flag info.\n"); return ret; } ec_chip->i2c_dm_data[0] = 8; if (charger_enable){ ec_chip->i2c_dm_data[6] = ec_chip->i2c_dm_data[5] | 0x01; } else { ec_chip->i2c_dm_data[6] = ec_chip->i2c_dm_data[5] & 0xFE; } ret = asuspec_dockram_write_data(0x0A,9); mod_timer(&ec_chip->asuspec_timer,jiffies+(HZ * 1)); return ret; }