summaryrefslogtreecommitdiff
path: root/drivers/media/sprd_sensor/csi2/csi_api.h
blob: b49bee7a97f535e1a9c4c2d811adcacb27e3fd4f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
 * csi_driver
 * 12/05/2010
 * Synopsys Inc. PT02
 */

#ifndef CSI_API_H_
#define CSI_API_H_

#include "csi_types.h"
#include "csi_driver.h"
#include <linux/spinlock.h>

#define SPRD_CSI2_REG_SIZE             0x40

typedef int (*csi2_isr_func)(u32 err_id, u32 err_status, void* u_data);

/* enumerators index the handler array rather than masks */
typedef enum
{
    ERR_PHY_TX_START = 0,
    ERR_FRAME_BOUNDARY_MATCH = 4,
    ERR_FRAME_SEQUENCE = 8,
    ERR_CRC_DURING_FRAME = 12,
    ERR_LINE_CRC = 16,
    ERR_DOUBLE_ECC = 20,
    ERR_PHY_ESCAPE_ENTRY = 21,
    ERR_ECC_SINGLE = 25,
    ERR_UNSUPPORTED_DATA_TYPE = 29,
    MAX_EVENT = 49
} csi_event_t;
typedef enum
{
    ERR_LINE_BOUNDARY_MATCH = 33,
    ERR_LINE_SEQUENCE = 41
} csi_line_event_t;
typedef enum
{
    ERROR_VC_LANE_OUT_OF_BOUND =    0xCA,
    ERROR_EVENT_TYPE_INVALID = 0xC9,
    ERROR_DATA_TYPE_INVALID = 0xC8,
    ERROR_SLOTS_FULL = 0xC7,
    ERROR_ALREADY_REGISTERED = 0xC6,
    ERROR_NOT_REGISTERED = 0xC5
} csi_api_error_t;

struct csi_context {
	u32                g_csi2_irq;
	csi2_isr_func      isr_cb;
	void              *u_data;
	spinlock_t         csi2_lock;
	handler_t          csi_api_event_registry[MAX_EVENT];
};

int csi_api_malloc(void **handle);
void csi_api_free(void *handle);
u8 csi_api_init(u32 bps_per_lane, u32 phy_id);
u8 csi_api_start(void *handle);
//u8 csi_api_start(u32 base_address);
u8 csi_api_close(void *handle, u32 phy_id);
u8 csi_api_set_on_lanes(u8 no_of_lanes);
u8 csi_api_get_on_lanes(void);
csi_lane_state_t csi_api_get_clk_state(void);
csi_lane_state_t csi_api_get_lane_state(u8 lane);
u8 csi_api_register_line_event(void *handle, u8 vc, csi_data_type_t data_type, csi_line_event_t line_event, handler_t handler);
u8 csi_api_unregister_line_event(void *handle, u8 vc, csi_data_type_t data_type, csi_line_event_t line_event);
u8 csi_api_register_event(void *handle, csi_event_t event, u8 vc_lane, handler_t handler);
u8 csi_api_unregister_event(void *handle, csi_event_t event, u8 vc_lane);
u8 csi_api_unregister_all_events(void *handle);
u8 csi_api_shut_down_phy(u8 shutdown);
u8 csi_api_reset_phy(void);
u8 csi_api_reset_controller(void);
u8 csi_api_core_write(csi_registers_t address, u32 data);
u32 csi_api_core_read(csi_registers_t address);
int csi_reg_isr(void *handle, csi2_isr_func user_func, void* user_data);
int csi_read_registers(uint32_t* reg_buf, uint32_t *buf_len);

#endif /* CSI_API_H_ */