1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Support for Intel Camera Imaging ISP subsystem.
4  * Copyright (c) 2010 - 2015, Intel Corporation.
5  */
6 
7 #include "input_system.h"
8 
9 #include "ia_css_isys.h"
10 #include "platform_support.h"
11 
12 #include "isys_dma_public.h"	/* isys2401_dma_set_max_burst_size() */
13 #include "isys_irq.h"
14 
ia_css_isys_2400_init(void)15 static input_system_err_t ia_css_isys_2400_init(void)
16 {
17 	backend_channel_cfg_t backend_ch0;
18 	backend_channel_cfg_t backend_ch1;
19 	target_cfg2400_t targetB;
20 	target_cfg2400_t targetC;
21 	u32 acq_mem_region_size = 24;
22 	u32 acq_nof_mem_regions = 2;
23 	input_system_err_t error = INPUT_SYSTEM_ERR_NO_ERROR;
24 
25 	memset(&backend_ch0, 0, sizeof(backend_channel_cfg_t));
26 	memset(&backend_ch1, 0, sizeof(backend_channel_cfg_t));
27 	memset(&targetB, 0, sizeof(targetB));
28 	memset(&targetC, 0, sizeof(targetC));
29 
30 	error = input_system_configuration_reset();
31 	if (error != INPUT_SYSTEM_ERR_NO_ERROR)
32 		return error;
33 
34 	error = input_system_csi_xmem_channel_cfg(
35 		    0,			/*ch_id                 */
36 		    INPUT_SYSTEM_PORT_A,	/*port                  */
37 		    backend_ch0,		/*backend_ch            */
38 		    32,			/*mem_region_size       */
39 		    6,			/*nof_mem_regions       */
40 		    acq_mem_region_size,	/*acq_mem_region_size   */
41 		    acq_nof_mem_regions,	/*acq_nof_mem_regions   */
42 		    targetB,		/*target                */
43 		    3);			/*nof_xmem_buffers      */
44 	if (error != INPUT_SYSTEM_ERR_NO_ERROR)
45 		return error;
46 
47 	error = input_system_csi_xmem_channel_cfg(
48 		    1,			/*ch_id                 */
49 		    INPUT_SYSTEM_PORT_B,	/*port                  */
50 		    backend_ch0,		/*backend_ch            */
51 		    16,			/*mem_region_size       */
52 		    3,			/*nof_mem_regions       */
53 		    acq_mem_region_size,	/*acq_mem_region_size   */
54 		    acq_nof_mem_regions,	/*acq_nof_mem_regions   */
55 		    targetB,		/*target                */
56 		    3);			/*nof_xmem_buffers      */
57 	if (error != INPUT_SYSTEM_ERR_NO_ERROR)
58 		return error;
59 
60 	error = input_system_csi_xmem_channel_cfg(
61 		    2,			/*ch_id                 */
62 		    INPUT_SYSTEM_PORT_C,	/*port                  */
63 		    backend_ch1,		/*backend_ch            */
64 		    32,			/*mem_region_size       */
65 		    3,			/*nof_mem_regions       */
66 		    acq_mem_region_size,	/*acq_mem_region_size   */
67 		    acq_nof_mem_regions,	/*acq_nof_mem_regions   */
68 		    targetC,		/*target                */
69 		    2);			/*nof_xmem_buffers      */
70 	if (error != INPUT_SYSTEM_ERR_NO_ERROR)
71 		return error;
72 
73 	error = input_system_configuration_commit();
74 
75 	return error;
76 }
77 
ia_css_isys_2401_init(void)78 static input_system_err_t ia_css_isys_2401_init(void)
79 {
80 	ia_css_isys_csi_rx_lut_rmgr_init();
81 	ia_css_isys_ibuf_rmgr_init();
82 	ia_css_isys_dma_channel_rmgr_init();
83 	ia_css_isys_stream2mmio_sid_rmgr_init();
84 
85 	isys2401_dma_set_max_burst_size(ISYS2401_DMA0_ID,
86 					1 /* Non Burst DMA transactions */);
87 
88 	/* Enable 2401 input system IRQ status for driver to retrieve */
89 	isys_irqc_status_enable(ISYS_IRQ0_ID);
90 	isys_irqc_status_enable(ISYS_IRQ1_ID);
91 	isys_irqc_status_enable(ISYS_IRQ2_ID);
92 
93 	return INPUT_SYSTEM_ERR_NO_ERROR;
94 }
95 
ia_css_isys_init(void)96 input_system_err_t ia_css_isys_init(void)
97 {
98 	if (IS_ISP2401)
99 		return ia_css_isys_2401_init();
100 
101 	return ia_css_isys_2400_init();
102 }
103 
ia_css_isys_uninit(void)104 void ia_css_isys_uninit(void)
105 {
106 	if (IS_ISP2401) {
107 		ia_css_isys_csi_rx_lut_rmgr_uninit();
108 		ia_css_isys_ibuf_rmgr_uninit();
109 		ia_css_isys_dma_channel_rmgr_uninit();
110 		ia_css_isys_stream2mmio_sid_rmgr_uninit();
111 	}
112 }
113