Example #1
0
static int __init hdcp_init(void)
{
	HDCP_DBG("hdcp_init() %ums\n", jiffies_to_msecs(jiffies));

	if (cpu_is_omap44xx()) {
	        /* Map HDMI WP address */
	        hdcp.hdmi_wp_base_addr = ioremap(HDMI_WP, 0x1000);
	        if (!hdcp.hdmi_wp_base_addr) {
	                printk(KERN_ERR "HDCP: HDMI WP IOremap error\n");
	                return -EFAULT;
	        }
	} else {
		hdcp.hdmi_wp_base_addr = NULL;
	}

	hdcp.hdcp_work = kzalloc(sizeof(struct hdcp_worker_data), GFP_KERNEL);
	if (!hdcp.hdcp_work) {
		HDCP_ERR("Could not allocate HDCP worker  structure\n");
		goto err_alloc_work;
	}

	hdcp.mdev = kzalloc(sizeof(struct miscdevice), GFP_KERNEL);
	if (!hdcp.mdev) {
		HDCP_ERR("Could not allocate misc device memory\n");
		goto err_alloc_mdev;
	}

	/* Map DESHDCP in kernel address space */
	hdcp.deshdcp_base_addr = ioremap(DSS_SS_FROM_L3__DESHDCP, 0x34);

	if (!hdcp.deshdcp_base_addr) {
		HDCP_ERR("DESHDCP IOremap error\n");
		goto err_map_deshdcp;
	}

	mutex_init(&hdcp.lock);

	hdcp.mdev->minor = MISC_DYNAMIC_MINOR;
	hdcp.mdev->name = "hdcp";
	hdcp.mdev->mode = 0666;
	hdcp.mdev->fops = &hdcp_fops;

	if (misc_register(hdcp.mdev)) {
		HDCP_ERR("Could not add character driver\n");
		goto err_misc_register;
	}

	mutex_lock(&hdcp.lock);

        /* Variable init */
        hdcp.en_ctrl  = 0;
        hdcp.hdcp_state = HDCP_DISABLED;
        hdcp.pending_start = 0;
        hdcp.pending_wq_event = 0;
        hdcp.retry_cnt = 0;
        hdcp.auth_state = HDCP_STATE_DISABLED;
        hdcp.pending_disable = 0;
        hdcp.hdcp_up_event = 0;
        hdcp.hdcp_down_event = 0;
        hdcp_wait_re_entrance = 0;
        hdcp.hpd_low = 0;

        spin_lock_init(&hdcp.spinlock);

        init_completion(&hdcp_comp);

	hdcp.workqueue = create_singlethread_workqueue("hdcp");
	if (hdcp.workqueue == NULL) {
		HDCP_ERR("Could not create HDCP workqueue\n");
		goto err_add_driver;
	}

	INIT_DELAYED_WORK(&hdcp.hdcp_work->dwork, hdcp_work_queue);

	mutex_init(&hdcp.re_entrant_lock);

	if (hdmi_runtime_get()) {
		HDCP_ERR("%s Error enabling clocks\n", __func__);
		goto err_runtime;
	}

	/* Register HDCP callbacks to HDMI library */
	if (cpu_is_omap44xx())
		omapdss_hdmi_register_hdcp_callbacks(&omap4_hdcp_start_frame_cb,
				 &omap4_hdcp_3des_cb, &omap4_hdcp_irq_cb);
	else
		omapdss_hdmi_register_hdcp_callbacks(&hdcp_start_frame_cb,
				 &hdcp_3des_cb, &hdcp_irq_cb);

	hdmi_runtime_put();

        mutex_unlock(&hdcp.lock);

	hdcp_load_keys();

	return 0;

err_runtime:
	mutex_destroy(&hdcp.re_entrant_lock);

	destroy_workqueue(hdcp.workqueue);

err_add_driver:
	misc_deregister(hdcp.mdev);

	mutex_unlock(&hdcp.lock);

err_misc_register:
	mutex_destroy(&hdcp.lock);

	iounmap(hdcp.deshdcp_base_addr);

err_map_deshdcp:
	kfree(hdcp.mdev);

err_alloc_mdev:
	kfree(hdcp.hdcp_work);

err_alloc_work:
	if (cpu_is_omap44xx())
		iounmap(hdcp.hdmi_wp_base_addr);

	return -EFAULT;
}
Example #2
0
/*-----------------------------------------------------------------------------
 * Function: hdcp_init
 *-----------------------------------------------------------------------------
 */
static int __init hdcp_init(void)
{
	DBG("hdcp_init() %u", jiffies_to_msecs(jiffies));

	/* Map HDMI WP address */
	hdcp.hdmi_wp_base_addr = ioremap(HDMI_WP, 0x1000);

	if (!hdcp.hdmi_wp_base_addr) {
		printk(KERN_ERR "HDCP: HDMI WP IOremap error\n");
		return -EFAULT;
	}

	/* Map DESHDCP in kernel address space */
	hdcp.deshdcp_base_addr = ioremap(DSS_SS_FROM_L3__DESHDCP, 0x34);

	if (!hdcp.deshdcp_base_addr) {
		printk(KERN_ERR "HDCP: DESHDCP IOremap error\n");
		goto err_map_deshdcp;
	}

	mutex_init(&hdcp.lock);

	mdev.minor = MISC_DYNAMIC_MINOR;
	mdev.name = "hdcp";
	mdev.mode = 0666;
	mdev.fops = &hdcp_fops;

	if (misc_register(&mdev)) {
		printk(KERN_ERR "HDCP: Could not add character driver\n");
		goto err_register;
	}

	mutex_lock(&hdcp.lock);

	/* Variable init */
	hdcp.en_ctrl  = 0;
	hdcp.hdcp_state = HDCP_DISABLED;
	hdcp.pending_start = 0;
	hdcp.pending_wq_event = 0;
	hdcp.retry_cnt = 0;
	hdcp.auth_state = HDCP_STATE_DISABLED;
	hdcp.pending_disable = 0;
	hdcp.hdcp_up_event = 0;
	hdcp.hdcp_down_event = 0;
	hdcp_wait_re_entrance = 0;
	hdcp.hpd_low = 0;

	spin_lock_init(&hdcp.spinlock);

	init_completion(&hdcp_comp);

	hdcp.workqueue = create_singlethread_workqueue("hdcp");
	if (hdcp.workqueue == NULL)
		goto err_add_driver;

	hdcp_request_dss();

	/* Register HDCP callbacks to HDMI library */
	if (omapdss_hdmi_register_hdcp_callbacks(&hdcp_start_frame_cb,
						 &hdcp_irq_cb,
						 &hdcp_3des_cb))
		hdcp.hdmi_state = HDMI_STARTED;
	else
		hdcp.hdmi_state = HDMI_STOPPED;

	hdcp_release_dss();

	mutex_unlock(&hdcp.lock);

	hdcp_load_keys();

	return 0;

err_add_driver:
	misc_deregister(&mdev);

err_register:
	mutex_destroy(&hdcp.lock);

	iounmap(hdcp.deshdcp_base_addr);

err_map_deshdcp:
	iounmap(hdcp.hdmi_wp_base_addr);

	return -EFAULT;
}