drm_irq.c revision e92e3a8694f157faf8a9e44096a70ada86c556bf
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye/*
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * drm_irq.c -- IRQ IOCTL and function support
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * Created: Fri Oct 18 2003 by anholt@FreeBSD.org
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye */
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye/*
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * Copyright 2003 Eric Anholt
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * All Rights Reserved.
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye *
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * Permission is hereby granted, free of charge, to any person obtaining a
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * copy of this software and associated documentation files (the "Software"),
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * to deal in the Software without restriction, including without limitation
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * the rights to use, copy, modify, merge, publish, distribute, sublicense,
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * and/or sell copies of the Software, and to permit persons to whom the
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * Software is furnished to do so, subject to the following conditions:
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye *
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * The above copyright notice and this permission notice (including the next
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * paragraph) shall be included in all copies or substantial portions of the
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * Software.
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye *
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * ERIC ANHOLT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye *
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * Authors:
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * Eric Anholt <anholt@FreeBSD.org>
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye *
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye */
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye/*
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * Use is subject to license terms.
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye */
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye#pragma ident "%Z%%M% %I% %E% SMI"
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye#include "drmP.h"
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye#include "drm.h"
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye/*ARGSUSED*/
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yeint
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yedrm_irq_by_busid(DRM_IOCTL_ARGS)
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye{
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_DEVICE;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye drm_irq_busid_t irq;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_COPY_FROM_USER_IOCTL(irq, (drm_irq_busid_t *)data, sizeof (irq));
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye if ((irq.busnum >> 8) != dev->pci_domain ||
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye (irq.busnum & 0xff) != dev->pci_bus ||
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye irq.devnum != dev->pci_slot ||
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye irq.funcnum != dev->pci_func)
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (DRM_ERR(EINVAL));
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye irq.irq = dev->irq;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_DEBUG("%x:%x:%x => IRQ %x\n",
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye irq.busnum, irq.devnum, irq.funcnum, irq.irq);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_COPY_TO_USER_IOCTL((drm_irq_busid_t *)data, irq, sizeof (irq));
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (0);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye}
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye/*ARGSUSED*/
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yestatic int
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yedrm_install_irq_handle(drm_softstate_t *dev)
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye{
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye dev_info_t *dip = NULL;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye dip = dev->dip;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye if (dip == NULL) {
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_ERROR("drm_install_irq_handle: cannot get vgatext's dip");
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (DDI_FAILURE);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye }
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye if (ddi_intr_hilevel(dip, 0) != 0) {
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_ERROR("drm_install_irq_handle: "
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye "high-level interrupts are not supported");
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (DDI_FAILURE);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye }
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye if (ddi_get_iblock_cookie(dip, (uint_t)0,
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye &dev->intr_block) != DDI_SUCCESS) {
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_ERROR("drm_install_irq_handle: cannot get iblock cookie");
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (DDI_FAILURE);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye }
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye mutex_init(&dev->irq_lock, NULL, MUTEX_DRIVER, (void *)dev->intr_block);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye /* setup the interrupt handler */
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye if (ddi_add_intr(dip, 0, &dev->intr_block,
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye (ddi_idevice_cookie_t *)NULL, dev->irq_handler,
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye (caddr_t)dev) != DDI_SUCCESS) {
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_ERROR("drm_install_irq_handle: ddi_add_intr failed");
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (DDI_FAILURE);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye }
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_DEBUG("drm_install_irq_handle: add the intr handle successful");
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (DDI_SUCCESS);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye}
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye/*ARGSUSED*/
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yeint
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yedrm_irq_install(drm_softstate_t *dev)
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye{
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye int ret;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye if (dev->dev_private == NULL) {
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_ERROR("drm_irq_install: dev_private is NULL");
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (DRM_ERR(EINVAL));
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye }
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye if (dev->irq_enabled) {
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_ERROR("drm_irq_install: irq already enabled");
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (DRM_ERR(EBUSY));
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye }
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye dev->context_flag = 0;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye mutex_init(&dev->tasklet_lock, NULL, MUTEX_DRIVER, NULL);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye /* before installing handler */
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye dev->irq_preinstall(dev);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye /* install handler */
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye ret = drm_install_irq_handle(dev);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye if (ret != DDI_SUCCESS) {
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_ERROR("drm_irq_install: drm_install_irq_handle failed");
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (ret);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye }
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye /* after installing handler */
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye dev->irq_postinstall(dev);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye dev->irq_enabled = 1;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (DDI_SUCCESS);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye}
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yestatic void
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yedrm_uninstall_irq_handle(drm_device_t *dev)
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye{
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye ASSERT(dev->dip);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye ddi_remove_intr(dev->dip, 0, dev->intr_block);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye}
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye/*ARGSUSED*/
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yeint
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yedrm_irq_uninstall(drm_softstate_t *dev)
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye{
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye if (!dev->irq_enabled) {
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (DRM_ERR(EINVAL));
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye }
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye dev->irq_enabled = 0;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye dev->irq_uninstall(dev);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye drm_uninstall_irq_handle(dev);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye dev->locked_tasklet_func = NULL;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye mutex_destroy(&dev->tasklet_lock);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (DDI_SUCCESS);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye}
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye/*ARGSUSED*/
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yeint
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yedrm_control(DRM_IOCTL_ARGS)
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye{
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_DEVICE;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye drm_control_t ctl;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye int err;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_DEBUG("drm_control: install irq = %x\n", dev->irq);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye DRM_COPY_FROM_USER_IOCTL(ctl, (drm_control_t *)data, sizeof (ctl));
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye switch (ctl.func) {
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye case DRM_INST_HANDLER:
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye /*
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * Handle drivers whose DRM used to require IRQ setup but the
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye * no longer does.
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye */
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (drm_irq_install(dev));
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye case DRM_UNINST_HANDLER:
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye err = drm_irq_uninstall(dev);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (err);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye default:
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (DRM_ERR(EINVAL));
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye }
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye}
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye/*ARGSUSED*/
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yeint
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yedrm_wait_vblank(DRM_IOCTL_ARGS)
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye{
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return (0);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye}
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye/*ARGSUSED*/
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yevoid
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yedrm_vbl_send_signals(drm_device_t *dev)
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye{
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye}
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yevoid
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Yedrm_locked_tasklet(drm_device_t *dev, void (*func)(drm_device_t *))
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye{
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye mutex_enter(&dev->tasklet_lock);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye if (dev->locked_tasklet_func) {
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye mutex_exit(&dev->tasklet_lock);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye return;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye }
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye dev->locked_tasklet_func = func;
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye mutex_exit(&dev->tasklet_lock);
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye}
3f1e69bef33050bee99ea1e9992af13fc467281fCheng Sean Ye