static ssize_t set_touchkey_update_show(struct device *dev, struct device_attribute *attr, char *buf) { /*TO DO IT */ int count=0; int retry=3; touchkey_update_status = 1; while (retry--) { if (ISSP_main() == 0) { printk(KERN_ERR"[TOUCHKEY]Touchkey_update succeeded\n"); touchkey_update_status = 0; count=1; break; } printk(KERN_ERR"touchkey_update failed... retry...\n"); } if (retry <= 0) { // disable ldo11 touchkey_ldo_on(0); msleep(300); count=0; printk(KERN_ERR"[TOUCHKEY]Touchkey_update fail\n"); touchkey_update_status = -1; return count; } init_hw(); /* after update, re initalize. */ return count; }
void touchkey_update_func(struct work_struct *p) { int retry = 10; touchkey_update_status = 1; printk(KERN_DEBUG "[TouchKey] %s start\n", __func__); #if 1 { char data[3]; i2c_touchkey_read(KEYCODE_REG, data, 3); printk(KERN_DEBUG"[%s] F/W version: 0x%x, Module version:0x%x\n", __FUNCTION__, data[1], data[2]); } #endif while (retry--) { if (ISSP_main() == 0) { touchkey_update_status = 0; printk(KERN_DEBUG "[TouchKey] touchkey_update succeeded\n"); enable_irq(IRQ_TOUCH_INT); msleep(500); touchkey_autocalibration(); return; } } touchkey_update_status = -1; printk(KERN_DEBUG "[TouchKey] touchkey_update failed\n"); return; }
void touchkey_update_func(struct work_struct *work) { struct touchkey_i2c *tkey_i2c = container_of(work, struct touchkey_i2c, update_work); int retry = 3; #if defined(CONFIG_TARGET_LOCALE_NAATT) char data[3]; i2c_touchkey_read(tkey_i2c->client, KEYCODE_REG, data, 3); pr_debug("[Touchkey] %s: F/W version: 0x%x, Module version:0x%x\n", __func__, data[1], data[2]); #endif tkey_i2c->update_status = TK_UPDATE_DOWN; pr_debug("[Touchkey] %s: start\n", __func__); touchkey_enable = 0; while (retry--) { if (ISSP_main(tkey_i2c) == 0) { pr_debug("[TouchKey] touchkey_update succeeded\n"); msleep(50); touchkey_enable = 1; #if defined(TK_HAS_AUTOCAL) touchkey_autocalibration(tkey_i2c); #endif tkey_i2c->update_status = TK_UPDATE_PASS; enable_irq(tkey_i2c->irq); return; } tkey_i2c->pdata->power_on(0); } enable_irq(tkey_i2c->irq); tkey_i2c->update_status = TK_UPDATE_FAIL; printk(KERN_DEBUG "[TouchKey] touchkey_update failed\n"); return; }
static int touch_FW_update(void) { int count = 0; int retry = NUM_OF_RETRY_UPDATE; touchkey_update_status = 1; while (retry--) { printk(KERN_DEBUG "[TOUCHKEY] Updating... !\n"); msleep(300); if (ISSP_main() == 0) { printk(KERN_DEBUG "[TOUCHKEY] Update success!\n"); touchkey_update_status = 0; count = 1; break; } printk(KERN_DEBUG "[TOUCHKEY] Touchkey_update failed... retry...\n"); } if (retry <= 0) { cypress_touchkey_con_hw(info, false); count = 0; printk(KERN_DEBUG "[TOUCHKEY]Touchkey_update fail\n"); touchkey_update_status = -1; msleep(300); } msleep(500); return count; }
static int __init touchkey_init(void) { int ret = 0; int retry = 3; #if 0 //update version "eclair/vendor/samsung/apps/Lcdtest/src/com/sec/android/app/lcdtest/touch_firmware.java" //if ((data[1] >= 0xa1) && (data[1] < 0xa9)) { //set_touchkey_debug('U'); while (retry--) { if (ISSP_main() == 0) { printk("touchkey_update succeeded\n"); //set_touchkey_debug('C'); break; } printk("touchkey_update failed... retry...\n"); //set_touchkey_debug('f'); } if (retry <= 0) { gpio_direction_output(_3_GPIO_TOUCH_EN, 0); #if !defined(CONFIG_ARIES_NTT) gpio_direction_output(_3_GPIO_TOUCH_CE, 0); #endif msleep(300); } init_hw(); //after update, re initalize. //} #endif ret = i2c_add_driver(&touchkey_i2c_driver); if (ret) pr_err("%s: cypress touch keypad registration failed. (%d)\n", __func__, ret); return ret; }
void touchkey_update_func(struct work_struct *p) { int retry = 10; #if defined(CONFIG_TARGET_LOCALE_NAATT) char data[3]; i2c_touchkey_read(KEYCODE_REG, data, 3); printk(KERN_DEBUG"[%s] F/W version: 0x%x, Module version:0x%x\n", __FUNCTION__, data[1], data[2]); #endif touchkey_update_status = 1; printk(KERN_DEBUG "[TouchKey] %s start\n", __func__); while (retry--) { if (ISSP_main() == 0) { touchkey_update_status = 0; printk(KERN_DEBUG "[TouchKey] touchkey_update succeeded\n"); enable_irq(IRQ_TOUCH_INT); return; } #if defined(CONFIG_TARGET_LOCALE_NAATT) touchkey_ldo_on(0); msleep(300); init_hw(); #endif } touchkey_update_status = -1; printk(KERN_DEBUG "[TouchKey] touchkey_update failed\n"); return; }
static void touch_FW_update_func(struct work_struct *work) { int count = 0; int retry = NUM_OF_RETRY_UPDATE; u8 data; touchkey_update_status = 1; #ifdef CONFIG_DEBUG_PRINTK printk(KERN_DEBUG "[TouchKey] %s start... !\n", __func__); #else ; #endif disable_irq(info->irq); while (retry--) { if (ISSP_main() == 0) { #ifdef CONFIG_DEBUG_PRINTK printk(KERN_DEBUG "[TOUCHKEY] Update success!\n"); #else ; #endif cypress_touchkey_con_hw(info, true); msleep(200); enable_irq(info->irq); data = i2c_smbus_read_byte_data(info->client, CYPRESS_FW_VER); info->fw_ver = data; #ifdef CONFIG_DEBUG_PRINTK printk(KERN_DEBUG "[TouchKey] %s : FW Ver 0x%02x\n", __func__, data); #else ; #endif cypress_thd_change(vbus_state); cypress_touchkey_auto_cal(info); touchkey_update_status = 0; count = i2c_smbus_write_byte_data(info->client, CYPRESS_GEN, CYPRESS_DATA_UPDATE); return; } cypress_touchkey_con_hw(info, false); msleep(300); cypress_touchkey_con_hw(info, true); msleep(200); } touchkey_update_status = -1; #ifdef CONFIG_DEBUG_PRINTK printk(KERN_DEBUG "[TOUCHKEY]Touchkey_update fail\n"); #else ; #endif return; }
static ssize_t set_touchkey_update_show(struct device *dev, struct device_attribute *attr, char *buf) { struct touchkey_i2c *tkey_i2c = dev_get_drvdata(dev); int count = 0; int retry = 3; tkey_i2c->update_status = TK_UPDATE_DOWN; disable_irq(tkey_i2c->irq); #ifdef TEST_JIG_MODE unsigned char get_touch = 0x40; #endif while (retry--) { if (ISSP_main(tkey_i2c) == 0) { printk(KERN_ERR "[TouchKey]Touchkey_update succeeded\n"); tkey_i2c->update_status = TK_UPDATE_PASS; count = 1; msleep(50); break; } printk(KERN_ERR "touchkey_update failed... retry...\n"); } if (retry <= 0) { /* disable ldo11 */ tkey_i2c->pdata->power_on(0); count = 0; printk(KERN_ERR "[TouchKey]Touchkey_update fail\n"); tkey_i2c->update_status = TK_UPDATE_FAIL; enable_irq(tkey_i2c->irq); return count; } #ifdef TEST_JIG_MODE i2c_touchkey_write(tkey_i2c->client, &get_touch, 1); #endif #if defined(TK_HAS_AUTOCAL) touchkey_autocalibration(tkey_i2c); #endif enable_irq(tkey_i2c->irq); return count; }
static ssize_t touch_update_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct cypress_touchkey_info *info = dev_get_drvdata(dev); int count = 0; int retry = NUM_OF_RETRY_UPDATE; char buff[16] = {0}; u8 data; info->touchkey_update_status = 1; dev_err(dev, "[TOUCHKEY] touch_update_write!\n"); disable_irq(info->irq); while (retry--) { if (ISSP_main() == 0) { dev_err(&info->client->dev, "[TOUCHKEY] Update success!\n"); msleep(50); cypress_touchkey_auto_cal(info); info->touchkey_update_status = 0; count = 1; enable_irq(info->irq); break; } dev_err(&info->client->dev, "[TOUCHKEY] Touchkey_update failed... retry...\n"); } if (retry <= 0) { if (info->pdata->gpio_led_en) cypress_touchkey_con_hw(info, false); msleep(300); count = 0; dev_err(&info->client->dev, "[TOUCHKEY]Touchkey_update fail\n"); info->touchkey_update_status = -1; return count; } msleep(500); data = i2c_smbus_read_byte_data(info->client, CYPRESS_FW_VER); count = snprintf(buff, sizeof(buff), "0x%02x\n", data); dev_err(&info->client->dev, "[TouchKey] %s : FW Ver 0x%02x\n", __func__, data); return count; }
static int touchkey_firmware_update(struct touchkey_i2c *tkey_i2c) { char data[3]; int retry; int ret = 0; ret = i2c_touchkey_read(tkey_i2c->client, KEYCODE_REG, data, 3); if (ret < 0) { printk(KERN_DEBUG "[TouchKey] i2c read fail. do not excute firm update.\n"); return ret; } printk(KERN_ERR "%s F/W version: 0x%x, Module version:0x%x\n", __func__, data[1], data[2]); retry = 3; tkey_i2c->firmware_ver = data[1]; tkey_i2c->module_ver = data[2]; if (tkey_i2c->firmware_ver < 0x0A) { tkey_i2c->update_status = TK_UPDATE_DOWN; while (retry--) { if (ISSP_main(tkey_i2c) == 0) { printk(KERN_ERR "[TOUCHKEY]Touchkey_update succeeded\n"); tkey_i2c->update_status = TK_UPDATE_PASS; break; } printk(KERN_ERR "touchkey_update failed...retry...\n"); } if (retry <= 0) { //tkey_i2c->pdata->power_on(0); touchkey_led_on(tkey_i2c, 0); tkey_i2c->update_status = TK_UPDATE_FAIL; } } else { if (tkey_i2c->firmware_ver >= 0x0A) { printk(KERN_ERR "[TouchKey] Not F/W update. Cypess touch-key F/W version is latest\n"); } else { printk(KERN_ERR "[TouchKey] Not F/W update. Cypess touch-key version(module or F/W) is not valid\n"); } } return ret; }
static void touchkey_update_func(struct work_struct *p) { int retry = 10; touchkey_update_status = 1; printk("%s start\n", __FUNCTION__); while (retry--) { if (ISSP_main() == 0) { touchkey_update_status = 0; printk("touchkey_update succeeded\n"); enable_irq(IRQ_TOUCH_INT); return; } } touchkey_update_status = -1; printk("touchkey_update failed\n"); return; }
void touchkey_update_func(struct work_struct *p) { int retry = 10; touchkey_update_status = 1; printk(KERN_DEBUG "[TouchKey] %s start\n", __func__); while (retry--) { if (ISSP_main() == 0) { touchkey_update_status = 0; printk(KERN_DEBUG "[TouchKey] touchkey_update succeeded\n"); enable_irq(IRQ_TOUCH_INT); return; } } touchkey_update_status = -1; printk(KERN_DEBUG "[TouchKey] touchkey_update failed\n"); return; }
static ssize_t set_touchkey_update_show(struct device *dev, struct device_attribute *attr, char *buf) { /*TO DO IT */ int count=0; int retry=3; disable_irq(IRQ_TOUCH_INT); touchkey_update_status = 1; while (retry--) { if (ISSP_main() == 0) { printk(KERN_ERR"[TOUCHKEY]Touchkey_update succeeded\n"); touchkey_update_status = 0; count=1; break; } printk(KERN_ERR"touchkey_update failed... retry...\n"); } enable_irq(IRQ_TOUCH_INT); if (retry <= 0) { // disable ldo11 #if 0 touchkey_ldo_on(0); #endif msleep(300); count=0; printk(KERN_ERR"[TOUCHKEY]Touchkey_update fail\n"); touchkey_update_status = -1; return count; } /*init_hw();*/ { unsigned char get_touch = 0x40; i2c_touchkey_write(&get_touch, 1); } return count; }
static ssize_t set_touchkey_update_show(struct device *dev, struct device_attribute *attr, char *buf) { /* TO DO IT */ int count = 0; int retry = 3; touchkey_update_status = 1; #ifdef TEST_JIG_MODE unsigned char get_touch = 0x40; #endif while (retry--) { if (ISSP_main() == 0) { printk(KERN_ERR"[TOUCHKEY]Touchkey_update succeeded\n"); touchkey_update_status = 0; count = 1; break; } printk(KERN_ERR"touchkey_update failed... retry...\n"); } if (retry <= 0) { /* disable ldo11 */ touchkey_ldo_on(0); msleep(300); count = 0; printk(KERN_ERR"[TOUCHKEY]Touchkey_update fail\n"); touchkey_update_status = -1; return count; } init_hw(); /* after update, re initalize. */ #ifdef TEST_JIG_MODE i2c_touchkey_write(&get_touch, 1); #endif return count; }
void touchkey_firmware_update(void) { char data[3]; int retry; i2c_touchkey_read(KEYCODE_REG, data, 3); printk(KERN_ERR"%s F/W version: 0x%x, Module version:0x%x\n", __FUNCTION__, data[1], data[2]); retry = 3; touch_version = data[1]; module_version = data[2]; if (touch_version != 0x09) { touchkey_update_status = 1; while (retry--) { if (ISSP_main() == 0) { printk(KERN_ERR"[TOUCHKEY]Touchkey_update succeeded\n"); touchkey_update_status = 0; break; } printk(KERN_ERR"touchkey_update failed... retry...\n"); } if (retry <= 0) { touchkey_ldo_on(0); touchkey_update_status = -1; msleep(300); } init_hw(); } else { if (touch_version == 0x09) { printk(KERN_ERR "[TouchKey] Not F/W update. Cypess touch-key F/W version is latest. \n"); } else { printk(KERN_ERR "[TouchKey] Not F/W update. Cypess touch-key version(module or F/W) is not valid. \n"); } } }
static int __init touchkey_init(void) { int ret = 0; int retry = 10; char data[3] = { 0, }; #if !(defined( CONFIG_S5PC110_T959_BOARD) || defined(CONFIG_S5PC110_KEPLER_BOARD)|| defined(CONFIG_S5PC110_DEMPSEY_BOARD)) #if defined(CONFIG_S5PC110_HAWK_BOARD) || defined(CONFIG_S5PC110_VIBRANTPLUS_BOARD) #else touchkey_keycode[2] = KEY_ENTER; #endif #endif #if !(defined(CONFIG_ARIES_NTT) || defined(CONFIG_S5PC110_DEMPSEY_BOARD)) if (ret = gpio_request(_3_GPIO_TOUCH_CE, "_3_GPIO_TOUCH_CE")) printk(KERN_ERR "Failed to request gpio %s:%d\n", __func__, __LINE__); #endif #ifndef CONFIG_S5PC110_DEMPSEY_BOARD if (ret = gpio_request(_3_GPIO_TOUCH_EN, "_3_GPIO_TOUCH_EN")) printk(KERN_ERR "Failed to request gpio %s:%d\n", __func__, __LINE__); #endif if (ret = gpio_request(_3_TOUCH_SDA_28V, "_3_TOUCH_SDA_28V")) printk(KERN_ERR "Failed to request gpio %s:%d\n", __func__, __LINE__); if (ret = gpio_request(_3_TOUCH_SCL_28V, "_3_TOUCH_SCL_28V")) printk(KERN_ERR "Failed to request gpio %s:%d\n", __func__, __LINE__); ret = misc_register(&touchkey_update_device); if (ret) { printk("%s misc_register fail\n", __FUNCTION__); } if (device_create_file (touchkey_update_device.this_device, &dev_attr_touch_version) < 0) { printk("%s device_create_file fail dev_attr_touch_version\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_touch_version.attr.name); } if (device_create_file (touchkey_update_device.this_device, &dev_attr_touch_update) < 0) { printk("%s device_create_file fail dev_attr_touch_update\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_touch_update.attr.name); } if (device_create_file (touchkey_update_device.this_device, &dev_attr_brightness) < 0) { printk("%s device_create_file fail dev_attr_touch_update\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_brightness.attr.name); } if (device_create_file (touchkey_update_device.this_device, &dev_attr_enable_disable) < 0) { printk("%s device_create_file fail dev_attr_touch_update\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_enable_disable.attr.name); } #if defined (CONFIG_S5PC110_T959_BOARD) || defined(CONFIG_S5PC110_HAWK_BOARD) || defined(CONFIG_S5PC110_VIBRANTPLUS_BOARD) //NAGSM_Android_SEL_Kernel_Aakash_20100320 if (device_create_file(touchkey_update_device.this_device, &dev_attr_melfasevtcntrl) < 0) { printk("%s device_create_file fail dev_attr_melfasevtcntrl\n",__FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_melfasevtcntrl.attr.name); } //NAGSM_Android_SEL_Kernel_Aakash_20100320 #endif touchkey_wq = create_singlethread_workqueue("melfas_touchkey_wq"); if (!touchkey_wq) return -ENOMEM; INIT_WORK(&touchkey_work, touchkey_work_func); init_hw(); while (retry--) { if (get_touchkey_firmware(data) == 0) //melfas need delay for multiple read break; } printk("%s F/W version: 0x%x, Module version:0x%x\n", __FUNCTION__, data[1], data[2]); touch_version = data[1]; retry = 3; #ifdef CONFIG_S5PC110_DEMPSEY_BOARD if((HWREV == 0x0C) && ((data[1] < 0x20)|| (data[1] == 0xFF)) ) { set_touchkey_debug('U'); while (retry--) { if (ISSP_main() == 0) { printk("touchkey_update succeeded\n"); set_touchkey_debug('C'); break; } printk("touchkey_update failed... retry...\n"); set_touchkey_debug('f'); } #ifndef CONFIG_S5PC110_DEMPSEY_BOARD if (retry <= 0) { gpio_direction_output(_3_GPIO_TOUCH_EN, 0); #if !(defined(CONFIG_ARIES_NTT) || defined(CONFIG_S5PC110_DEMPSEY_BOARD)) gpio_direction_output(_3_GPIO_TOUCH_CE, 0); #endif msleep(300); } #endif init_hw(); //after update, re initalize. } #endif ret = i2c_add_driver(&touchkey_i2c_driver); if (ret) { printk ("melfas touch keypad registration failed, module not inserted.ret= %d\n", ret); } return ret; }
static int __init touchkey_init(void) { int ret = 0; int retry = 10; char data[3] = { 0, }; touchkey_keycode[2] = KEY_ENTER; #if !defined(CONFIG_ARIES_NTT) if (ret = gpio_request(_3_GPIO_TOUCH_CE, "_3_GPIO_TOUCH_CE")) printk(KERN_ERR "Failed to request gpio %s:%d\n", __func__, __LINE__); #endif if (ret = gpio_request(_3_GPIO_TOUCH_EN, "_3_GPIO_TOUCH_EN")) printk(KERN_ERR "Failed to request gpio %s:%d\n", __func__, __LINE__); if (ret = gpio_request(_3_TOUCH_SDA_28V, "_3_TOUCH_SDA_28V")) printk(KERN_ERR "Failed to request gpio %s:%d\n", __func__, __LINE__); if (ret = gpio_request(_3_TOUCH_SCL_28V, "_3_TOUCH_SCL_28V")) printk(KERN_ERR "Failed to request gpio %s:%d\n", __func__, __LINE__); ret = misc_register(&touchkey_update_device); if (ret) { printk("%s misc_register fail\n", __FUNCTION__); } if (device_create_file (touchkey_update_device.this_device, &dev_attr_touch_version) < 0) { printk("%s device_create_file fail dev_attr_touch_version\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_touch_version.attr.name); } if (device_create_file (touchkey_update_device.this_device, &dev_attr_touch_update) < 0) { printk("%s device_create_file fail dev_attr_touch_update\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_touch_update.attr.name); } if (device_create_file (touchkey_update_device.this_device, &dev_attr_brightness) < 0) { printk("%s device_create_file fail dev_attr_touch_update\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_brightness.attr.name); } if (device_create_file (touchkey_update_device.this_device, &dev_attr_enable_disable) < 0) { printk("%s device_create_file fail dev_attr_touch_update\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_enable_disable.attr.name); } #ifdef CONFIG_KEYPAD_CYPRESS_TOUCH_USE_BLN ret = 0; ret = misc_register(&backlightnotification_device); if (ret) { printk("%s misc_register fail\n", __FUNCTION__, backlightnotification_device.name); } //add the backlightnotification attributes if (device_create_file(backlightnotification_device.this_device, &dev_attr_enabled) < 0) { printk("%s device_create_file fail dev_attr_touch_update\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_enabled.attr.name); } if (device_create_file(backlightnotification_device.this_device, &dev_attr_notification_led) < 0) { printk("%s device_create_file fail dev_attr_touch_update\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_notification_led.attr.name); } if (device_create_file(backlightnotification_device.this_device, &dev_attr_version) < 0) { printk("%s device_create_file fail dev_attr_touch_update\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_version.attr.name); } #endif touchkey_wq = create_singlethread_workqueue("melfas_touchkey_wq"); if (!touchkey_wq) return -ENOMEM; INIT_WORK(&touchkey_work, touchkey_work_func); init_hw(); while (retry--) { if (get_touchkey_firmware(data) == 0) //melfas need delay for multiple read break; } printk("%s F/W version: 0x%x, Module version:0x%x\n", __FUNCTION__, data[1], data[2]); touch_version = data[1]; retry = 3; #if 0 //update version "eclair/vendor/samsung/apps/Lcdtest/src/com/sec/android/app/lcdtest/touch_firmware.java" if ((data[1] >= 0xa1) && (data[1] < 0xa9)) { set_touchkey_debug('U'); while (retry--) { if (ISSP_main() == 0) { printk("touchkey_update succeeded\n"); set_touchkey_debug('C'); break; } printk("touchkey_update failed... retry...\n"); set_touchkey_debug('f'); } if (retry <= 0) { #ifdef CONFIG_KEYPAD_CYPRESS_TOUCH_USE_BLN touchkey_power_off(); #else gpio_direction_output(_3_GPIO_TOUCH_EN, 0); #if !defined(CONFIG_ARIES_NTT) gpio_direction_output(_3_GPIO_TOUCH_CE, 0); #endif #endif msleep(300); } init_hw(); //after update, re initalize. } #endif ret = i2c_add_driver(&touchkey_i2c_driver); if (ret) { printk ("melfas touch keypad registration failed, module not inserted.ret= %d\n", ret); } return ret; }
static int touchkey_firmware_update(struct touchkey_i2c *tkey_i2c) { int retry = 3; int ret = 0; char data[3]; disable_irq(tkey_i2c->irq); ret = i2c_touchkey_read(tkey_i2c->client, KEYCODE_REG, data, 3); if (ret < 0) { printk(KERN_DEBUG "[TouchKey] i2c read fail. do not excute firm update.\n"); data[1] = 0; data[2] = 0; } printk(KERN_ERR "%s F/W version: 0x%x, Module version:0x%x\n", __func__, data[1], data[2]); tkey_i2c->firmware_ver = data[1]; tkey_i2c->module_ver = data[2]; if ((tkey_i2c->firmware_ver < TK_FIRMWARE_VER) && (tkey_i2c->module_ver <= TK_MODULE_VER)) { printk(KERN_DEBUG "[TouchKey] firmware auto update excute\n"); tkey_i2c->update_status = TK_UPDATE_DOWN; while (retry--) { if (ISSP_main(tkey_i2c) == 0) { printk(KERN_DEBUG "[TouchKey]firmware update succeeded\n"); tkey_i2c->update_status = TK_UPDATE_PASS; msleep(50); break; } msleep(50); printk(KERN_DEBUG "[TouchKey] firmware update failed. retry\n"); } if (retry <= 0) { //tkey_i2c->pdata->power_on(0); touchkey_led_on(tkey_i2c, 0); tkey_i2c->update_status = TK_UPDATE_FAIL; printk(KERN_DEBUG "[TouchKey] firmware update failed.\n"); } ret = touchkey_i2c_check(tkey_i2c); if (ret < 0) { printk(KERN_DEBUG "[TouchKey] i2c read fail.\n"); return TK_UPDATE_FAIL; } printk(KERN_DEBUG "[TouchKey] firm ver = %d, module ver = %d\n", tkey_i2c->firmware_ver, tkey_i2c->module_ver); } else { printk(KERN_DEBUG "[TouchKey] firmware auto update do not excute\n"); printk(KERN_DEBUG "[TouchKey] firmware_ver(banary=%d, current=%d)\n", TK_FIRMWARE_VER, tkey_i2c->firmware_ver); printk(KERN_DEBUG "[TouchKey] module_ver(banary=%d, current=%d)\n", TK_MODULE_VER, tkey_i2c->module_ver); } enable_irq(tkey_i2c->irq); return TK_UPDATE_PASS; }
static int __devinit cypress_touchkey_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); struct cypress_touchkey_platform_data *pdata = client->dev.platform_data; struct cypress_touchkey_info *info; struct input_dev *input_dev; int ret = 0; int i; // int retry = NUM_OF_RETRY_UPDATE; int ic_fw_ver; int error; struct device *sec_touchkey; printk("[TKEY] %s _ %d\n",__func__,__LINE__); if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) return -EIO; #ifdef CONFIG_OF if (client->dev.of_node) { pdata = devm_kzalloc(&client->dev, sizeof(struct cypress_touchkey_platform_data), GFP_KERNEL); if (!pdata) { dev_info(&client->dev, "Failed to allocate memory\n"); return -ENOMEM; } error = cypress_parse_dt(&client->dev, pdata); if (error) return error; } else pdata = client->dev.platform_data; cypress_request_gpio(pdata); #endif info = kzalloc(sizeof(*info), GFP_KERNEL); if (!info) { dev_err(&client->dev, "fail to memory allocation.\n"); goto err_mem_alloc; } input_dev = input_allocate_device(); if (!input_dev) { dev_err(&client->dev, "fail to allocate input device.\n"); goto err_input_dev_alloc; } client->irq = gpio_to_irq(pdata->gpio_int); info->client = client; info->input_dev = input_dev; info->pdata = pdata; info->irq = client->irq; info->touchkey_update_status = 0; input_dev->name = "sec_touchkey"; input_dev->phys = info->phys; input_dev->id.bustype = BUS_I2C; input_dev->dev.parent = &client->dev; info->is_powering_on = true; cypress_power_onoff(info, 1); msleep(50); set_bit(EV_SYN, input_dev->evbit); set_bit(EV_KEY, input_dev->evbit); set_bit(EV_LED, input_dev->evbit); set_bit(LED_MISC, input_dev->ledbit); atomic_set(&info->keypad_enable, 1); for (i = 0; i < pdata->keycodes_size; i++) { info->keycode[i] = pdata->touchkey_keycode[i]; set_bit(info->keycode[i], input_dev->keybit); } input_set_drvdata(input_dev, info); mutex_init(&info->touchkey_mutex); ret = input_register_device(input_dev); if (ret) { dev_err(&client->dev, "[TOUCHKEY] failed to register input dev (%d).\n", ret); goto err_reg_input_dev; } i2c_set_clientdata(client, info); if (info->pdata->gpio_led_en) { ret = gpio_request(info->pdata->gpio_led_en, "gpio_touchkey_led"); if (ret < 0) { dev_err(&client->dev, "gpio_touchkey_led gpio_request is failed\n"); goto err_gpio_request; } gpio_tlmm_config(GPIO_CFG(info->pdata->gpio_led_en, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), 1); cypress_touchkey_con_hw(info, true); } #ifdef USE_OPEN_CLOSE input_dev->open = cypress_input_open; input_dev->close = cypress_input_close; #endif dev_info(&info->client->dev, "gpio_to_irq IRQ %d\n", client->irq); ret = request_threaded_irq(client->irq, NULL, cypress_touchkey_interrupt, IRQF_TRIGGER_FALLING, client->dev.driver->name, info); if (ret < 0) { dev_err(&client->dev, "Failed to request IRQ %d (err: %d).\n", client->irq, ret); goto err_req_irq; } #ifdef CONFIG_HAS_EARLYSUSPEND info->early_suspend.suspend = cypress_touchkey_early_suspend; info->early_suspend.resume = cypress_touchkey_late_resume; register_early_suspend(&info->early_suspend); #endif /* CONFIG_HAS_EARLYSUSPEND */ info->led_wq = create_singlethread_workqueue("cypress_touchkey"); INIT_WORK(&info->led_work, cypress_touchkey_led_work); info->leds.name = TOUCHKEY_BACKLIGHT; info->leds.brightness = LED_FULL; info->leds.max_brightness = LED_FULL; info->leds.brightness_set = cypress_touchkey_brightness_set; ret = led_classdev_register(&client->dev, &info->leds); if (ret) goto err_req_irq; #if defined(CONFIG_LCD_CONNECTION_CHECK) //for SMD test if (is_lcd_attached() == 0) { disable_irq(client->irq); printk("[TSK] %s : is_lcd_attached()=0 \n",__func__); } else{ #endif msleep(20); ic_fw_ver = i2c_smbus_read_byte_data(client, CYPRESS_FW_VER); dev_err(&client->dev, "Touchkey FW Version: 0x%02x\n", ic_fw_ver); #if defined(CONFIG_MACH_M2_ATT) || defined(CONFIG_MACH_M2_DCM) \ || defined(CONFIG_MACH_M2_SKT) || defined(CONFIG_MACH_M2_KDI) dev_err(&client->dev, "Touchkey FW Version: 0x%02x, system_rev: %x\n", ic_fw_ver, system_rev); if (0 /* ic_fw_ver < BIN_FW_VERSION */) { dev_err(&client->dev, "[TOUCHKEY] touchkey_update Start!!\n"); disable_irq(client->irq); while (retry--) { if (ISSP_main() == 0) { dev_err(&client->dev, "[TOUCHKEY] Update success!\n"); enable_irq(client->irq); break; } dev_err(&client->dev, "[TOUCHKEY] Touchkey_update failed... retry...\n"); } if (retry <= 0) { if (info->pdata->gpio_led_en) cypress_touchkey_con_hw(info, false); msleep(300); dev_err(&client->dev, "[TOUCHKEY]Touchkey_update fail\n"); } msleep(500); ic_fw_ver = i2c_smbus_read_byte_data(info->client, CYPRESS_FW_VER); dev_err(&client->dev, "[TouchKey] %s : FW Ver 0x%02x\n", __func__, ic_fw_ver); } else { dev_err(&client->dev, "[TouchKey] FW update does not need!\n"); } #endif cypress_touchkey_auto_cal(info); #if defined(CONFIG_LCD_CONNECTION_CHECK) //for SMD test } #endif sec_touchkey = device_create(sec_class, NULL, 0, NULL, "sec_touchkey"); if (IS_ERR(sec_touchkey)) { pr_err("Failed to create device(sec_touchkey)!\n"); goto err_sysfs; } dev_set_drvdata(sec_touchkey, info); if (device_create_file(sec_touchkey, &dev_attr_keypad_enable) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_keypad_enable.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_touchkey_firm_update_status) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_firm_update.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_touchkey_firm_update) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_firm_update.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_touchkey_firm_version_panel) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_firm_version_panel.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_touchkey_firm_version_phone) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_firm_version_phone.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_touchkey_brightness) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_brightness.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_touch_sensitivity) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touch_sensitivity.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_touchkey_menu) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_menu.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_touchkey_back) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_back.attr.name); goto err_sysfs; } #ifdef HOME_KEY_USE if (device_create_file(sec_touchkey, &dev_attr_touchkey_home) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_home.attr.name); goto err_sysfs; } #endif if (device_create_file(sec_touchkey, &dev_attr_touchkey_raw_data0) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_raw_data0.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_touchkey_raw_data1) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_raw_data1.attr.name); goto err_sysfs; } #ifdef HOME_KEY_USE if (device_create_file(sec_touchkey, &dev_attr_touchkey_raw_data2) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_raw_data2.attr.name); goto err_sysfs; } #endif if (device_create_file(sec_touchkey, &dev_attr_touchkey_idac0) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_idac0.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_touchkey_idac1) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_idac1.attr.name); goto err_sysfs; } #ifdef HOME_KEY_USE if (device_create_file(sec_touchkey, &dev_attr_touchkey_idac2) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_idac2.attr.name); goto err_sysfs; } #endif if (device_create_file(sec_touchkey, &dev_attr_touchkey_threshold) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_threshold.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_touchkey_autocal_start) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_autocal_start.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_autocal_enable) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_autocal_enable.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_autocal_stat) < 0) { pr_err("Failed to create device file(%s)!\n", dev_attr_autocal_stat.attr.name); goto err_sysfs; } if (device_create_file(sec_touchkey, &dev_attr_touchkey_brightness_level) < 0) { printk(KERN_ERR "Failed to create device file(%s)!\n", dev_attr_touchkey_brightness_level.attr.name); goto err_sysfs; } info->is_powering_on = false; return 0; err_req_irq: err_gpio_request: input_unregister_device(input_dev); err_reg_input_dev: input_free_device(input_dev); input_dev = NULL; mutex_destroy(&info->touchkey_mutex); err_input_dev_alloc: kfree(info); err_sysfs: return -ENXIO; err_mem_alloc: return ret; }
static int cypress_touchkey_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct device *dev = &client->dev; struct input_dev *input_dev; struct cypress_touchkey_devdata *devdata; u8 data[3]; int err; int cnt; #if defined(TOUCH_UPDATE) int ret; int retry = 10; #endif if (!dev->platform_data) { dev_err(dev, "%s: Platform data is NULL\n", __func__); return -EINVAL; } devdata = kzalloc(sizeof(*devdata), GFP_KERNEL); if (devdata == NULL) { dev_err(dev, "%s: failed to create our state\n", __func__); return -ENODEV; } devdata->client = client; i2c_set_clientdata(client, devdata); devdata->pdata = client->dev.platform_data; if (!devdata->pdata->keycode) { dev_err(dev, "%s: Invalid platform data\n", __func__); err = -EINVAL; goto err_null_keycodes; } strlcpy(devdata->client->name, DEVICE_NAME, I2C_NAME_SIZE); input_dev = input_allocate_device(); if (!input_dev) { err = -ENOMEM; goto err_input_alloc_dev; } devdata->input_dev = input_dev; dev_set_drvdata(&input_dev->dev, devdata); input_dev->name = DEVICE_NAME; input_dev->id.bustype = BUS_HOST; for (cnt = 0; cnt < devdata->pdata->keycode_cnt; cnt++) input_set_capability(input_dev, EV_KEY, devdata->pdata->keycode[cnt]); err = input_register_device(input_dev); if (err) goto err_input_reg_dev; devdata->is_powering_on = true; //devdata->pdata->touchkey_onoff(TOUCHKEY_ON); turn_touchkey( devdata, true ); err = i2c_master_recv(client, data, sizeof(data)); if (err < sizeof(data)) { if (err >= 0) err = -EIO; dev_err(dev, "%s: error reading hardware version\n", __func__); goto err_read; } dev_info(dev, "%s: hardware rev1 = %#02x, rev2 = %#02x\n", __func__, data[1], data[2]); devdata->backlight_on = BACKLIGHT_ON; devdata->backlight_off = BACKLIGHT_OFF; devdata->has_legacy_keycode = 1; #if 0 err = i2c_touchkey_write_byte(devdata, devdata->backlight_on); if (err) { dev_err(dev, "%s: touch keypad backlight on failed\n", __func__); goto err_backlight_on; } #endif if (request_threaded_irq(client->irq, touchkey_interrupt_handler, touchkey_interrupt_thread, IRQF_TRIGGER_FALLING, DEVICE_NAME, devdata)) { dev_err(dev, "%s: Can't allocate irq.\n", __func__); goto err_req_irq; } #ifdef CONFIG_HAS_EARLYSUSPEND devdata->early_suspend.suspend = cypress_touchkey_early_suspend; devdata->early_suspend.resume = cypress_touchkey_early_resume; #endif register_early_suspend(&devdata->early_suspend); devdata->is_powering_on = false; #if defined(TOUCH_UPDATE) ret = misc_register(&touchkey_update_device); if (ret) { printk("%s misc_register fail\n", __FUNCTION__); goto err_misc_reg; } dev_set_drvdata(touchkey_update_device.this_device, devdata); if (device_create_file (touchkey_update_device.this_device, &dev_attr_touch_version) < 0) { printk("%s device_create_file fail dev_attr_touch_version\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_touch_version.attr.name); } if (device_create_file (touchkey_update_device.this_device, &dev_attr_touch_update) < 0) { printk("%s device_create_file fail dev_attr_touch_update\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_touch_update.attr.name); } if (device_create_file (touchkey_update_device.this_device, &dev_attr_brightness) < 0) { printk("%s device_create_file fail dev_attr_touch_update\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_brightness.attr.name); } if (device_create_file (touchkey_update_device.this_device, &dev_attr_enable_disable) < 0) { printk("%s device_create_file fail dev_attr_touch_update\n", __FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_enable_disable.attr.name); } touchkey_wq = create_singlethread_workqueue(DEVICE_NAME); if (!touchkey_wq) goto err_create_wq; while (retry--) { if (get_touchkey_firmware(data) == 0) //melfas need delay for multiple read break; } printk("%s F/W version: 0x%x, Module version:0x%x\n", __FUNCTION__, data[1], data[2]); #if defined CONFIG_S5PC110_DEMPSEY_BOARD // Firmware check & Update if((data[1] < 0x21)){ touchkey_update_status=1; while (retry--) { if (ISSP_main() == 0) { printk(KERN_ERR"[TOUCHKEY]Touchkey_update succeeded\n"); touchkey_update_status=0; break; } printk(KERN_ERR"touchkey_update failed... retry...\n"); } if (retry <= 0) { // disable ldo11 touchkey_ldo_on(0); touchkey_update_status=-1; msleep(300); } init_hw(); //after update, re initalize. } #endif #endif #ifdef CONFIG_KEYPAD_CYPRESS_TOUCH_BLN _pr_info3("%s misc_register(%s)\n", __FUNCTION__, backlightnotification_device.name); err = misc_register(&backlightnotification_device); if (err) { pr_err("%s misc_register(%s) fail\n", __FUNCTION__, backlightnotification_device.name); } else { /* * keep a reference to the devdata, * misc driver does not give access to it (or i missed that somewhere) */ bln_devdata = devdata; /* add the backlightnotification attributes */ if (sysfs_create_group(&backlightnotification_device.this_device->kobj, &bln_interface_attributes_group) < 0) { pr_err("%s sysfs_create_group fail\n", __FUNCTION__); pr_err("Failed to create sysfs group for device (%s)!\n", backlightnotification_device.name); } } #endif return 0; err_create_wq: #if defined(TOUCH_UPDATE) misc_deregister(&touchkey_update_device); #endif err_misc_reg: err_req_irq: err_backlight_on: err_read: //devdata->pdata->touchkey_onoff(TOUCHKEY_OFF); turn_touchkey( devdata, false ); input_unregister_device(input_dev); goto err_input_alloc_dev; err_input_reg_dev: input_free_device(input_dev); err_input_alloc_dev: err_null_keycodes: kfree(devdata); return err; }
static int touchkey_firmware_update(struct touchkey_i2c *tkey_i2c) { int retry = 3; int ret = 0; char data[3]; disable_irq(tkey_i2c->irq); ret = i2c_touchkey_read(tkey_i2c->client, KEYCODE_REG, data, 3); if (ret < 0) { pr_debug("[TouchKey] i2c read fail. do not excute firm update.\n"); data[1] = 0; data[2] = 0; } pr_err("%s F/W version: 0x%x, Module version:0x%x\n", __func__, data[1], data[2]); tkey_i2c->firmware_ver = data[1]; tkey_i2c->module_ver = data[2]; #if defined(CONFIG_MACH_M0) || defined(CONFIG_MACH_C1) \ || defined(CONFIG_MACH_C1VZW) || defined(CONFIG_MACH_C2) if ((tkey_i2c->firmware_ver < TK_FIRMWARE_VER) && (tkey_i2c->module_ver <= TK_MODULE_VER)) { #else if ((tkey_i2c->firmware_ver < TK_FIRMWARE_VER) && (tkey_i2c->module_ver == TK_MODULE_VER)) { #endif pr_debug("[TouchKey] firmware auto update excute\n"); tkey_i2c->update_status = TK_UPDATE_DOWN; while (retry--) { if (ISSP_main(tkey_i2c) == 0) { pr_debug("[TouchKey]firmware update succeeded\n"); tkey_i2c->update_status = TK_UPDATE_PASS; msleep(50); break; } msleep(50); pr_debug("[TouchKey] firmware update failed. retry\n"); } if (retry <= 0) { tkey_i2c->pdata->power_on(0); tkey_i2c->update_status = TK_UPDATE_FAIL; pr_debug("[TouchKey] firmware update failed.\n"); } ret = touchkey_i2c_check(tkey_i2c); if (ret < 0) { pr_debug("[TouchKey] i2c read fail.\n"); return TK_UPDATE_FAIL; } #if defined(CONFIG_TARGET_LOCALE_KOR) ret = i2c_touchkey_read(tkey_i2c->client, KEYCODE_REG, data, 3); if (ret < 0) { pr_debug("[TouchKey] i2c read fail. do not excute firm update.\n"); } tkey_i2c->firmware_ver = data[1]; tkey_i2c->module_ver = data[2]; #endif printk(KERN_DEBUG "[TouchKey] firm ver = %d, module ver = %d\n", tkey_i2c->firmware_ver, tkey_i2c->module_ver); } else { pr_debug("[TouchKey] firmware auto update do not excute\n"); pr_debug("[TouchKey] firmware_ver(banary=%d, current=%d)\n", TK_FIRMWARE_VER, tkey_i2c->firmware_ver); pr_debug("[TouchKey] module_ver(banary=%d, current=%d)\n", TK_MODULE_VER, tkey_i2c->module_ver); } enable_irq(tkey_i2c->irq); return TK_UPDATE_PASS; } #else static int touchkey_firmware_update(struct touchkey_i2c *tkey_i2c) { char data[3]; int retry; int ret = 0; ret = i2c_touchkey_read(tkey_i2c->client, KEYCODE_REG, data, 3); if (ret < 0) { pr_debug("[TouchKey] i2c read fail. do not excute firm update.\n"); return ret; } pr_err("%s F/W version: 0x%x, Module version:0x%x\n", __func__, data[1], data[2]); retry = 3; tkey_i2c->firmware_ver = data[1]; tkey_i2c->module_ver = data[2]; if (tkey_i2c->firmware_ver < 0x0A) { tkey_i2c->update_status = TK_UPDATE_DOWN; while (retry--) { if (ISSP_main(tkey_i2c) == 0) { pr_err("[TOUCHKEY]Touchkey_update succeeded\n"); tkey_i2c->update_status = TK_UPDATE_PASS; break; } pr_err("touchkey_update failed...retry...\n"); } if (retry <= 0) { tkey_i2c->pdata->power_on(0); tkey_i2c->update_status = TK_UPDATE_FAIL; ret = TK_UPDATE_FAIL; } } else { if (tkey_i2c->firmware_ver >= 0x0A) { pr_err("[TouchKey] Not F/W update. Cypess touch-key F/W version is latest\n"); } else { pr_err("[TouchKey] Not F/W update. Cypess touch-key version(module or F/W) is not valid\n"); } } return ret; }