1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright: 2017 Cadence Design Systems, Inc.
4 *
5 * Author: Boris Brezillon <boris.brezillon@bootlin.com>
6 */
7
8#ifndef __CDNS_DSI_H__
9#define __CDNS_DSI_H__
10
11#include <drm/drm_bridge.h>
12#include <drm/drm_mipi_dsi.h>
13#include <drm/drm_panel.h>
14
15#include <linux/bits.h>
16#include <linux/completion.h>
17#include <linux/phy/phy.h>
18
19struct clk;
20struct reset_control;
21
22struct cdns_dsi_output {
23	struct mipi_dsi_device *dev;
24	struct drm_panel *panel;
25	struct drm_bridge *bridge;
26	union phy_configure_opts phy_opts;
27};
28
29enum cdns_dsi_input_id {
30	CDNS_SDI_INPUT,
31	CDNS_DPI_INPUT,
32	CDNS_DSC_INPUT,
33};
34
35struct cdns_dsi_cfg {
36	unsigned int hfp;
37	unsigned int hsa;
38	unsigned int hbp;
39	unsigned int hact;
40	unsigned int htotal;
41};
42
43struct cdns_dsi_input {
44	enum cdns_dsi_input_id id;
45	struct drm_bridge bridge;
46};
47
48struct cdns_dsi;
49
50/**
51 * struct cdns_dsi_platform_ops - CDNS DSI Platform operations
52 * @init: Called in the CDNS DSI probe
53 * @deinit: Called in the CDNS DSI remove
54 * @enable: Called at the beginning of CDNS DSI bridge enable
55 * @disable: Called at the end of CDNS DSI bridge disable
56 */
57struct cdns_dsi_platform_ops {
58	int (*init)(struct cdns_dsi *dsi);
59	void (*deinit)(struct cdns_dsi *dsi);
60	void (*enable)(struct cdns_dsi *dsi);
61	void (*disable)(struct cdns_dsi *dsi);
62};
63
64struct cdns_dsi {
65	struct mipi_dsi_host base;
66	void __iomem *regs;
67#ifdef CONFIG_DRM_CDNS_DSI_J721E
68	void __iomem *j721e_regs;
69#endif
70	const struct cdns_dsi_platform_ops *platform_ops;
71	struct cdns_dsi_input input;
72	struct cdns_dsi_output output;
73	unsigned int direct_cmd_fifo_depth;
74	unsigned int rx_fifo_depth;
75	struct completion direct_cmd_comp;
76	struct clk *dsi_p_clk;
77	struct reset_control *dsi_p_rst;
78	struct clk *dsi_sys_clk;
79	bool link_initialized;
80	bool phy_initialized;
81	struct phy *dphy;
82};
83
84#endif /* !__CDNS_DSI_H__ */
85