mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 14:19:16 +00:00
drm: bridge: Generalize Exynos-DSI driver into a Samsung DSIM bridge
Samsung MIPI DSIM controller is common DSI IP that can be used in various SoCs like Exynos, i.MX8M Mini/Nano. In order to access this DSI controller between various platform SoCs, the ideal way to incorporate this in the drm stack is via the drm bridge driver. We already have a consolidated code for supporting component and bridge based DRM drivers, so keep the exynos component based code in existing exynos_drm_dsi.c and move generic bridge code as part of samsung-dsim.c Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> Reviewed-by: Marek Vasut <marex@denx.de> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> Signed-off-by: Inki Dae <inki.dae@samsung.com>
This commit is contained in:
parent
48b64ba81f
commit
e7447128ca
7 changed files with 2083 additions and 2000 deletions
|
@ -6624,6 +6624,15 @@ T: git git://anongit.freedesktop.org/drm/drm-misc
|
||||||
F: Documentation/devicetree/bindings/display/panel/samsung,lms397kf04.yaml
|
F: Documentation/devicetree/bindings/display/panel/samsung,lms397kf04.yaml
|
||||||
F: drivers/gpu/drm/panel/panel-samsung-db7430.c
|
F: drivers/gpu/drm/panel/panel-samsung-db7430.c
|
||||||
|
|
||||||
|
DRM DRIVER FOR SAMSUNG MIPI DSIM BRIDGE
|
||||||
|
M: Inki Dae <inki.dae@samsung.com>
|
||||||
|
M: Jagan Teki <jagan@amarulasolutions.com>
|
||||||
|
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||||
|
S: Maintained
|
||||||
|
T: git git://anongit.freedesktop.org/drm/drm-misc
|
||||||
|
F: drivers/gpu/drm/bridge/samsung-dsim.c
|
||||||
|
F: include/drm/bridge/samsung-dsim.h
|
||||||
|
|
||||||
DRM DRIVER FOR SAMSUNG S6D27A1 PANELS
|
DRM DRIVER FOR SAMSUNG S6D27A1 PANELS
|
||||||
M: Markuss Broks <markuss.broks@gmail.com>
|
M: Markuss Broks <markuss.broks@gmail.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
|
@ -220,6 +220,18 @@ config DRM_PARADE_PS8640
|
||||||
The PS8640 is a high-performance and low-power
|
The PS8640 is a high-performance and low-power
|
||||||
MIPI DSI to eDP converter
|
MIPI DSI to eDP converter
|
||||||
|
|
||||||
|
config DRM_SAMSUNG_DSIM
|
||||||
|
tristate "Samsung MIPI DSIM bridge driver"
|
||||||
|
depends on COMMON_CLK
|
||||||
|
depends on OF && HAS_IOMEM
|
||||||
|
select DRM_KMS_HELPER
|
||||||
|
select DRM_MIPI_DSI
|
||||||
|
select DRM_PANEL_BRIDGE
|
||||||
|
help
|
||||||
|
The Samsung MIPI DSIM bridge controller driver.
|
||||||
|
This MIPI DSIM bridge can be found it on Exynos SoCs and
|
||||||
|
NXP's i.MX8M Mini/Nano.
|
||||||
|
|
||||||
config DRM_SIL_SII8620
|
config DRM_SIL_SII8620
|
||||||
tristate "Silicon Image SII8620 HDMI/MHL bridge"
|
tristate "Silicon Image SII8620 HDMI/MHL bridge"
|
||||||
depends on OF
|
depends on OF
|
||||||
|
|
|
@ -14,6 +14,7 @@ obj-$(CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW) += megachips-stdpxxxx-ge-b850v
|
||||||
obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o
|
obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o
|
||||||
obj-$(CONFIG_DRM_PARADE_PS8622) += parade-ps8622.o
|
obj-$(CONFIG_DRM_PARADE_PS8622) += parade-ps8622.o
|
||||||
obj-$(CONFIG_DRM_PARADE_PS8640) += parade-ps8640.o
|
obj-$(CONFIG_DRM_PARADE_PS8640) += parade-ps8640.o
|
||||||
|
obj-$(CONFIG_DRM_SAMSUNG_DSIM) += samsung-dsim.o
|
||||||
obj-$(CONFIG_DRM_SIL_SII8620) += sil-sii8620.o
|
obj-$(CONFIG_DRM_SIL_SII8620) += sil-sii8620.o
|
||||||
obj-$(CONFIG_DRM_SII902X) += sii902x.o
|
obj-$(CONFIG_DRM_SII902X) += sii902x.o
|
||||||
obj-$(CONFIG_DRM_SII9234) += sii9234.o
|
obj-$(CONFIG_DRM_SII9234) += sii9234.o
|
||||||
|
|
1900
drivers/gpu/drm/bridge/samsung-dsim.c
Normal file
1900
drivers/gpu/drm/bridge/samsung-dsim.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -59,6 +59,7 @@ config DRM_EXYNOS_DSI
|
||||||
depends on DRM_EXYNOS_FIMD || DRM_EXYNOS5433_DECON || DRM_EXYNOS7_DECON
|
depends on DRM_EXYNOS_FIMD || DRM_EXYNOS5433_DECON || DRM_EXYNOS7_DECON
|
||||||
select DRM_MIPI_DSI
|
select DRM_MIPI_DSI
|
||||||
select DRM_PANEL
|
select DRM_PANEL
|
||||||
|
select DRM_SAMSUNG_DSIM
|
||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
This enables support for Exynos MIPI-DSI device.
|
This enables support for Exynos MIPI-DSI device.
|
||||||
|
|
File diff suppressed because it is too large
Load diff
114
include/drm/bridge/samsung-dsim.h
Normal file
114
include/drm/bridge/samsung-dsim.h
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2022 Amarula Solutions(India)
|
||||||
|
* Author: Jagan Teki <jagan@amarulasolutions.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SAMSUNG_DSIM__
|
||||||
|
#define __SAMSUNG_DSIM__
|
||||||
|
|
||||||
|
#include <linux/gpio/consumer.h>
|
||||||
|
#include <linux/regulator/consumer.h>
|
||||||
|
|
||||||
|
#include <drm/drm_atomic_helper.h>
|
||||||
|
#include <drm/drm_of.h>
|
||||||
|
#include <drm/drm_mipi_dsi.h>
|
||||||
|
|
||||||
|
struct samsung_dsim;
|
||||||
|
|
||||||
|
#define DSIM_STATE_ENABLED BIT(0)
|
||||||
|
#define DSIM_STATE_INITIALIZED BIT(1)
|
||||||
|
#define DSIM_STATE_CMD_LPM BIT(2)
|
||||||
|
#define DSIM_STATE_VIDOUT_AVAILABLE BIT(3)
|
||||||
|
|
||||||
|
enum samsung_dsim_type {
|
||||||
|
DSIM_TYPE_EXYNOS3250,
|
||||||
|
DSIM_TYPE_EXYNOS4210,
|
||||||
|
DSIM_TYPE_EXYNOS5410,
|
||||||
|
DSIM_TYPE_EXYNOS5422,
|
||||||
|
DSIM_TYPE_EXYNOS5433,
|
||||||
|
DSIM_TYPE_IMX8MM,
|
||||||
|
DSIM_TYPE_COUNT,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define samsung_dsim_hw_is_exynos(hw) \
|
||||||
|
((hw) >= DSIM_TYPE_EXYNOS3250 && (hw) <= DSIM_TYPE_EXYNOS5433)
|
||||||
|
|
||||||
|
struct samsung_dsim_transfer {
|
||||||
|
struct list_head list;
|
||||||
|
struct completion completed;
|
||||||
|
int result;
|
||||||
|
struct mipi_dsi_packet packet;
|
||||||
|
u16 flags;
|
||||||
|
u16 tx_done;
|
||||||
|
|
||||||
|
u8 *rx_payload;
|
||||||
|
u16 rx_len;
|
||||||
|
u16 rx_done;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct samsung_dsim_driver_data {
|
||||||
|
const unsigned int *reg_ofs;
|
||||||
|
unsigned int plltmr_reg;
|
||||||
|
unsigned int has_freqband:1;
|
||||||
|
unsigned int has_clklane_stop:1;
|
||||||
|
unsigned int num_clks;
|
||||||
|
unsigned int max_freq;
|
||||||
|
unsigned int wait_for_reset;
|
||||||
|
unsigned int num_bits_resol;
|
||||||
|
unsigned int pll_p_offset;
|
||||||
|
const unsigned int *reg_values;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct samsung_dsim_host_ops {
|
||||||
|
int (*register_host)(struct samsung_dsim *dsim);
|
||||||
|
void (*unregister_host)(struct samsung_dsim *dsim);
|
||||||
|
int (*attach)(struct samsung_dsim *dsim, struct mipi_dsi_device *device);
|
||||||
|
void (*detach)(struct samsung_dsim *dsim, struct mipi_dsi_device *device);
|
||||||
|
irqreturn_t (*te_irq_handler)(struct samsung_dsim *dsim);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct samsung_dsim_plat_data {
|
||||||
|
enum samsung_dsim_type hw_type;
|
||||||
|
const struct samsung_dsim_host_ops *host_ops;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct samsung_dsim {
|
||||||
|
struct mipi_dsi_host dsi_host;
|
||||||
|
struct drm_bridge bridge;
|
||||||
|
struct drm_bridge *out_bridge;
|
||||||
|
struct device *dev;
|
||||||
|
struct drm_display_mode mode;
|
||||||
|
|
||||||
|
void __iomem *reg_base;
|
||||||
|
struct phy *phy;
|
||||||
|
struct clk **clks;
|
||||||
|
struct regulator_bulk_data supplies[2];
|
||||||
|
int irq;
|
||||||
|
struct gpio_desc *te_gpio;
|
||||||
|
|
||||||
|
u32 pll_clk_rate;
|
||||||
|
u32 burst_clk_rate;
|
||||||
|
u32 esc_clk_rate;
|
||||||
|
u32 lanes;
|
||||||
|
u32 mode_flags;
|
||||||
|
u32 format;
|
||||||
|
|
||||||
|
int state;
|
||||||
|
struct drm_property *brightness;
|
||||||
|
struct completion completed;
|
||||||
|
|
||||||
|
spinlock_t transfer_lock; /* protects transfer_list */
|
||||||
|
struct list_head transfer_list;
|
||||||
|
|
||||||
|
const struct samsung_dsim_driver_data *driver_data;
|
||||||
|
const struct samsung_dsim_plat_data *plat_data;
|
||||||
|
|
||||||
|
void *priv;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int samsung_dsim_probe(struct platform_device *pdev);
|
||||||
|
extern int samsung_dsim_remove(struct platform_device *pdev);
|
||||||
|
extern const struct dev_pm_ops samsung_dsim_pm_ops;
|
||||||
|
|
||||||
|
#endif /* __SAMSUNG_DSIM__ */
|
Loading…
Reference in a new issue