struct pvr2_context *pvr2_context_create(
	struct usb_interface *intf,
	const struct usb_device_id *devid,
	void (*setup_func)(struct pvr2_context *))
{
	struct pvr2_context *mp = NULL;
	mp = kzalloc(sizeof(*mp),GFP_KERNEL);
	if (!mp) goto done;
	pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr_main id=%p",mp);
	mp->setup_func = setup_func;
	mutex_init(&mp->mutex);
	mp->hdw = pvr2_hdw_create(intf,devid);
	if (!mp->hdw) {
		pvr2_context_destroy(mp);
		mp = NULL;
		goto done;
	}

	mp->workqueue = create_singlethread_workqueue("pvrusb2");
	INIT_WORK(&mp->workinit, pvr2_context_setup);
	INIT_WORK(&mp->workpoll, pvr2_context_poll);
	queue_work(mp->workqueue,&mp->workinit);
 done:
	return mp;
}
Example #2
0
struct pvr2_context *pvr2_context_create(
    struct usb_interface *intf,
    const struct usb_device_id *devid,
    void (*setup_func)(struct pvr2_context *))
{
    struct pvr2_context *mp = NULL;
    mp = kzalloc(sizeof(*mp),GFP_KERNEL);
    if (!mp) goto done;
    pvr2_trace(PVR2_TRACE_CTXT,"pvr2_context %p (create)",mp);
    mp->setup_func = setup_func;
    mutex_init(&mp->mutex);
    mutex_lock(&pvr2_context_mutex);
    mp->exist_prev = pvr2_context_exist_last;
    mp->exist_next = NULL;
    pvr2_context_exist_last = mp;
    if (mp->exist_prev) {
        mp->exist_prev->exist_next = mp;
    } else {
        pvr2_context_exist_first = mp;
    }
    mutex_unlock(&pvr2_context_mutex);
    mp->hdw = pvr2_hdw_create(intf,devid);
    if (!mp->hdw) {
        pvr2_context_destroy(mp);
        mp = NULL;
        goto done;
    }
    pvr2_context_set_notify(mp, !0);
 done:
    return mp;
}