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__ ); }
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; }