/** * hp3a_stream_on - Perform stream on specific tasks. * * No return value. **/ void hp3a_stream_on(void) { g_tc.frame_count = 0; memset(&g_tc.sensor_current, 0, sizeof(struct hp3a_sensor_param)); memset(&g_tc.sensor_requested, 0, sizeof(struct hp3a_sensor_param)); memset(&g_tc.sensor_stats, 0, sizeof(struct hp3a_sensor_param)); hp3a_flush_queue_irqsave(&g_tc.ready_stats_queue); hp3a_flush_queue_irqsave(&g_tc.hist_hw_queue); g_tc.raw_cap_sched_count = 0; g_tc.v4l2_streaming = 1; hp3a_enable_histogram(); hp3a_update_hardpipe(); }
/** * hp3a_set_sensor_param - Set sensor specific params. * @param: Pointer the structure containing sensor parameters. * @fh: Pointer to a hp3a_fh stucture. * * Return 0 on success, less than 0 otherwise. **/ int hp3a_set_sensor_param(struct hp3a_sensor_param *param, struct hp3a_fh *fh) { int ret = -1; struct hp3a_sensor_param_internal sensor_param = { .exposure = 0, .gain = 0, .fps = 0}; unsigned long irqflags = 0; if (likely(fh->v4l2_dev > -1)) { if (likely(g_tc.v4l2_streaming == 1)) { sensor_param.v4l2_dev = fh->v4l2_dev; ret = 0; spin_lock_irqsave(&g_tc.stats_lock, irqflags); if (!(g_tc.sensor_stats.exposure && g_tc.sensor_stats.gain) && !QUEUE_COUNT(g_tc.sensor_write_queue)) { memset(&g_tc.sensor_current, 0, \ sizeof(g_tc.sensor_current)); memset(&g_tc.sensor_requested, 0, \ sizeof(g_tc.sensor_requested)); } if (param->fps && g_tc.sensor_requested.fps != \ param->fps) { sensor_param.fps = param->fps; sensor_param.exposure = param->exposure; sensor_param.gain = param->gain; ret = hp3a_enqueue( \ &g_tc.sensor_write_queue, &sensor_param); sensor_param.fps = 0; sensor_param.exposure = 0; sensor_param.gain = 0; if (!ret) { g_tc.sensor_requested.fps = \ param->fps; g_tc.sensor_requested.exposure = param->exposure; g_tc.sensor_requested.gain = \ param->gain; } } if (param->exposure && (g_tc.sensor_requested.exposure != \ param->exposure)) { sensor_param.exposure = param->exposure; ret = hp3a_enqueue( \ &g_tc.sensor_write_queue, &sensor_param); sensor_param.exposure = 0; if (!ret) { g_tc.sensor_requested.exposure = \ param->exposure; } } if (param->gain && (g_tc.sensor_requested.gain != \ param->gain)) { sensor_param.gain = param->gain; ret = hp3a_enqueue( \ &g_tc.sensor_write_queue, &sensor_param); if (!ret) { g_tc.sensor_requested.gain = \ param->gain; } } spin_unlock_irqrestore(&g_tc.stats_lock, irqflags); } else { struct cam_sensor_settings sensor_settings = { .flags = 0, .exposure = 0, .gain = 0, .fps = 0, .regs = 0, .reg_data = 0}; sensor_settings.exposure = param->exposure; sensor_settings.gain = param->gain; sensor_settings.fps = param->fps; sensor_settings.flags = (OMAP34XXCAM_SET_GAIN | \ OMAP34XXCAM_SET_EXPOSURE); /** * Write and read sensor settings. */ ret = omap34xxcam_sensor_settings(fh->v4l2_dev, &sensor_settings); } } else { dev_err(fh->device->dev, "hp3a: Invalid sensor id(%d)\n", fh->v4l2_dev); } return ret; } /** * hp3a_set_hardpipe_param - Set hard pipe specific params to be programmed. * @param: Pointer the structure containing hard pipe parameters. * @fh: Pointer to a hp3a_fh stucture. * * Return 0 on success, less than 0 otherwise. **/ int hp3a_set_hardpipe_param(struct hp3a_hardpipe_param *param, struct hp3a_fh *fh) { unsigned long irqflags = 0; spin_lock_irqsave(&g_tc.hardpipe_lock, irqflags); memcpy(&g_tc.hpipe_param, param, sizeof(struct hp3a_hardpipe_param)); g_tc.update_hardpipe = 1; spin_unlock_irqrestore(&g_tc.hardpipe_lock, irqflags); if (g_tc.v4l2_streaming == 0) hp3a_update_hardpipe(); return 0; }
/** * hp3a_update_wb - Update WB related hw settings. * * No return value. **/ void hp3a_update_wb(void) { hp3a_update_hardpipe(); }