1f5fbb83fSMauro Carvalho Chehab /* SPDX-License-Identifier: GPL-2.0 */
29d4fa1a1SMauro Carvalho Chehab /*
39d4fa1a1SMauro Carvalho Chehab  * Support for Intel Camera Imaging ISP subsystem.
49d4fa1a1SMauro Carvalho Chehab  * Copyright (c) 2015, Intel Corporation.
59d4fa1a1SMauro Carvalho Chehab  *
69d4fa1a1SMauro Carvalho Chehab  * This program is free software; you can redistribute it and/or modify it
79d4fa1a1SMauro Carvalho Chehab  * under the terms and conditions of the GNU General Public License,
89d4fa1a1SMauro Carvalho Chehab  * version 2, as published by the Free Software Foundation.
99d4fa1a1SMauro Carvalho Chehab  *
109d4fa1a1SMauro Carvalho Chehab  * This program is distributed in the hope it will be useful, but WITHOUT
119d4fa1a1SMauro Carvalho Chehab  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
129d4fa1a1SMauro Carvalho Chehab  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
139d4fa1a1SMauro Carvalho Chehab  * more details.
149d4fa1a1SMauro Carvalho Chehab  */
159d4fa1a1SMauro Carvalho Chehab 
169d4fa1a1SMauro Carvalho Chehab #ifndef __IA_CSS_IRQ_H
179d4fa1a1SMauro Carvalho Chehab #define __IA_CSS_IRQ_H
189d4fa1a1SMauro Carvalho Chehab 
199d4fa1a1SMauro Carvalho Chehab /* @file
209d4fa1a1SMauro Carvalho Chehab  * This file contains information for Interrupts/IRQs from CSS
219d4fa1a1SMauro Carvalho Chehab  */
229d4fa1a1SMauro Carvalho Chehab 
239d4fa1a1SMauro Carvalho Chehab #include "ia_css_err.h"
249d4fa1a1SMauro Carvalho Chehab #include "ia_css_pipe_public.h"
259d4fa1a1SMauro Carvalho Chehab #include "ia_css_input_port.h"
26*64288aa9SMoses Christopher Bollavarapu #include <linux/bits.h>
279d4fa1a1SMauro Carvalho Chehab 
289d4fa1a1SMauro Carvalho Chehab /* Interrupt types, these enumerate all supported interrupt types.
299d4fa1a1SMauro Carvalho Chehab  */
309d4fa1a1SMauro Carvalho Chehab enum ia_css_irq_type {
319d4fa1a1SMauro Carvalho Chehab 	IA_CSS_IRQ_TYPE_EDGE,  /** Edge (level) sensitive interrupt */
329d4fa1a1SMauro Carvalho Chehab 	IA_CSS_IRQ_TYPE_PULSE  /** Pulse-shaped interrupt */
339d4fa1a1SMauro Carvalho Chehab };
349d4fa1a1SMauro Carvalho Chehab 
359d4fa1a1SMauro Carvalho Chehab /* Interrupt request type.
369d4fa1a1SMauro Carvalho Chehab  *  When the CSS hardware generates an interrupt, a function in this API
379d4fa1a1SMauro Carvalho Chehab  *  needs to be called to retrieve information about the interrupt.
389d4fa1a1SMauro Carvalho Chehab  *  This interrupt type is part of this information and indicates what
399d4fa1a1SMauro Carvalho Chehab  *  type of information the interrupt signals.
409d4fa1a1SMauro Carvalho Chehab  *
419d4fa1a1SMauro Carvalho Chehab  *  Note that one interrupt can carry multiple interrupt types. For
429d4fa1a1SMauro Carvalho Chehab  *  example: the online video ISP will generate only 2 interrupts, one to
439d4fa1a1SMauro Carvalho Chehab  *  signal that the statistics (3a and DIS) are ready and one to signal
449d4fa1a1SMauro Carvalho Chehab  *  that all output frames are done (output and viewfinder).
459d4fa1a1SMauro Carvalho Chehab  *
469d4fa1a1SMauro Carvalho Chehab  * DEPRECATED, this interface is not portable it should only define user
479d4fa1a1SMauro Carvalho Chehab  * (SW) interrupts
489d4fa1a1SMauro Carvalho Chehab  */
499d4fa1a1SMauro Carvalho Chehab enum ia_css_irq_info {
50*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_CSS_RECEIVER_ERROR            = BIT(0),
519d4fa1a1SMauro Carvalho Chehab 	/** the css receiver has encountered an error */
52*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_CSS_RECEIVER_FIFO_OVERFLOW    = BIT(1),
539d4fa1a1SMauro Carvalho Chehab 	/** the FIFO in the csi receiver has overflown */
54*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_CSS_RECEIVER_SOF              = BIT(2),
559d4fa1a1SMauro Carvalho Chehab 	/** the css receiver received the start of frame */
56*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_CSS_RECEIVER_EOF              = BIT(3),
579d4fa1a1SMauro Carvalho Chehab 	/** the css receiver received the end of frame */
58*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_CSS_RECEIVER_SOL              = BIT(4),
599d4fa1a1SMauro Carvalho Chehab 	/** the css receiver received the start of line */
60*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_EVENTS_READY                  = BIT(5),
619d4fa1a1SMauro Carvalho Chehab 	/** One or more events are available in the PSYS event queue */
62*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_CSS_RECEIVER_EOL              = BIT(6),
639d4fa1a1SMauro Carvalho Chehab 	/** the css receiver received the end of line */
64*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_CSS_RECEIVER_SIDEBAND_CHANGED = BIT(7),
659d4fa1a1SMauro Carvalho Chehab 	/** the css receiver received a change in side band signals */
66*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_CSS_RECEIVER_GEN_SHORT_0      = BIT(8),
679d4fa1a1SMauro Carvalho Chehab 	/** generic short packets (0) */
68*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_CSS_RECEIVER_GEN_SHORT_1      = BIT(9),
699d4fa1a1SMauro Carvalho Chehab 	/** generic short packets (1) */
70*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_IF_PRIM_ERROR                 = BIT(10),
719d4fa1a1SMauro Carvalho Chehab 	/** the primary input formatter (A) has encountered an error */
72*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_IF_PRIM_B_ERROR               = BIT(11),
739d4fa1a1SMauro Carvalho Chehab 	/** the primary input formatter (B) has encountered an error */
74*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_IF_SEC_ERROR                  = BIT(12),
759d4fa1a1SMauro Carvalho Chehab 	/** the secondary input formatter has encountered an error */
76*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_STREAM_TO_MEM_ERROR           = BIT(13),
779d4fa1a1SMauro Carvalho Chehab 	/** the stream-to-memory device has encountered an error */
78*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_SW_0                          = BIT(14),
799d4fa1a1SMauro Carvalho Chehab 	/** software interrupt 0 */
80*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_SW_1                          = BIT(15),
819d4fa1a1SMauro Carvalho Chehab 	/** software interrupt 1 */
82*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_SW_2                          = BIT(16),
839d4fa1a1SMauro Carvalho Chehab 	/** software interrupt 2 */
84*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_ISP_BINARY_STATISTICS_READY   = BIT(17),
859d4fa1a1SMauro Carvalho Chehab 	/** ISP binary statistics are ready */
86*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_INPUT_SYSTEM_ERROR            = BIT(18),
879d4fa1a1SMauro Carvalho Chehab 	/** the input system in in error */
88*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_IF_ERROR                      = BIT(19),
899d4fa1a1SMauro Carvalho Chehab 	/** the input formatter in in error */
90*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_DMA_ERROR                     = BIT(20),
919d4fa1a1SMauro Carvalho Chehab 	/** the dma in in error */
92*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_IRQ_INFO_ISYS_EVENTS_READY             = BIT(21),
939d4fa1a1SMauro Carvalho Chehab 	/** end-of-frame events are ready in the isys_event queue */
949d4fa1a1SMauro Carvalho Chehab };
959d4fa1a1SMauro Carvalho Chehab 
969d4fa1a1SMauro Carvalho Chehab /* CSS receiver error types. Whenever the CSS receiver has encountered
979d4fa1a1SMauro Carvalho Chehab  *  an error, this enumeration is used to indicate which errors have occurred.
989d4fa1a1SMauro Carvalho Chehab  *
999d4fa1a1SMauro Carvalho Chehab  *  Note that multiple error flags can be enabled at once and that this is in
1009d4fa1a1SMauro Carvalho Chehab  *  fact common (whenever an error occurs, it usually results in multiple
1019d4fa1a1SMauro Carvalho Chehab  *  errors).
1029d4fa1a1SMauro Carvalho Chehab  *
1039d4fa1a1SMauro Carvalho Chehab  * DEPRECATED: This interface is not portable, different systems have
1049d4fa1a1SMauro Carvalho Chehab  * different receiver types, or possibly none in case of tests systems.
1059d4fa1a1SMauro Carvalho Chehab  */
1069d4fa1a1SMauro Carvalho Chehab enum ia_css_rx_irq_info {
107*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_BUFFER_OVERRUN   = BIT(0),  /** buffer overrun */
108*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_ENTER_SLEEP_MODE = BIT(1),  /** entering sleep mode */
109*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_EXIT_SLEEP_MODE  = BIT(2),  /** exited sleep mode */
110*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_ECC_CORRECTED    = BIT(3),  /** ECC corrected */
111*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_ERR_SOT          = BIT(4),
1129d4fa1a1SMauro Carvalho Chehab 	/** Start of transmission */
113*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_ERR_SOT_SYNC     = BIT(5),  /** SOT sync (??) */
114*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_ERR_CONTROL      = BIT(6),  /** Control (??) */
115*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_ERR_ECC_DOUBLE   = BIT(7),  /** Double ECC */
116*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_ERR_CRC          = BIT(8),  /** CRC error */
117*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_ERR_UNKNOWN_ID   = BIT(9),  /** Unknown ID */
118*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_ERR_FRAME_SYNC   = BIT(10), /** Frame sync error */
119*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_ERR_FRAME_DATA   = BIT(11), /** Frame data error */
120*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_ERR_DATA_TIMEOUT = BIT(12), /** Timeout occurred */
121*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_ERR_UNKNOWN_ESC  = BIT(13), /** Unknown escape seq. */
122*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_ERR_LINE_SYNC    = BIT(14), /** Line Sync error */
123*64288aa9SMoses Christopher Bollavarapu 	IA_CSS_RX_IRQ_INFO_INIT_TIMEOUT     = BIT(15),
1249d4fa1a1SMauro Carvalho Chehab };
1259d4fa1a1SMauro Carvalho Chehab 
1269d4fa1a1SMauro Carvalho Chehab /* Interrupt info structure. This structure contains information about an
1279d4fa1a1SMauro Carvalho Chehab  *  interrupt. This needs to be used after an interrupt is received on the IA
1289d4fa1a1SMauro Carvalho Chehab  *  to perform the correct action.
1299d4fa1a1SMauro Carvalho Chehab  */
1309d4fa1a1SMauro Carvalho Chehab struct ia_css_irq {
1319d4fa1a1SMauro Carvalho Chehab 	enum ia_css_irq_info type; /** Interrupt type. */
1329d4fa1a1SMauro Carvalho Chehab 	unsigned int sw_irq_0_val; /** In case of SW interrupt 0, value. */
1339d4fa1a1SMauro Carvalho Chehab 	unsigned int sw_irq_1_val; /** In case of SW interrupt 1, value. */
1349d4fa1a1SMauro Carvalho Chehab 	unsigned int sw_irq_2_val; /** In case of SW interrupt 2, value. */
1359d4fa1a1SMauro Carvalho Chehab 	struct ia_css_pipe *pipe;
1369d4fa1a1SMauro Carvalho Chehab 	/** The image pipe that generated the interrupt. */
1379d4fa1a1SMauro Carvalho Chehab };
1389d4fa1a1SMauro Carvalho Chehab 
1399d4fa1a1SMauro Carvalho Chehab /* @brief Obtain interrupt information.
1409d4fa1a1SMauro Carvalho Chehab  *
1419d4fa1a1SMauro Carvalho Chehab  * @param[out] info	Pointer to the interrupt info. The interrupt
1429d4fa1a1SMauro Carvalho Chehab  *			information wil be written to this info.
1439d4fa1a1SMauro Carvalho Chehab  * @return		If an error is encountered during the interrupt info
1449d4fa1a1SMauro Carvalho Chehab  *			and no interrupt could be translated successfully, this
1459d4fa1a1SMauro Carvalho Chehab  *			will return IA_CSS_INTERNAL_ERROR. Otherwise
14641022d35SMauro Carvalho Chehab  *			0.
1479d4fa1a1SMauro Carvalho Chehab  *
1489d4fa1a1SMauro Carvalho Chehab  * This function is expected to be executed after an interrupt has been sent
1499d4fa1a1SMauro Carvalho Chehab  * to the IA from the CSS. This function returns information about the interrupt
1509d4fa1a1SMauro Carvalho Chehab  * which is needed by the IA code to properly handle the interrupt. This
1519d4fa1a1SMauro Carvalho Chehab  * information includes the image pipe, buffer type etc.
1529d4fa1a1SMauro Carvalho Chehab  */
15341022d35SMauro Carvalho Chehab int
1549d4fa1a1SMauro Carvalho Chehab ia_css_irq_translate(unsigned int *info);
1559d4fa1a1SMauro Carvalho Chehab 
1569d4fa1a1SMauro Carvalho Chehab /* @brief Get CSI receiver error info.
1579d4fa1a1SMauro Carvalho Chehab  *
1589d4fa1a1SMauro Carvalho Chehab  * @param[out] irq_bits	Pointer to the interrupt bits. The interrupt
1599d4fa1a1SMauro Carvalho Chehab  *			bits will be written this info.
1609d4fa1a1SMauro Carvalho Chehab  *			This will be the error bits that are enabled in the CSI
1619d4fa1a1SMauro Carvalho Chehab  *			receiver error register.
1629d4fa1a1SMauro Carvalho Chehab  * @return	None
1639d4fa1a1SMauro Carvalho Chehab  *
1649d4fa1a1SMauro Carvalho Chehab  * This function should be used whenever a CSI receiver error interrupt is
1659d4fa1a1SMauro Carvalho Chehab  * generated. It provides the detailed information (bits) on the exact error
1669d4fa1a1SMauro Carvalho Chehab  * that occurred.
1679d4fa1a1SMauro Carvalho Chehab  *
1689d4fa1a1SMauro Carvalho Chehab  *@deprecated {this function is DEPRECATED since it only works on CSI port 1.
1699d4fa1a1SMauro Carvalho Chehab  * Use the function below instead and specify the appropriate port.}
1709d4fa1a1SMauro Carvalho Chehab  */
1719d4fa1a1SMauro Carvalho Chehab void
1729d4fa1a1SMauro Carvalho Chehab ia_css_rx_get_irq_info(unsigned int *irq_bits);
1739d4fa1a1SMauro Carvalho Chehab 
1749d4fa1a1SMauro Carvalho Chehab /* @brief Get CSI receiver error info.
1759d4fa1a1SMauro Carvalho Chehab  *
1769d4fa1a1SMauro Carvalho Chehab  * @param[in]  port     Input port identifier.
1779d4fa1a1SMauro Carvalho Chehab  * @param[out] irq_bits	Pointer to the interrupt bits. The interrupt
1789d4fa1a1SMauro Carvalho Chehab  *			bits will be written this info.
1799d4fa1a1SMauro Carvalho Chehab  *			This will be the error bits that are enabled in the CSI
1809d4fa1a1SMauro Carvalho Chehab  *			receiver error register.
1819d4fa1a1SMauro Carvalho Chehab  * @return	None
1829d4fa1a1SMauro Carvalho Chehab  *
1839d4fa1a1SMauro Carvalho Chehab  * This function should be used whenever a CSI receiver error interrupt is
1849d4fa1a1SMauro Carvalho Chehab  * generated. It provides the detailed information (bits) on the exact error
1859d4fa1a1SMauro Carvalho Chehab  * that occurred.
1869d4fa1a1SMauro Carvalho Chehab  */
1879d4fa1a1SMauro Carvalho Chehab void
1889d4fa1a1SMauro Carvalho Chehab ia_css_rx_port_get_irq_info(enum mipi_port_id port, unsigned int *irq_bits);
1899d4fa1a1SMauro Carvalho Chehab 
1909d4fa1a1SMauro Carvalho Chehab /* @brief Clear CSI receiver error info.
1919d4fa1a1SMauro Carvalho Chehab  *
1929d4fa1a1SMauro Carvalho Chehab  * @param[in] irq_bits	The bits that should be cleared from the CSI receiver
1939d4fa1a1SMauro Carvalho Chehab  *			interrupt bits register.
1949d4fa1a1SMauro Carvalho Chehab  * @return	None
1959d4fa1a1SMauro Carvalho Chehab  *
1969d4fa1a1SMauro Carvalho Chehab  * This function should be called after ia_css_rx_get_irq_info has been called
1979d4fa1a1SMauro Carvalho Chehab  * and the error bits have been interpreted. It is advised to use the return
1989d4fa1a1SMauro Carvalho Chehab  * value of that function as the argument to this function to make sure no new
1999d4fa1a1SMauro Carvalho Chehab  * error bits get overwritten.
2009d4fa1a1SMauro Carvalho Chehab  *
2019d4fa1a1SMauro Carvalho Chehab  * @deprecated{this function is DEPRECATED since it only works on CSI port 1.
2029d4fa1a1SMauro Carvalho Chehab  * Use the function below instead and specify the appropriate port.}
2039d4fa1a1SMauro Carvalho Chehab  */
2049d4fa1a1SMauro Carvalho Chehab void
2059d4fa1a1SMauro Carvalho Chehab ia_css_rx_clear_irq_info(unsigned int irq_bits);
2069d4fa1a1SMauro Carvalho Chehab 
2079d4fa1a1SMauro Carvalho Chehab /* @brief Clear CSI receiver error info.
2089d4fa1a1SMauro Carvalho Chehab  *
2099d4fa1a1SMauro Carvalho Chehab  * @param[in] port      Input port identifier.
2109d4fa1a1SMauro Carvalho Chehab  * @param[in] irq_bits	The bits that should be cleared from the CSI receiver
2119d4fa1a1SMauro Carvalho Chehab  *			interrupt bits register.
2129d4fa1a1SMauro Carvalho Chehab  * @return	None
2139d4fa1a1SMauro Carvalho Chehab  *
2149d4fa1a1SMauro Carvalho Chehab  * This function should be called after ia_css_rx_get_irq_info has been called
2159d4fa1a1SMauro Carvalho Chehab  * and the error bits have been interpreted. It is advised to use the return
2169d4fa1a1SMauro Carvalho Chehab  * value of that function as the argument to this function to make sure no new
2179d4fa1a1SMauro Carvalho Chehab  * error bits get overwritten.
2189d4fa1a1SMauro Carvalho Chehab  */
2199d4fa1a1SMauro Carvalho Chehab void
2209d4fa1a1SMauro Carvalho Chehab ia_css_rx_port_clear_irq_info(enum mipi_port_id port, unsigned int irq_bits);
2219d4fa1a1SMauro Carvalho Chehab 
2229d4fa1a1SMauro Carvalho Chehab /* @brief Enable or disable specific interrupts.
2239d4fa1a1SMauro Carvalho Chehab  *
2249d4fa1a1SMauro Carvalho Chehab  * @param[in] type	The interrupt type that will be enabled/disabled.
2259d4fa1a1SMauro Carvalho Chehab  * @param[in] enable	enable or disable.
2269d4fa1a1SMauro Carvalho Chehab  * @return		Returns IA_CSS_INTERNAL_ERROR if this interrupt
2279d4fa1a1SMauro Carvalho Chehab  *			type cannot be enabled/disabled which is true for
2289d4fa1a1SMauro Carvalho Chehab  *			CSS internal interrupts. Otherwise returns
22941022d35SMauro Carvalho Chehab  *			0.
2309d4fa1a1SMauro Carvalho Chehab  */
23141022d35SMauro Carvalho Chehab int
2329d4fa1a1SMauro Carvalho Chehab ia_css_irq_enable(enum ia_css_irq_info type, bool enable);
2339d4fa1a1SMauro Carvalho Chehab 
2349d4fa1a1SMauro Carvalho Chehab #endif /* __IA_CSS_IRQ_H */
235