static ssize_t epen_checksum_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct wacom_i2c *wac_i2c = dev_get_drvdata(dev); int val; sscanf(buf, "%d", &val); if (val != 1) { dev_info(&wac_i2c->client->dev, "%s: wrong cmd %d\n", __func__, val); return count; } wacom_enable_irq(wac_i2c, false); wacom_checksum(wac_i2c); wacom_enable_irq(wac_i2c, true); dev_info(&wac_i2c->client->dev, "%s: result %d\n", __func__, wac_i2c->checksum_result); return count; }
static ssize_t epen_checksum_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct wacom_i2c *wac_i2c = dev_get_drvdata(dev); bool check_version = false; int val; sscanf(buf, "%d", &val); #if defined(CONFIG_MACH_P4NOTE) if (wac_i2c->checksum_result) return count; else check_version = true; #elif defined(CONFIG_MACH_Q1_BD) if (wac_i2c->wac_feature->fw_version >= 0x31E) check_version = true; #elif defined(CONFIG_MACH_T0) if (wac_i2c->wac_feature->fw_version == 0x179) { wac_i2c->checksum_result = 1; check_version = false; } else check_version = true; #else check_version = true; #endif if (val == 1 && check_version) { wacom_enable_irq(wac_i2c, false); wacom_checksum(wac_i2c); wacom_enable_irq(wac_i2c, true); } printk(KERN_DEBUG "epen:%s, check %d, result %d\n", __func__, check_version, wac_i2c->checksum_result); return count; }
static ssize_t epen_checksum_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct wacom_i2c *wac_i2c = dev_get_drvdata(dev); bool check_version = false; int val; sscanf(buf, "%d", &val); #if defined(CONFIG_MACH_P4NOTE) return count; #else if (wac_i2c->wac_feature->fw_version >= 0x31E) check_version = true; #endif if (val == 1 && check_version) { disable_irq(wac_i2c->client->irq); #ifdef WACOM_PDCT_WORK_AROUND disable_irq(wac_i2c->irq_pdct); #endif wacom_checksum(wac_i2c); enable_irq(wac_i2c->client->irq); #ifdef WACOM_PDCT_WORK_AROUND enable_irq(wac_i2c->irq_pdct); #endif printk(KERN_DEBUG "[E-PEN] %s, result %d\n", __func__, wac_i2c->checksum_result); } return count; }
int wacom_i2c_query(struct wacom_i2c *wac_i2c) { struct wacom_features *wac_feature = wac_i2c->wac_feature; int ret; u8 buf; u8 data[9] = {0, }; int i = 0; int query_limit = 10; buf = COM_QUERY; for (i = 0; i < query_limit; i++) { ret = wacom_i2c_send(wac_i2c, &buf, 1, false); if (ret < 0) { printk(KERN_ERR"[E-PEN] I2C send failed(%d)\n", ret); continue; } msleep(100); ret = wacom_i2c_recv(wac_i2c, data, COM_QUERY_NUM, false); if (ret < 0) { printk(KERN_ERR"[E-PEN] I2C recv failed(%d)\n", ret); continue; } printk(KERN_INFO "[E-PEN] %s: %dth ret of wacom query=%d\n", __func__, i, ret); if (COM_QUERY_NUM == ret) { if (0x0f == data[0]) { wac_feature->fw_version = ((u16) data[7] << 8) + (u16) data[8]; break; } else { printk(KERN_NOTICE "[E-PEN] %X, %X, %X, %X, %X, %X, %X, fw=0x%x\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6], wac_feature->fw_version); } } } #if defined(CONFIG_MACH_Q1_BD)\ || defined(CONFIG_MACH_P4NOTE)\ || defined(CONFIG_MACH_T0) wac_feature->x_max = (u16) WACOM_MAX_COORD_X; wac_feature->y_max = (u16) WACOM_MAX_COORD_Y; #else wac_feature->x_max = ((u16) data[1] << 8) + (u16) data[2]; wac_feature->y_max = ((u16) data[3] << 8) + (u16) data[4]; #endif wac_feature->pressure_max = (u16) data[6] + ((u16) data[5] << 8); #if defined(COOR_WORK_AROUND) if (i == 10 || ret < 0) { printk(KERN_NOTICE "[E-PEN] COOR_WORK_AROUND is applied\n"); printk(KERN_NOTICE "[E-PEN] %X, %X, %X, %X, %X, %X, %X, %X, %X\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8]); wac_feature->x_max = (u16) WACOM_MAX_COORD_X; wac_feature->y_max = (u16) WACOM_MAX_COORD_Y; wac_feature->pressure_max = (u16) WACOM_MAX_PRESSURE; #ifdef CONFIG_MACH_T0 wac_feature->fw_version = 0; #else wac_feature->fw_version = 0xFF; #endif } #endif printk(KERN_NOTICE "[E-PEN] x_max=0x%X\n", wac_feature->x_max); printk(KERN_NOTICE "[E-PEN] y_max=0x%X\n", wac_feature->y_max); printk(KERN_NOTICE "[E-PEN] pressure_max=0x%X\n", wac_feature->pressure_max); printk(KERN_NOTICE "[E-PEN] fw_version=0x%X (d7:0x%X,d8:0x%X)\n", wac_feature->fw_version, data[7], data[8]); printk(KERN_NOTICE "[E-PEN] %X, %X, %X, %X, %X, %X, %X, %X, %X\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8]); if ((i == 10) && (ret < 0)) { printk(KERN_DEBUG"[E-PEN] %s, failed\n", __func__); wac_i2c->query_status = false; return ret; } wac_i2c->query_status = true; #if defined(CONFIG_MACH_P4NOTE) wacom_checksum(wac_i2c); #endif return 0; }
int wacom_i2c_query(struct wacom_i2c *wac_i2c) { struct wacom_features *wac_feature = wac_i2c->wac_feature; struct i2c_msg msg[2]; int ret; char buf; u8 data[9]; int i = 0; int query_limit = 10; buf = COM_QUERY; msg[0].addr = wac_i2c->client->addr; msg[0].flags = 0x00; msg[0].len = 1; msg[0].buf = (u8 *)&buf; msg[1].addr = wac_i2c->client->addr; msg[1].flags = I2C_M_RD; msg[1].len = COM_QUERY_NUM; msg[1].buf = (u8 *) data; for (i = 0; i < query_limit; i++) { ret = i2c_transfer(wac_i2c->client->adapter, msg, 2); printk(KERN_INFO "[E-PEN]: %s: %dth ret of wacom query=%d\n", __func__, i, ret); if (2 == ret) { wac_feature->fw_version = ((u16) data[7] << 8) + (u16) data[8]; if (wac_feature->fw_version != 0xFF && wac_feature->fw_version != 0xFFFF && wac_feature->fw_version != 0x0) { break; } else { printk(KERN_NOTICE "[E-PEN]: %X, %X, %X, %X, %X, %X, %X, fw=0x%x\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6], wac_feature->fw_version); } } } #if defined(CONFIG_MACH_Q1_BD) || defined(CONFIG_MACH_P4NOTE) wac_feature->x_max = (u16) MAX_COORD_X; wac_feature->y_max = (u16) MAX_COORD_Y; #else wac_feature->x_max = ((u16) data[1] << 8) + (u16) data[2]; wac_feature->y_max = ((u16) data[3] << 8) + (u16) data[4]; #endif wac_feature->pressure_max = (u16) data[6] + ((u16) data[5] << 8); #if defined(COOR_WORK_AROUND) if (i == 10 || ret < 0) { printk(KERN_NOTICE "[E-PEN]: COOR_WORK_AROUND is applied\n"); printk(KERN_NOTICE "[E-PEN]: %X, %X, %X, %X, %X, %X, %X, %X, %X\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8]); wac_feature->x_max = (u16) COOR_WORK_AROUND_X_MAX; wac_feature->y_max = (u16) COOR_WORK_AROUND_Y_MAX; wac_feature->pressure_max = (u16) COOR_WORK_AROUND_PRESSURE_MAX; wac_feature->fw_version = 0xFF; } #endif printk(KERN_NOTICE "[E-PEN]: x_max=0x%X\n", wac_feature->x_max); printk(KERN_NOTICE "[E-PEN]: y_max=0x%X\n", wac_feature->y_max); printk(KERN_NOTICE "[E-PEN]: pressure_max=0x%X\n", wac_feature->pressure_max); printk(KERN_NOTICE "[E-PEN]: fw_version=0x%X (d7:0x%X,d8:0x%X)\n", wac_feature->fw_version, data[7], data[8]); printk(KERN_NOTICE "[E-PEN]: %X, %X, %X, %X, %X, %X, %X, %X, %X\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8]); if ((i == 10) && (ret < 0)) return ret; #if defined(CONFIG_MACH_P4NOTE) wacom_checksum(wac_i2c); #endif return 0; }