]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/mxc/vpu/mxc_vpu.c
mxc: vpu: change vpu_data into a pointer to kzalloc'ed memory
[karo-tx-linux.git] / drivers / mxc / vpu / mxc_vpu.c
index 564682c64a558a4a8b757fdbb1ab93f0d4648b31..bc7768c76b5673482c9136c618cc6e907f7847f6 100644 (file)
@@ -66,12 +66,10 @@ struct vpu_priv {
        struct mutex lock;
        const struct mxc_vpu_soc_data *soc_data;
        int clk_enabled;
-       struct list_head users;
 };
 
 struct vpu_user_data {
        struct vpu_priv *vpu_data;
-       struct list_head list;
        int clk_enable_cnt;
 };
 
@@ -104,7 +102,7 @@ static LIST_HEAD(mem_list);
 
 static int vpu_major;
 static struct class *vpu_class;
-static struct vpu_priv vpu_data;
+static struct vpu_priv *vpu_data;
 static u8 open_count;
 static struct clk *vpu_clk;
 static struct vpu_mem_desc bitwork_mem;
@@ -306,12 +304,9 @@ static int vpu_open(struct inode *inode, struct file *filp)
        if (user_data == NULL)
                return -ENOMEM;
 
-       user_data->vpu_data = &vpu_data;
-
-       INIT_LIST_HEAD(&user_data->list);
-       list_add(&user_data->list, &vpu_data.users);
+       user_data->vpu_data = vpu_data;
 
-       mutex_lock(&vpu_data.lock);
+       mutex_lock(&vpu_data->lock);
 
        if (open_count++ == 0) {
                pm_runtime_get_sync(vpu_dev);
@@ -319,7 +314,7 @@ static int vpu_open(struct inode *inode, struct file *filp)
        }
 
        filp->private_data = user_data;
-       mutex_unlock(&vpu_data.lock);
+       mutex_unlock(&vpu_data->lock);
        return 0;
 }
 
@@ -807,9 +802,11 @@ static int vpu_dev_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        drv_data->soc_data = soc_data;
-       INIT_LIST_HEAD(&drv_data->users);
+       mutex_init(&drv_data->lock);
 
        init_waitqueue_head(&vpu_queue);
+       drv_data->workqueue = create_workqueue("vpu_wq");
+       INIT_WORK(&drv_data->work, vpu_worker_callback);
 
        err = of_property_read_u32(np, "iramsize", &iramsize);
        if (!err && iramsize) {
@@ -879,7 +876,7 @@ static int vpu_dev_probe(struct platform_device *pdev)
                goto err_out_class;
        }
        err = request_irq(vpu_ipi_irq, vpu_ipi_irq_handler, 0, "VPU_CODEC_IRQ",
-                         &vpu_data);
+                         drv_data);
        if (err)
                goto err_out_class;
 
@@ -906,16 +903,14 @@ static int vpu_dev_probe(struct platform_device *pdev)
                        goto err_out_class;
                }
                err = request_irq(vpu_jpu_irq, vpu_jpu_irq_handler, IRQF_TRIGGER_RISING,
-                               "VPU_JPG_IRQ", &vpu_data);
+                               "VPU_JPG_IRQ", drv_data);
                if (err)
                        goto err_out_class;
        }
 
        pm_runtime_enable(&pdev->dev);
+       vpu_data = drv_data;
 
-       vpu_data.workqueue = create_workqueue("vpu_wq");
-       INIT_WORK(&vpu_data.work, vpu_worker_callback);
-       mutex_init(&vpu_data.lock);
        dev_info(vpu_dev, "VPU initialized\n");
        return 0;
 
@@ -977,7 +972,8 @@ static int vpu_suspend(struct device *dev)
 
        if (open_count) {
                /* Wait for vpu go to idle state, suspect vpu cannot be changed
-                  to idle state after about 1 sec */
+                * to idle state after about 1 sec
+                */
                timeout = jiffies + HZ;
                while (READ_REG(BIT_BUSY_FLAG)) {
                        msleep(1);