Example #1
0
static unsigned int s3c_rotator_poll(struct file *file, poll_table *wait)
{
	unsigned int mask = 0;

	poll_wait(file, &waitq_rotator, wait);

	if (S3C_ROTATOR_IDLE == s3c_rotator_get_status()) {
		mask = POLLOUT|POLLWRNORM;
	}

	return mask;
}
Example #2
0
static int s3c_rotator_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
	struct s3c_rotator_ctrl	*ctrl = &s3c_rot;
	ro_params *params;
	ro_params *parg;

	unsigned int check_rest = 0;

	if (s3c_rotator_get_status() != S3C_ROT_STATREG_STATUS_IDLE) {
		printk(KERN_ERR "Rotator is busy : %x\n", s3c_rotator_get_status());
		return -EBUSY;
	}

	mutex_lock(h_rot_mutex);

	params	        = (ro_params *)file->private_data;
	parg	        = (ro_params *)arg;

	get_user(params->src_width, &parg->src_width);
	get_user(params->src_height, &parg->src_height);

	get_user(params->src_window_offset_x, &parg->src_window_offset_x);
	get_user(params->src_window_offset_y, &parg->src_window_offset_y);

	get_user(params->src_window_width, &parg->src_window_width);
	get_user(params->src_window_height, &parg->src_window_height);

	get_user(params->src_format,    &parg->src_format);
	get_user(params->src_addr_rgb_y, &parg->src_addr_rgb_y);
	get_user(params->src_addr_cb,   &parg->src_addr_cb);
	get_user(params->src_addr_cr,   &parg->src_addr_cr);

	get_user(params->dst_window_offset_x, &parg->dst_window_offset_x);
	get_user(params->dst_window_offset_y, &parg->dst_window_offset_y);

	get_user(params->dst_window_width, &parg->dst_window_width);
	get_user(params->dst_window_height, &parg->dst_window_height);

	get_user(params->dst_addr_rgb_y, &parg->dst_addr_rgb_y);
	get_user(params->dst_addr_cb,   &parg->dst_addr_cb);
	get_user(params->dst_addr_cr,   &parg->dst_addr_cr);

	check_rest = s3c_rotator_check_restrictions(params);

	if (check_rest) {
		printk(KERN_ERR "\n%s: restrictions error : %d\n", __FUNCTION__, check_rest);
		return -EINVAL;
	}

	/* set source format*/
	s3c_rotator_set_inputfmt(params->src_format);

	/* set degree */
	s3c_rotator_set_degree(cmd);

	s3c_rotator_set_source(params);
	s3c_rotator_set_dest(params);
	s3c_rotator_start();

	ctrl->status = ROT_RUN;

	if (!(file->f_flags & O_NONBLOCK)) {
		if (interruptible_sleep_on_timeout(&waitq_rotator, ROTATOR_TIMEOUT) == 0) {
			ctrl->status = ROT_IDLE;
			printk(KERN_ERR "\n%s: Waiting for interrupt is timeout\n", __FUNCTION__);
		}
	}

	mutex_unlock(h_rot_mutex);

	return 0;
}