diff mbox series

drm/sti: clean up after drm_atomic_helper_shutdown rework

Message ID 20181012094639.1585-2-benjamin.gaignard@linaro.org
State Superseded
Headers show
Series drm/sti: clean up after drm_atomic_helper_shutdown rework | expand

Commit Message

Benjamin Gaignard Oct. 12, 2018, 9:46 a.m. UTC
Since drm_atomic_helper_shutdown() rework it is possible to do additional
clean up in sti driver: custom plane destroy functions become useless and
clean up encoder is no more needed.

Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>

---
 drivers/gpu/drm/sti/sti_cursor.c |  9 +--------
 drivers/gpu/drm/sti/sti_gdp.c    |  9 +--------
 drivers/gpu/drm/sti/sti_hqvdp.c  |  9 +--------
 drivers/gpu/drm/sti/sti_tvout.c  | 24 ------------------------
 4 files changed, 3 insertions(+), 48 deletions(-)

-- 
2.15.0

Comments

Benjamin Gaignard Oct. 16, 2018, 6:30 p.m. UTC | #1
Le lun. 15 oct. 2018 à 10:00, Daniel Vetter <daniel@ffwll.ch> a écrit :
>

> On Fri, Oct 12, 2018 at 11:46:39AM +0200, Benjamin Gaignard wrote:

> > Since drm_atomic_helper_shutdown() rework it is possible to do additional

> > clean up in sti driver: custom plane destroy functions become useless and

> > clean up encoder is no more needed.

> >

> > Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>

> > ---

> >  drivers/gpu/drm/sti/sti_cursor.c |  9 +--------

> >  drivers/gpu/drm/sti/sti_gdp.c    |  9 +--------

> >  drivers/gpu/drm/sti/sti_hqvdp.c  |  9 +--------

> >  drivers/gpu/drm/sti/sti_tvout.c  | 24 ------------------------

> >  4 files changed, 3 insertions(+), 48 deletions(-)

> >

> > diff --git a/drivers/gpu/drm/sti/sti_cursor.c b/drivers/gpu/drm/sti/sti_cursor.c

> > index bc908453ffb3..e1ba253055c7 100644

> > --- a/drivers/gpu/drm/sti/sti_cursor.c

> > +++ b/drivers/gpu/drm/sti/sti_cursor.c

> > @@ -328,13 +328,6 @@ static const struct drm_plane_helper_funcs sti_cursor_helpers_funcs = {

> >       .atomic_disable = sti_cursor_atomic_disable,

> >  };

> >

> > -static void sti_cursor_destroy(struct drm_plane *drm_plane)

> > -{

> > -     DRM_DEBUG_DRIVER("\n");

> > -

> > -     drm_plane_cleanup(drm_plane);

> > -}

> > -

> >  static int sti_cursor_late_register(struct drm_plane *drm_plane)

> >  {

> >       struct sti_plane *plane = to_sti_plane(drm_plane);

> > @@ -346,7 +339,7 @@ static int sti_cursor_late_register(struct drm_plane *drm_plane)

> >  static const struct drm_plane_funcs sti_cursor_plane_helpers_funcs = {

> >       .update_plane = drm_atomic_helper_update_plane,

> >       .disable_plane = drm_atomic_helper_disable_plane,

> > -     .destroy = sti_cursor_destroy,

> > +     .destroy = drm_plane_cleanup,

> >       .reset = sti_plane_reset,

> >       .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,

> >       .atomic_destroy_state = drm_atomic_helper_plane_destroy_state,

> > diff --git a/drivers/gpu/drm/sti/sti_gdp.c b/drivers/gpu/drm/sti/sti_gdp.c

> > index 3c19614d3f75..87b50451afd7 100644

> > --- a/drivers/gpu/drm/sti/sti_gdp.c

> > +++ b/drivers/gpu/drm/sti/sti_gdp.c

> > @@ -879,13 +879,6 @@ static const struct drm_plane_helper_funcs sti_gdp_helpers_funcs = {

> >       .atomic_disable = sti_gdp_atomic_disable,

> >  };

> >

> > -static void sti_gdp_destroy(struct drm_plane *drm_plane)

> > -{

> > -     DRM_DEBUG_DRIVER("\n");

> > -

> > -     drm_plane_cleanup(drm_plane);

> > -}

> > -

> >  static int sti_gdp_late_register(struct drm_plane *drm_plane)

> >  {

> >       struct sti_plane *plane = to_sti_plane(drm_plane);

> > @@ -897,7 +890,7 @@ static int sti_gdp_late_register(struct drm_plane *drm_plane)

> >  static const struct drm_plane_funcs sti_gdp_plane_helpers_funcs = {

> >       .update_plane = drm_atomic_helper_update_plane,

> >       .disable_plane = drm_atomic_helper_disable_plane,

> > -     .destroy = sti_gdp_destroy,

> > +     .destroy = drm_plane_cleanup,

> >       .reset = sti_plane_reset,

> >       .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,

> >       .atomic_destroy_state = drm_atomic_helper_plane_destroy_state,

> > diff --git a/drivers/gpu/drm/sti/sti_hqvdp.c b/drivers/gpu/drm/sti/sti_hqvdp.c

> > index 23565f52dd71..065a5b08a702 100644

> > --- a/drivers/gpu/drm/sti/sti_hqvdp.c

> > +++ b/drivers/gpu/drm/sti/sti_hqvdp.c

> > @@ -1256,13 +1256,6 @@ static const struct drm_plane_helper_funcs sti_hqvdp_helpers_funcs = {

> >       .atomic_disable = sti_hqvdp_atomic_disable,

> >  };

> >

> > -static void sti_hqvdp_destroy(struct drm_plane *drm_plane)

> > -{

> > -     DRM_DEBUG_DRIVER("\n");

> > -

> > -     drm_plane_cleanup(drm_plane);

> > -}

> > -

> >  static int sti_hqvdp_late_register(struct drm_plane *drm_plane)

> >  {

> >       struct sti_plane *plane = to_sti_plane(drm_plane);

> > @@ -1274,7 +1267,7 @@ static int sti_hqvdp_late_register(struct drm_plane *drm_plane)

> >  static const struct drm_plane_funcs sti_hqvdp_plane_helpers_funcs = {

> >       .update_plane = drm_atomic_helper_update_plane,

> >       .disable_plane = drm_atomic_helper_disable_plane,

> > -     .destroy = sti_hqvdp_destroy,

> > +     .destroy = drm_plane_cleanup,

> >       .reset = sti_plane_reset,

> >       .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,

> >       .atomic_destroy_state = drm_atomic_helper_plane_destroy_state,

> > diff --git a/drivers/gpu/drm/sti/sti_tvout.c b/drivers/gpu/drm/sti/sti_tvout.c

> > index ea4a3b87fa55..4dc3b2ec40eb 100644

> > --- a/drivers/gpu/drm/sti/sti_tvout.c

> > +++ b/drivers/gpu/drm/sti/sti_tvout.c

> > @@ -788,21 +788,6 @@ static void sti_tvout_create_encoders(struct drm_device *dev,

> >       tvout->dvo = sti_tvout_create_dvo_encoder(dev, tvout);

> >  }

> >

> > -static void sti_tvout_destroy_encoders(struct sti_tvout *tvout)

> > -{

> > -     if (tvout->hdmi)

> > -             drm_encoder_cleanup(tvout->hdmi);

> > -     tvout->hdmi = NULL;

> > -

> > -     if (tvout->hda)

> > -             drm_encoder_cleanup(tvout->hda);

> > -     tvout->hda = NULL;

> > -

> > -     if (tvout->dvo)

> > -             drm_encoder_cleanup(tvout->dvo);

> > -     tvout->dvo = NULL;

> > -}

> > -

> >  static int sti_tvout_bind(struct device *dev, struct device *master, void *data)

> >  {

> >       struct sti_tvout *tvout = dev_get_drvdata(dev);

> > @@ -815,17 +800,8 @@ static int sti_tvout_bind(struct device *dev, struct device *master, void *data)

> >       return 0;

> >  }

> >

> > -static void sti_tvout_unbind(struct device *dev, struct device *master,

> > -     void *data)

> > -{

> > -     struct sti_tvout *tvout = dev_get_drvdata(dev);

> > -

> > -     sti_tvout_destroy_encoders(tvout);

> > -}

> > -

> >  static const struct component_ops sti_tvout_ops = {

> >       .bind   = sti_tvout_bind,

> > -     .unbind = sti_tvout_unbind,

>

> Hm, this here looks strange now. I'd put a comment somewhere that

> master_ops->unbind cleans up everything. Either way:

>

> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>


Hi Daniel,

unbind undo what has been done in bind even the functions aren't symetric:
encoder creation are done is this level of the driver while they
destruction is done
in the top level of the driver by calling drm shutdown function. From
module point of view
bind and unbind are balanced correctly.
I have test it on board :-)

I will not merge this patch until I get a clear review from you.

Regards,
Benjamin
>

> >  };

> >

> >  static int sti_tvout_probe(struct platform_device *pdev)

> > --

> > 2.15.0

> >

>

> --

> Daniel Vetter

> Software Engineer, Intel Corporation

> http://blog.ffwll.ch
Daniel Vetter Oct. 16, 2018, 7:15 p.m. UTC | #2
On Tue, Oct 16, 2018 at 8:30 PM Benjamin Gaignard
<benjamin.gaignard@linaro.org> wrote:
>

> Le lun. 15 oct. 2018 à 10:00, Daniel Vetter <daniel@ffwll.ch> a écrit :

> >

> > On Fri, Oct 12, 2018 at 11:46:39AM +0200, Benjamin Gaignard wrote:

> > > Since drm_atomic_helper_shutdown() rework it is possible to do additional

> > > clean up in sti driver: custom plane destroy functions become useless and

> > > clean up encoder is no more needed.

> > >

> > > Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>

> > > ---

> > >  drivers/gpu/drm/sti/sti_cursor.c |  9 +--------

> > >  drivers/gpu/drm/sti/sti_gdp.c    |  9 +--------

> > >  drivers/gpu/drm/sti/sti_hqvdp.c  |  9 +--------

> > >  drivers/gpu/drm/sti/sti_tvout.c  | 24 ------------------------

> > >  4 files changed, 3 insertions(+), 48 deletions(-)

> > >

> > > diff --git a/drivers/gpu/drm/sti/sti_cursor.c b/drivers/gpu/drm/sti/sti_cursor.c

> > > index bc908453ffb3..e1ba253055c7 100644

> > > --- a/drivers/gpu/drm/sti/sti_cursor.c

> > > +++ b/drivers/gpu/drm/sti/sti_cursor.c

> > > @@ -328,13 +328,6 @@ static const struct drm_plane_helper_funcs sti_cursor_helpers_funcs = {

> > >       .atomic_disable = sti_cursor_atomic_disable,

> > >  };

> > >

> > > -static void sti_cursor_destroy(struct drm_plane *drm_plane)

> > > -{

> > > -     DRM_DEBUG_DRIVER("\n");

> > > -

> > > -     drm_plane_cleanup(drm_plane);

> > > -}

> > > -

> > >  static int sti_cursor_late_register(struct drm_plane *drm_plane)

> > >  {

> > >       struct sti_plane *plane = to_sti_plane(drm_plane);

> > > @@ -346,7 +339,7 @@ static int sti_cursor_late_register(struct drm_plane *drm_plane)

> > >  static const struct drm_plane_funcs sti_cursor_plane_helpers_funcs = {

> > >       .update_plane = drm_atomic_helper_update_plane,

> > >       .disable_plane = drm_atomic_helper_disable_plane,

> > > -     .destroy = sti_cursor_destroy,

> > > +     .destroy = drm_plane_cleanup,

> > >       .reset = sti_plane_reset,

> > >       .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,

> > >       .atomic_destroy_state = drm_atomic_helper_plane_destroy_state,

> > > diff --git a/drivers/gpu/drm/sti/sti_gdp.c b/drivers/gpu/drm/sti/sti_gdp.c

> > > index 3c19614d3f75..87b50451afd7 100644

> > > --- a/drivers/gpu/drm/sti/sti_gdp.c

> > > +++ b/drivers/gpu/drm/sti/sti_gdp.c

> > > @@ -879,13 +879,6 @@ static const struct drm_plane_helper_funcs sti_gdp_helpers_funcs = {

> > >       .atomic_disable = sti_gdp_atomic_disable,

> > >  };

> > >

> > > -static void sti_gdp_destroy(struct drm_plane *drm_plane)

> > > -{

> > > -     DRM_DEBUG_DRIVER("\n");

> > > -

> > > -     drm_plane_cleanup(drm_plane);

> > > -}

> > > -

> > >  static int sti_gdp_late_register(struct drm_plane *drm_plane)

> > >  {

> > >       struct sti_plane *plane = to_sti_plane(drm_plane);

> > > @@ -897,7 +890,7 @@ static int sti_gdp_late_register(struct drm_plane *drm_plane)

> > >  static const struct drm_plane_funcs sti_gdp_plane_helpers_funcs = {

> > >       .update_plane = drm_atomic_helper_update_plane,

> > >       .disable_plane = drm_atomic_helper_disable_plane,

> > > -     .destroy = sti_gdp_destroy,

> > > +     .destroy = drm_plane_cleanup,

> > >       .reset = sti_plane_reset,

> > >       .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,

> > >       .atomic_destroy_state = drm_atomic_helper_plane_destroy_state,

> > > diff --git a/drivers/gpu/drm/sti/sti_hqvdp.c b/drivers/gpu/drm/sti/sti_hqvdp.c

> > > index 23565f52dd71..065a5b08a702 100644

> > > --- a/drivers/gpu/drm/sti/sti_hqvdp.c

> > > +++ b/drivers/gpu/drm/sti/sti_hqvdp.c

> > > @@ -1256,13 +1256,6 @@ static const struct drm_plane_helper_funcs sti_hqvdp_helpers_funcs = {

> > >       .atomic_disable = sti_hqvdp_atomic_disable,

> > >  };

> > >

> > > -static void sti_hqvdp_destroy(struct drm_plane *drm_plane)

> > > -{

> > > -     DRM_DEBUG_DRIVER("\n");

> > > -

> > > -     drm_plane_cleanup(drm_plane);

> > > -}

> > > -

> > >  static int sti_hqvdp_late_register(struct drm_plane *drm_plane)

> > >  {

> > >       struct sti_plane *plane = to_sti_plane(drm_plane);

> > > @@ -1274,7 +1267,7 @@ static int sti_hqvdp_late_register(struct drm_plane *drm_plane)

> > >  static const struct drm_plane_funcs sti_hqvdp_plane_helpers_funcs = {

> > >       .update_plane = drm_atomic_helper_update_plane,

> > >       .disable_plane = drm_atomic_helper_disable_plane,

> > > -     .destroy = sti_hqvdp_destroy,

> > > +     .destroy = drm_plane_cleanup,

> > >       .reset = sti_plane_reset,

> > >       .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,

> > >       .atomic_destroy_state = drm_atomic_helper_plane_destroy_state,

> > > diff --git a/drivers/gpu/drm/sti/sti_tvout.c b/drivers/gpu/drm/sti/sti_tvout.c

> > > index ea4a3b87fa55..4dc3b2ec40eb 100644

> > > --- a/drivers/gpu/drm/sti/sti_tvout.c

> > > +++ b/drivers/gpu/drm/sti/sti_tvout.c

> > > @@ -788,21 +788,6 @@ static void sti_tvout_create_encoders(struct drm_device *dev,

> > >       tvout->dvo = sti_tvout_create_dvo_encoder(dev, tvout);

> > >  }

> > >

> > > -static void sti_tvout_destroy_encoders(struct sti_tvout *tvout)

> > > -{

> > > -     if (tvout->hdmi)

> > > -             drm_encoder_cleanup(tvout->hdmi);

> > > -     tvout->hdmi = NULL;

> > > -

> > > -     if (tvout->hda)

> > > -             drm_encoder_cleanup(tvout->hda);

> > > -     tvout->hda = NULL;

> > > -

> > > -     if (tvout->dvo)

> > > -             drm_encoder_cleanup(tvout->dvo);

> > > -     tvout->dvo = NULL;

> > > -}

> > > -

> > >  static int sti_tvout_bind(struct device *dev, struct device *master, void *data)

> > >  {

> > >       struct sti_tvout *tvout = dev_get_drvdata(dev);

> > > @@ -815,17 +800,8 @@ static int sti_tvout_bind(struct device *dev, struct device *master, void *data)

> > >       return 0;

> > >  }

> > >

> > > -static void sti_tvout_unbind(struct device *dev, struct device *master,

> > > -     void *data)

> > > -{

> > > -     struct sti_tvout *tvout = dev_get_drvdata(dev);

> > > -

> > > -     sti_tvout_destroy_encoders(tvout);

> > > -}

> > > -

> > >  static const struct component_ops sti_tvout_ops = {

> > >       .bind   = sti_tvout_bind,

> > > -     .unbind = sti_tvout_unbind,

> >

> > Hm, this here looks strange now. I'd put a comment somewhere that

> > master_ops->unbind cleans up everything. Either way:

> >

> > Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>

>

> Hi Daniel,

>

> unbind undo what has been done in bind even the functions aren't symetric:

> encoder creation are done is this level of the driver while they

> destruction is done

> in the top level of the driver by calling drm shutdown function. From

> module point of view

> bind and unbind are balanced correctly.

> I have test it on board :-)


Yes that's my understanding too, but then I stumbled over this revert
(I cc'ed you on it):

https://lore.kernel.org/patchwork/patch/1000524/

Now I'm not sure anymore whether my r-b is correct. What happens if
only one of the components gets unbound, and not the top level?

> I will not merge this patch until I get a clear review from you.


You had one, but I just retracted it because of the revert ...
-Daniel

>

> Regards,

> Benjamin

> >

> > >  };

> > >

> > >  static int sti_tvout_probe(struct platform_device *pdev)

> > > --

> > > 2.15.0

> > >

> >

> > --

> > Daniel Vetter

> > Software Engineer, Intel Corporation

> > http://blog.ffwll.ch




-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
diff mbox series

Patch

diff --git a/drivers/gpu/drm/sti/sti_cursor.c b/drivers/gpu/drm/sti/sti_cursor.c
index bc908453ffb3..e1ba253055c7 100644
--- a/drivers/gpu/drm/sti/sti_cursor.c
+++ b/drivers/gpu/drm/sti/sti_cursor.c
@@ -328,13 +328,6 @@  static const struct drm_plane_helper_funcs sti_cursor_helpers_funcs = {
 	.atomic_disable = sti_cursor_atomic_disable,
 };
 
-static void sti_cursor_destroy(struct drm_plane *drm_plane)
-{
-	DRM_DEBUG_DRIVER("\n");
-
-	drm_plane_cleanup(drm_plane);
-}
-
 static int sti_cursor_late_register(struct drm_plane *drm_plane)
 {
 	struct sti_plane *plane = to_sti_plane(drm_plane);
@@ -346,7 +339,7 @@  static int sti_cursor_late_register(struct drm_plane *drm_plane)
 static const struct drm_plane_funcs sti_cursor_plane_helpers_funcs = {
 	.update_plane = drm_atomic_helper_update_plane,
 	.disable_plane = drm_atomic_helper_disable_plane,
-	.destroy = sti_cursor_destroy,
+	.destroy = drm_plane_cleanup,
 	.reset = sti_plane_reset,
 	.atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
 	.atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
diff --git a/drivers/gpu/drm/sti/sti_gdp.c b/drivers/gpu/drm/sti/sti_gdp.c
index 3c19614d3f75..87b50451afd7 100644
--- a/drivers/gpu/drm/sti/sti_gdp.c
+++ b/drivers/gpu/drm/sti/sti_gdp.c
@@ -879,13 +879,6 @@  static const struct drm_plane_helper_funcs sti_gdp_helpers_funcs = {
 	.atomic_disable = sti_gdp_atomic_disable,
 };
 
-static void sti_gdp_destroy(struct drm_plane *drm_plane)
-{
-	DRM_DEBUG_DRIVER("\n");
-
-	drm_plane_cleanup(drm_plane);
-}
-
 static int sti_gdp_late_register(struct drm_plane *drm_plane)
 {
 	struct sti_plane *plane = to_sti_plane(drm_plane);
@@ -897,7 +890,7 @@  static int sti_gdp_late_register(struct drm_plane *drm_plane)
 static const struct drm_plane_funcs sti_gdp_plane_helpers_funcs = {
 	.update_plane = drm_atomic_helper_update_plane,
 	.disable_plane = drm_atomic_helper_disable_plane,
-	.destroy = sti_gdp_destroy,
+	.destroy = drm_plane_cleanup,
 	.reset = sti_plane_reset,
 	.atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
 	.atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
diff --git a/drivers/gpu/drm/sti/sti_hqvdp.c b/drivers/gpu/drm/sti/sti_hqvdp.c
index 23565f52dd71..065a5b08a702 100644
--- a/drivers/gpu/drm/sti/sti_hqvdp.c
+++ b/drivers/gpu/drm/sti/sti_hqvdp.c
@@ -1256,13 +1256,6 @@  static const struct drm_plane_helper_funcs sti_hqvdp_helpers_funcs = {
 	.atomic_disable = sti_hqvdp_atomic_disable,
 };
 
-static void sti_hqvdp_destroy(struct drm_plane *drm_plane)
-{
-	DRM_DEBUG_DRIVER("\n");
-
-	drm_plane_cleanup(drm_plane);
-}
-
 static int sti_hqvdp_late_register(struct drm_plane *drm_plane)
 {
 	struct sti_plane *plane = to_sti_plane(drm_plane);
@@ -1274,7 +1267,7 @@  static int sti_hqvdp_late_register(struct drm_plane *drm_plane)
 static const struct drm_plane_funcs sti_hqvdp_plane_helpers_funcs = {
 	.update_plane = drm_atomic_helper_update_plane,
 	.disable_plane = drm_atomic_helper_disable_plane,
-	.destroy = sti_hqvdp_destroy,
+	.destroy = drm_plane_cleanup,
 	.reset = sti_plane_reset,
 	.atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
 	.atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
diff --git a/drivers/gpu/drm/sti/sti_tvout.c b/drivers/gpu/drm/sti/sti_tvout.c
index ea4a3b87fa55..4dc3b2ec40eb 100644
--- a/drivers/gpu/drm/sti/sti_tvout.c
+++ b/drivers/gpu/drm/sti/sti_tvout.c
@@ -788,21 +788,6 @@  static void sti_tvout_create_encoders(struct drm_device *dev,
 	tvout->dvo = sti_tvout_create_dvo_encoder(dev, tvout);
 }
 
-static void sti_tvout_destroy_encoders(struct sti_tvout *tvout)
-{
-	if (tvout->hdmi)
-		drm_encoder_cleanup(tvout->hdmi);
-	tvout->hdmi = NULL;
-
-	if (tvout->hda)
-		drm_encoder_cleanup(tvout->hda);
-	tvout->hda = NULL;
-
-	if (tvout->dvo)
-		drm_encoder_cleanup(tvout->dvo);
-	tvout->dvo = NULL;
-}
-
 static int sti_tvout_bind(struct device *dev, struct device *master, void *data)
 {
 	struct sti_tvout *tvout = dev_get_drvdata(dev);
@@ -815,17 +800,8 @@  static int sti_tvout_bind(struct device *dev, struct device *master, void *data)
 	return 0;
 }
 
-static void sti_tvout_unbind(struct device *dev, struct device *master,
-	void *data)
-{
-	struct sti_tvout *tvout = dev_get_drvdata(dev);
-
-	sti_tvout_destroy_encoders(tvout);
-}
-
 static const struct component_ops sti_tvout_ops = {
 	.bind	= sti_tvout_bind,
-	.unbind	= sti_tvout_unbind,
 };
 
 static int sti_tvout_probe(struct platform_device *pdev)