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;
};
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;
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);
}
filp->private_data = user_data;
- mutex_unlock(&vpu_data.lock);
+ mutex_unlock(&vpu_data->lock);
return 0;
}
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) {
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;
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;
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);