100 lines
3.1 KiB
C
Executable File
100 lines
3.1 KiB
C
Executable File
/*
|
|
* Samsung Exynos5 SoC series FIMC-IS driver
|
|
*
|
|
*
|
|
* Copyright (c) 2016 Samsung Electronics Co., Ltd
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
|
|
#ifndef FIMC_IS_DEVICE_MGR_H
|
|
#define FIMC_IS_DEVICE_MGR_H
|
|
|
|
#include "fimc-is-config.h"
|
|
#include "fimc-is-device-ischain.h"
|
|
#include "fimc-is-device-sensor.h"
|
|
|
|
#ifdef CONFIG_USE_SENSOR_GROUP
|
|
#define GET_DEVICE_TYPE_BY_GRP(group_id) \
|
|
({enum fimc_is_device_type type; \
|
|
switch (group_id) { \
|
|
case GROUP_ID_SS0: \
|
|
case GROUP_ID_SS1: \
|
|
case GROUP_ID_SS2: \
|
|
case GROUP_ID_SS3: \
|
|
case GROUP_ID_SS4: \
|
|
case GROUP_ID_SS5: \
|
|
type = FIMC_IS_DEVICE_SENSOR; \
|
|
break; \
|
|
default: \
|
|
type = FIMC_IS_DEVICE_ISCHAIN; \
|
|
break; \
|
|
}; type;})
|
|
|
|
#define GET_HEAD_GROUP_IN_DEVICE(type, group) \
|
|
({ struct fimc_is_group *head; \
|
|
head = group->head; \
|
|
while (head) { \
|
|
if (head->device_type == type) \
|
|
break; \
|
|
else \
|
|
head = head->child; \
|
|
}; head;})
|
|
|
|
#define GET_OUT_FLAG_IN_DEVICE(device_type, out_flag) \
|
|
({unsigned long tmp_out_flag; \
|
|
if (device_type == FIMC_IS_DEVICE_ISCHAIN) \
|
|
tmp_out_flag = ((out_flag) & (~((1 << ENTRY_3AA) - 1))); \
|
|
else \
|
|
tmp_out_flag = ((out_flag) & ((1 << ENTRY_3AA) - 1)); \
|
|
tmp_out_flag;})
|
|
#else
|
|
#define GET_DEVICE_TYPE_BY_GRP(group_id) FIMC_IS_DEVICE_ISCHAIN
|
|
#define GET_HEAD_GROUP_IN_DEVICE(type, group) (group->head)
|
|
#define GET_OUT_FLAG_IN_DEVICE(device_type, out_flag) (out_flag)
|
|
#endif
|
|
|
|
struct devicemgr_sensor_tag_data {
|
|
struct fimc_is_devicemgr *devicemgr;
|
|
struct fimc_is_group *group;
|
|
u32 fcount;
|
|
u32 stream;
|
|
};
|
|
|
|
struct fimc_is_devicemgr {
|
|
struct fimc_is_device_sensor *sensor[FIMC_IS_STREAM_COUNT];
|
|
struct fimc_is_device_ischain *ischain[FIMC_IS_STREAM_COUNT];
|
|
struct tasklet_struct tasklet[FIMC_IS_STREAM_COUNT];
|
|
struct devicemgr_sensor_tag_data tag_data[FIMC_IS_STREAM_COUNT];
|
|
};
|
|
|
|
struct fimc_is_group *get_ischain_leader_group(struct fimc_is_device_ischain *device);
|
|
int fimc_is_devicemgr_probe(struct fimc_is_devicemgr *devicemgr);
|
|
int fimc_is_devicemgr_open(struct fimc_is_devicemgr *devicemgr,
|
|
void *device, enum fimc_is_device_type type);
|
|
int fimc_is_devicemgr_binding(struct fimc_is_devicemgr *devicemgr,
|
|
struct fimc_is_device_sensor *sensor,
|
|
struct fimc_is_device_ischain *ischain,
|
|
enum fimc_is_device_type type);
|
|
int fimc_is_devicemgr_start(struct fimc_is_devicemgr *devicemgr,
|
|
void *device, enum fimc_is_device_type type);
|
|
int fimc_is_devicemgr_stop(struct fimc_is_devicemgr *devicemgr,
|
|
void *device, enum fimc_is_device_type type);
|
|
int fimc_is_devicemgr_close(struct fimc_is_devicemgr *devicemgr,
|
|
void *device, enum fimc_is_device_type type);
|
|
int fimc_is_devicemgr_shot_callback(struct fimc_is_group *group,
|
|
struct fimc_is_frame *frame,
|
|
u32 fcount,
|
|
enum fimc_is_device_type type);
|
|
int fimc_is_devicemgr_shot_done(struct fimc_is_group *group,
|
|
struct fimc_is_frame *ldr_frame,
|
|
u32 status);
|
|
#ifdef SUPPORT_REMOSAIC_CROP_ZOOM
|
|
void fimc_is_devicemgr_sensor_mode_change(struct fimc_is_group *group,
|
|
struct fimc_is_frame *frame);
|
|
#endif
|
|
#endif
|