162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) STMicroelectronics SA 2017
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Authors: Philippe Cornu <philippe.cornu@st.com>
662306a36Sopenharmony_ci *          Yannick Fertre <yannick.fertre@st.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef __DW_MIPI_DSI__
1062306a36Sopenharmony_ci#define __DW_MIPI_DSI__
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/types.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <drm/drm_modes.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistruct drm_display_mode;
1762306a36Sopenharmony_cistruct drm_encoder;
1862306a36Sopenharmony_cistruct dw_mipi_dsi;
1962306a36Sopenharmony_cistruct mipi_dsi_device;
2062306a36Sopenharmony_cistruct platform_device;
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct dw_mipi_dsi_dphy_timing {
2362306a36Sopenharmony_ci	u16 data_hs2lp;
2462306a36Sopenharmony_ci	u16 data_lp2hs;
2562306a36Sopenharmony_ci	u16 clk_hs2lp;
2662306a36Sopenharmony_ci	u16 clk_lp2hs;
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistruct dw_mipi_dsi_phy_ops {
3062306a36Sopenharmony_ci	int (*init)(void *priv_data);
3162306a36Sopenharmony_ci	void (*power_on)(void *priv_data);
3262306a36Sopenharmony_ci	void (*power_off)(void *priv_data);
3362306a36Sopenharmony_ci	int (*get_lane_mbps)(void *priv_data,
3462306a36Sopenharmony_ci			     const struct drm_display_mode *mode,
3562306a36Sopenharmony_ci			     unsigned long mode_flags, u32 lanes, u32 format,
3662306a36Sopenharmony_ci			     unsigned int *lane_mbps);
3762306a36Sopenharmony_ci	int (*get_timing)(void *priv_data, unsigned int lane_mbps,
3862306a36Sopenharmony_ci			  struct dw_mipi_dsi_dphy_timing *timing);
3962306a36Sopenharmony_ci	int (*get_esc_clk_rate)(void *priv_data, unsigned int *esc_clk_rate);
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct dw_mipi_dsi_host_ops {
4362306a36Sopenharmony_ci	int (*attach)(void *priv_data,
4462306a36Sopenharmony_ci		      struct mipi_dsi_device *dsi);
4562306a36Sopenharmony_ci	int (*detach)(void *priv_data,
4662306a36Sopenharmony_ci		      struct mipi_dsi_device *dsi);
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistruct dw_mipi_dsi_plat_data {
5062306a36Sopenharmony_ci	void __iomem *base;
5162306a36Sopenharmony_ci	unsigned int max_data_lanes;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	enum drm_mode_status (*mode_valid)(void *priv_data,
5462306a36Sopenharmony_ci					   const struct drm_display_mode *mode,
5562306a36Sopenharmony_ci					   unsigned long mode_flags,
5662306a36Sopenharmony_ci					   u32 lanes, u32 format);
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	const struct dw_mipi_dsi_phy_ops *phy_ops;
5962306a36Sopenharmony_ci	const struct dw_mipi_dsi_host_ops *host_ops;
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	void *priv_data;
6262306a36Sopenharmony_ci};
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistruct dw_mipi_dsi *dw_mipi_dsi_probe(struct platform_device *pdev,
6562306a36Sopenharmony_ci				      const struct dw_mipi_dsi_plat_data
6662306a36Sopenharmony_ci				      *plat_data);
6762306a36Sopenharmony_civoid dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi);
6862306a36Sopenharmony_ciint dw_mipi_dsi_bind(struct dw_mipi_dsi *dsi, struct drm_encoder *encoder);
6962306a36Sopenharmony_civoid dw_mipi_dsi_unbind(struct dw_mipi_dsi *dsi);
7062306a36Sopenharmony_civoid dw_mipi_dsi_set_slave(struct dw_mipi_dsi *dsi, struct dw_mipi_dsi *slave);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#endif /* __DW_MIPI_DSI__ */
73