int mcs6000_ts_ioctl_down(struct inode *inode, struct file *flip, unsigned int cmd, unsigned long arg) { int err = 0; struct mcs6000_ts_down_ioctl_i2c_type client_data; struct mcs6000_ts_device *dev = NULL; dev = &mcs6000_ts_dev; //printk(KERN_INFO"%d\n", _IOC_NR(cmd)); if (_IOC_NR(cmd) >= MCS6000_TS_DOWN_IOCTL_MAXNR) return -EINVAL; switch (cmd) { case MCS6000_TS_DOWN_IOCTL_VDD_HIGH: err = dev->power(ON); if( err < 0 ) printk(KERN_INFO"%s: Power On Fail....\n", __FUNCTION__); break; case MCS6000_TS_DOWN_IOCTL_VDD_LOW: err = dev->power(OFF); if( err < 0 ) printk(KERN_INFO"%s: Power Down Fail..\n", __FUNCTION__); break; case MCS6000_TS_DOWN_IOCTL_INTR_HIGH: gpio_configure(dev->intr_gpio, GPIOF_DRIVE_OUTPUT | GPIOF_OUTPUT_HIGH); break; case MCS6000_TS_DOWN_IOCTL_INTR_LOW: gpio_configure(dev->intr_gpio, GPIOF_DRIVE_OUTPUT | GPIOF_OUTPUT_LOW); break; case MCS6000_TS_DOWN_IOCTL_INTR_OUT: gpio_configure(dev->intr_gpio, GPIOF_DRIVE_OUTPUT); break; case MCS6000_TS_DOWN_IOCTL_INTR_IN: gpio_configure(dev->intr_gpio, GPIOF_INPUT); break; case MCS6000_TS_DOWN_IOCTL_SCL_HIGH: gpio_configure(dev->scl_gpio, GPIOF_DRIVE_OUTPUT | GPIOF_OUTPUT_HIGH); break; case MCS6000_TS_DOWN_IOCTL_SCL_LOW: gpio_configure(dev->scl_gpio, GPIOF_DRIVE_OUTPUT | GPIOF_OUTPUT_LOW); break; case MCS6000_TS_DOWN_IOCTL_SDA_HIGH: gpio_configure(dev->sda_gpio, GPIOF_DRIVE_OUTPUT | GPIOF_OUTPUT_HIGH); break; case MCS6000_TS_DOWN_IOCTL_SDA_LOW: gpio_configure(dev->sda_gpio, GPIOF_DRIVE_OUTPUT | GPIOF_OUTPUT_LOW); break; case MCS6000_TS_DOWN_IOCTL_SCL_OUT: gpio_configure(dev->scl_gpio, GPIOF_DRIVE_OUTPUT); break; case MCS6000_TS_DOWN_IOCTL_SDA_OUT: gpio_configure(dev->sda_gpio, GPIOF_DRIVE_OUTPUT); break; case MCS6000_TS_DOWN_IOCTL_I2C_ENABLE: //mcs6000_ts_down_i2c_block_enable(1); break; case MCS6000_TS_DOWN_IOCTL_I2C_DISABLE: //mcs6000_ts_down_i2c_block_enable(0); break; case MCS6000_TS_DOWN_IOCTL_I2C_READ: if (copy_from_user(&client_data, (struct mcs6000_ts_down_ioctl_i2c_type *)arg, sizeof(struct mcs6000_ts_down_ioctl_i2c_type))) { printk(KERN_INFO "%s: copyfromuser error\n", __FUNCTION__); return -EFAULT; } if (0 > mcs6000_ts_ioctl_down_i2c_read( (unsigned char)client_data.addr, (unsigned char *)&client_data.data)) { err = -EIO; } if (copy_to_user((void *)arg, (const void *)&client_data, sizeof(struct mcs6000_ts_down_ioctl_i2c_type))) { printk(KERN_INFO "%s: copytouser error\n", __FUNCTION__); err = -EFAULT; } break; case MCS6000_TS_DOWN_IOCTL_I2C_WRITE: if (copy_from_user(&client_data, (struct mcs6000_ts_down_ioctl_i2c_type *)arg, sizeof(struct mcs6000_ts_down_ioctl_i2c_type))) { printk(KERN_INFO "%s: copyfromuser error\n", __FUNCTION__); return -EFAULT; } if (0 > mcs6000_ts_ioctl_down_i2c_write((unsigned char)client_data.addr, (unsigned char)client_data.data)) { err = -EIO; } break; case MCS6000_TS_DOWN_IOCTL_SELECT_TS_TYPE: break; default: err = -EINVAL; break; } if (err < 0) printk(KERN_ERR "\n==== Touch DONW IOCTL Fail....%d\n",_IOC_NR(cmd)); return err; }
static int mcs6000_ts_ioctl_down(struct inode *inode, struct file *flip, unsigned int cmd, unsigned long arg) { int err = 0; struct mcs6000_ts_down_ioctl_i2c_type client_data; struct mcs6000_ts_device *dev = NULL; int sel_type = 0; dev = &mcs6000_ts_dev; //printk(KERN_INFO"%d\n", _IOC_NR(cmd)); if (_IOC_NR(cmd) >= MCS6000_TS_DOWN_IOCTL_MAXNR) return -EINVAL; switch (cmd) { case MCS6000_TS_DOWN_IOCTL_VDD_HIGH: err = dev->power(ON); if( err < 0 ) printk(KERN_INFO"[sub]%s: Power On Fail....\n", __FUNCTION__); break; case MCS6000_TS_DOWN_IOCTL_VDD_LOW: err = dev->power(OFF); if( err < 0 ) printk(KERN_INFO"[sub]%s: Power Down Fail..\n", __FUNCTION__); break; case MCS6000_TS_DOWN_IOCTL_CE_HIGH: gpio_direction_output(dev->ce_gpio, 1); break; case MCS6000_TS_DOWN_IOCTL_CE_LOW: gpio_direction_output(dev->ce_gpio, 0); break; case MCS6000_TS_DOWN_IOCTL_INTR_HIGH: gpio_direction_output(dev->intr_gpio, 1); break; case MCS6000_TS_DOWN_IOCTL_INTR_LOW: gpio_direction_output(dev->intr_gpio, 0); break; case MCS6000_TS_DOWN_IOCTL_INTR_OUT: gpio_direction_output(dev->intr_gpio, 0); break; case MCS6000_TS_DOWN_IOCTL_INTR_IN: gpio_direction_input(dev->intr_gpio); break; case MCS6000_TS_DOWN_IOCTL_SCL_HIGH: gpio_direction_output(dev->scl_gpio, 1); break; case MCS6000_TS_DOWN_IOCTL_SCL_LOW: gpio_direction_output(dev->scl_gpio, 0); break; case MCS6000_TS_DOWN_IOCTL_SDA_HIGH: gpio_direction_output(dev->sda_gpio, 1); break; case MCS6000_TS_DOWN_IOCTL_SDA_LOW: gpio_direction_output(dev->sda_gpio, 0); break; case MCS6000_TS_DOWN_IOCTL_SCL_OUT: gpio_direction_output(dev->scl_gpio, 0); break; case MCS6000_TS_DOWN_IOCTL_SDA_OUT: gpio_direction_output(dev->sda_gpio, 0); break; case MCS6000_TS_DOWN_IOCTL_I2C_ENABLE: //mcs6000_ts_down_i2c_block_enable(1); break; case MCS6000_TS_DOWN_IOCTL_I2C_DISABLE: //mcs6000_ts_down_i2c_block_enable(0); break; case MCS6000_TS_DOWN_IOCTL_I2C_READ: if (copy_from_user(&client_data, (struct mcs6000_ts_down_ioctl_i2c_type *)arg, sizeof(struct mcs6000_ts_down_ioctl_i2c_type))) { printk(KERN_INFO "[sub]%s: copyfromuser error\n", __FUNCTION__); return -EFAULT; } if (0 > mcs6000_ts_ioctl_down_i2c_read( (unsigned char)client_data.addr, (unsigned char *)&client_data.data)) { err = -EIO; } if (copy_to_user((void *)arg, (const void *)&client_data, sizeof(struct mcs6000_ts_down_ioctl_i2c_type))) { printk(KERN_INFO "[sub]%s: copytouser error\n", __FUNCTION__); err = -EFAULT; } break; case MCS6000_TS_DOWN_IOCTL_I2C_WRITE: if (copy_from_user(&client_data, (struct mcs6000_ts_down_ioctl_i2c_type *)arg, sizeof(struct mcs6000_ts_down_ioctl_i2c_type))) { printk(KERN_INFO "[sub]%s: copyfromuser error\n", __FUNCTION__); return -EFAULT; } if (0 > mcs6000_ts_ioctl_down_i2c_write((unsigned char)client_data.addr, (unsigned char)client_data.data)) { err = -EIO; } break; case MCS6000_TS_DOWN_IOCTL_SELECT_TS_TYPE: if( copy_from_user(&sel_type, (int*)arg, sizeof(int)) ){ printk(KERN_INFO "%s: copyfromuser error, cmd(%d)\n", __FUNCTION__, cmd); return -EFAULT; } if(sel_type == 0xFF){ /* download completed, clear version info cache */ is_version_info_cached = 0; } printk(KERN_INFO "[sub]%s: MCS6000_TS_DOWN_IOCTL_SELECT_TS_TYPE(%d)\n", __FUNCTION__, sel_type); break; case MCS6000_TS_DOWN_IOCTL_ENTER_DOWN_MODE: is_downloading = 1; printk(KERN_INFO "[sub]%s: MCS6000_TS_DOWN_IOCTL_ENTER_DOWN_MODE(%d)\n", __FUNCTION__, sel_type); disable_irq(dev->num_irq); printk(KERN_INFO "[sub]touch download start : irq disabled by ioctl\n"); break; default: err = -EINVAL; break; } if (err < 0) printk(KERN_ERR "\n[sub]==== Touch DONW IOCTL Fail....%d\n",_IOC_NR(cmd)); return err; }