drm: omapdrm: dss: Support passing private data to debugfs show handlers

To simplify implementation of debugfs seq_file show handlers, the driver
passes the pointer to the show function through the debugfs_create_file
data pointer. This prevents using the pointer to pass driver private
data to the show handler, and requires all handlers to use global
variables to access private data.

To prepare for the removal of global private data in the driver, rework
the debugfs infrastructure to allow passing a private data pointer to
show handlers.

The price to pay is explicit removal of debugfs files to free the
internally allocated memory. This is desirable anyway as debugfs entries
should be removed when a component driver is unbound, otherwise crashes
will occur due to access to freed memory when the components will be
dynamically allocated instead of stored in global variables.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
This commit is contained in:
Laurent Pinchart
2018-02-13 14:00:29 +02:00
committed by Tomi Valkeinen
parent 360c21533c
commit f33656e1fe
8 changed files with 141 additions and 63 deletions

View File

@@ -327,6 +327,8 @@ static struct {
struct regulator *vdda_dac_reg;
struct dss_device *dss;
struct dss_debugfs_entry *debugfs;
struct clk *tv_dac_clk;
struct videomode vm;
@@ -670,12 +672,12 @@ static int venc_init_regulator(void)
return 0;
}
static void venc_dump_regs(struct seq_file *s)
static int venc_dump_regs(struct seq_file *s, void *p)
{
#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, venc_read_reg(r))
if (venc_runtime_get())
return;
return 0;
DUMPREG(VENC_F_CONTROL);
DUMPREG(VENC_VIDOUT_CTRL);
@@ -722,6 +724,7 @@ static void venc_dump_regs(struct seq_file *s)
venc_runtime_put();
#undef DUMPREG
return 0;
}
static int venc_get_clocks(struct platform_device *pdev)
@@ -914,7 +917,7 @@ static int venc_bind(struct device *dev, struct device *master, void *data)
goto err_probe_of;
}
dss_debugfs_create_file("venc", venc_dump_regs);
venc.debugfs = dss_debugfs_create_file("venc", venc_dump_regs, &venc);
venc_init_output(pdev);
@@ -930,6 +933,8 @@ static void venc_unbind(struct device *dev, struct device *master, void *data)
{
struct platform_device *pdev = to_platform_device(dev);
dss_debugfs_remove_file(venc.debugfs);
venc_uninit_output(pdev);
pm_runtime_disable(&pdev->dev);