long dmb_ioctl (struct file *filp, unsigned int cmd, unsigned long arg) { long res = 1; ioctl_info info; int err = 0, size = 0; // printk("%s : type(%c), nr(%x) \n",__func__ , _IOC_TYPE(cmd), _IOC_NR(cmd)); if(_IOC_TYPE(cmd) != IOCTL_MAGIC) return -EINVAL; if(_IOC_NR(cmd) >= IOCTL_MAXNR) return -EINVAL; size = _IOC_SIZE(cmd); // printk("%s : size(%d)\n", __func__, size); if(size) { if(_IOC_DIR(cmd) & _IOC_READ) err = access_ok(VERIFY_WRITE, (void *) arg, size); else if(_IOC_DIR(cmd) & _IOC_WRITE) err = access_ok(VERIFY_READ, (void *) arg, size); if(!err) { printk("%s : Wrong argument! cmd(0x%08x) _IOC_NR(%d) _IOC_TYPE(0x%x) _IOC_SIZE(%d) _IOC_DIR(0x%x)\n", __FUNCTION__, cmd, _IOC_NR(cmd), _IOC_TYPE(cmd), _IOC_SIZE(cmd), _IOC_DIR(cmd)); return err; } } switch(cmd) { case IOCTL_DMB_RESET: res = copy_from_user((void *)&info, (void *)arg, size); // reset the chip with the info[0], if info[0] is zero then isdbt reset, // if info[0] is one then atv reset. printk("IOCTL_DMB_RESET enter.., info.buf[0] %d, info.buf[1] %d\n", info.buf[0], info.buf[1]); dmb_hw_rst(info.buf[0], info.buf[1]); break; case IOCTL_DMB_INIT: nmi625_i2c_init(); break; case IOCTL_DMB_BYTE_READ: break; case IOCTL_DMB_WORD_READ: break; case IOCTL_DMB_LONG_READ: break; case IOCTL_DMB_BULK_READ: res = copy_from_user((void *)&info, (void *)arg, size); res = nmi625_i2c_read(0, (u16)info.dev_addr, (u8 *)(info.buf), info.size); res = copy_to_user((void *)arg, (void *)&info, size); break; case IOCTL_DMB_BYTE_WRITE: //copy_from_user((void *)&info, (void *)arg, size); //res = BBM_BYTE_WRITE(0, (u16)info.buff[0], (u8)info.buff[1]); break; case IOCTL_DMB_WORD_WRITE: break; case IOCTL_DMB_LONG_WRITE: break; case IOCTL_DMB_BULK_WRITE: res = copy_from_user((void *)&info, (void *)arg, size); nmi625_i2c_write(0, (u16)info.dev_addr, (u8 *)(info.buf), info.size); break; case IOCTL_DMB_TUNER_SELECT: break; case IOCTL_DMB_TUNER_READ: break; case IOCTL_DMB_TUNER_WRITE: break; case IOCTL_DMB_TUNER_SET_FREQ: break; case IOCTL_DMB_POWER_ON: printk("DMB_POWER_ON enter..\n"); dmb_hw_init(); break; case IOCTL_DMB_POWER_OFF: printk("DMB_POWER_OFF enter..\n"); //nmi_i2c_deinit(NULL); dmb_hw_deinit(); break; /* FIH, Chandler, add for ftm support { */ case IOCTL_DMB_FTM_CHIPID: gpio_direction_output(gpio_isdbt_rstn,0); mdelay(50); gpio_direction_output(gpio_isdbt_rstn,1); mdelay(100); res = copy_from_user((void *)&info, (void *)arg, size); nmi625_i2c_ftm_chip_id((u8 *)(info.buf), info.size); res = copy_to_user((void *)arg, (void *)&info, size); break; /* FIH, Chandler, add for ftm support } */ default: printk("dmb_ioctl : Undefined ioctl command\n"); res = 1; break; } return res; }
long dmb_ioctl (struct file *filp, unsigned int cmd, unsigned long arg) { long res = 1; ioctl_info info; int err = 0, size; if(_IOC_TYPE(cmd) != IOCTL_MAGIC) return -EINVAL; if(_IOC_NR(cmd) >= IOCTL_MAXNR) return -EINVAL; size = _IOC_SIZE(cmd); if(size) { if(_IOC_DIR(cmd) & _IOC_READ) err = access_ok(VERIFY_WRITE, (void *) arg, size); else if(_IOC_DIR(cmd) & _IOC_WRITE) err = access_ok(VERIFY_READ, (void *) arg, size); if(!err) { printk("%s : Wrong argument! cmd(0x%08x) _IOC_NR(%d) _IOC_TYPE(0x%x) _IOC_SIZE(%d) _IOC_DIR(0x%x)\n", __FUNCTION__, cmd, _IOC_NR(cmd), _IOC_TYPE(cmd), _IOC_SIZE(cmd), _IOC_DIR(cmd)); return err; } } switch(cmd) { case IOCTL_DMB_RESET: if (copy_from_user(&info, (void *)arg, size)) return -EFAULT; printk("DMB_RESET enter.., info.buf[0] %d, info.buf[1] %d\n", info.buf[0], info.buf[1]); dmb_hw_rst(info.buf[0], info.buf[1]); break; case IOCTL_DMB_INIT: nmi625_i2c_init(); break; case IOCTL_DMB_BYTE_READ: break; case IOCTL_DMB_WORD_READ: break; case IOCTL_DMB_LONG_READ: break; case IOCTL_DMB_BULK_READ: if (copy_from_user(&info, (void *)arg, size)) return -EFAULT; res = nmi625_i2c_read(0, (u16)info.dev_addr, (u8 *)(info.buf), info.size); if (copy_to_user((void *)arg, (void *)&info, size)) return -EFAULT; break; case IOCTL_DMB_BYTE_WRITE: break; case IOCTL_DMB_WORD_WRITE: break; case IOCTL_DMB_LONG_WRITE: break; case IOCTL_DMB_BULK_WRITE: if (copy_from_user(&info, (void *)arg, size)) return -EFAULT; nmi625_i2c_write(0, (u16)info.dev_addr, (u8 *)(info.buf), info.size); break; case IOCTL_DMB_TUNER_SELECT: break; case IOCTL_DMB_TUNER_READ: break; case IOCTL_DMB_TUNER_WRITE: break; case IOCTL_DMB_TUNER_SET_FREQ: break; case IOCTL_DMB_POWER_ON: printk("DMB_POWER_ON enter..\n"); dmb_hw_init(); break; case IOCTL_DMB_POWER_OFF: printk("DMB_POWER_OFF enter..\n"); dmb_hw_deinit(); break; case IOCTL_DMB_ANTENNA_SELECT: printk("DMB_ANTENNA_SELECT enter..\n"); if (copy_from_user(&info, (void *)arg, size)) return -EFAULT; if (info.buf[0] > 0X0F) { printk("DMB_ANTENNA_SELECT: select antenna %d > 0X0F !!!\n", info.buf[0]); return -EFAULT; } oneseg_select_antenna(info.buf[0]); break; default: printk("dmb_ioctl : Undefined ioctl command\n"); res = 1; break; } return res; }
int dmb_ioctl (struct file *filp, unsigned int cmd, unsigned long arg) { long res = 1; ioctl_info info; int err, size; if(_IOC_TYPE(cmd) != IOCTL_MAGIC) return -EINVAL; if(_IOC_NR(cmd) >= IOCTL_MAXNR) return -EINVAL; mutex_lock(&nmi625_mutex); size = _IOC_SIZE(cmd); if(size) { if(_IOC_DIR(cmd) & _IOC_READ) err = access_ok(VERIFY_WRITE, (void *) arg, size); else if(_IOC_DIR(cmd) & _IOC_WRITE) err = access_ok(VERIFY_READ, (void *) arg, size); if(!err) { printk("%s : Wrong argument! cmd(0x%08x) _IOC_NR(%d) _IOC_TYPE(0x%x) _IOC_SIZE(%d) _IOC_DIR(0x%x)\n", __FUNCTION__, cmd, _IOC_NR(cmd), _IOC_TYPE(cmd), _IOC_SIZE(cmd), _IOC_DIR(cmd)); mutex_unlock(&nmi625_mutex); return err; } } switch(cmd) { case IOCTL_DMB_RESET: copy_from_user((void *)&info, (void *)arg, size); // reset the chip with the info[0], if info[0] is zero then isdbt reset, // if info[0] is one then atv reset. printk("IOCTL_DMB_RESET enter.., info.buf[0] %d, info.buf[1] %d\n", info.buf[0], info.buf[1]); dmb_hw_rst(info.buf[0], info.buf[1]); break; case IOCTL_DMB_INIT: nmi625_i2c_init(); break; case IOCTL_DMB_BYTE_READ: break; case IOCTL_DMB_WORD_READ: break; case IOCTL_DMB_LONG_READ: break; case IOCTL_DMB_BULK_READ: copy_from_user((void *)&info, (void *)arg, size); res = nmi625_i2c_read(0, (u16)info.dev_addr, (u8 *)(info.buf), info.size); copy_to_user((void *)arg, (void *)&info, size); break; case IOCTL_DMB_BYTE_WRITE: //copy_from_user((void *)&info, (void *)arg, size); //res = BBM_BYTE_WRITE(0, (u16)info.buff[0], (u8)info.buff[1]); break; case IOCTL_DMB_WORD_WRITE: break; case IOCTL_DMB_LONG_WRITE: break; case IOCTL_DMB_BULK_WRITE: copy_from_user((void *)&info, (void *)arg, size); nmi625_i2c_write(0, (u16)info.dev_addr, (u8 *)(info.buf), info.size); break; case IOCTL_DMB_TUNER_SELECT: break; case IOCTL_DMB_TUNER_READ: break; case IOCTL_DMB_TUNER_WRITE: break; case IOCTL_DMB_TUNER_SET_FREQ: break; case IOCTL_DMB_POWER_ON: printk("DMB_POWER_ON enter..\n"); dmb_hw_init(); break; case IOCTL_DMB_POWER_OFF: printk("DMB_POWER_OFF enter..\n"); //nmi_i2c_deinit(NULL); dmb_hw_deinit(); break; default: printk("dmb_ioctl : Undefined ioctl command\n"); res = 1; break; } mutex_unlock(&nmi625_mutex); return res; }