void __isph3a_aewb_enable(struct isp_h3a_device *isp_h3a, u8 enable) { if (enable) { isp_h3a->regs.pcr |= ISPH3A_PCR_AEW_EN; DPRINTK_ISPH3A(" H3A enabled \n"); } else { isp_h3a->regs.pcr &= ~ISPH3A_PCR_AEW_EN; DPRINTK_ISPH3A(" H3A disabled \n"); } isp_h3a->update = 1; isp_h3a->aewb_config_local.aewb_enable = enable; isph3a_aewb_update_regs(isp_h3a); }
/** * isph3a_save_context - Saves the values of the h3a module registers. **/ void isph3a_save_context(struct device *dev) { DPRINTK_ISPH3A(" Saving context\n"); isp_save_context(dev, isph3a_reg_list); /* Avoid enable during restore ctx */ isph3a_reg_list[0].val &= ~(ISPH3A_PCR_AEW_EN | ISPH3A_PCR_AF_EN); }
/** * isph3a_aewb_request_statistics - REquest statistics and update gains in AEWB * @aewbdata: Pointer to return AE AWB statistics data. * * This API allows the user to update White Balance gains, as well as * exposure time and analog gain. It is also used to request frame * statistics. * * Returns 0 if successful, -EINVAL when H3A engine is not enabled, or other * errors when setting gains. **/ int isph3a_aewb_request_statistics(struct isp_h3a_device *isp_h3a, struct isph3a_aewb_data *aewbdata) { struct device *dev = to_device(isp_h3a); unsigned long irqflags; int ret = 0; if (!isp_h3a->aewb_config_local.aewb_enable) { dev_dbg(dev, "h3a: engine not enabled\n"); return -EINVAL; } DPRINTK_ISPH3A("isph3a_aewb_request_statistics: Enter " "(frame req. => %d, current frame => %d," "update => %d)\n", aewbdata->frame_number, isp_h3a->stat.frame_number, aewbdata->update); DPRINTK_ISPH3A("User data received: \n"); DPRINTK_ISPH3A("Digital gain = 0x%04x\n", aewbdata->dgain); DPRINTK_ISPH3A("WB gain b *= 0x%04x\n", aewbdata->wb_gain_b); DPRINTK_ISPH3A("WB gain r *= 0x%04x\n", aewbdata->wb_gain_r); DPRINTK_ISPH3A("WB gain gb = 0x%04x\n", aewbdata->wb_gain_gb); DPRINTK_ISPH3A("WB gain gr = 0x%04x\n", aewbdata->wb_gain_gr); spin_lock_irqsave(isp_h3a->lock, irqflags); if (aewbdata->update & SET_DIGITAL_GAIN) isp_h3a->h3awb_update.dgain = (u16)aewbdata->dgain; if (aewbdata->update & SET_COLOR_GAINS) { isp_h3a->h3awb_update.coef0 = (u8)aewbdata->wb_gain_r; isp_h3a->h3awb_update.coef1 = (u8)aewbdata->wb_gain_gr; isp_h3a->h3awb_update.coef2 = (u8)aewbdata->wb_gain_gb; isp_h3a->h3awb_update.coef3 = (u8)aewbdata->wb_gain_b; } if (aewbdata->update & (SET_COLOR_GAINS | SET_DIGITAL_GAIN)) isp_h3a->wb_update = 1; spin_unlock_irqrestore(isp_h3a->lock, irqflags); if (aewbdata->update & REQUEST_STATISTICS) ret = isph3a_aewb_get_stats(isp_h3a, aewbdata); aewbdata->curr_frame = isp_h3a->stat.frame_number; DPRINTK_ISPH3A("isph3a_aewb_request_statistics: " "aewbdata->h3a_aewb_statistics_buf => %p\n", aewbdata->h3a_aewb_statistics_buf); return ret; }
/** * isph3a_print_status - Debug print. Values of H3A related registers. **/ static void isph3a_print_status(struct isp_h3a_device *isp_h3a) { DPRINTK_ISPH3A("ISPH3A_PCR = 0x%08x\n", isp_reg_readl(isp_h3a->dev, OMAP3_ISP_IOMEM_H3A, ISPH3A_PCR)); DPRINTK_ISPH3A("ISPH3A_AEWWIN1 = 0x%08x\n", isp_reg_readl(isp_h3a->dev, OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWWIN1)); DPRINTK_ISPH3A("ISPH3A_AEWINSTART = 0x%08x\n", isp_reg_readl(isp_h3a->dev, OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWINSTART)); DPRINTK_ISPH3A("ISPH3A_AEWINBLK = 0x%08x\n", isp_reg_readl(isp_h3a->dev, OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWINBLK)); DPRINTK_ISPH3A("ISPH3A_AEWSUBWIN = 0x%08x\n", isp_reg_readl(isp_h3a->dev, OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWSUBWIN)); DPRINTK_ISPH3A("ISPH3A_AEWBUFST = 0x%08x\n", isp_reg_readl(isp_h3a->dev, OMAP3_ISP_IOMEM_H3A, ISPH3A_AEWBUFST)); DPRINTK_ISPH3A("stats windows = %d\n", isp_h3a->win_count); DPRINTK_ISPH3A("stats buf size = %d\n", isp_h3a->stat.buf_size); }
/** * isph3a_restore_context - Restores the values of the h3a module registers. **/ void isph3a_restore_context(struct device *dev) { DPRINTK_ISPH3A(" Restoring context\n"); isp_restore_context(dev, isph3a_reg_list); }