/** * 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; }
/** * 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); } }
/** * 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); } }