示例#1
0
/**
 * hp3a_read_ispregs_to_user - Read an array of ISP registers into user buffer.
 * @user_page: Pointer to structure containing register page to read.
 *
 * Return 0 on success, -1 otherwise.
 **/
int hp3a_read_ispregs_to_user(struct hp3a_reg_page *user_page)
{
	int ret = -1;
	struct hp3a_reg_page page;
	struct hp3a_reg *regs;

	if (copy_from_user(&page,
			(struct hp3a_reg_page *)user_page,
			sizeof(struct hp3a_reg_page) == 0)) {
		regs = kmalloc(sizeof(struct hp3a_reg) * page.len, GFP_KERNEL);
		if (page.regs != 0) {
			if (copy_from_user(regs, page.regs,
				sizeof(struct hp3a_reg) * page.len) == 0) {
				hp3a_read_ispregs(regs);

				if (copy_to_user(page.regs, regs,
					sizeof(struct hp3a_reg) * page.len) == 0) {
					ret = 0;
				}
			}
			kfree(regs);
		} else {
			printk(KERN_ERR "hp3a: Error allocating memory for register read!\n");
		}
	}

	return ret;
}
示例#2
0
/**
 * hp3a_enable_raw - Enables raw statistics collection.
 *
 * No return value.
 **/
void hp3a_enable_raw(unsigned long buffer_addr)
{
	if (likely(buffer_addr != 0)) {
		if (g_tc.isp_ctx_saved == 0) {
			/* Save ISP registers. */
			hp3a_read_ispregs(isp_raw_regs);
			g_tc.isp_ctx_saved = 1;
		}

		/* Set ccdc config register. */
		/*
		omap_writel((omap_readl(ISPCCDC_CFG)) & \
				~ISPCCDC_CFG_WENLOG, ISPCCDC_CFG);
		*/
		omap_writel((omap_readl(ISPCCDC_CFG)) | ISPCCDC_CFG_WENLOG,
							ISPCCDC_CFG);

		/* Set oputput memory address. */
		omap_writel(buffer_addr, ISPCCDC_SDR_ADDR);

		/* Set register for line memory offset*/
		omap_writel(ALIGN_TO((g_tc.raw_width << 1), 32),
					ISPCCDC_HSIZE_OFF);

		/*
			The following registers must be set during CCDC config.
			CCDC_HORZ_INFO
			CCDC_VERT_START
			CCDC_VERT_LINES
			CCDC_SDOFST
		*/

		/* ISPCCDC_SYN_MODE must be set last. */
		omap_writel((omap_readl(ISPCCDC_SYN_MODE) |
				ISPCCDC_SYN_MODE_WEN |
				ISPCCDC_SYN_MODE_EXWEN |
				ISPCCDC_SYN_MODE_VP2SDR),
				ISPCCDC_SYN_MODE);
	}
}
示例#3
0
/**
 * hp3a_enable_raw - Enables raw statistics collection.
 *
 * No return value.
 **/
void hp3a_enable_raw(unsigned long buffer_addr)
{
	if (likely(buffer_addr != 0)) {
		if (likely(g_tc.isp_ctx_saved == 0)) {
			/* Save ISP registers. */
			hp3a_read_ispregs(isp_raw_regs);
			g_tc.isp_ctx_saved = 1;
		}

		/* Set ccdc config register. */
		/*
		omap_writel((omap_readl(ISPCCDC_CFG)) & \
				~ISPCCDC_CFG_WENLOG, ISPCCDC_CFG);
		*/
		omap_writel((omap_readl(ISPCCDC_CFG)) | ISPCCDC_CFG_WENLOG,
							ISPCCDC_CFG);

		/* Set oputput memory address. */
		omap_writel(buffer_addr, ISPCCDC_SDR_ADDR);

		/* Set register for line memory offset*/
		omap_writel(ALIGN_TO((g_tc.raw_width << 1), 32), ISPCCDC_HSIZE_OFF);

		/*0 - By default Donot inverse the field identification */
		omap_writel((omap_readl(ISPCCDC_SDOFST) & (~ISPCCDC_SDOFST_FINV)),
								ISPCCDC_SDOFST);

		/*0 - By default one line offset*/
		omap_writel(omap_readl(ISPCCDC_SDOFST) & ISPCCDC_SDOFST_FOFST_1L,
				ISPCCDC_SDOFST);

		/* ISPCCDC_SYN_MODE must be set last. */
		omap_writel((omap_readl(ISPCCDC_SYN_MODE) | ISPCCDC_SYN_MODE_WEN |
				ISPCCDC_SYN_MODE_EXWEN | ISPCCDC_SYN_MODE_VP2SDR),
				ISPCCDC_SYN_MODE);
	}
}