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; }
/*----------------------------------------------------------------------------- * 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; }