> Add the MT8189 OVL -> DVO pipeline alongside its OVL -> DSI one, > selecting the DVO0 module and start-of-frame source instead. The MT8189 > drives its eDP output through a DVO stage in place of the DSI, on the > same mutex instance and with the same overlay and RDMA modules. > > Signed-off-by: David Lechner <[email protected]> > > diff --git a/drivers/video/mediatek/mtk_disp_mutex.c > b/drivers/video/mediatek/mtk_disp_mutex.c > index 99e46711db5..1a7ea414f40 100644 > --- a/drivers/video/mediatek/mtk_disp_mutex.c > +++ b/drivers/video/mediatek/mtk_disp_mutex.c > @@ -51,7 +51,10 @@ > #define MT8188_MUTEX_MOD_DISP1_DISP_MIXER 30 > #define MT8188_MUTEX_MOD_DISP1_DPI1 38 > > -/* The MT8365 and MT8366 DSI pipelines use instance 0 of the mmsys mutex */ > +/* > + * The MT8365 and MT8366 DSI pipelines, and the MT8189 DSI and DVO ones, use > + * instance 0 of the mmsys mutex > + */ > #define MUTEX_DSI_ID 0 > > /* the MT8365 shifts the end-of-frame selector by 6 instead of 7 */ > @@ -82,15 +85,26 @@ > #define MT8189_MUTEX_MOD_DISP_RDMA0 4 > #define MT8189_MUTEX_MOD_DISP_DSI0 22 > > +/* the DVO output stage replaces the DSI on the eDP path of the same mmsys */ > +#define MT8189_MUTEX_SOF_DVO0 5 > +#define MT8189_MUTEX_EOF_DVO0 (MT8189_MUTEX_SOF_DVO0 << 7) > + > +#define MT8189_MUTEX_MOD_DISP_DVO0 21 > + > /** > * struct mtk_disp_mutex_data - per-SoC mutex data > * @dsi_mod: MOD0 bits of the components of the OVL -> DSI pipeline > * @dsi_sof: start and end-of-frame selectors of the DSI > + * @dvo_mod: MOD0 bits of the components of the OVL -> DVO pipeline, 0 on > + * the SoCs without a DVO output stage > + * @dvo_sof: start and end-of-frame selectors of the DVO > * @no_clk: the mutex has no clock of its own > */ > struct mtk_disp_mutex_data { > u32 dsi_mod; > u32 dsi_sof; > + u32 dvo_mod; > + u32 dvo_sof; > bool no_clk; > }; > > @@ -145,8 +159,19 @@ static const struct mtk_disp_mutex_data > mt8189_mutex_data = { > MUTEX_MOD_BIT(MT8189_MUTEX_MOD_DISP_RDMA0) | > MUTEX_MOD_BIT(MT8189_MUTEX_MOD_DISP_DSI0), > .dsi_sof = MT8189_MUTEX_EOF_DSI0 | MT8189_MUTEX_SOF_DSI0, > + .dvo_mod = MUTEX_MOD_BIT(MT8189_MUTEX_MOD_DISP_OVL0) | > + MUTEX_MOD_BIT(MT8189_MUTEX_MOD_DISP_RDMA0) | > + MUTEX_MOD_BIT(MT8189_MUTEX_MOD_DISP_DVO0), > + .dvo_sof = MT8189_MUTEX_EOF_DVO0 | MT8189_MUTEX_SOF_DVO0, > }; > > +static void mtk_disp_mutex_enable(struct udevice *dev, u32 mod, u32 sof) > +{ > + mtk_disp_comp_write(dev, DISP_MUTEX_MOD0(MUTEX_DSI_ID), mod); > + mtk_disp_comp_write(dev, DISP_MUTEX_SOF(MUTEX_DSI_ID), sof); > + mtk_disp_comp_write(dev, DISP_MUTEX_EN(MUTEX_DSI_ID), MUTEX_EN); > +} > + > int mtk_disp_mutex_ovl_dsi_enable(struct udevice *dev) > { > struct mtk_disp_mutex_priv *mutex = dev_get_priv(dev); > @@ -156,11 +181,21 @@ int mtk_disp_mutex_ovl_dsi_enable(struct udevice *dev) > return -EOPNOTSUPP; > } > > - mtk_disp_comp_write(dev, DISP_MUTEX_MOD0(MUTEX_DSI_ID), > - mutex->data->dsi_mod); > - mtk_disp_comp_write(dev, DISP_MUTEX_SOF(MUTEX_DSI_ID), > - mutex->data->dsi_sof); > - mtk_disp_comp_write(dev, DISP_MUTEX_EN(MUTEX_DSI_ID), MUTEX_EN); > + mtk_disp_mutex_enable(dev, mutex->data->dsi_mod, mutex->data->dsi_sof); > + > + return 0; > +} > + > +int mtk_disp_mutex_ovl_dvo_enable(struct udevice *dev) > +{ > + struct mtk_disp_mutex_priv *mutex = dev_get_priv(dev); > + > + if (!mutex->data || !mutex->data->dvo_mod) {
any reason to check only data->dvo_mod? should we also check for data->dvo_sof? should we also add same check on mtk_disp_mutex_ovl_dsi_enable? -- Julien Stephan <[email protected]>
