static ssize_t firmware_ret_show(struct device *dev, struct device_attribute *attr, char *buf) { printk("[TSP] %s!\n", __func__); printk("[TSP] %s, firmware_ret_val = %d\n", __func__, firmware_ret_val); firm_update(); return sprintf(buf, "%d", firmware_ret_val ); }
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 ) ); }
/* firmware - update */ static ssize_t firmware_store( struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { char *after; unsigned long value = simple_strtoul(buf, &after, 10); printk(KERN_INFO "[TSP] %s, %d\n", __func__, __LINE__); firmware_ret_val = -1; if ( value == 1 ) { printk("[TSP] Firmware update start!!\n" ); firm_update( ); #if FIRM_TEST printk("[TSP] start update cypress touch firmware !!\n"); g_FirmwareImageSize = CYPRESS_FIRMWARE_IMAGE_SIZE; if(g_pTouchFirmware == NULL) { printk("[TSP][ERROR] %s() kmalloc fail !! \n", __FUNCTION__); return -1; } /* ready for firmware code */ size = issp_request_firmware("touch.hex"); /* firmware update */ // issp_upgrade(); g_FirmwareImageSize = 0; // step.1 power off/on // step.2 enable irq #endif return size; } return size; }
/* firmware - update */ static ssize_t firmware_store( struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { char *after; unsigned long value = simple_strtoul(buf, &after, 10); printk(KERN_INFO "[TSP] %s, %d\n", __func__, __LINE__); firmware_ret_val = -1; if ( value == 1 ) { printk("[TSP] Firmware update start!!\n" ); firm_update( ); } return size; }
static int synaptics_ts_probe( struct i2c_client *client, const struct i2c_device_id *id) { struct synaptics_ts_data *ts; int ret = 0; struct vreg *vreg_touch; uint8_t i2c_addr = 0x1B; uint8_t buf_tmp[3]={0,}; HW_ver = 0; SW_ver = 0; printk("[TSP] %s, %d\n", __func__, __LINE__ ); vreg_touch = vreg_get(NULL, "ldo6"); ret = vreg_set_level(vreg_touch, OUT3000mV); if (ret) { printk(KERN_ERR "%s: vreg set level failed (%d)\n", __func__, ret); return -EIO; } ret = vreg_enable(vreg_touch); if (ret) { printk(KERN_ERR "%s: vreg enable failed (%d)\n", __func__, ret); return -EIO; } msleep(700); ts = kzalloc(sizeof(*ts), GFP_KERNEL); if (ts == NULL) { ret = -ENOMEM; goto err_alloc_data_failed; } INIT_WORK(&ts->work, synaptics_ts_work_func); INIT_DELAYED_WORK(&ts->work_check_ic, check_ic_work_func ); schedule_delayed_work(&ts->work_check_ic, CHECK_TIME ); ts->client = client; i2c_set_clientdata(client, ts); ts_global = ts; ts->input_dev = input_allocate_device(); if (ts->input_dev == NULL) { ret = -ENOMEM; touch_present = 0; printk(KERN_ERR "synaptics_ts_probe: Failed to allocate input device\n"); goto err_input_dev_alloc_failed; } ts->input_dev->name = "sec_touchscreen"; set_bit(EV_SYN, ts->input_dev->evbit); set_bit(EV_KEY, ts->input_dev->evbit); set_bit(BTN_TOUCH, ts->input_dev->keybit); set_bit(EV_ABS, ts->input_dev->evbit); printk(KERN_INFO "synaptics_ts_probe: max_x: 240, max_y: 320\n"); input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, MAX_X, 0, 0); //0, MAX_X, 0, 0 input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, MAX_Y, 0, 0); //0, MAX_Y, 0, 0 input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); /* ts->input_dev->name = ts->keypad_info->name; */ ret = input_register_device(ts->input_dev); if (ret) { touch_present = 0; printk(KERN_ERR "synaptics_ts_probe: Unable to register %s input device\n", ts->input_dev->name); goto err_input_register_device_failed; } printk("[TSP] %s, irq=%d\n", __func__, client->irq ); if (client->irq) { ret = request_irq(client->irq, synaptics_ts_irq_handler,/* IRQF_TRIGGER_RISING |*/ IRQF_TRIGGER_FALLING , client->name, ts); if (ret == 0) ts->use_irq = 1; else dev_err(&client->dev, "request_irq failed\n"); } #ifdef CONFIG_HAS_EARLYSUSPEND ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; ts->early_suspend.suspend = synaptics_ts_early_suspend; ts->early_suspend.resume = synaptics_ts_late_resume; register_early_suspend(&ts->early_suspend); #endif printk(KERN_INFO "synaptics_ts_probe: Start touchscreen %s in %s mode\n", ts->input_dev->name, ts->use_irq ? "interrupt" : "polling"); /* sys fs */ touch_class = class_create(THIS_MODULE, "touch"); if (IS_ERR(touch_class)) pr_err("Failed to create class(touch)!\n"); firmware_dev = device_create(touch_class, NULL, 0, NULL, "firmware"); if (IS_ERR(firmware_dev)) pr_err("Failed to create device(firmware)!\n"); if (device_create_file(firmware_dev, &dev_attr_firmware) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_firmware.attr.name); if (device_create_file(firmware_dev, &dev_attr_firmware_ret) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_firmware_ret.attr.name); /* sys fs */ /* Check point - i2c check - start */ ret = tsp_i2c_read( i2c_addr, buf_tmp, sizeof(buf_tmp)); HW_ver = buf_tmp[1]; SW_ver = buf_tmp[2]; if (ret <= 0) { printk(KERN_ERR "i2c_transfer failed\n"); ret = tsp_i2c_read( i2c_addr, buf_tmp, sizeof(buf_tmp)); if (ret <= 0) { disable_irq(ts_global->client->irq); cancel_delayed_work_sync(&ts_global->work_check_ic); touch_present = 0; printk("[TSP] %s, ln:%d, Failed to register TSP!!!\n\tcheck the i2c line!!!, ret=%d\n", __func__,__LINE__, ret); goto err_check_functionality_failed; } } /* Check point - i2c check - end */ printk("[TSP] %s, ver CY=%x\n", __func__ , buf_tmp[0] ); printk("[TSP] %s, ver HW=%x\n", __func__ , buf_tmp[1] ); printk("[TSP] %s, ver SW=%x\n", __func__ , buf_tmp[2] ); touch_present = 1; /* Check point - Firmware */ printk("[TSP] %s:%d, ver SW=%x, HW=%x\n", __func__, __LINE__, SW_ver, HW_ver); printk("[TSP] Here - Deleted Firmware Check Routine \n"); #if 0 switch( (HW_ver+1)/10 ){ case 0: //Degitech if(HW_ver < Digi_HEX_HW_VER){ //Firmware Update firm_update(); }else if((SW_ver<Digi_HEX_SW_VER)||((SW_ver&0xF0)==0xF0)||(SW_ver==0)){ printk("[TSP] firm_update START!!, ln=%d\n",__LINE__); firm_update(); }else{ printk("[TSP] Firmware Version(Digitech) is Up-to-date.\n"); }break; case 1: //SMAC if(HW_ver < SMAC_HEX_HW_VER){ //Firmware Update firm_update(); }else if((SW_ver<SMAC_HEX_SW_VER)||((SW_ver&0xF0)==0xF0)||(SW_ver==0)){ printk("[TSP] firm_update START!!, ln=%d\n",__LINE__); firm_update(); }else{ printk("[TSP] Firmware Version(SMAC) is Up-to-date.\n"); }break; case 2: ; // } #endif printk(KERN_INFO "synaptics_ts_probe: Manufacturer ID: %x, HW ver=%x, SW ver=%x\n", buf_tmp[0], buf_tmp[1], buf_tmp[2]); /* Check point - Firmware */ return 0; err_input_register_device_failed: input_free_device(ts->input_dev); err_input_dev_alloc_failed: kfree(ts); err_alloc_data_failed: err_check_functionality_failed: return ret; }
static int synaptics_ts_probe( struct i2c_client *client, const struct i2c_device_id *id) { struct synaptics_ts_data *ts; uint8_t i2c_addr = 0x1B; uint8_t buf[3], buf_tmp[3]={0,0,0}; uint8_t addr[1]; int i, ret; #if defined (CONFIG_TOUCHSCREEN_MMS128_TASSCOOPER) printk("[TSP][Synaptics][%s] %s\n", __func__,"Called"); if(Is_MMS128_Connected()== 1) { printk("[TSP][Synaptics][%s] %s\n", __func__,"Melfas already detected !!"); return -ENXIO; } #endif printk("[TSP] %s, %d\n", __func__, __LINE__ ); touch_ctrl_regulator(TOUCH_ON); msleep(100); touch_ctrl_regulator(TOUCH_OFF); msleep(200); touch_ctrl_regulator(TOUCH_ON); msleep(100); ts = kzalloc(sizeof(*ts), GFP_KERNEL); if (ts == NULL) { ret = -ENOMEM; goto err_alloc_data_failed; } #if USE_THREADED_IRQ #else INIT_WORK(&ts->work, synaptics_ts_work_func); #endif ts->client = client; i2c_set_clientdata(client, ts); ts_global = ts; tsp_irq=client->irq; #if defined (CONFIG_TOUCHSCREEN_MMS128_TASSCOOPER) ret = synaptics_ts_check(); if (ret <= 0) { i2c_release_client(client); touch_ctrl_regulator(TOUCH_OFF); ret = -ENXIO; goto err_input_dev_alloc_failed; } #else /* Check point - i2c check - start */ //ret = tsp_i2c_read( 0x1B, buf_tmp, sizeof(buf_tmp)); for (i = 0; i < 1; i++) { printk("[TSP] %s, %d, send\n", __func__, __LINE__ ); addr[0] = 0x1B; //address ret = i2c_master_send(ts_global->client, addr, 1); if (ret >= 0) { printk("[TSP] %s, %d, receive\n", __func__, __LINE__ ); ret = i2c_master_recv(ts_global->client, buf_tmp, 3); if (ret >= 0) break; // i2c success } printk("[TSP] %s, %d, fail\n", __func__, __LINE__ ); } touch_vendor_id = buf_tmp[0]; touch_hw_ver = buf_tmp[1]; touch_sw_ver = buf_tmp[2]; printk("[TSP] %s:%d, ver tsp=%x, HW=%x, SW=%x\n", __func__,__LINE__, touch_vendor_id, touch_hw_ver, touch_sw_ver); #endif HW_ver = touch_hw_ver; if (ret <= 0) { printk("[TSP] %s, ln:%d, Failed to register TSP!!!\n\tcheck the i2c line!!!, ret=%d\n", __func__,__LINE__, ret); goto err_check_functionality_failed; } /* Check point - i2c check - end */ ts->input_dev = input_allocate_device(); if (ts->input_dev == NULL) { ret = -ENOMEM; printk(KERN_ERR "synaptics_ts_probe: Failed to allocate input device\n"); goto err_input_dev_alloc_failed; } ts->input_dev->name = "synaptics-rmi-touchscreen"; ts->input_dev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); ts->input_dev->keybit[BIT_WORD(KEY_POWER)] |= BIT_MASK(KEY_POWER); set_bit(BTN_TOUCH, ts->input_dev->keybit); set_bit(EV_ABS, ts->input_dev->evbit); ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, MAX_X, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, MAX_Y, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); set_bit(EV_SYN, ts->input_dev->evbit); set_bit(EV_KEY, ts->input_dev->evbit); /* ts->input_dev->name = ts->keypad_info->name; */ ret = input_register_device(ts->input_dev); if (ret) { printk(KERN_ERR "synaptics_ts_probe: Unable to register %s input device\n", ts->input_dev->name); goto err_input_register_device_failed; } printk("[TSP] %s, irq=%d\n", __func__, client->irq ); if (client->irq) { #if USE_THREADED_IRQ ret = request_threaded_irq(client->irq, synaptics_ts_irq_handler, synaptics_ts_work_func, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, client->name, ts); #else ret = request_irq(client->irq, synaptics_ts_irq_handler, IRQF_TRIGGER_FALLING, client->name, ts); #endif if (ret == 0) ts->use_irq = 1; else dev_err(&client->dev, "request_irq failed\n"); } if (!ts->use_irq) { hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ts->timer.function = synaptics_ts_timer_func; hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); } #if 1 #ifdef CONFIG_HAS_EARLYSUSPEND ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; ts->early_suspend.suspend = synaptics_ts_early_suspend; ts->early_suspend.resume = synaptics_ts_late_resume; register_early_suspend(&ts->early_suspend); #endif #endif printk(KERN_INFO "synaptics_ts_probe: Start touchscreen %s in %s mode\n", ts->input_dev->name, ts->use_irq ? "interrupt" : "polling"); /* sys fs */ touch_class = class_create(THIS_MODULE, "touch"); if (IS_ERR(touch_class)) pr_err("Failed to create class(touch)!\n"); firmware_dev = device_create(touch_class, NULL, 0, NULL, "firmware"); if (IS_ERR(firmware_dev)) pr_err("Failed to create device(firmware)!\n"); if (device_create_file(firmware_dev, &dev_attr_firmware) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_firmware.attr.name); if (device_create_file(firmware_dev, &dev_attr_firmware_ret) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_firmware_ret.attr.name); /* sys fs */ #if 0 if(buf_tmp[0]<HEX_HW_VER){ //Firmware Update firm_update(); }else if((buf_tmp[1]<HEX_SW_VER)||((buf_tmp[1]&0xF0)==0xF0)||(buf_tmp[1]==0)){ printk("[TSP] firm_update START!!, ln=%d\n",__LINE__); firm_update(); }else{ printk("[TSP] Firmware Version is Up-to-date.\n"); } #endif return 0; err_input_register_device_failed: input_free_device(ts->input_dev); err_input_dev_alloc_failed: kfree(ts); err_alloc_data_failed: err_check_functionality_failed: return ret; }
/* firmware - update */ static ssize_t firmware_store( struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { char *after; uint8_t i2c_addr = 0x00; uint8_t buf_tmp[11] = {0}; unsigned long value = simple_strtoul(buf, &after, 10); printk(KERN_INFO "[TSP] %s, %d\n", __func__, __LINE__); firmware_ret_val = -1; tsp_i2c_read( i2c_addr, buf_tmp, sizeof(buf_tmp)); touch_vendor_id = buf_tmp[7]; touch_hw_ver = buf_tmp[8]; touch_sw_ver = buf_tmp[9]; printk("[TSP] %s:%d, ver tsp=%x, HW=%x, SW=%x\n", __func__,__LINE__, touch_vendor_id, touch_hw_ver, touch_sw_ver); HW_ver = touch_hw_ver; if ( value == 1 ) { printk("[TSP] Firmware update start!!\n" ); now_tst200_update_luisa = 1; firm_update( ); now_tst200_update_luisa = 0; #if FIRM_TEST printk("[TSP] start update cypress touch firmware !!\n"); g_FirmwareImageSize = CYPRESS_FIRMWARE_IMAGE_SIZE; if(g_pTouchFirmware == NULL) { printk("[TSP][ERROR] %s() kmalloc fail !! \n", __FUNCTION__); return -1; } /* ready for firmware code */ size = issp_request_firmware("touch.hex"); /* firmware update */ // issp_upgrade(); g_FirmwareImageSize = 0; // step.1 power off/on // step.2 enable irq #endif return size; } else if( value == 2 ) { printk("[TSP] Special Firmware update start!!\n" ); tsp_special_update = 1; now_tst200_update_luisa = 1; firm_update( ); now_tst200_update_luisa = 0; } return size; }
static int synaptics_ts_probe( struct i2c_client *client, const struct i2c_device_id *id) { struct synaptics_ts_data *ts; int i, ret = 0; uint8_t i2c_addr = 0; uint8_t addr[1]; uint8_t buf[11] = {0,}; int ret_temp=0; uint8_t buf_temp[3]; //uint8_t i2c_addr_temp = 0x02; printk("[TSP] %s, %d\n", __func__, __LINE__ ); touch_ctrl_regulator(TOUCH_ON); msleep(100); touch_ctrl_regulator(TOUCH_OFF); msleep(200); touch_ctrl_regulator(TOUCH_ON); msleep(100); ts = kzalloc(sizeof(*ts), GFP_KERNEL); if (ts == NULL) { ret = -ENOMEM; goto err_alloc_data_failed; } #if USE_THREADED_IRQ #else INIT_WORK(&ts->work, synaptics_ts_work_func); #endif INIT_WORK(&ts->work_timer, check_ic_work_func); ts->client = client; i2c_set_clientdata(client, ts); ts_global = ts; ts->input_dev = input_allocate_device(); if (ts->input_dev == NULL) { ret = -ENOMEM; printk(KERN_ERR "synaptics_ts_probe: Failed to allocate input device\n"); goto err_input_dev_alloc_failed; } ts->input_dev->name = "sec_touchscreen"; ts->input_dev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); ts->input_dev->keybit[BIT_WORD(KEY_POWER)] |= BIT_MASK(KEY_POWER); set_bit(BTN_TOUCH, ts->input_dev->keybit); set_bit(EV_ABS, ts->input_dev->evbit); ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); printk(KERN_INFO "synaptics_ts_probe: max_x: 240, max_y: 320\n"); input_set_abs_params(ts->input_dev, ABS_X, 0, MAX_X, 0, 0); input_set_abs_params(ts->input_dev, ABS_Y, 0, MAX_Y, 0, 0); input_set_abs_params(ts->input_dev, ABS_PRESSURE, 0, 255, 0, 0); input_set_abs_params(ts->input_dev, ABS_TOOL_WIDTH, 0, 15, 0, 0); set_bit(EV_SYN, ts->input_dev->evbit); set_bit(EV_KEY, ts->input_dev->evbit); hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ts->timer.function = synaptics_watchdog_timer_func; /* Check point - i2c check - start */ //ret = tsp_i2c_read( i2c_addr, buf, sizeof(buf)); for (i = 0; i < 1; i++) { printk("[TSP] %s, %d, send\n", __func__, __LINE__ ); addr[0] = ADDR_TSP_VENDER_ID; //address ret = i2c_master_send(ts_global->client, addr, 1); if (ret >= 0) { printk("[TSP] %s, %d, receive\n", __func__, __LINE__ ); ret = i2c_master_recv(ts_global->client, buf, 3); if (ret >= 0) break; // i2c success } printk("[TSP] %s, %d, fail\n", __func__, __LINE__ ); } touch_vendor_id = buf[0]; touch_hw_ver = buf[1]; touch_sw_ver = buf[2]; printk("[TSP] %s:%d, ver tsp=%x, HW=%x, SW=%x\n", __func__,__LINE__, touch_vendor_id, touch_hw_ver, touch_sw_ver); HW_ver = touch_hw_ver; if(ret >= 0) { touch_present = 1; hrtimer_start(&ts->timer, ktime_set(2, 0), HRTIMER_MODE_REL); } else//if(ret < 0) { printk(KERN_ERR "i2c_transfer failed\n"); printk("[TSP] %s, ln:%d, Failed to register TSP!!!\n\tcheck the i2c line!!!, ret=%d\n", __func__,__LINE__, ret); goto err_check_functionality_failed; } /* Check point - i2c check - end */ /* ts->input_dev->name = ts->keypad_info->name; */ ret = input_register_device(ts->input_dev); if (ret) { printk(KERN_ERR "synaptics_ts_probe: Unable to register %s input device\n", ts->input_dev->name); goto err_input_register_device_failed; } printk("[TSP] %s, irq=%d\n", __func__, client->irq ); if (client->irq) { #if USE_THREADED_IRQ ret = request_threaded_irq(client->irq, synaptics_ts_irq_handler, synaptics_ts_work_func, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, client->name, ts); #else ret = request_irq(client->irq, synaptics_ts_irq_handler,/* IRQF_TRIGGER_RISING |*/ IRQF_TRIGGER_FALLING , client->name, ts); #endif if (ret == 0) ts->use_irq = 1; else dev_err(&client->dev, "request_irq failed\n"); } // hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); // ts->timer.function = synaptics_ts_timer_func; #ifdef CONFIG_HAS_EARLYSUSPEND ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN+1; ts->early_suspend.suspend = synaptics_ts_early_suspend; ts->early_suspend.resume = synaptics_ts_late_resume; register_early_suspend(&ts->early_suspend); #endif printk(KERN_INFO "synaptics_ts_probe: Start touchscreen %s in %s mode\n", ts->input_dev->name, ts->use_irq ? "interrupt" : "polling"); /* sys fs */ touch_class = class_create(THIS_MODULE, "touch"); if (IS_ERR(touch_class)) pr_err("Failed to create class(touch)!\n"); firmware_dev = device_create(touch_class, NULL, 0, NULL, "firmware"); if (IS_ERR(firmware_dev)) pr_err("Failed to create device(firmware)!\n"); if (device_create_file(firmware_dev, &dev_attr_firmware) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_firmware.attr.name); if (device_create_file(firmware_dev, &dev_attr_firmware_ret) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_firmware_ret.attr.name); if (device_create_file(firmware_dev, &dev_attr_raw) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_raw.attr.name); if (device_create_file(firmware_dev, &dev_attr_raw_enable) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_raw_enable.attr.name); if (device_create_file(firmware_dev, &dev_attr_raw_disable) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_raw_disable.attr.name); if (device_create_file(firmware_dev, &dev_attr_rawdata_read) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_rawdata_read.attr.name); if (device_create_file(firmware_dev, &dev_attr_difference_read) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_difference_read.attr.name); if (device_create_file(firmware_dev, &dev_attr_raw_value) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_raw_value.attr.name); if (device_create_file(firmware_dev, &dev_attr_touch15test_enable) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_touch15test_enable.attr.name); if (device_create_file(firmware_dev, &dev_attr_touch15test_disable) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_touch15test_disable.attr.name); /* sys fs */ #if 0//SET_DOWNLOAD_BY_GPIO #if 0 if (/*(touch_vendor_id == TSP_VENDER_ID)&&*/( touch_hw_ver == TSP_HW_VER1)&&(touch_sw_ver < TSP_SW_VER1)) { printk("[TSP] Firmware update start!!\n" ); now_tst200_update_luisa = 1; firm_update(); now_tst200_update_luisa = 0; } else if (/*(touch_vendor_id == TSP_VENDER_ID)&&*/( touch_hw_ver == TSP_HW_VER2)&&(touch_sw_ver < TSP_SW_VER2)) { printk("[TSP] Firmware update start!!\n" ); now_tst200_update_luisa = 1; firm_update(); now_tst200_update_luisa = 0; } #endif { HW_ver = 0x03; printk("[TSP] Firmware update start!!\n" ); now_tst200_update_luisa = 1; firm_update(); now_tst200_update_luisa = 0; } #endif // SET_DOWNLOAD_BY_GPIO return 0; err_input_register_device_failed: input_free_device(ts->input_dev); err_input_dev_alloc_failed: kfree(ts); err_alloc_data_failed: err_check_functionality_failed: return ret; }
static int synaptics_ts_probe( struct i2c_client *client, const struct i2c_device_id *id) { struct synaptics_ts_data *ts; int ret = 0; int key = 0; struct vreg *vreg_touch; uint8_t i2c_addr = 0x1B; uint8_t buf_tmp[3]={0,}; HW_ver = 0; SW_ver = 0; printk("[TSP] %s, %d\n", __func__, __LINE__ ); vreg_touch = vreg_get(NULL, "maxldo06"); ret = vreg_set_level(vreg_touch, OUT3000mV); if (ret) { printk(KERN_ERR "%s: vreg set level failed (%d)\n", __func__, ret); return -EIO; } ret = vreg_enable(vreg_touch); if (ret) { printk(KERN_ERR "%s: vreg enable failed (%d)\n", __func__, ret); return -EIO; } msleep(700); ts = kzalloc(sizeof(*ts), GFP_KERNEL); if (ts == NULL) { ret = -ENOMEM; goto err_alloc_data_failed; } INIT_WORK(&ts->work, synaptics_ts_work_func); #ifdef TOUCH_VERIFY_WITH_TIMER if(board_hw_revision >= 0x3) { INIT_DELAYED_WORK(&ts->work_check_ic, check_ic_work_func ); schedule_delayed_work(&ts->work_check_ic, CHECK_TIME ); } #endif ts->client = client; i2c_set_clientdata(client, ts); ts_global = ts; ts->input_dev = input_allocate_device(); if (ts->input_dev == NULL) { ret = -ENOMEM; printk(KERN_ERR "synaptics_ts_probe: Failed to allocate input device\n"); goto err_input_dev_alloc_failed; } ts->input_dev->name = "synaptics-rmi-touchscreen"; set_bit(EV_SYN, ts->input_dev->evbit); set_bit(EV_KEY, ts->input_dev->evbit); set_bit(BTN_TOUCH, ts->input_dev->keybit); set_bit(EV_ABS, ts->input_dev->evbit); printk(KERN_INFO "synaptics_ts_probe: max_x: 240, max_y: 320\n"); input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, MAX_X, 0, 0); //0, MAX_X, 0, 0 input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, MAX_Y, 0, 0); //0, MAX_Y, 0, 0 input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); for(key = 0; key < MAX_KEYS ; key++) input_set_capability(ts->input_dev, EV_KEY, touchkey_keycodes[key]); // for TSK for(key = 0; key < MAX_KEYS ; key++) touchkey_status[key] = TK_STATUS_RELEASE; /* ts->input_dev->name = ts->keypad_info->name; */ ret = input_register_device(ts->input_dev); if (ret) { printk(KERN_ERR "synaptics_ts_probe: Unable to register %s input device\n", ts->input_dev->name); goto err_input_register_device_failed; } printk("[TSP] %s, irq=%d\n", __func__, client->irq ); if (client->irq) { ret = request_irq(client->irq, synaptics_ts_irq_handler,/* IRQF_TRIGGER_RISING |*/ IRQF_TRIGGER_FALLING , client->name, ts); if (ret == 0) ts->use_irq = 1; else dev_err(&client->dev, "request_irq failed\n"); } #ifdef CONFIG_HAS_EARLYSUSPEND ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; ts->early_suspend.suspend = synaptics_ts_early_suspend; ts->early_suspend.resume = synaptics_ts_late_resume; register_early_suspend(&ts->early_suspend); #endif printk(KERN_INFO "synaptics_ts_probe: Start touchscreen %s in %s mode\n", ts->input_dev->name, ts->use_irq ? "interrupt" : "polling"); /* sys fs */ touch_class = class_create(THIS_MODULE, "touch"); if (IS_ERR(touch_class)) pr_err("Failed to create class(touch)!\n"); firmware_dev = device_create(touch_class, NULL, 0, NULL, "firmware"); if (IS_ERR(firmware_dev)) pr_err("Failed to create device(firmware)!\n"); if (device_create_file(firmware_dev, &dev_attr_firmware) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_firmware.attr.name); if (device_create_file(firmware_dev, &dev_attr_firmware_ret) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_firmware_ret.attr.name); /* sys fs */ if(board_hw_revision >= 0x3) { msleep(400); } /* Check point - i2c check - start */ ret = tsp_i2c_read( i2c_addr, buf_tmp, sizeof(buf_tmp)); HW_ver = buf_tmp[1]; SW_ver = buf_tmp[2]; if (ret <= 0) { printk(KERN_ERR "i2c_transfer failed\n"); ret = tsp_i2c_read( i2c_addr, buf_tmp, sizeof(buf_tmp)); #ifdef EMERGENCY_FIRMWARE_UPDATE emergency_firm_update(); #endif if (ret <= 0) { printk("[TSP] %s, ln:%d, Failed to register TSP!!!\n\tcheck the i2c line!!!, ret=%d\n", __func__,__LINE__, ret); goto err_check_functionality_failed; } } /* Check point - i2c check - end */ printk("[TSP] %s, ver CY=%x\n", __func__ , buf_tmp[0] ); printk("[TSP] %s, ver HW=%x\n", __func__ , buf_tmp[1] ); printk("[TSP] %s, ver SW=%x\n", __func__ , buf_tmp[2] ); /* Check point - Firmware */ printk("[TSP] %s: Board REV[%d], ver SW=%x, HW=%x\n", __func__, board_hw_revision, SW_ver, HW_ver ); if(((HW_ver <= HEX_HW_VER ) || ( HW_ver < HEX_HW_VER && HW_ver > 0 )) && (board_hw_revision < 0x3)) { if((SW_ver<HEX_SW_VER)||((SW_ver&0xF0)==0xF0)||(SW_ver==0)){ printk(KERN_INFO "[TSP] Firmware Update on REV01"); firm_update(); } else { printk(KERN_INFO "[TSP] Firmware version is up-to-date"); } } else if(((HW_ver <= HEX_HW_VER_REV03) || (HW_ver < HEX_HW_VER_REV03 && HW_ver>0)) && (board_hw_revision == 0x3)) { if((SW_ver < HEX_SW_VER_REV03)||((SW_ver&0xF0)==0xF0)||(SW_ver==0)){ printk(KERN_INFO "[TSP] Firmware Update on REV03"); firm_update(); }else{ printk(KERN_INFO "[TSP] Firmware version is up-to-date"); } } else if(((HW_ver <= HEX_HW_VER_REV04) || (HW_ver < HEX_HW_VER_REV04 && HW_ver>0)) && (board_hw_revision >= 0x4)) { if((SW_ver < HEX_SW_VER_REV04)||((SW_ver&0xF0)==0xF0)||(SW_ver==0)){ printk(KERN_INFO "[TSP] Firmware Update on REV06"); firm_update(); }else{ printk(KERN_INFO "[TSP] Firmware version is up-to-date"); } } printk(KERN_INFO "%s: Manufacturer ID: %x, HW ver=%x, SW ver=%x\n", __func__, buf_tmp[0], buf_tmp[1], buf_tmp[2]); #ifdef KEY_LED_CONTROL init_timer(&g_led_timer); g_led_timer.expires= (jiffies + (HZ*KEY_LED_ON_TIME)); g_led_timer.function = TouchKey_Led_TimerProc; add_timer(&g_led_timer); #endif return 0; err_input_register_device_failed: input_free_device(ts->input_dev); err_input_dev_alloc_failed: kfree(ts); err_alloc_data_failed: err_check_functionality_failed: return ret; }
static int synaptics_ts_probe( struct i2c_client *client, const struct i2c_device_id *id) { struct synaptics_ts_data *ts; int ret = 0; struct vreg *vreg_touch; printk("[TSP] %s, %d\n", __func__, __LINE__ ); tsp_ready=0; vreg_touch = vreg_get(NULL, "ldo6"); ret = vreg_set_level(vreg_touch, OUT2800mV); if (ret) { printk(KERN_ERR "%s: vreg set level failed (%d)\n", __func__, ret); return -EIO; } ret = vreg_enable(vreg_touch); if (ret) { printk(KERN_ERR "%s: vreg enable failed (%d)\n", __func__, ret); return -EIO; } msleep(100); gpio_configure( VTOUCH_EN, GPIOF_OUTPUT_HIGH ); //I2C Pullup 2.6V gpio_set_value( VTOUCH_EN, 1 ); msleep(100); ts = kzalloc(sizeof(*ts), GFP_KERNEL); if (ts == NULL) { ret = -ENOMEM; goto err_alloc_data_failed; } INIT_WORK(&ts->work, synaptics_ts_work_func); ts->client = client; i2c_set_clientdata(client, ts); ts_global = ts; ts->input_dev = input_allocate_device(); if (ts->input_dev == NULL) { ret = -ENOMEM; printk(KERN_ERR "synaptics_ts_probe: Failed to allocate input device\n"); goto err_input_dev_alloc_failed; } ts->input_dev->name = "synaptics-rmi-touchscreen"; set_bit(EV_SYN, ts->input_dev->evbit); set_bit(EV_KEY, ts->input_dev->evbit); set_bit(BTN_TOUCH, ts->input_dev->keybit); set_bit(EV_ABS, ts->input_dev->evbit); printk(KERN_INFO "synaptics_ts_probe: max_x: %d, max_y: %d\n", MAX_X, MAX_Y); input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, MAX_X, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, MAX_Y, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); /* ts->input_dev->name = ts->keypad_info->name; */ ret = input_register_device(ts->input_dev); if (ret) { printk(KERN_ERR "synaptics_ts_probe: Unable to register %s input device\n", ts->input_dev->name); goto err_input_register_device_failed; } printk("[TSP] %s, irq=%d\n", __func__, client->irq ); if (client->irq) { ret = request_irq(client->irq, synaptics_ts_irq_handler,/* IRQF_TRIGGER_RISING |*/ IRQF_TRIGGER_FALLING , client->name, ts); if (ret == 0) ts->use_irq = 1; else dev_err(&client->dev, "request_irq failed\n"); } #ifdef CONFIG_HAS_EARLYSUSPEND ts->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; //CHJ origin ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; ts->early_suspend.suspend = synaptics_ts_early_suspend; ts->early_suspend.resume = synaptics_ts_late_resume; register_early_suspend(&ts->early_suspend); #endif printk(KERN_INFO "synaptics_ts_probe: Start touchscreen %s in %s mode\n", ts->input_dev->name, ts->use_irq ? "interrupt" : "polling"); /* sys fs */ touch_class = class_create(THIS_MODULE, "touch"); if (IS_ERR(touch_class)) pr_err("Failed to create class(touch)!\n"); firmware_dev = device_create(touch_class, NULL, 0, NULL, "firmware"); if (IS_ERR(firmware_dev)) pr_err("Failed to create device(firmware)!\n"); if (device_create_file(firmware_dev, &dev_attr_firmware) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_firmware.attr.name); if (device_create_file(firmware_dev, &dev_attr_firmware_ret) < 0) pr_err("Failed to create device file(%s)!\n", dev_attr_firmware_ret.attr.name); /* sys fs */ /* Check point - i2c check - start */ ret = read_ver(); if( !(HW_ver == 0x02 || HW_ver == 0x05 || HW_ver == 0x08 || HW_ver == 0x06 || HW_ver == 0x09 || HW_ver == 0x40 ) ) { if( board_hw_revision == 4 ){ HW_ver = 0x40; msleep(1000); firm_update(); } else printk("[TSP] %s, board_hw_revision=%d\n", __func__, board_hw_revision); } if (ret <= 0) { printk("[TSP] %s, ln=%d, Error\n", __func__, __LINE__ ); ret = read_ver(); if (ret <= 0) { printk("[TSP] %s, ln:%d, Failed to register TSP!!!\n\tcheck the i2c line!!!, ret=%d\n", __func__,__LINE__, ret); goto err_check_functionality_failed; } } /* Check point - i2c check - end */ #if 0//CHJ /* Check point - firmware ver check - start */ if(board_hw_revision == 0x02){ if( (HW_ver==0x08)&&(SW_ver<0x11) ){ printk(KERN_INFO "[TSP] board_rev=%d, TSP HW_ver=%2x, SW_ver=%2x\n", board_hw_revision, HW_ver, SW_ver); firm_update(); } } if(board_hw_revision == 0x03){ if( (HW_ver==HEX_HW_VER)&&(SW_ver<HEX_SW_VER) ){ printk(KERN_INFO "[TSP] board_rev=%d, TSP HW_ver=%2x, SW_ver=%2x\n", board_hw_revision, HW_ver, SW_ver); firm_update(); } } /* Check point - firmware ver check - end */ #endif return 0; err_input_register_device_failed: input_free_device(ts->input_dev); err_input_dev_alloc_failed: kfree(ts); err_alloc_data_failed: err_check_functionality_failed: return ret; }