static ssize_t touch_version_read(struct device *dev, struct device_attribute *attr, char *buf) { #if 0 char data[3] = { 0, }; int count; init_hw(); if (get_touchkey_firmware(data) != 0) { i2c_touchkey_read(KEYCODE_REG, data, 3); } count = sprintf(buf, "0x%x\n", data[1]); printk(KERN_DEBUG "[TouchKey] touch_version_read 0x%x\n", data[1]); return count; #else u8 data[3]; int ret; printk(KERN_DEBUG "called %s \n", __func__); ret = i2c_touchkey_read(KEYCODE_REG, data, 3); printk(KERN_DEBUG "called %s data[1] =%d,data[2] = %d\n", __func__, data[1], data[2]); return sprintf(buf, "0x%x\n", data[1]); #endif }
static ssize_t touchkey_version_show(struct device *dev, struct device_attribute *attr, char *buf) { u8 version[3]; //printk("called %s \n",__func__); get_touchkey_firmware(version); return sprintf(buf,"%02x\n",version[1]); }
ssize_t touchkey_update_read(struct file * filp, char *buf, size_t count, loff_t * f_pos) { char data[3]={0,}; get_touchkey_firmware(data); put_user(data[1], buf); return 1; }
static ssize_t touch_version_read(struct device *dev, struct device_attribute *attr, char *buf) { char data[3]; int count; init_hw(); get_touchkey_firmware(data); count = sprintf(buf,"%d\n", data[1]); return count; }
static ssize_t touch_version_read(struct device *dev, struct device_attribute *attr, char *buf) { char data[3] = { 0, }; int count; init_hw(); if (get_touchkey_firmware(data) != 0) i2c_touchkey_read(KEYCODE_REG, data, 3); count = sprintf(buf, "0x%x\n", data[1]); printk("touch_version_read 0x%x\n", data[1]); return count; }
void touchkey_resume_func(struct work_struct *p) { char data[3]; printk("---%s---\n", __FUNCTION__); get_touchkey_firmware(data); //clear interrupt if (readl(gpio_pend_mask_mem) & (0x1 << 1)) writel(readl(gpio_pend_mask_mem) | (0x1 << 1), gpio_pend_mask_mem); enable_irq(IRQ_TOUCH_INT); touchkey_enable = 1; return; }
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 __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,}; #if defined(CONFIG_MACH_S5PC110_LATONA) /* Latona does not use Melfas Touchkey, but used Cypress TSP + Touchkey */ return 0; #endif 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 (device_create_file(touchkey_update_device.this_device, &dev_attr_show_sensitivity) < 0) { //printk("%s device_create_file fail dev_attr_show_sensitivity\n",__FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_show_sensitivity.attr.name); } if (device_create_file(touchkey_update_device.this_device, &dev_attr_touchkey_version) < 0) { //printk("%s device_create_file fail dev_attr_touchkey_version\n",__FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_version.attr.name); } if (device_create_file(touchkey_update_device.this_device, &dev_attr_touchkey_recommend) < 0) { //printk("%s device_create_file fail dev_attr_touchkey_recommend\n",__FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_recommend.attr.name); } if (device_create_file(touchkey_update_device.this_device, &dev_attr_touchkey_menu) < 0) { //printk("%s device_create_file fail dev_attr_touchkey_menu\n",__FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_menu.attr.name); } if (device_create_file(touchkey_update_device.this_device, &dev_attr_touchkey_back) < 0) { //printk("%s device_create_file fail dev_attr_touchkey_back\n",__FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_back.attr.name); } #if defined (CONFIG_MACH_S5PC110_PRESTIGE) if (device_create_file(touchkey_update_device.this_device, &dev_attr_touchkey_home) < 0) { //printk("%s device_create_file fail dev_attr_touchkey_home\n",__FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_home.attr.name); } if (device_create_file(touchkey_update_device.this_device, &dev_attr_touchkey_search) < 0) { //printk("%s device_create_file fail dev_attr_touchkey_search\n",__FUNCTION__); pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_search.attr.name); } #endif init_hw(); while(retry--) { if(get_touchkey_firmware(data) == 0) //melfas need delay for multiple read break; } printk(KERN_DEBUG "%s F/W version: 0x%x, Module version:0x%x\n",__FUNCTION__, data[1], data[2]); touch_version = data[1]; retry = 3; printk(KERN_DEBUG "HWREV is 0x%x\n",HWREV); if ((1 <= data[1]) && (data[1] <= 20)) { s5pc110_upper_board_touchkey = 1; } printk("Upper Board Touchkey is 0x%x\n", s5pc110_upper_board_touchkey); #if 0 if((data[1]==0x0) || (data[1]==0xff)) { // do nothing } else if (data[1] < 0x08) { set_touchkey_debug('U'); while (retry--) { if (mcsdl_download_binary_data() == 1) { printk("touchkey_update successed\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); gpio_direction_output(_3_GPIO_TOUCH_CE, 0); 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 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 defined(TOUCH_UPDATE) tempdata = devdata; #endif 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); 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; 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; } 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__); } 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) return -ENOMEM; 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]); #endif #ifdef CONFIG_GENERIC_BLN bln_devdata = devdata; #endif return 0; err_req_irq: err_backlight_on: err_read: devdata->pdata->touchkey_onoff(TOUCHKEY_OFF); 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 __init touchkey_init(void) { int ret = 0; int retry = 10; char data[3]; touchkey_keycode[2] = KEY_ENTER; 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); } init_hw(); while (retry--) { get_touchkey_firmware(data); printk("%s F/W version: 0x%x, Module version:0x%x\n", __FUNCTION__, data[1], data[2]); if ((data[1] != 0xff) && (data[2] != 0xff)) break; } retry = 3; if (((data[1] < 0x9) || (data[1] == 0xff))) { set_touchkey_debug('U'); while (retry--) { if (mcsdl_download_binary_data() == 1) { printk("touchkey_update successed\n"); set_touchkey_debug('C'); break; } printk("touchkey_update failed... retry...\n"); set_touchkey_debug('f'); } } 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 cypress_touchkey_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct device *dev = &client->dev; struct input_dev *input_dev; u8 data[6]; int err; int cnt; int touch_auto_calibration_on_off = 0; #if defined(TOUCH_UPDATE) int ret; int retry = 10; #endif printk(" cypress_touchkey_probe\n"); gpio_set_value(TOUCHKEY_VDD_EN, 1); msleep(5); 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 = "sec_touchkey"; 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); msleep(50); err = i2c_master_recv(client, data, sizeof(data)); if (err < (int)sizeof(data)) { printk(KERN_DEBUG"[Touchkey] i2c master recv error %d\n", err); 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 set_irq_type((IRQ_EINT_GROUP18_BASE + 6), IRQ_TYPE_LEVEL_LOW); // IRQ_TYPE_EDGE_FALLING); s3c_gpio_cfgpin(_3_GPIO_TOUCH_INT, S3C_GPIO_SFN(0xf)); s3c_gpio_setpull(_3_GPIO_TOUCH_INT, S3C_GPIO_PULL_NONE); 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; } mdelay(50); touchkey_auto_calibration(1); mdelay(200); i2c_touchkey_read (devdata,0x00, data, 6); touch_auto_calibration_on_off = (data[5] & 0x80)>>7; printk("touchkey_auto_calibration=%d,data=%x \n",touch_auto_calibration_on_off,data[5]); #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); } if (device_create_file (touchkey_update_device.this_device, &dev_attr_touchkey_menu) < 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_touchkey_home) < 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_touchkey_back) < 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_touchkey_search) < 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_sensitivity) < 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_touchkey_idac0) < 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_touchkey_idac1) < 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_touchkey_idac2) < 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_touchkey_idac3) < 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); } 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]); #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); 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; }