162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2022 Amarula Solutions(India) 462306a36Sopenharmony_ci * Author: Jagan Teki <jagan@amarulasolutions.com> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef __SAMSUNG_DSIM__ 862306a36Sopenharmony_ci#define __SAMSUNG_DSIM__ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/gpio/consumer.h> 1162306a36Sopenharmony_ci#include <linux/regulator/consumer.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <drm/drm_atomic_helper.h> 1462306a36Sopenharmony_ci#include <drm/drm_of.h> 1562306a36Sopenharmony_ci#include <drm/drm_mipi_dsi.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistruct samsung_dsim; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define DSIM_STATE_ENABLED BIT(0) 2062306a36Sopenharmony_ci#define DSIM_STATE_INITIALIZED BIT(1) 2162306a36Sopenharmony_ci#define DSIM_STATE_CMD_LPM BIT(2) 2262306a36Sopenharmony_ci#define DSIM_STATE_VIDOUT_AVAILABLE BIT(3) 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cienum samsung_dsim_type { 2562306a36Sopenharmony_ci DSIM_TYPE_EXYNOS3250, 2662306a36Sopenharmony_ci DSIM_TYPE_EXYNOS4210, 2762306a36Sopenharmony_ci DSIM_TYPE_EXYNOS5410, 2862306a36Sopenharmony_ci DSIM_TYPE_EXYNOS5422, 2962306a36Sopenharmony_ci DSIM_TYPE_EXYNOS5433, 3062306a36Sopenharmony_ci DSIM_TYPE_IMX8MM, 3162306a36Sopenharmony_ci DSIM_TYPE_IMX8MP, 3262306a36Sopenharmony_ci DSIM_TYPE_COUNT, 3362306a36Sopenharmony_ci}; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define samsung_dsim_hw_is_exynos(hw) \ 3662306a36Sopenharmony_ci ((hw) >= DSIM_TYPE_EXYNOS3250 && (hw) <= DSIM_TYPE_EXYNOS5433) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct samsung_dsim_transfer { 3962306a36Sopenharmony_ci struct list_head list; 4062306a36Sopenharmony_ci struct completion completed; 4162306a36Sopenharmony_ci int result; 4262306a36Sopenharmony_ci struct mipi_dsi_packet packet; 4362306a36Sopenharmony_ci u16 flags; 4462306a36Sopenharmony_ci u16 tx_done; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci u8 *rx_payload; 4762306a36Sopenharmony_ci u16 rx_len; 4862306a36Sopenharmony_ci u16 rx_done; 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistruct samsung_dsim_driver_data { 5262306a36Sopenharmony_ci const unsigned int *reg_ofs; 5362306a36Sopenharmony_ci unsigned int plltmr_reg; 5462306a36Sopenharmony_ci unsigned int has_freqband:1; 5562306a36Sopenharmony_ci unsigned int has_clklane_stop:1; 5662306a36Sopenharmony_ci unsigned int has_broken_fifoctrl_emptyhdr:1; 5762306a36Sopenharmony_ci unsigned int num_clks; 5862306a36Sopenharmony_ci unsigned int min_freq; 5962306a36Sopenharmony_ci unsigned int max_freq; 6062306a36Sopenharmony_ci unsigned int wait_for_reset; 6162306a36Sopenharmony_ci unsigned int num_bits_resol; 6262306a36Sopenharmony_ci unsigned int pll_p_offset; 6362306a36Sopenharmony_ci const unsigned int *reg_values; 6462306a36Sopenharmony_ci u16 m_min; 6562306a36Sopenharmony_ci u16 m_max; 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistruct samsung_dsim_host_ops { 6962306a36Sopenharmony_ci int (*register_host)(struct samsung_dsim *dsim); 7062306a36Sopenharmony_ci void (*unregister_host)(struct samsung_dsim *dsim); 7162306a36Sopenharmony_ci int (*attach)(struct samsung_dsim *dsim, struct mipi_dsi_device *device); 7262306a36Sopenharmony_ci void (*detach)(struct samsung_dsim *dsim, struct mipi_dsi_device *device); 7362306a36Sopenharmony_ci irqreturn_t (*te_irq_handler)(struct samsung_dsim *dsim); 7462306a36Sopenharmony_ci}; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistruct samsung_dsim_plat_data { 7762306a36Sopenharmony_ci enum samsung_dsim_type hw_type; 7862306a36Sopenharmony_ci const struct samsung_dsim_host_ops *host_ops; 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistruct samsung_dsim { 8262306a36Sopenharmony_ci struct mipi_dsi_host dsi_host; 8362306a36Sopenharmony_ci struct drm_bridge bridge; 8462306a36Sopenharmony_ci struct drm_bridge *out_bridge; 8562306a36Sopenharmony_ci struct device *dev; 8662306a36Sopenharmony_ci struct drm_display_mode mode; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci void __iomem *reg_base; 8962306a36Sopenharmony_ci struct phy *phy; 9062306a36Sopenharmony_ci struct clk **clks; 9162306a36Sopenharmony_ci struct regulator_bulk_data supplies[2]; 9262306a36Sopenharmony_ci int irq; 9362306a36Sopenharmony_ci struct gpio_desc *te_gpio; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci u32 pll_clk_rate; 9662306a36Sopenharmony_ci u32 burst_clk_rate; 9762306a36Sopenharmony_ci u32 hs_clock; 9862306a36Sopenharmony_ci u32 esc_clk_rate; 9962306a36Sopenharmony_ci u32 lanes; 10062306a36Sopenharmony_ci u32 mode_flags; 10162306a36Sopenharmony_ci u32 format; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci bool swap_dn_dp_clk; 10462306a36Sopenharmony_ci bool swap_dn_dp_data; 10562306a36Sopenharmony_ci int state; 10662306a36Sopenharmony_ci struct drm_property *brightness; 10762306a36Sopenharmony_ci struct completion completed; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci spinlock_t transfer_lock; /* protects transfer_list */ 11062306a36Sopenharmony_ci struct list_head transfer_list; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci const struct samsung_dsim_driver_data *driver_data; 11362306a36Sopenharmony_ci const struct samsung_dsim_plat_data *plat_data; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci void *priv; 11662306a36Sopenharmony_ci}; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ciextern int samsung_dsim_probe(struct platform_device *pdev); 11962306a36Sopenharmony_ciextern int samsung_dsim_remove(struct platform_device *pdev); 12062306a36Sopenharmony_ciextern const struct dev_pm_ops samsung_dsim_pm_ops; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci#endif /* __SAMSUNG_DSIM__ */ 123