18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) STMicroelectronics SA 2017
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Authors: Philippe Cornu <philippe.cornu@st.com>
68c2ecf20Sopenharmony_ci *          Yannick Fertre <yannick.fertre@st.com>
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifndef __DW_MIPI_DSI__
108c2ecf20Sopenharmony_ci#define __DW_MIPI_DSI__
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/types.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <drm/drm_modes.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_cistruct drm_display_mode;
178c2ecf20Sopenharmony_cistruct drm_encoder;
188c2ecf20Sopenharmony_cistruct dw_mipi_dsi;
198c2ecf20Sopenharmony_cistruct mipi_dsi_device;
208c2ecf20Sopenharmony_cistruct platform_device;
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_cistruct dw_mipi_dsi_dphy_timing {
238c2ecf20Sopenharmony_ci	u16 data_hs2lp;
248c2ecf20Sopenharmony_ci	u16 data_lp2hs;
258c2ecf20Sopenharmony_ci	u16 clk_hs2lp;
268c2ecf20Sopenharmony_ci	u16 clk_lp2hs;
278c2ecf20Sopenharmony_ci};
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_cistruct dw_mipi_dsi_phy_ops {
308c2ecf20Sopenharmony_ci	int (*init)(void *priv_data);
318c2ecf20Sopenharmony_ci	void (*power_on)(void *priv_data);
328c2ecf20Sopenharmony_ci	void (*power_off)(void *priv_data);
338c2ecf20Sopenharmony_ci	int (*get_lane_mbps)(void *priv_data,
348c2ecf20Sopenharmony_ci			     const struct drm_display_mode *mode,
358c2ecf20Sopenharmony_ci			     unsigned long mode_flags, u32 lanes, u32 format,
368c2ecf20Sopenharmony_ci			     unsigned int *lane_mbps);
378c2ecf20Sopenharmony_ci	int (*get_timing)(void *priv_data, unsigned int lane_mbps,
388c2ecf20Sopenharmony_ci			  struct dw_mipi_dsi_dphy_timing *timing);
398c2ecf20Sopenharmony_ci	int (*get_esc_clk_rate)(void *priv_data, unsigned int *esc_clk_rate);
408c2ecf20Sopenharmony_ci};
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_cistruct dw_mipi_dsi_host_ops {
438c2ecf20Sopenharmony_ci	int (*attach)(void *priv_data,
448c2ecf20Sopenharmony_ci		      struct mipi_dsi_device *dsi);
458c2ecf20Sopenharmony_ci	int (*detach)(void *priv_data,
468c2ecf20Sopenharmony_ci		      struct mipi_dsi_device *dsi);
478c2ecf20Sopenharmony_ci};
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_cistruct dw_mipi_dsi_plat_data {
508c2ecf20Sopenharmony_ci	void __iomem *base;
518c2ecf20Sopenharmony_ci	unsigned int max_data_lanes;
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	enum drm_mode_status (*mode_valid)(void *priv_data,
548c2ecf20Sopenharmony_ci					   const struct drm_display_mode *mode);
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	const struct dw_mipi_dsi_phy_ops *phy_ops;
578c2ecf20Sopenharmony_ci	const struct dw_mipi_dsi_host_ops *host_ops;
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci	void *priv_data;
608c2ecf20Sopenharmony_ci};
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_cistruct dw_mipi_dsi *dw_mipi_dsi_probe(struct platform_device *pdev,
638c2ecf20Sopenharmony_ci				      const struct dw_mipi_dsi_plat_data
648c2ecf20Sopenharmony_ci				      *plat_data);
658c2ecf20Sopenharmony_civoid dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi);
668c2ecf20Sopenharmony_ciint dw_mipi_dsi_bind(struct dw_mipi_dsi *dsi, struct drm_encoder *encoder);
678c2ecf20Sopenharmony_civoid dw_mipi_dsi_unbind(struct dw_mipi_dsi *dsi);
688c2ecf20Sopenharmony_civoid dw_mipi_dsi_set_slave(struct dw_mipi_dsi *dsi, struct dw_mipi_dsi *slave);
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci#endif /* __DW_MIPI_DSI__ */
71