static void check_ic_work_func(struct work_struct *work)
{
	int ret=0;
	uint8_t i2c_addr = 0x1F;
	uint8_t wdog_val[1];
	
	ret = tsp_i2c_read( i2c_addr, wdog_val, sizeof(wdog_val));
	if (ret <= 0) {
		printk("[TSP] i2c failed : ret=%d, ln=%d\n",ret, __LINE__);

		i2c_error_cnt++;
	}else {
		i2c_error_cnt = 0;
	}

	if(wdog_val[0] == (uint8_t)prev_wdog_val || i2c_error_cnt >=3 )
	{
		disable_irq(ts_global->client->irq);
		tsp_reset();
		enable_irq(ts_global->client->irq);
		i2c_error_cnt=0;
		prev_wdog_val = -1;
	}
	else
	{
		prev_wdog_val = wdog_val[0];
	}

	schedule_delayed_work(&ts_global->work_check_ic, CHECK_TIME );
}
int tsp_i2c_read(u8 reg, unsigned char *rbuf, int buf_size)
{
	int ret=-1;
	struct i2c_msg rmsg;
	uint8_t start_reg;

	rmsg.addr = ts_global->client->addr;
	rmsg.flags = 0;//I2C_M_WR;
	rmsg.len = 1;
	rmsg.buf = &start_reg;
	start_reg = reg;
	ret = i2c_transfer(ts_global->client->adapter, &rmsg, 1);

	if(ret>=0) {
		rmsg.flags = I2C_M_RD;
		rmsg.len = buf_size;
		rmsg.buf = rbuf;
		ret = i2c_transfer(ts_global->client->adapter, &rmsg, 1 );
	}

	if( ret < 0 )
	{
		printk("[TSP] Error code : %d\n", __LINE__ );
		printk("[TSP] reset ret=%d\n", tsp_reset( ) );
	}

	return ret;
}
static void check_ic_work_func(struct work_struct *work_timer)
{
	int ret=0;
	uint8_t buf_esd[1];
	uint8_t wdog_val[1];

	struct synaptics_ts_data *ts = container_of(work_timer, struct synaptics_ts_data, work_timer);

	//printk("[TSP] %s, %d\n", __func__, __LINE__ );

	buf_esd[0] = 0x02;
	wdog_val[0] = 1;
	   
	if((tsp_testmode == 0) && (tsp_irq_operation == 0 && (now_tst200_update_luisa == 0)))
	{
		ret = i2c_master_send(ts->client, buf_esd, 1);
			
		if(ret >=0)
		{
			ret = i2c_master_recv(ts->client, wdog_val, 1);
			//printk("[TSP] prev_wdog_val = %d, wdog_val = %d\n", prev_wdog_val, wdog_val[0] );
			
			if(wdog_val[0] == (uint8_t)prev_wdog_val)
			{
				//printk("[TSP] %s tsp_reset counter = %x, prev = %x\n", __func__, wdog_val[0], (uint8_t)prev_wdog_val);
				tsp_reset();
				prev_wdog_val = -1;
			}
			else
			{
				prev_wdog_val = wdog_val[0];
			}			
		}
		else//if(ret < 0)
		{
			tsp_reset();
			printk(KERN_ERR "[TSP] silabs_ts_work_func : i2c_master_send [%d]\n", ret);			
		}
	}
}
void emergency_firm_update( void )
{
	int ret_val=-1;
	int count=0;
	do {
		printk("[TSP]-------------------------------!!\n");
		printk("[TSP] Emergency TSP Firmware Update Start ~~~!!\n");
		tsp_reset();
		ret_val = firm_update();
		msleep(200);
		printk("[TSP]  %s, %d, update pass / fail[%d]\n", __func__, __LINE__,ret_val );
		count++;
	} while( (ret_val != 0) && ( count < FIRMWARE_UPDATE_MAX ) );
}
static void ts_resume_work_func(struct work_struct *ignored)
{
	int ret, key, retry_count;
	struct vreg *vreg_touch;
	uint8_t i2c_addr = 0x1D;
	uint8_t buf[1];
	printk("[TSP] %s+\n", __func__ );

	retry_count = 0;

	while (ts_global->use_irq)
	{
		msleep(20);

		ret = tsp_i2c_read( i2c_addr, buf, sizeof(buf));
		
		if (ret <= 0) 
		{
			retry_count++;
		}
		else if	( buf[0] == 0 )
		{
			retry_count++;
		}
		else
		{
			printk("[TSP] %s:%d, ver SW=%x\n", __func__,__LINE__, buf[0] );
			break;
		}

		if(retry_count > 5){
			printk("[TSP] %s: %d, retry_count=%d\n", __func__, __LINE__, retry_count);
			tsp_reset();
			break;
		}
	
		msleep(20);
	}

	enable_irq(ts_global->client->irq);
	prev_wdog_val = -1;
	schedule_delayed_work(&ts_global->work_check_ic, CHECK_TIME );
	mutex_unlock(&tsp_sleep_lock);
	printk("[TSP] %s-\n", __func__ );

}
예제 #6
0
int tsp_i2c_read(u8 reg, unsigned char *rbuf, int buf_size)
{
	int ret=-1;
	int cnt=0;
	struct i2c_msg rmsg;
	uint8_t start_reg;

	rmsg.addr = ts_global->client->addr;
	rmsg.flags = 0;
	rmsg.len = 1;
	rmsg.buf = &start_reg;
	start_reg = reg;

	for(cnt==0;cnt<I2C_RETRY;cnt++){
		ret = i2c_transfer(ts_global->client->adapter, &rmsg, 1);
		if(ret == 1){
			rmsg.flags = I2C_M_RD;
			rmsg.len = buf_size;
			rmsg.buf = rbuf;
			ret = i2c_transfer(ts_global->client->adapter, &rmsg, 1);

			if(ret == 1)
				break;	
			else
				printk("[TSP] Error ln=%d, ret=%d\n",__LINE__, ret);

		} else {
			printk("[TSP] Error ln=%d, ret=%d\n",__LINE__, ret);
		}
	}

	if (cnt==I2C_RETRY)
		tsp_reset();

	return ret;
}
static int synaptics_ts_resume(struct i2c_client *client)
{
	int ret, key, retry_count;
	struct vreg *vreg_touch;
	struct synaptics_ts_data *ts = i2c_get_clientdata(client);
	uint8_t i2c_addr = 0x1D;
	uint8_t buf[1];

	printk("[TSP] %s+\n", __func__ );
	if( touch_present )
	{
	mutex_lock(&tsp_sleep_lock);

	gpio_set_value( TSP_SCL , 1 ); 
	gpio_set_value( TSP_SDA , 1 ); 
	gpio_set_value( TSP_INT , 1 ); 

	vreg_touch = vreg_get(NULL, "ldo6");

	ret = vreg_enable(vreg_touch);

	if (ret)
	{
		printk(KERN_ERR "%s: vreg enable failed (%d)\n",
				__func__, ret);
		return -EIO;
	}

	schedule_delayed_work(&ts_resume_work, 20 );//200 msec
	msleep(100);
#if 0
	msleep(500);


	retry_count = 0;

	while (ts->use_irq)
	{
		msleep(20);

		ret = tsp_i2c_read( i2c_addr, buf, sizeof(buf));

		if (ret <= 0) 
		{
			retry_count++;
		}
		else if	( buf[0] == 0 )
		{
			retry_count++;
		}
		else
		{
			printk("[TSP] %s:%d, ver SW=%x\n", __func__,__LINE__, buf[0] );
			break;
		}

		if(retry_count > 5){
			printk("[TSP] %s: %d, retry_count=%d\n", __func__, __LINE__, retry_count);
			tsp_reset();
			break;
		}

		msleep(20);
	}

	enable_irq(client->irq);
	prev_wdog_val = -1;
	schedule_delayed_work(&ts->work_check_ic, CHECK_TIME );
#endif
	}
	else
		printk("[TSP] TSP isn't present.\n", __func__ );
	printk("[TSP] %s-\n", __func__ );
	return 0;
}