summaryrefslogtreecommitdiff
path: root/drivers/media
diff options
context:
space:
mode:
authorAdam Jiang <chaoj@nvidia.com>2012-02-16 19:02:56 +0900
committerRohan Somvanshi <rsomvanshi@nvidia.com>2012-02-17 08:00:47 -0800
commit108094ba6375c83ae671ed02bc821d51aaeab068 (patch)
tree1cadb66e34582b4f0122915194711e71b1af803e /drivers/media
parentf3636b910624bcc823a03fe03c40e71d1a5be0bb (diff)
dtv: Fixed file-private_data assigned error
NULL pointer caused kernel crash when tegra_dtv driver was opened. This patch fixed the bug. fixed Bug 940932 Change-Id: I09f8caff789ea8e1222f4afd9bf73ef890472583 Signed-off-by: Adam Jiang <chaoj@nvidia.com> Reviewed-on: http://git-master/r/84284 Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/video/tegra/tegra_dtv.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/media/video/tegra/tegra_dtv.c b/drivers/media/video/tegra/tegra_dtv.c
index 9d5100c1af62..e1e2596007f6 100644
--- a/drivers/media/video/tegra/tegra_dtv.c
+++ b/drivers/media/video/tegra/tegra_dtv.c
@@ -154,6 +154,7 @@ struct tegra_dtv_context {
struct dentry *d;
/* for refer back */
struct platform_device *pdev;
+ struct miscdevice miscdev;
};
static inline struct tegra_dtv_context *to_ctx(struct dtv_stream *s)
@@ -618,7 +619,10 @@ static ssize_t tegra_dtv_read(struct file *file, char __user *buf,
static int tegra_dtv_open(struct inode *inode, struct file *file)
{
int i;
- struct tegra_dtv_context *dtv_ctx;
+ struct miscdevice *miscdev = file->private_data;
+ struct tegra_dtv_context *dtv_ctx =
+ container_of(miscdev, struct tegra_dtv_context, miscdev);
+ file->private_data = dtv_ctx;
dtv_ctx = (struct tegra_dtv_context *) file->private_data;
@@ -680,12 +684,6 @@ static const struct file_operations tegra_dtv_fops = {
.release = tegra_dtv_release,
};
-static struct miscdevice tegra_dtv_misc_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = TEGRA_DTV_NAME,
- .fops = &tegra_dtv_fops,
-};
-
#ifdef CONFIG_DEBUG_FS
static int dtv_reg_show(struct seq_file *s, void *unused)
{
@@ -965,7 +963,10 @@ static int tegra_dtv_probe(struct platform_device *pdev)
goto fail_setup_dma;
/* register as a misc device */
- ret = misc_register(&tegra_dtv_misc_device);
+ dtv_ctx->miscdev.minor = MISC_DYNAMIC_MINOR;
+ dtv_ctx->miscdev.name = TEGRA_DTV_NAME;
+ dtv_ctx->miscdev.fops = &tegra_dtv_fops;
+ ret = misc_register(&dtv_ctx->miscdev);
if (ret) {
pr_err("%s: Unable to register misc device.\n",
__func__);
@@ -985,7 +986,7 @@ static int tegra_dtv_probe(struct platform_device *pdev)
fail_debugfs_reg:
dtv_debugfs_exit(dtv_ctx);
fail_misc_reg:
- misc_deregister(&tegra_dtv_misc_device);
+ misc_deregister(&dtv_ctx->miscdev);
fail_setup_stream:
fail_setup_dma:
tear_down_dma(dtv_ctx);
@@ -1004,14 +1005,14 @@ static int __devexit tegra_dtv_remove(struct platform_device *pdev)
pr_info("%s: remove dtv.\n", __func__);
- misc_deregister(&tegra_dtv_misc_device);
-
dtv_ctx = platform_get_drvdata(pdev);
dtv_debugfs_exit(dtv_ctx);
tear_down_dma(dtv_ctx);
release_stream_buffer(&dtv_ctx->stream, dtv_ctx->stream.num_bufs);
+ misc_deregister(&dtv_ctx->miscdev);
+
return 0;
}