Skip to content

Commit

Permalink
drm: sti: use late_register and early_unregister callbacks
Browse files Browse the repository at this point in the history
Make sti driver use register callback to move debugfs
initialization out of sub-components creation.
This will allow to convert driver .load() to
drm_dev_alloc() and drm_dev_register().

sti_compositor bring up 2 crtc but only one debugfs init is
needed so use drm_crtc_index to do it on the first one.
This can't be done in sti_drv because only sti_compositor have
access to the devices.
It is almost the same for sti_encoder which handle multiple
encoder while one only debugfs entry is needed so add a boolean
to avoid multiple debugfs initialization

Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/1466514580-15194-3-git-send-email-benjamin.gaignard@linaro.org
  • Loading branch information
Benjamin Gaignard authored and Daniel Vetter committed Jun 21, 2016
1 parent a104299 commit 83af0a4
Show file tree
Hide file tree
Showing 16 changed files with 198 additions and 69 deletions.
20 changes: 20 additions & 0 deletions drivers/gpu/drm/sti/sti_compositor.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,26 @@ struct sti_compositor_data stih416_compositor_data = {
},
};

int sti_compositor_debufs_init(struct sti_compositor *compo,
struct drm_minor *minor)
{
int ret = 0, i;

for (i = 0; compo->vid[i]; i++) {
ret = vid_debugfs_init(compo->vid[i], minor);
if (ret)
return ret;
}

for (i = 0; compo->mixer[i]; i++) {
ret = sti_mixer_debugfs_init(compo->mixer[i], minor);
if (ret)
return ret;
}

return 0;
}

static int sti_compositor_bind(struct device *dev,
struct device *master,
void *data)
Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/sti/sti_compositor.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,7 @@ struct sti_compositor {
struct notifier_block vtg_vblank_nb;
};

int sti_compositor_debufs_init(struct sti_compositor *compo,
struct drm_minor *minor);

#endif
12 changes: 12 additions & 0 deletions drivers/gpu/drm/sti/sti_crtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,17 @@ void sti_crtc_disable_vblank(struct drm_device *drm_dev, unsigned int pipe)
}
}

static int sti_crtc_late_register(struct drm_crtc *crtc)
{
struct sti_mixer *mixer = to_sti_mixer(crtc);
struct sti_compositor *compo = dev_get_drvdata(mixer->dev);

if (drm_crtc_index(crtc) == 0)
return sti_compositor_debufs_init(compo, crtc->dev->primary);

return 0;
}

static const struct drm_crtc_funcs sti_crtc_funcs = {
.set_config = drm_atomic_helper_set_config,
.page_flip = drm_atomic_helper_page_flip,
Expand All @@ -339,6 +350,7 @@ static const struct drm_crtc_funcs sti_crtc_funcs = {
.reset = drm_atomic_helper_crtc_reset,
.atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
.late_register = sti_crtc_late_register,
};

bool sti_crtc_is_main(struct drm_crtc *crtc)
Expand Down
32 changes: 28 additions & 4 deletions drivers/gpu/drm/sti/sti_cursor.c
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,33 @@ 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_helper_disable(drm_plane);
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);
struct sti_cursor *cursor = to_sti_cursor(plane);

return cursor_debugfs_init(cursor, drm_plane->dev->primary);
}

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,
.set_property = sti_plane_set_property,
.reset = drm_atomic_helper_plane_reset,
.atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
.late_register = sti_cursor_late_register,
};

struct drm_plane *sti_cursor_create(struct drm_device *drm_dev,
struct device *dev, int desc,
void __iomem *baseaddr,
Expand Down Expand Up @@ -363,7 +390,7 @@ struct drm_plane *sti_cursor_create(struct drm_device *drm_dev,

res = drm_universal_plane_init(drm_dev, &cursor->plane.drm_plane,
possible_crtcs,
&sti_plane_helpers_funcs,
&sti_cursor_plane_helpers_funcs,
cursor_supported_formats,
ARRAY_SIZE(cursor_supported_formats),
DRM_PLANE_TYPE_CURSOR, NULL);
Expand All @@ -377,9 +404,6 @@ struct drm_plane *sti_cursor_create(struct drm_device *drm_dev,

sti_plane_init_property(&cursor->plane, DRM_PLANE_TYPE_CURSOR);

if (cursor_debugfs_init(cursor, drm_dev->primary))
DRM_ERROR("CURSOR debugfs setup failed\n");

return &cursor->plane.drm_plane;

err_plane:
Expand Down
18 changes: 10 additions & 8 deletions drivers/gpu/drm/sti/sti_dvo.c
Original file line number Diff line number Diff line change
Expand Up @@ -404,24 +404,29 @@ sti_dvo_connector_detect(struct drm_connector *connector, bool force)
return connector_status_disconnected;
}

static void sti_dvo_connector_destroy(struct drm_connector *connector)
static int sti_dvo_late_register(struct drm_connector *connector)
{
struct sti_dvo_connector *dvo_connector
= to_sti_dvo_connector(connector);
struct sti_dvo *dvo = dvo_connector->dvo;

if (dvo_debugfs_init(dvo, dvo->drm_dev->primary)) {
DRM_ERROR("DVO debugfs setup failed\n");
return -EINVAL;
}

drm_connector_unregister(connector);
drm_connector_cleanup(connector);
kfree(dvo_connector);
return 0;
}

static const struct drm_connector_funcs sti_dvo_connector_funcs = {
.dpms = drm_atomic_helper_connector_dpms,
.fill_modes = drm_helper_probe_single_connector_modes,
.detect = sti_dvo_connector_detect,
.destroy = sti_dvo_connector_destroy,
.destroy = drm_connector_cleanup,
.reset = drm_atomic_helper_connector_reset,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
.late_register = sti_dvo_late_register,
};

static struct drm_encoder *sti_dvo_find_encoder(struct drm_device *dev)
Expand Down Expand Up @@ -502,9 +507,6 @@ static int sti_dvo_bind(struct device *dev, struct device *master, void *data)
goto err_sysfs;
}

if (dvo_debugfs_init(dvo, drm_dev->primary))
DRM_ERROR("DVO debugfs setup failed\n");

return 0;

err_sysfs:
Expand Down
32 changes: 28 additions & 4 deletions drivers/gpu/drm/sti/sti_gdp.c
Original file line number Diff line number Diff line change
Expand Up @@ -866,6 +866,33 @@ 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_helper_disable(drm_plane);
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);
struct sti_gdp *gdp = to_sti_gdp(plane);

return gdp_debugfs_init(gdp, drm_plane->dev->primary);
}

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,
.set_property = sti_plane_set_property,
.reset = drm_atomic_helper_plane_reset,
.atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
.late_register = sti_gdp_late_register,
};

struct drm_plane *sti_gdp_create(struct drm_device *drm_dev,
struct device *dev, int desc,
void __iomem *baseaddr,
Expand All @@ -892,7 +919,7 @@ struct drm_plane *sti_gdp_create(struct drm_device *drm_dev,

res = drm_universal_plane_init(drm_dev, &gdp->plane.drm_plane,
possible_crtcs,
&sti_plane_helpers_funcs,
&sti_gdp_plane_helpers_funcs,
gdp_supported_formats,
ARRAY_SIZE(gdp_supported_formats),
type, NULL);
Expand All @@ -905,9 +932,6 @@ struct drm_plane *sti_gdp_create(struct drm_device *drm_dev,

sti_plane_init_property(&gdp->plane, type);

if (gdp_debugfs_init(gdp, drm_dev->primary))
DRM_ERROR("GDP debugfs setup failed\n");

return &gdp->plane.drm_plane;

err:
Expand Down
18 changes: 10 additions & 8 deletions drivers/gpu/drm/sti/sti_hda.c
Original file line number Diff line number Diff line change
Expand Up @@ -681,24 +681,29 @@ sti_hda_connector_detect(struct drm_connector *connector, bool force)
return connector_status_connected;
}

static void sti_hda_connector_destroy(struct drm_connector *connector)
static int sti_hda_late_register(struct drm_connector *connector)
{
struct sti_hda_connector *hda_connector
= to_sti_hda_connector(connector);
struct sti_hda *hda = hda_connector->hda;

if (hda_debugfs_init(hda, hda->drm_dev->primary)) {
DRM_ERROR("HDA debugfs setup failed\n");
return -EINVAL;
}

drm_connector_unregister(connector);
drm_connector_cleanup(connector);
kfree(hda_connector);
return 0;
}

static const struct drm_connector_funcs sti_hda_connector_funcs = {
.dpms = drm_atomic_helper_connector_dpms,
.fill_modes = drm_helper_probe_single_connector_modes,
.detect = sti_hda_connector_detect,
.destroy = sti_hda_connector_destroy,
.destroy = drm_connector_cleanup,
.reset = drm_atomic_helper_connector_reset,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
.late_register = sti_hda_late_register,
};

static struct drm_encoder *sti_hda_find_encoder(struct drm_device *dev)
Expand Down Expand Up @@ -769,9 +774,6 @@ static int sti_hda_bind(struct device *dev, struct device *master, void *data)
/* force to disable hd dacs at startup */
hda_enable_hd_dacs(hda, false);

if (hda_debugfs_init(hda, drm_dev->primary))
DRM_ERROR("HDA debugfs setup failed\n");

return 0;

err_sysfs:
Expand Down
19 changes: 15 additions & 4 deletions drivers/gpu/drm/sti/sti_hdmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1007,8 +1007,21 @@ sti_hdmi_connector_get_property(struct drm_connector *connector,
return -EINVAL;
}

static int sti_hdmi_late_register(struct drm_connector *connector)
{
struct sti_hdmi_connector *hdmi_connector
= to_sti_hdmi_connector(connector);
struct sti_hdmi *hdmi = hdmi_connector->hdmi;

if (hdmi_debugfs_init(hdmi, hdmi->drm_dev->primary)) {
DRM_ERROR("HDMI debugfs setup failed\n");
return -EINVAL;
}

return 0;
}

static const struct drm_connector_funcs sti_hdmi_connector_funcs = {
.dpms = drm_atomic_helper_connector_dpms,
.fill_modes = drm_helper_probe_single_connector_modes,
.detect = sti_hdmi_connector_detect,
.destroy = sti_hdmi_connector_destroy,
Expand All @@ -1018,6 +1031,7 @@ static const struct drm_connector_funcs sti_hdmi_connector_funcs = {
.atomic_get_property = sti_hdmi_connector_get_property,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
.late_register = sti_hdmi_late_register,
};

static struct drm_encoder *sti_hdmi_find_encoder(struct drm_device *dev)
Expand Down Expand Up @@ -1091,9 +1105,6 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)
/* Enable default interrupts */
hdmi_write(hdmi, HDMI_DEFAULT_INT, HDMI_INT_EN);

if (hdmi_debugfs_init(hdmi, drm_dev->primary))
DRM_ERROR("HDMI debugfs setup failed\n");

return 0;

err_sysfs:
Expand Down
32 changes: 28 additions & 4 deletions drivers/gpu/drm/sti/sti_hqvdp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1234,6 +1234,33 @@ 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_helper_disable(drm_plane);
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);
struct sti_hqvdp *hqvdp = to_sti_hqvdp(plane);

return hqvdp_debugfs_init(hqvdp, drm_plane->dev->primary);
}

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,
.set_property = sti_plane_set_property,
.reset = drm_atomic_helper_plane_reset,
.atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
.late_register = sti_hqvdp_late_register,
};

static struct drm_plane *sti_hqvdp_create(struct drm_device *drm_dev,
struct device *dev, int desc)
{
Expand All @@ -1246,7 +1273,7 @@ static struct drm_plane *sti_hqvdp_create(struct drm_device *drm_dev,
sti_hqvdp_init(hqvdp);

res = drm_universal_plane_init(drm_dev, &hqvdp->plane.drm_plane, 1,
&sti_plane_helpers_funcs,
&sti_hqvdp_plane_helpers_funcs,
hqvdp_supported_formats,
ARRAY_SIZE(hqvdp_supported_formats),
DRM_PLANE_TYPE_OVERLAY, NULL);
Expand All @@ -1259,9 +1286,6 @@ static struct drm_plane *sti_hqvdp_create(struct drm_device *drm_dev,

sti_plane_init_property(&hqvdp->plane, DRM_PLANE_TYPE_OVERLAY);

if (hqvdp_debugfs_init(hqvdp, drm_dev->primary))
DRM_ERROR("HQVDP debugfs setup failed\n");

return &hqvdp->plane.drm_plane;
}

Expand Down
5 changes: 1 addition & 4 deletions drivers/gpu/drm/sti/sti_mixer.c
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ static struct drm_info_list mixer1_debugfs_files[] = {
{ "mixer_aux", mixer_dbg_show, 0, NULL },
};

static int mixer_debugfs_init(struct sti_mixer *mixer, struct drm_minor *minor)
int sti_mixer_debugfs_init(struct sti_mixer *mixer, struct drm_minor *minor)
{
unsigned int i;
struct drm_info_list *mixer_debugfs_files;
Expand Down Expand Up @@ -393,8 +393,5 @@ struct sti_mixer *sti_mixer_create(struct device *dev,
DRM_DEBUG_DRIVER("%s created. Regs=%p\n",
sti_mixer_to_str(mixer), mixer->regs);

if (mixer_debugfs_init(mixer, drm_dev->primary))
DRM_ERROR("MIXER debugfs setup failed\n");

return mixer;
}
2 changes: 2 additions & 0 deletions drivers/gpu/drm/sti/sti_mixer.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ int sti_mixer_active_video_area(struct sti_mixer *mixer,

void sti_mixer_set_background_status(struct sti_mixer *mixer, bool enable);

int sti_mixer_debugfs_init(struct sti_mixer *mixer, struct drm_minor *minor);

/* depth in Cross-bar control = z order */
#define GAM_MIXER_NB_DEPTH_LEVEL 6

Expand Down
Loading

0 comments on commit 83af0a4

Please sign in to comment.