Esempio n. 1
0
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;

}
Esempio n. 2
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");
	}
}
Esempio n. 3
0
/*
 * 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;
}
Esempio n. 4
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);
}
Esempio n. 5
0
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 ;
		}
	}
}
Esempio n. 6
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");
	} 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);
	}
}
Esempio n. 7
0
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);
}