[PATCH 7/8] drm: Add old state pointer to CRTC .enable() helper function


Wed Jun 28 13:55:07 UTC 2017


<syeh at vmware.com>,Thierry Reding <thierry.reding at gmail.com>,Thomas Hellstrom <thellstrom at vmware.com>,Tomi Valkeinen <tomi.valkeinen at ti.com>,VMware Graphics <linux-graphics-maintainer at vmware.com>,Vincent Abriou <vincent.abriou at st.com>,Xinliang Liu <z.liuxinliang at hisilicon.com>,Xinwei Kong <kong.kongxinwei at hisilicon.com>,Yannick Fertre <yannick.fertre at st.com>
From: Stefan Agner <stefan at agner.ch>
Message-ID: <961A615D-ED2E-4FA2-A49E-BB250F3E9DBB at agner.ch>



On June 27, 2017 3:16:20 PM MDT, Laurent Pinchart <laurent.pinchart+renesas at ideasonboard.com> wrote:
>The old state is useful for drivers that need to perform operations at
>enable time that depend on the transition between the old and new
>states.
>
>While at it, rename the operation to .atomic_enable() to be consistent
>with .atomic_disable(), as the .enable() operation is used by atomic
>helpers only.
>
>Signed-off-by: Laurent Pinchart
><laurent.pinchart+renesas at ideasonboard.com>
>---
> drivers/gpu/drm/arc/arcpgu_crtc.c               |  5 ++--
> drivers/gpu/drm/arm/hdlcd_crtc.c                |  5 ++--
> drivers/gpu/drm/arm/malidp_crtc.c               |  5 ++--
> drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c  |  5 ++--
> drivers/gpu/drm/drm_atomic_helper.c             |  7 +++--
> drivers/gpu/drm/drm_simple_kms_helper.c         |  5 ++--
> drivers/gpu/drm/exynos/exynos_drm_crtc.c        |  5 ++--
> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c      |  5 ++--

For fsl-dcu:

Acked-by: Stefan Agner <stefan at agner.ch>

> drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c  |  5 ++--
> drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c |  5 ++--
> drivers/gpu/drm/imx/ipuv3-crtc.c                |  5 ++--
> drivers/gpu/drm/mediatek/mtk_drm_crtc.c         |  5 ++--
> drivers/gpu/drm/meson/meson_crtc.c              |  5 ++--
> drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c        |  5 ++--
> drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c        |  5 ++--
> drivers/gpu/drm/omapdrm/omap_crtc.c             |  5 ++--
> drivers/gpu/drm/qxl/qxl_display.c               |  5 ++--
> drivers/gpu/drm/rcar-du/rcar_du_crtc.c          |  5 ++--
> drivers/gpu/drm/rockchip/rockchip_drm_vop.c     |  5 ++--
> drivers/gpu/drm/sti/sti_crtc.c                  |  5 ++--
> drivers/gpu/drm/stm/ltdc.c                      |  5 ++--
> drivers/gpu/drm/sun4i/sun4i_crtc.c              |  5 ++--
> drivers/gpu/drm/tegra/dc.c                      |  5 ++--
> drivers/gpu/drm/tilcdc/tilcdc_crtc.c            |  8 +++++-
> drivers/gpu/drm/vc4/vc4_crtc.c                  |  5 ++--
> drivers/gpu/drm/virtio/virtgpu_display.c        |  5 ++--
> drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c             |  7 +++--
> drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c            |  7 +++--
> drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c            |  5 ++--
> drivers/gpu/drm/zte/zx_vou.c                    |  5 ++--
>include/drm/drm_modeset_helper_vtables.h        | 38
>+++++++++++++------------
> 31 files changed, 117 insertions(+), 80 deletions(-)
>
>diff --git a/drivers/gpu/drm/arc/arcpgu_crtc.c
>b/drivers/gpu/drm/arc/arcpgu_crtc.c
>index 1f306781c9d5..c9bc6a90ac83 100644
>--- a/drivers/gpu/drm/arc/arcpgu_crtc.c
>+++ b/drivers/gpu/drm/arc/arcpgu_crtc.c
>@@ -119,7 +119,8 @@ static void arc_pgu_crtc_mode_set_nofb(struct
>drm_crtc *crtc)
> 	clk_set_rate(arcpgu->clk, m->crtc_clock * 1000);
> }
> 
>-static void arc_pgu_crtc_enable(struct drm_crtc *crtc)
>+static void arc_pgu_crtc_atomic_enable(struct drm_crtc *crtc,
>+				       struct drm_crtc_state *old_state)
> {
> 	struct arcpgu_drm_private *arcpgu = crtc_to_arcpgu_priv(crtc);
> 
>@@ -161,9 +162,9 @@ static const struct drm_crtc_helper_funcs
>arc_pgu_crtc_helper_funcs = {
> 	.mode_set	= drm_helper_crtc_mode_set,
> 	.mode_set_base	= drm_helper_crtc_mode_set_base,
> 	.mode_set_nofb	= arc_pgu_crtc_mode_set_nofb,
>-	.enable		= arc_pgu_crtc_enable,
> 	.disable	= arc_pgu_crtc_disable,
> 	.atomic_begin	= arc_pgu_crtc_atomic_begin,
>+	.atomic_enable	= arc_pgu_crtc_atomic_enable,
> };
> 
> static void arc_pgu_plane_atomic_update(struct drm_plane *plane,
>diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c
>b/drivers/gpu/drm/arm/hdlcd_crtc.c
>index d67b6f15e8b8..2b7f4f05d91f 100644
>--- a/drivers/gpu/drm/arm/hdlcd_crtc.c
>+++ b/drivers/gpu/drm/arm/hdlcd_crtc.c
>@@ -165,7 +165,8 @@ static void hdlcd_crtc_mode_set_nofb(struct
>drm_crtc *crtc)
> 	clk_set_rate(hdlcd->clk, m->crtc_clock * 1000);
> }
> 
>-static void hdlcd_crtc_enable(struct drm_crtc *crtc)
>+static void hdlcd_crtc_atomic_enable(struct drm_crtc *crtc,
>+				     struct drm_crtc_state *old_state)
> {
> 	struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc);
> 
>@@ -218,10 +219,10 @@ static void hdlcd_crtc_atomic_begin(struct
>drm_crtc *crtc,
> }
> 
> static const struct drm_crtc_helper_funcs hdlcd_crtc_helper_funcs = {
>-	.enable		= hdlcd_crtc_enable,
> 	.disable	= hdlcd_crtc_disable,
> 	.atomic_check	= hdlcd_crtc_atomic_check,
> 	.atomic_begin	= hdlcd_crtc_atomic_begin,
>+	.atomic_enable	= hdlcd_crtc_atomic_enable,
> };
> 
> static int hdlcd_plane_atomic_check(struct drm_plane *plane,
>diff --git a/drivers/gpu/drm/arm/malidp_crtc.c
>b/drivers/gpu/drm/arm/malidp_crtc.c
>index 4bb38a21efec..8e5b1c0181ab 100644
>--- a/drivers/gpu/drm/arm/malidp_crtc.c
>+++ b/drivers/gpu/drm/arm/malidp_crtc.c
>@@ -46,7 +46,8 @@ static enum drm_mode_status
>malidp_crtc_mode_valid(struct drm_crtc *crtc,
> 	return MODE_OK;
> }
> 
>-static void malidp_crtc_enable(struct drm_crtc *crtc)
>+static void malidp_crtc_atomic_enable(struct drm_crtc *crtc,
>+				      struct drm_crtc_state *old_state)
> {
> 	struct malidp_drm *malidp = crtc_to_malidp_device(crtc);
> 	struct malidp_hw_device *hwdev = malidp->dev;
>@@ -408,9 +409,9 @@ static int malidp_crtc_atomic_check(struct drm_crtc
>*crtc,
> 
> static const struct drm_crtc_helper_funcs malidp_crtc_helper_funcs = {
> 	.mode_valid = malidp_crtc_mode_valid,
>-	.enable = malidp_crtc_enable,
> 	.disable = malidp_crtc_disable,
> 	.atomic_check = malidp_crtc_atomic_check,
>+	.atomic_enable = malidp_crtc_atomic_enable,
> };
> 
>static struct drm_crtc_state *malidp_crtc_duplicate_state(struct
>drm_crtc *crtc)
>diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
>b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
>index f6b8c5908a20..e54e503180f4 100644
>--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
>+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
>@@ -183,7 +183,8 @@ static void atmel_hlcdc_crtc_disable(struct
>drm_crtc *c)
> 	pm_runtime_put_sync(dev->dev);
> }
> 
>-static void atmel_hlcdc_crtc_enable(struct drm_crtc *c)
>+static void atmel_hlcdc_crtc_atomic_enable(struct drm_crtc *c,
>+					   struct drm_crtc_state *old_state)
> {
> 	struct drm_device *dev = c->dev;
> 	struct atmel_hlcdc_crtc *crtc = drm_crtc_to_atmel_hlcdc_crtc(c);
>@@ -320,10 +321,10 @@ static const struct drm_crtc_helper_funcs
>lcdc_crtc_helper_funcs = {
> 	.mode_set_nofb = atmel_hlcdc_crtc_mode_set_nofb,
> 	.mode_set_base = drm_helper_crtc_mode_set_base,
> 	.disable = atmel_hlcdc_crtc_disable,
>-	.enable = atmel_hlcdc_crtc_enable,
> 	.atomic_check = atmel_hlcdc_crtc_atomic_check,
> 	.atomic_begin = atmel_hlcdc_crtc_atomic_begin,
> 	.atomic_flush = atmel_hlcdc_crtc_atomic_flush,
>+	.atomic_enable = atmel_hlcdc_crtc_atomic_enable,
> };
> 
> static void atmel_hlcdc_crtc_destroy(struct drm_crtc *c)
>diff --git a/drivers/gpu/drm/drm_atomic_helper.c
>b/drivers/gpu/drm/drm_atomic_helper.c
>index 2f269e4267da..23e4661a62fe 100644
>--- a/drivers/gpu/drm/drm_atomic_helper.c
>+++ b/drivers/gpu/drm/drm_atomic_helper.c
>@@ -1069,12 +1069,13 @@ void
>drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
> 					      struct drm_atomic_state *old_state)
> {
> 	struct drm_crtc *crtc;
>+	struct drm_crtc_state *old_crtc_state;
> 	struct drm_crtc_state *new_crtc_state;
> 	struct drm_connector *connector;
> 	struct drm_connector_state *new_conn_state;
> 	int i;
> 
>-	for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
>+	for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state,
>new_crtc_state, i) {
> 		const struct drm_crtc_helper_funcs *funcs;
> 
> 		/* Need to filter out CRTCs where only planes change. */
>@@ -1090,8 +1091,8 @@ void
>drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
> 			DRM_DEBUG_ATOMIC("enabling [CRTC:%d:%s]\n",
> 					 crtc->base.id, crtc->name);
> 
>-			if (funcs->enable)
>-				funcs->enable(crtc);
>+			if (funcs->atomic_enable)
>+				funcs->atomic_enable(crtc, old_crtc_state);
> 			else
> 				funcs->commit(crtc);
> 		}
>diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c
>b/drivers/gpu/drm/drm_simple_kms_helper.c
>index e084f9f8ca66..58c27ab1756f 100644
>--- a/drivers/gpu/drm/drm_simple_kms_helper.c
>+++ b/drivers/gpu/drm/drm_simple_kms_helper.c
>@@ -40,7 +40,8 @@ static int drm_simple_kms_crtc_check(struct drm_crtc
>*crtc,
> 	return drm_atomic_add_affected_planes(state->state, crtc);
> }
> 
>-static void drm_simple_kms_crtc_enable(struct drm_crtc *crtc)
>+static void drm_simple_kms_crtc_enable(struct drm_crtc *crtc,
>+				       struct drm_crtc_state *old_state)
> {
> 	struct drm_simple_display_pipe *pipe;
> 
>@@ -64,8 +65,8 @@ static void drm_simple_kms_crtc_disable(struct
>drm_crtc *crtc)
> 
>static const struct drm_crtc_helper_funcs
>drm_simple_kms_crtc_helper_funcs = {
> 	.atomic_check = drm_simple_kms_crtc_check,
>+	.atomic_enable = drm_simple_kms_crtc_enable,
> 	.disable = drm_simple_kms_crtc_disable,
>-	.enable = drm_simple_kms_crtc_enable,
> };
> 
> static const struct drm_crtc_funcs drm_simple_kms_crtc_funcs = {
>diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
>b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
>index d72777f6411a..b7e2fadb6442 100644
>--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
>+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
>@@ -21,7 +21,8 @@
> #include "exynos_drm_drv.h"
> #include "exynos_drm_plane.h"
> 
>-static void exynos_drm_crtc_enable(struct drm_crtc *crtc)
>+static void exynos_drm_crtc_atomic_enable(struct drm_crtc *crtc,
>+					  struct drm_crtc_state *old_state)
> {
> 	struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
> 
>@@ -82,11 +83,11 @@ static void exynos_crtc_atomic_flush(struct
>drm_crtc *crtc,
> }
> 
> static const struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = {
>-	.enable		= exynos_drm_crtc_enable,
> 	.disable	= exynos_drm_crtc_disable,
> 	.atomic_check	= exynos_crtc_atomic_check,
> 	.atomic_begin	= exynos_crtc_atomic_begin,
> 	.atomic_flush	= exynos_crtc_atomic_flush,
>+	.atomic_enable	= exynos_drm_crtc_atomic_enable,
> };
> 
> void exynos_crtc_handle_event(struct exynos_drm_crtc *exynos_crtc)
>diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
>b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
>index cc4e944a1d3c..0e3752437e44 100644
>--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
>+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
>@@ -63,7 +63,8 @@ static void fsl_dcu_drm_crtc_atomic_disable(struct
>drm_crtc *crtc,
> 	clk_disable_unprepare(fsl_dev->pix_clk);
> }
> 
>-static void fsl_dcu_drm_crtc_enable(struct drm_crtc *crtc)
>+static void fsl_dcu_drm_crtc_atomic_enable(struct drm_crtc *crtc,
>+					   struct drm_crtc_state *old_state)
> {
> 	struct drm_device *dev = crtc->dev;
> 	struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
>@@ -133,7 +134,7 @@ static void fsl_dcu_drm_crtc_mode_set_nofb(struct
>drm_crtc *crtc)
>static const struct drm_crtc_helper_funcs fsl_dcu_drm_crtc_helper_funcs
>= {
> 	.atomic_disable = fsl_dcu_drm_crtc_atomic_disable,
> 	.atomic_flush = fsl_dcu_drm_crtc_atomic_flush,
>-	.enable = fsl_dcu_drm_crtc_enable,
>+	.atomic_enable = fsl_dcu_drm_crtc_atomic_enable,
> 	.mode_set_nofb = fsl_dcu_drm_crtc_mode_set_nofb,
> };
> 
>diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
>b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
>index 59542bddc980..49ef47c0c81a 100644
>--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
>+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
>@@ -192,7 +192,8 @@ static struct drm_plane *hibmc_plane_init(struct
>hibmc_drm_private *priv)
> 	return plane;
> }
> 
>-static void hibmc_crtc_enable(struct drm_crtc *crtc)
>+static void hibmc_crtc_atomic_enable(struct drm_crtc *crtc,
>+				     struct drm_crtc_state *old_state)
> {
> 	unsigned int reg;
> 	struct hibmc_drm_private *priv = crtc->dev->dev_private;
>@@ -453,11 +454,11 @@ static const struct drm_crtc_funcs
>hibmc_crtc_funcs = {
> };
> 
> static const struct drm_crtc_helper_funcs hibmc_crtc_helper_funcs = {
>-	.enable		= hibmc_crtc_enable,
> 	.disable	= hibmc_crtc_disable,
> 	.mode_set_nofb	= hibmc_crtc_mode_set_nofb,
> 	.atomic_begin	= hibmc_crtc_atomic_begin,
> 	.atomic_flush	= hibmc_crtc_atomic_flush,
>+	.atomic_enable	= hibmc_crtc_atomic_enable,
> };
> 
> int hibmc_de_init(struct hibmc_drm_private *priv)
>diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
>b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
>index c96c228a9898..8e00818b24fc 100644
>--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
>+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
>@@ -467,7 +467,8 @@ static void ade_dump_regs(void __iomem *base)
> static void ade_dump_regs(void __iomem *base) { }
> #endif
> 
>-static void ade_crtc_enable(struct drm_crtc *crtc)
>+static void ade_crtc_atomic_enable(struct drm_crtc *crtc,
>+				   struct drm_crtc_state *old_state)
> {
> 	struct ade_crtc *acrtc = to_ade_crtc(crtc);
> 	struct ade_hw_ctx *ctx = acrtc->ctx;
>@@ -553,11 +554,11 @@ static void ade_crtc_atomic_flush(struct drm_crtc
>*crtc,
> }
> 
> static const struct drm_crtc_helper_funcs ade_crtc_helper_funcs = {
>-	.enable		= ade_crtc_enable,
> 	.disable	= ade_crtc_disable,
> 	.mode_set_nofb	= ade_crtc_mode_set_nofb,
> 	.atomic_begin	= ade_crtc_atomic_begin,
> 	.atomic_flush	= ade_crtc_atomic_flush,
>+	.atomic_enable	= ade_crtc_atomic_enable,
> };
> 
> static const struct drm_crtc_funcs ade_crtc_funcs = {
>diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c
>b/drivers/gpu/drm/imx/ipuv3-crtc.c
>index 5456c15d962c..53e0b24beda6 100644
>--- a/drivers/gpu/drm/imx/ipuv3-crtc.c
>+++ b/drivers/gpu/drm/imx/ipuv3-crtc.c
>@@ -50,7 +50,8 @@ static inline struct ipu_crtc *to_ipu_crtc(struct
>drm_crtc *crtc)
> 	return container_of(crtc, struct ipu_crtc, base);
> }
> 
>-static void ipu_crtc_enable(struct drm_crtc *crtc)
>+static void ipu_crtc_atomic_enable(struct drm_crtc *crtc,
>+				   struct drm_crtc_state *old_state)
> {
> 	struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
> 	struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent);
>@@ -293,7 +294,7 @@ static const struct drm_crtc_helper_funcs
>ipu_helper_funcs = {
> 	.atomic_check = ipu_crtc_atomic_check,
> 	.atomic_begin = ipu_crtc_atomic_begin,
> 	.atomic_disable = ipu_crtc_atomic_disable,
>-	.enable = ipu_crtc_enable,
>+	.atomic_enable = ipu_crtc_atomic_enable,
> };
> 
> static void ipu_put_resources(struct ipu_crtc *ipu_crtc)
>diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
>b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
>index 6582e1f56d37..5971b0827d1b 100644
>--- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
>+++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
>@@ -366,7 +366,8 @@ static void mtk_crtc_ddp_config(struct drm_crtc
>*crtc)
> 	}
> }
> 
>-static void mtk_drm_crtc_enable(struct drm_crtc *crtc)
>+static void mtk_drm_crtc_atomic_enable(struct drm_crtc *crtc,
>+				       struct drm_crtc_state *old_state)
> {
> 	struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
> 	struct mtk_ddp_comp *ovl = mtk_crtc->ddp_comp[0];
>@@ -487,10 +488,10 @@ static const struct drm_crtc_funcs mtk_crtc_funcs
>= {
> static const struct drm_crtc_helper_funcs mtk_crtc_helper_funcs = {
> 	.mode_fixup	= mtk_drm_crtc_mode_fixup,
> 	.mode_set_nofb	= mtk_drm_crtc_mode_set_nofb,
>-	.enable		= mtk_drm_crtc_enable,
> 	.disable	= mtk_drm_crtc_disable,
> 	.atomic_begin	= mtk_drm_crtc_atomic_begin,
> 	.atomic_flush	= mtk_drm_crtc_atomic_flush,
>+	.atomic_enable	= mtk_drm_crtc_atomic_enable,
> };
> 
> static int mtk_drm_crtc_init(struct drm_device *drm,
>diff --git a/drivers/gpu/drm/meson/meson_crtc.c
>b/drivers/gpu/drm/meson/meson_crtc.c
>index c986eb03b9d9..6f148307b0e0 100644
>--- a/drivers/gpu/drm/meson/meson_crtc.c
>+++ b/drivers/gpu/drm/meson/meson_crtc.c
>@@ -79,7 +79,8 @@ static const struct drm_crtc_funcs meson_crtc_funcs =
>{
> 
> };
> 
>-static void meson_crtc_enable(struct drm_crtc *crtc)
>+static void meson_crtc_atomic_enable(struct drm_crtc *crtc,
>+				     struct drm_crtc_state *old_state)
> {
> 	struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
> 	struct drm_crtc_state *crtc_state = crtc->state;
>@@ -149,10 +150,10 @@ static void meson_crtc_atomic_flush(struct
>drm_crtc *crtc,
> }
> 
> static const struct drm_crtc_helper_funcs meson_crtc_helper_funcs = {
>-	.enable		= meson_crtc_enable,
> 	.disable	= meson_crtc_disable,
> 	.atomic_begin	= meson_crtc_atomic_begin,
> 	.atomic_flush	= meson_crtc_atomic_flush,
>+	.atomic_enable	= meson_crtc_atomic_enable,
> };
> 
> void meson_crtc_irq(struct meson_drm *priv)
>diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
>b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
>index 615e1def64d9..9c20133f3f8d 100644
>--- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
>+++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
>@@ -295,7 +295,8 @@ static void mdp4_crtc_disable(struct drm_crtc
>*crtc)
> 	mdp4_crtc->enabled = false;
> }
> 
>-static void mdp4_crtc_enable(struct drm_crtc *crtc)
>+static void mdp4_crtc_atomic_enable(struct drm_crtc *crtc,
>+				    struct drm_crtc_state *old_state)
> {
> 	struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc);
> 	struct mdp4_kms *mdp4_kms = get_kms(crtc);
>@@ -493,10 +494,10 @@ static const struct drm_crtc_funcs
>mdp4_crtc_funcs = {
> static const struct drm_crtc_helper_funcs mdp4_crtc_helper_funcs = {
> 	.mode_set_nofb = mdp4_crtc_mode_set_nofb,
> 	.disable = mdp4_crtc_disable,
>-	.enable = mdp4_crtc_enable,
> 	.atomic_check = mdp4_crtc_atomic_check,
> 	.atomic_begin = mdp4_crtc_atomic_begin,
> 	.atomic_flush = mdp4_crtc_atomic_flush,
>+	.atomic_enable = mdp4_crtc_atomic_enable,
> };
> 
>static void mdp4_crtc_vblank_irq(struct mdp_irq *irq, uint32_t
>irqstatus)
>diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>index cb5415d6c04b..d39d9d24d169 100644
>--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>@@ -429,7 +429,8 @@ static void mdp5_crtc_disable(struct drm_crtc
>*crtc)
> 	mdp5_crtc->enabled = false;
> }
> 
>-static void mdp5_crtc_enable(struct drm_crtc *crtc)
>+static void mdp5_crtc_atomic_enable(struct drm_crtc *crtc,
>+				    struct drm_crtc_state *old_state)
> {
> 	struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc);
>	struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state);
>@@ -940,10 +941,10 @@ static const struct drm_crtc_funcs
>mdp5_crtc_no_lm_cursor_funcs = {
> static const struct drm_crtc_helper_funcs mdp5_crtc_helper_funcs = {
> 	.mode_set_nofb = mdp5_crtc_mode_set_nofb,
> 	.disable = mdp5_crtc_disable,
>-	.enable = mdp5_crtc_enable,
> 	.atomic_check = mdp5_crtc_atomic_check,
> 	.atomic_begin = mdp5_crtc_atomic_begin,
> 	.atomic_flush = mdp5_crtc_atomic_flush,
>+	.atomic_enable = mdp5_crtc_atomic_enable,
> };
> 
>static void mdp5_crtc_vblank_irq(struct mdp_irq *irq, uint32_t
>irqstatus)
>diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c
>b/drivers/gpu/drm/omapdrm/omap_crtc.c
>index dd0ef40ca469..7a1b7a9cc270 100644
>--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
>+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
>@@ -356,7 +356,8 @@ static void omap_crtc_arm_event(struct drm_crtc
>*crtc)
> 	}
> }
> 
>-static void omap_crtc_enable(struct drm_crtc *crtc)
>+static void omap_crtc_atomic_enable(struct drm_crtc *crtc,
>+				    struct drm_crtc_state *old_state)
> {
> 	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
> 	int ret;
>@@ -568,10 +569,10 @@ static const struct drm_crtc_funcs
>omap_crtc_funcs = {
> static const struct drm_crtc_helper_funcs omap_crtc_helper_funcs = {
> 	.mode_set_nofb = omap_crtc_mode_set_nofb,
> 	.disable = omap_crtc_disable,
>-	.enable = omap_crtc_enable,
> 	.atomic_check = omap_crtc_atomic_check,
> 	.atomic_begin = omap_crtc_atomic_begin,
> 	.atomic_flush = omap_crtc_atomic_flush,
>+	.atomic_enable = omap_crtc_atomic_enable,
> };
> 
>/*
>-----------------------------------------------------------------------------
>diff --git a/drivers/gpu/drm/qxl/qxl_display.c
>b/drivers/gpu/drm/qxl/qxl_display.c
>index 7ede5f131a5c..ea95e7e7cc7f 100644
>--- a/drivers/gpu/drm/qxl/qxl_display.c
>+++ b/drivers/gpu/drm/qxl/qxl_display.c
>@@ -447,7 +447,8 @@ static void qxl_mode_set_nofb(struct drm_crtc
>*crtc)
> 
> }
> 
>-static void qxl_crtc_enable(struct drm_crtc *crtc)
>+static void qxl_crtc_atomic_enable(struct drm_crtc *crtc,
>+				   struct drm_crtc_state *old_state)
> {
> 	DRM_DEBUG("\n");
> }
>@@ -466,8 +467,8 @@ static const struct drm_crtc_helper_funcs
>qxl_crtc_helper_funcs = {
> 	.disable = qxl_crtc_disable,
> 	.mode_fixup = qxl_crtc_mode_fixup,
> 	.mode_set_nofb = qxl_mode_set_nofb,
>-	.enable = qxl_crtc_enable,
> 	.atomic_flush = qxl_crtc_atomic_flush,
>+	.atomic_enable = qxl_crtc_atomic_enable,
> };
> 
> static int qxl_primary_atomic_check(struct drm_plane *plane,
>diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
>b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
>index 345eff72f581..6aa3fa8d06f9 100644
>--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
>+++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
>@@ -552,7 +552,8 @@ void rcar_du_crtc_resume(struct rcar_du_crtc
>*rcrtc)
>  * CRTC Functions
>  */
> 
>-static void rcar_du_crtc_enable(struct drm_crtc *crtc)
>+static void rcar_du_crtc_atomic_enable(struct drm_crtc *crtc,
>+				       struct drm_crtc_state *old_state)
> {
> 	struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
> 
>@@ -610,9 +611,9 @@ static void rcar_du_crtc_atomic_flush(struct
>drm_crtc *crtc,
> 
> static const struct drm_crtc_helper_funcs crtc_helper_funcs = {
> 	.disable = rcar_du_crtc_disable,
>-	.enable = rcar_du_crtc_enable,
> 	.atomic_begin = rcar_du_crtc_atomic_begin,
> 	.atomic_flush = rcar_du_crtc_atomic_flush,
>+	.atomic_enable = rcar_du_crtc_atomic_enable,
> };
> 
> static int rcar_du_crtc_enable_vblank(struct drm_crtc *crtc)
>diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
>b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
>index 5d450332c2fd..bb59f7410634 100644
>--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
>+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
>@@ -871,7 +871,8 @@ static bool vop_crtc_mode_fixup(struct drm_crtc
>*crtc,
> 	return true;
> }
> 
>-static void vop_crtc_enable(struct drm_crtc *crtc)
>+static void vop_crtc_atomic_enable(struct drm_crtc *crtc,
>+				   struct drm_crtc_state *old_state)
> {
> 	struct vop *vop = to_vop(crtc);
> 	const struct vop_data *vop_data = vop->data;
>@@ -1079,11 +1080,11 @@ static void vop_crtc_atomic_begin(struct
>drm_crtc *crtc,
> }
> 
> static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = {
>-	.enable = vop_crtc_enable,
> 	.disable = vop_crtc_disable,
> 	.mode_fixup = vop_crtc_mode_fixup,
> 	.atomic_flush = vop_crtc_atomic_flush,
> 	.atomic_begin = vop_crtc_atomic_begin,
>+	.atomic_enable = vop_crtc_atomic_enable,
> };
> 
> static void vop_crtc_destroy(struct drm_crtc *crtc)
>diff --git a/drivers/gpu/drm/sti/sti_crtc.c
>b/drivers/gpu/drm/sti/sti_crtc.c
>index d45a4335df5d..bb864345fedf 100644
>--- a/drivers/gpu/drm/sti/sti_crtc.c
>+++ b/drivers/gpu/drm/sti/sti_crtc.c
>@@ -20,7 +20,8 @@
> #include "sti_vid.h"
> #include "sti_vtg.h"
> 
>-static void sti_crtc_enable(struct drm_crtc *crtc)
>+static void sti_crtc_atomic_enable(struct drm_crtc *crtc,
>+				   struct drm_crtc_state *old_state)
> {
> 	struct sti_mixer *mixer = to_sti_mixer(crtc);
> 
>@@ -222,10 +223,10 @@ static void sti_crtc_atomic_flush(struct drm_crtc
>*crtc,
> }
> 
> static const struct drm_crtc_helper_funcs sti_crtc_helper_funcs = {
>-	.enable = sti_crtc_enable,
> 	.disable = sti_crtc_disabling,
> 	.mode_set_nofb = sti_crtc_mode_set_nofb,
> 	.atomic_flush = sti_crtc_atomic_flush,
>+	.atomic_enable = sti_crtc_atomic_enable,
> };
> 
> static void sti_crtc_destroy(struct drm_crtc *crtc)
>diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c
>index 1b9483d4f2a4..337fce004d08 100644
>--- a/drivers/gpu/drm/stm/ltdc.c
>+++ b/drivers/gpu/drm/stm/ltdc.c
>@@ -386,7 +386,8 @@ static void ltdc_crtc_load_lut(struct drm_crtc
>*crtc)
> 				  ldev->clut[i]);
> }
> 
>-static void ltdc_crtc_enable(struct drm_crtc *crtc)
>+static void ltdc_crtc_atomic_enable(struct drm_crtc *crtc,
>+				    struct drm_crtc_state *old_state)
> {
> 	struct ltdc_device *ldev = crtc_to_ltdc(crtc);
> 
>@@ -524,10 +525,10 @@ static void ltdc_crtc_atomic_flush(struct
>drm_crtc *crtc,
> 
> static struct drm_crtc_helper_funcs ltdc_crtc_helper_funcs = {
> 	.load_lut = ltdc_crtc_load_lut,
>-	.enable = ltdc_crtc_enable,
> 	.disable = ltdc_crtc_disable,
> 	.mode_set_nofb = ltdc_crtc_mode_set_nofb,
> 	.atomic_flush = ltdc_crtc_atomic_flush,
>+	.atomic_enable = ltdc_crtc_atomic_enable,
> };
> 
>int ltdc_crtc_enable_vblank(struct drm_device *ddev, unsigned int pipe)
>diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.c
>b/drivers/gpu/drm/sun4i/sun4i_crtc.c
>index f8c70439d1e2..509e4d8014f3 100644
>--- a/drivers/gpu/drm/sun4i/sun4i_crtc.c
>+++ b/drivers/gpu/drm/sun4i/sun4i_crtc.c
>@@ -86,7 +86,8 @@ static void sun4i_crtc_disable(struct drm_crtc *crtc)
> 	}
> }
> 
>-static void sun4i_crtc_enable(struct drm_crtc *crtc)
>+static void sun4i_crtc_atomic_enable(struct drm_crtc *crtc,
>+				     struct drm_crtc_state *old_state)
> {
> 	struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc);
> 
>@@ -98,8 +99,8 @@ static void sun4i_crtc_enable(struct drm_crtc *crtc)
> static const struct drm_crtc_helper_funcs sun4i_crtc_helper_funcs = {
> 	.atomic_begin	= sun4i_crtc_atomic_begin,
> 	.atomic_flush	= sun4i_crtc_atomic_flush,
>+	.atomic_enable	= sun4i_crtc_atomic_enable,
> 	.disable	= sun4i_crtc_disable,
>-	.enable		= sun4i_crtc_enable,
> };
> 
> static int sun4i_crtc_enable_vblank(struct drm_crtc *crtc)
>diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c
>index c875f11786b9..2e0d167cb657 100644
>--- a/drivers/gpu/drm/tegra/dc.c
>+++ b/drivers/gpu/drm/tegra/dc.c
>@@ -1243,7 +1243,8 @@ static void tegra_crtc_disable(struct drm_crtc
>*crtc)
> 	pm_runtime_put_sync(dc->dev);
> }
> 
>-static void tegra_crtc_enable(struct drm_crtc *crtc)
>+static void tegra_crtc_atomic_enable(struct drm_crtc *crtc,
>+				     struct drm_crtc_state *old_state)
> {
> 	struct drm_display_mode *mode = &crtc->state->adjusted_mode;
> 	struct tegra_dc_state *state = to_dc_state(crtc->state);
>@@ -1352,10 +1353,10 @@ static void tegra_crtc_atomic_flush(struct
>drm_crtc *crtc,
> 
> static const struct drm_crtc_helper_funcs tegra_crtc_helper_funcs = {
> 	.disable = tegra_crtc_disable,
>-	.enable = tegra_crtc_enable,
> 	.atomic_check = tegra_crtc_atomic_check,
> 	.atomic_begin = tegra_crtc_atomic_begin,
> 	.atomic_flush = tegra_crtc_atomic_flush,
>+	.atomic_enable = tegra_crtc_atomic_enable,
> };
> 
> static irqreturn_t tegra_dc_irq(int irq, void *data)
>diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
>b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
>index d524ed0d5146..6c5892763d27 100644
>--- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
>+++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
>@@ -504,6 +504,12 @@ static void tilcdc_crtc_enable(struct drm_crtc
>*crtc)
> 	mutex_unlock(&tilcdc_crtc->enable_lock);
> }
> 
>+static void tilcdc_crtc_atomic_enable(struct drm_crtc *crtc,
>+				      struct drm_crtc_state *old_state)
>+{
>+	tilcdc_crtc_enable(crtc);
>+}
>+
> static void tilcdc_crtc_off(struct drm_crtc *crtc, bool shutdown)
> {
> 	struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
>@@ -729,9 +735,9 @@ static const struct drm_crtc_funcs
>tilcdc_crtc_funcs = {
> 
> static const struct drm_crtc_helper_funcs tilcdc_crtc_helper_funcs = {
> 		.mode_fixup     = tilcdc_crtc_mode_fixup,
>-		.enable		= tilcdc_crtc_enable,
> 		.disable	= tilcdc_crtc_disable,
> 		.atomic_check	= tilcdc_crtc_atomic_check,
>+		.atomic_enable	= tilcdc_crtc_atomic_enable,
> };
> 
> int tilcdc_crtc_max_width(struct drm_crtc *crtc)
>diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c
>b/drivers/gpu/drm/vc4/vc4_crtc.c
>index f20c01759c0d..4c03a565b276 100644
>--- a/drivers/gpu/drm/vc4/vc4_crtc.c
>+++ b/drivers/gpu/drm/vc4/vc4_crtc.c
>@@ -533,7 +533,8 @@ static void vc4_crtc_disable(struct drm_crtc *crtc)
> 	}
> }
> 
>-static void vc4_crtc_enable(struct drm_crtc *crtc)
>+static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,
>+				   struct drm_crtc_state *old_state)
> {
> 	struct drm_device *dev = crtc->dev;
> 	struct vc4_dev *vc4 = to_vc4_dev(dev);
>@@ -870,10 +871,10 @@ static const struct drm_crtc_funcs vc4_crtc_funcs
>= {
> static const struct drm_crtc_helper_funcs vc4_crtc_helper_funcs = {
> 	.mode_set_nofb = vc4_crtc_mode_set_nofb,
> 	.disable = vc4_crtc_disable,
>-	.enable = vc4_crtc_enable,
> 	.mode_valid = vc4_crtc_mode_valid,
> 	.atomic_check = vc4_crtc_atomic_check,
> 	.atomic_flush = vc4_crtc_atomic_flush,
>+	.atomic_enable = vc4_crtc_atomic_enable,
> };
> 
> static const struct vc4_crtc_data pv0_data = {
>diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c
>b/drivers/gpu/drm/virtio/virtgpu_display.c
>index d51bd4521f17..03a3c12ed100 100644
>--- a/drivers/gpu/drm/virtio/virtgpu_display.c
>+++ b/drivers/gpu/drm/virtio/virtgpu_display.c
>@@ -113,7 +113,8 @@ static void virtio_gpu_crtc_mode_set_nofb(struct
>drm_crtc *crtc)
> 				   crtc->mode.vdisplay, 0, 0);
> }
> 
>-static void virtio_gpu_crtc_enable(struct drm_crtc *crtc)
>+static void virtio_gpu_crtc_atomic_enable(struct drm_crtc *crtc,
>+					  struct drm_crtc_state *old_state)
> {
> }
> 
>@@ -145,11 +146,11 @@ static void virtio_gpu_crtc_atomic_flush(struct
>drm_crtc *crtc,
> }
> 
>static const struct drm_crtc_helper_funcs virtio_gpu_crtc_helper_funcs
>= {
>-	.enable        = virtio_gpu_crtc_enable,
> 	.disable       = virtio_gpu_crtc_disable,
> 	.mode_set_nofb = virtio_gpu_crtc_mode_set_nofb,
> 	.atomic_check  = virtio_gpu_crtc_atomic_check,
> 	.atomic_flush  = virtio_gpu_crtc_atomic_flush,
>+	.atomic_enable = virtio_gpu_crtc_atomic_enable,
> };
> 
> static void virtio_gpu_enc_mode_set(struct drm_encoder *encoder,
>diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
>b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
>index f8acd3a15523..832b83c582c2 100644
>--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
>+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
>@@ -203,7 +203,7 @@ static void vmw_ldu_crtc_mode_set_nofb(struct
>drm_crtc *crtc)
> }
> 
> /**
>- * vmw_ldu_crtc_helper_enable - Noop
>+ * vmw_ldu_crtc_atomic_enable - Noop
>  *
>  * @crtc: CRTC associated with the new screen
>  *
>@@ -212,7 +212,8 @@ static void vmw_ldu_crtc_mode_set_nofb(struct
>drm_crtc *crtc)
>  * but since for LDU the display plane is closely tied to the
>  * CRTC, it makes more sense to do those at plane update time.
>  */
>-static void vmw_ldu_crtc_helper_enable(struct drm_crtc *crtc)
>+static void vmw_ldu_crtc_atomic_enable(struct drm_crtc *crtc,
>+				       struct drm_crtc_state *old_state)
> {
> }
> 
>@@ -376,12 +377,12 @@ drm_plane_helper_funcs
>vmw_ldu_primary_plane_helper_funcs = {
> };
> 
>static const struct drm_crtc_helper_funcs vmw_ldu_crtc_helper_funcs = {
>-	.enable = vmw_ldu_crtc_helper_enable,
> 	.disable = vmw_ldu_crtc_helper_disable,
> 	.mode_set_nofb = vmw_ldu_crtc_mode_set_nofb,
> 	.atomic_check = vmw_du_crtc_atomic_check,
> 	.atomic_begin = vmw_du_crtc_atomic_begin,
> 	.atomic_flush = vmw_du_crtc_atomic_flush,
>+	.atomic_enable = vmw_ldu_crtc_atomic_enable,
> };
> 
> 
>diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
>b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
>index 1cb826c503bf..8ba3bad06909 100644
>--- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
>+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
>@@ -270,13 +270,14 @@ static void vmw_sou_crtc_helper_prepare(struct
>drm_crtc *crtc)
> }
> 
> /**
>- * vmw_sou_crtc_helper_enable - Noop
>+ * vmw_sou_crtc_atomic_enable - Noop
>  *
>  * @crtc: CRTC associated with the new screen
>  *
>  * This is called after a mode set has been completed.
>  */
>-static void vmw_sou_crtc_helper_enable(struct drm_crtc *crtc)
>+static void vmw_sou_crtc_atomic_enable(struct drm_crtc *crtc,
>+				       struct drm_crtc_state *old_state)
> {
> }
> 
>@@ -573,12 +574,12 @@ drm_plane_helper_funcs
>vmw_sou_primary_plane_helper_funcs = {
> 
>static const struct drm_crtc_helper_funcs vmw_sou_crtc_helper_funcs = {
> 	.prepare = vmw_sou_crtc_helper_prepare,
>-	.enable = vmw_sou_crtc_helper_enable,
> 	.disable = vmw_sou_crtc_helper_disable,
> 	.mode_set_nofb = vmw_sou_crtc_mode_set_nofb,
> 	.atomic_check = vmw_du_crtc_atomic_check,
> 	.atomic_begin = vmw_du_crtc_atomic_begin,
> 	.atomic_flush = vmw_du_crtc_atomic_flush,
>+	.atomic_enable = vmw_sou_crtc_atomic_enable,
> };
> 
> 
>diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
>b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
>index 4eb93b47d6db..f2b39d9c51cc 100644
>--- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
>+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
>@@ -412,7 +412,8 @@ static void vmw_stdu_crtc_helper_prepare(struct
>drm_crtc *crtc)
> }
> 
> 
>-static void vmw_stdu_crtc_helper_enable(struct drm_crtc *crtc)
>+static void vmw_stdu_crtc_atomic_enable(struct drm_crtc *crtc,
>+					struct drm_crtc_state *old_state)
> {
> 	struct vmw_private *dev_priv;
> 	struct vmw_screen_target_display_unit *stdu;
>@@ -1415,12 +1416,12 @@ drm_plane_helper_funcs
>vmw_stdu_primary_plane_helper_funcs = {
> 
> static const struct drm_crtc_helper_funcs vmw_stdu_crtc_helper_fu

-- 
Sent from my Android device with K-9 Mail. Please excuse my brevity.


More information about the dri-devel mailing list