1e7447128SJagan Teki /* SPDX-License-Identifier: GPL-2.0+ */ 2e7447128SJagan Teki /* 3e7447128SJagan Teki * Copyright (C) 2022 Amarula Solutions(India) 4e7447128SJagan Teki * Author: Jagan Teki <jagan@amarulasolutions.com> 5e7447128SJagan Teki */ 6e7447128SJagan Teki 7e7447128SJagan Teki #ifndef __SAMSUNG_DSIM__ 8e7447128SJagan Teki #define __SAMSUNG_DSIM__ 9e7447128SJagan Teki 10e7447128SJagan Teki #include <linux/gpio/consumer.h> 11e7447128SJagan Teki #include <linux/regulator/consumer.h> 12e7447128SJagan Teki 13e7447128SJagan Teki #include <drm/drm_atomic_helper.h> 14e7447128SJagan Teki #include <drm/drm_of.h> 15e7447128SJagan Teki #include <drm/drm_mipi_dsi.h> 16e7447128SJagan Teki 17e7447128SJagan Teki struct samsung_dsim; 18e7447128SJagan Teki 19e7447128SJagan Teki #define DSIM_STATE_ENABLED BIT(0) 20e7447128SJagan Teki #define DSIM_STATE_INITIALIZED BIT(1) 21e7447128SJagan Teki #define DSIM_STATE_CMD_LPM BIT(2) 22e7447128SJagan Teki #define DSIM_STATE_VIDOUT_AVAILABLE BIT(3) 23e7447128SJagan Teki 24e7447128SJagan Teki enum samsung_dsim_type { 25e7447128SJagan Teki DSIM_TYPE_EXYNOS3250, 26e7447128SJagan Teki DSIM_TYPE_EXYNOS4210, 27e7447128SJagan Teki DSIM_TYPE_EXYNOS5410, 28e7447128SJagan Teki DSIM_TYPE_EXYNOS5422, 29e7447128SJagan Teki DSIM_TYPE_EXYNOS5433, 30e7447128SJagan Teki DSIM_TYPE_IMX8MM, 31b2cfec52SMarek Vasut DSIM_TYPE_IMX8MP, 32e7447128SJagan Teki DSIM_TYPE_COUNT, 33e7447128SJagan Teki }; 34e7447128SJagan Teki 35e7447128SJagan Teki #define samsung_dsim_hw_is_exynos(hw) \ 36e7447128SJagan Teki ((hw) >= DSIM_TYPE_EXYNOS3250 && (hw) <= DSIM_TYPE_EXYNOS5433) 37e7447128SJagan Teki 38e7447128SJagan Teki struct samsung_dsim_transfer { 39e7447128SJagan Teki struct list_head list; 40e7447128SJagan Teki struct completion completed; 41e7447128SJagan Teki int result; 42e7447128SJagan Teki struct mipi_dsi_packet packet; 43e7447128SJagan Teki u16 flags; 44e7447128SJagan Teki u16 tx_done; 45e7447128SJagan Teki 46e7447128SJagan Teki u8 *rx_payload; 47e7447128SJagan Teki u16 rx_len; 48e7447128SJagan Teki u16 rx_done; 49e7447128SJagan Teki }; 50e7447128SJagan Teki 51e7447128SJagan Teki struct samsung_dsim_driver_data { 52e7447128SJagan Teki const unsigned int *reg_ofs; 53e7447128SJagan Teki unsigned int plltmr_reg; 54e7447128SJagan Teki unsigned int has_freqband:1; 55e7447128SJagan Teki unsigned int has_clklane_stop:1; 56*2f56a02eSMarek Szyprowski unsigned int has_broken_fifoctrl_emptyhdr:1; 57e7447128SJagan Teki unsigned int num_clks; 5854f1a83cSAdam Ford unsigned int min_freq; 59e7447128SJagan Teki unsigned int max_freq; 60e7447128SJagan Teki unsigned int wait_for_reset; 61e7447128SJagan Teki unsigned int num_bits_resol; 62e7447128SJagan Teki unsigned int pll_p_offset; 63e7447128SJagan Teki const unsigned int *reg_values; 6454f1a83cSAdam Ford u16 m_min; 6554f1a83cSAdam Ford u16 m_max; 66e7447128SJagan Teki }; 67e7447128SJagan Teki 68e7447128SJagan Teki struct samsung_dsim_host_ops { 69e7447128SJagan Teki int (*register_host)(struct samsung_dsim *dsim); 70e7447128SJagan Teki void (*unregister_host)(struct samsung_dsim *dsim); 71e7447128SJagan Teki int (*attach)(struct samsung_dsim *dsim, struct mipi_dsi_device *device); 72e7447128SJagan Teki void (*detach)(struct samsung_dsim *dsim, struct mipi_dsi_device *device); 73e7447128SJagan Teki irqreturn_t (*te_irq_handler)(struct samsung_dsim *dsim); 74e7447128SJagan Teki }; 75e7447128SJagan Teki 76e7447128SJagan Teki struct samsung_dsim_plat_data { 77e7447128SJagan Teki enum samsung_dsim_type hw_type; 78e7447128SJagan Teki const struct samsung_dsim_host_ops *host_ops; 79e7447128SJagan Teki }; 80e7447128SJagan Teki 81e7447128SJagan Teki struct samsung_dsim { 82e7447128SJagan Teki struct mipi_dsi_host dsi_host; 83e7447128SJagan Teki struct drm_bridge bridge; 84e7447128SJagan Teki struct drm_bridge *out_bridge; 85e7447128SJagan Teki struct device *dev; 86e7447128SJagan Teki struct drm_display_mode mode; 87e7447128SJagan Teki 88e7447128SJagan Teki void __iomem *reg_base; 89e7447128SJagan Teki struct phy *phy; 90e7447128SJagan Teki struct clk **clks; 91e7447128SJagan Teki struct regulator_bulk_data supplies[2]; 92e7447128SJagan Teki int irq; 93e7447128SJagan Teki struct gpio_desc *te_gpio; 94e7447128SJagan Teki 95e7447128SJagan Teki u32 pll_clk_rate; 96e7447128SJagan Teki u32 burst_clk_rate; 9789691775SAdam Ford u32 hs_clock; 98e7447128SJagan Teki u32 esc_clk_rate; 99e7447128SJagan Teki u32 lanes; 100e7447128SJagan Teki u32 mode_flags; 101e7447128SJagan Teki u32 format; 102e7447128SJagan Teki 10374629c49SMarek Vasut bool swap_dn_dp_clk; 10474629c49SMarek Vasut bool swap_dn_dp_data; 105e7447128SJagan Teki int state; 106e7447128SJagan Teki struct drm_property *brightness; 107e7447128SJagan Teki struct completion completed; 108e7447128SJagan Teki 109e7447128SJagan Teki spinlock_t transfer_lock; /* protects transfer_list */ 110e7447128SJagan Teki struct list_head transfer_list; 111e7447128SJagan Teki 112e7447128SJagan Teki const struct samsung_dsim_driver_data *driver_data; 113e7447128SJagan Teki const struct samsung_dsim_plat_data *plat_data; 114e7447128SJagan Teki 115e7447128SJagan Teki void *priv; 116e7447128SJagan Teki }; 117e7447128SJagan Teki 118e7447128SJagan Teki extern int samsung_dsim_probe(struct platform_device *pdev); 119e7447128SJagan Teki extern int samsung_dsim_remove(struct platform_device *pdev); 120e7447128SJagan Teki extern const struct dev_pm_ops samsung_dsim_pm_ops; 121e7447128SJagan Teki 122e7447128SJagan Teki #endif /* __SAMSUNG_DSIM__ */ 123