diff --git a/drivers/misc/paintbox/paintbox.c b/drivers/misc/paintbox/paintbox.c index f1f2450cd58d7c03f93039fce340c731d8510be0..b52a7cc4e6f9e4a7ac558fd770b8804732cde833 100644 --- a/drivers/misc/paintbox/paintbox.c +++ b/drivers/misc/paintbox/paintbox.c @@ -241,13 +241,6 @@ static long paintbox_get_caps_ioctl(struct paintbox_data *pb, /* The caller to this function must hold pb lock */ static long paintbox_ipu_reset(struct paintbox_data *pb) { - if (pb->session_count > 1) { - dev_warn(&pb->pdev->dev, - "%s: ignoring reset request: multiple active sessions\n", - __func__); - return -EBUSY; - } - paintbox_io_disable_interrupt(pb, ~0ULL); mnh_ipu_reset(); paintbox_io_apb_post_ipu_reset(pb); @@ -265,9 +258,43 @@ static long paintbox_ipu_reset_ioctl(struct paintbox_data *pb, struct paintbox_session *session, unsigned long arg) { int ret; + unsigned int i; mutex_lock(&pb->lock); + + for (i = 0; i < pb->lbp.num_lbps; i++) { + if (pb->lbp.lbps[i].session && + (pb->lbp.lbps[i].session != session)) { + ret = -EBUSY; + goto unlock; + } + } + + for (i = 0; i < pb->stp.num_stps; i++) { + if (pb->stp.stps[i].session && + (pb->stp.stps[i].session != session)) { + ret = -EBUSY; + goto unlock; + } + } + + for (i = 0; i < pb->dma.num_channels; i++) { + if (pb->dma.channels[i].session && + (pb->dma.channels[i].session != session)) { + ret = -EBUSY; + goto unlock; + } + } + + for (i = 0; i < pb->io.num_interrupts; i++) { + if (pb->irqs[i].session && (pb->irqs[i].session != session)) { + ret = -EBUSY; + goto unlock; + } + } + ret = paintbox_ipu_reset(pb); +unlock: mutex_unlock(&pb->lock); return ret;