mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
Mediatek DRM Next - 20260521
1. hdmi: Convert DRM_ERROR() to drm_err() 2. Simplify mtk_crtc allocation 3. mtk_dpi: Open-code drm_simple_encoder_init() 4. Convert legacy DRM logging to drm_* helpers in mtk_dsi.c 5. dsi: Add compatible for mt8167-dsi -----BEGIN PGP SIGNATURE----- iQJMBAABCgA2FiEEACwLKSDmq+9RDv5P4cpzo8lZTiQFAmoPD/kYHGNodW5rdWFu Zy5odUBrZXJuZWwub3JnAAoJEOHKc6PJWU4ksD0P/iyXICh0ilWG3Z2GVxFgCWqf rpWvC2t9WI+EUJzV7Ggxou9qF0gkUB7TvRZpHCo9E09EhQ/JB58h+ChDmfao0QBX XwxF+SLxWPoSnNYodrMt3tLroOVn6KTPnUzr6MUITZPlfbQkErKQAjMe2VXflV7f 8jcwO9B0/aK9ntfeOvdAu1pUyS3gBTjSF07xzTKrlCRcYqmJ3NmqtQZORIoClhDT CSW50dn47cEpHrUiUkH/544aNad6ZW4u12LRW6dKo9BO8yUvM+5nii+9TpdivmvF 4P+L0Cy18V2IHcXdWdHx3uHyIkYY/TIC7igYKTbe2GJXFJKx/8GtlZRRSDq8wKll kwMbUf2x6Vljrzepi+AV8gsQ0d0IJv3yAlDGo1xLVeZR4BLCbToEY9gTBScQoA3p fFAPV8D4K8XRg+3tqLCTUrUKuDHNsMzP/eVj0S1ely2bdJ92UhLbk8k0C6+h0qG7 vbI5E6vOnJqYXoBc2OlfBFonopJmBfWF/rxtWiVrcVKC9OfjLyuPDMNiqjvn4353 5LNecCG/+xcCP020YajpI7PIAWr/wHk9uA42bM4pp9BGCws/LsO1yU4k0YjMnqkC MsDsHduSADk0rk/LutT3aC9qawSwY2iXtkH2S6sYMcjj31WNNjGn1YE5o3HS971z CLbOtDjkNV1oLtJAe4XJ =QRD1 -----END PGP SIGNATURE----- Merge tag 'mediatek-drm-next-20260521' of https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux into drm-next Mediatek DRM Next - 20260521 1. hdmi: Convert DRM_ERROR() to drm_err() 2. Simplify mtk_crtc allocation 3. mtk_dpi: Open-code drm_simple_encoder_init() 4. Convert legacy DRM logging to drm_* helpers in mtk_dsi.c 5. dsi: Add compatible for mt8167-dsi Signed-off-by: Dave Airlie <airlied@redhat.com> From: Chun-Kuang Hu <chunkuang.hu@kernel.org> Link: https://patch.msgid.link/20260521140841.5103-1-chunkuang.hu@kernel.org
This commit is contained in:
commit
f12f8a5780
|
|
@ -62,7 +62,6 @@ struct mtk_crtc {
|
|||
struct device *dma_dev;
|
||||
struct mtk_mutex *mutex;
|
||||
unsigned int ddp_comp_nr;
|
||||
struct mtk_ddp_comp **ddp_comp;
|
||||
unsigned int num_conn_routes;
|
||||
const struct mtk_drm_route *conn_routes;
|
||||
|
||||
|
|
@ -71,6 +70,8 @@ struct mtk_crtc {
|
|||
bool config_updating;
|
||||
/* lock for config_updating to cmd buffer */
|
||||
spinlock_t config_lock;
|
||||
|
||||
struct mtk_ddp_comp *ddp_comp[];
|
||||
};
|
||||
|
||||
struct mtk_crtc_state {
|
||||
|
|
@ -1048,18 +1049,14 @@ int mtk_crtc_create(struct drm_device *drm_dev, const unsigned int *path,
|
|||
}
|
||||
}
|
||||
|
||||
mtk_crtc = devm_kzalloc(dev, sizeof(*mtk_crtc), GFP_KERNEL);
|
||||
mtk_crtc = devm_kzalloc(dev,
|
||||
struct_size(mtk_crtc, ddp_comp, path_len + (conn_routes ? 1 : 0)),
|
||||
GFP_KERNEL);
|
||||
if (!mtk_crtc)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_crtc->mmsys_dev = priv->mmsys_dev;
|
||||
mtk_crtc->ddp_comp_nr = path_len;
|
||||
mtk_crtc->ddp_comp = devm_kcalloc(dev,
|
||||
mtk_crtc->ddp_comp_nr + (conn_routes ? 1 : 0),
|
||||
sizeof(*mtk_crtc->ddp_comp),
|
||||
GFP_KERNEL);
|
||||
if (!mtk_crtc->ddp_comp)
|
||||
return -ENOMEM;
|
||||
mtk_crtc->mmsys_dev = priv->mmsys_dev;
|
||||
|
||||
mtk_crtc->mutex = mtk_mutex_get(priv->mutex_dev);
|
||||
if (IS_ERR(mtk_crtc->mutex)) {
|
||||
|
|
|
|||
|
|
@ -25,8 +25,8 @@
|
|||
#include <drm/drm_bridge_connector.h>
|
||||
#include <drm/drm_crtc.h>
|
||||
#include <drm/drm_edid.h>
|
||||
#include <drm/drm_encoder.h>
|
||||
#include <drm/drm_of.h>
|
||||
#include <drm/drm_simple_kms_helper.h>
|
||||
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_disp_drv.h"
|
||||
|
|
@ -993,6 +993,10 @@ static const struct drm_bridge_funcs mtk_dpi_bridge_funcs = {
|
|||
.debugfs_init = mtk_dpi_debugfs_init,
|
||||
};
|
||||
|
||||
static const struct drm_encoder_funcs mtk_dpi_encoder_funcs = {
|
||||
.destroy = drm_encoder_cleanup,
|
||||
};
|
||||
|
||||
void mtk_dpi_start(struct device *dev)
|
||||
{
|
||||
struct mtk_dpi *dpi = dev_get_drvdata(dev);
|
||||
|
|
@ -1026,8 +1030,8 @@ static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
|
|||
int ret;
|
||||
|
||||
dpi->mmsys_dev = priv->mmsys_dev;
|
||||
ret = drm_simple_encoder_init(drm_dev, &dpi->encoder,
|
||||
DRM_MODE_ENCODER_TMDS);
|
||||
ret = drm_encoder_init(drm_dev, &dpi->encoder, &mtk_dpi_encoder_funcs,
|
||||
DRM_MODE_ENCODER_TMDS, NULL);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to initialize decoder: %d\n", ret);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -511,6 +511,7 @@ static void mtk_dsi_config_vdo_timing_per_line_lp(struct mtk_dsi *dsi)
|
|||
u32 delta;
|
||||
struct mtk_phy_timing *timing = &dsi->phy_timing;
|
||||
struct videomode *vm = &dsi->vm;
|
||||
struct drm_device *drm = dsi->bridge.dev;
|
||||
|
||||
if (dsi->format == MIPI_DSI_FMT_RGB565)
|
||||
dsi_tmp_buf_bpp = 2;
|
||||
|
|
@ -544,7 +545,7 @@ static void mtk_dsi_config_vdo_timing_per_line_lp(struct mtk_dsi *dsi)
|
|||
horizontal_backporch_byte /
|
||||
horizontal_front_back_byte;
|
||||
} else {
|
||||
DRM_WARN("HFP + HBP less than d-phy, FPS will under 60Hz\n");
|
||||
drm_warn(drm, "HFP + HBP less than d-phy, FPS will under 60Hz\n");
|
||||
}
|
||||
|
||||
if ((dsi->mode_flags & MIPI_DSI_HS_PKT_END_ALIGNED) &&
|
||||
|
|
@ -624,12 +625,13 @@ static s32 mtk_dsi_wait_for_irq_done(struct mtk_dsi *dsi, u32 irq_flag,
|
|||
{
|
||||
s32 ret = 0;
|
||||
unsigned long jiffies = msecs_to_jiffies(timeout);
|
||||
struct drm_device *drm = dsi->bridge.dev;
|
||||
|
||||
ret = wait_event_interruptible_timeout(dsi->irq_wait_queue,
|
||||
dsi->irq_data & irq_flag,
|
||||
jiffies);
|
||||
if (ret == 0) {
|
||||
DRM_WARN("Wait DSI IRQ(0x%08x) Timeout\n", irq_flag);
|
||||
drm_warn(drm, "Wait DSI IRQ(0x%08x) Timeout\n", irq_flag);
|
||||
|
||||
mtk_dsi_enable(dsi);
|
||||
mtk_dsi_reset_engine(dsi);
|
||||
|
|
@ -664,9 +666,10 @@ static s32 mtk_dsi_switch_to_cmd_mode(struct mtk_dsi *dsi, u8 irq_flag, u32 t)
|
|||
{
|
||||
mtk_dsi_irq_data_clear(dsi, irq_flag);
|
||||
mtk_dsi_set_cmd_mode(dsi);
|
||||
struct drm_device *drm = dsi->bridge.dev;
|
||||
|
||||
if (!mtk_dsi_wait_for_irq_done(dsi, irq_flag, t)) {
|
||||
DRM_ERROR("failed to switch cmd mode\n");
|
||||
drm_err(drm, "failed to switch cmd mode\n");
|
||||
return -ETIME;
|
||||
} else {
|
||||
return 0;
|
||||
|
|
@ -849,11 +852,12 @@ static void mtk_dsi_bridge_atomic_pre_enable(struct drm_bridge *bridge,
|
|||
struct drm_atomic_commit *state)
|
||||
{
|
||||
struct mtk_dsi *dsi = bridge_to_dsi(bridge);
|
||||
struct drm_device *drm = bridge->dev;
|
||||
int ret;
|
||||
|
||||
ret = mtk_dsi_poweron(dsi);
|
||||
if (ret < 0)
|
||||
DRM_ERROR("failed to power on dsi\n");
|
||||
drm_err(drm, "failed to power on dsi\n");
|
||||
}
|
||||
|
||||
static void mtk_dsi_bridge_atomic_post_disable(struct drm_bridge *bridge,
|
||||
|
|
@ -916,7 +920,7 @@ static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *dsi)
|
|||
ret = drm_simple_encoder_init(drm, &dsi->encoder,
|
||||
DRM_MODE_ENCODER_DSI);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to encoder init to drm\n");
|
||||
drm_err(drm, "Failed to encoder init to drm\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -932,7 +936,7 @@ static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *dsi)
|
|||
|
||||
dsi->connector = drm_bridge_connector_init(drm, &dsi->encoder);
|
||||
if (IS_ERR(dsi->connector)) {
|
||||
DRM_ERROR("Unable to create bridge connector\n");
|
||||
drm_err(drm, "Unable to create bridge connector\n");
|
||||
ret = PTR_ERR(dsi->connector);
|
||||
goto err_cleanup_encoder;
|
||||
}
|
||||
|
|
@ -984,6 +988,7 @@ static int mtk_dsi_host_attach(struct mipi_dsi_host *host,
|
|||
{
|
||||
struct mtk_dsi *dsi = host_to_dsi(host);
|
||||
struct device *dev = host->dev;
|
||||
struct drm_device *drm = dsi->bridge.dev;
|
||||
int ret;
|
||||
|
||||
dsi->lanes = device->lanes;
|
||||
|
|
@ -1005,7 +1010,7 @@ static int mtk_dsi_host_attach(struct mipi_dsi_host *host,
|
|||
|
||||
ret = component_add(host->dev, &mtk_dsi_component_ops);
|
||||
if (ret) {
|
||||
DRM_ERROR("failed to add dsi_host component: %d\n", ret);
|
||||
drm_err(drm, "failed to add dsi_host component: %d\n", ret);
|
||||
drm_bridge_remove(&dsi->bridge);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1027,11 +1032,12 @@ static void mtk_dsi_wait_for_idle(struct mtk_dsi *dsi)
|
|||
{
|
||||
int ret;
|
||||
u32 val;
|
||||
struct drm_device *drm = dsi->bridge.dev;
|
||||
|
||||
ret = readl_poll_timeout(dsi->regs + DSI_INTSTA, val, !(val & DSI_BUSY),
|
||||
4, 2000000);
|
||||
if (ret) {
|
||||
DRM_WARN("polling dsi wait not busy timeout!\n");
|
||||
drm_warn(drm, "polling dsi wait not busy timeout!\n");
|
||||
|
||||
mtk_dsi_enable(dsi);
|
||||
mtk_dsi_reset_engine(dsi);
|
||||
|
|
@ -1119,6 +1125,7 @@ static ssize_t mtk_dsi_host_transfer(struct mipi_dsi_host *host,
|
|||
const struct mipi_dsi_msg *msg)
|
||||
{
|
||||
struct mtk_dsi *dsi = host_to_dsi(host);
|
||||
struct drm_device *drm = dsi->bridge.dev;
|
||||
ssize_t recv_cnt;
|
||||
u8 read_data[16];
|
||||
void *src_addr;
|
||||
|
|
@ -1149,7 +1156,7 @@ static ssize_t mtk_dsi_host_transfer(struct mipi_dsi_host *host,
|
|||
}
|
||||
|
||||
if (!msg->rx_buf) {
|
||||
DRM_ERROR("dsi receive buffer size may be NULL\n");
|
||||
drm_err(drm, "dsi receive buffer size may be NULL\n");
|
||||
ret = -EINVAL;
|
||||
goto restore_dsi_mode;
|
||||
}
|
||||
|
|
@ -1173,7 +1180,7 @@ static ssize_t mtk_dsi_host_transfer(struct mipi_dsi_host *host,
|
|||
if (recv_cnt)
|
||||
memcpy(msg->rx_buf, src_addr, recv_cnt);
|
||||
|
||||
DRM_INFO("dsi get %zd byte data from the panel address(0x%x)\n",
|
||||
drm_info(drm, "dsi get %zd byte data from the panel address(0x%x)\n",
|
||||
recv_cnt, *((u8 *)(msg->tx_buf)));
|
||||
|
||||
restore_dsi_mode:
|
||||
|
|
@ -1304,6 +1311,7 @@ static const struct mtk_dsi_driver_data mt8188_dsi_driver_data = {
|
|||
|
||||
static const struct of_device_id mtk_dsi_of_match[] = {
|
||||
{ .compatible = "mediatek,mt2701-dsi", .data = &mt2701_dsi_driver_data },
|
||||
{ .compatible = "mediatek,mt8167-dsi", .data = &mt2701_dsi_driver_data },
|
||||
{ .compatible = "mediatek,mt8173-dsi", .data = &mt8173_dsi_driver_data },
|
||||
{ .compatible = "mediatek,mt8183-dsi", .data = &mt8183_dsi_driver_data },
|
||||
{ .compatible = "mediatek,mt8186-dsi", .data = &mt8186_dsi_driver_data },
|
||||
|
|
|
|||
|
|
@ -981,8 +981,8 @@ static int mtk_hdmi_bridge_attach(struct drm_bridge *bridge,
|
|||
int ret;
|
||||
|
||||
if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) {
|
||||
DRM_ERROR("%s: The flag DRM_BRIDGE_ATTACH_NO_CONNECTOR must be supplied\n",
|
||||
__func__);
|
||||
drm_err(bridge->dev,
|
||||
"DRM_BRIDGE_ATTACH_NO_CONNECTOR must be supplied\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user