int omap3isp_stat_init(struct ispstat *stat, const char *name, const struct v4l2_subdev_ops *sd_ops) { stat->buf = kcalloc(STAT_MAX_BUFS, sizeof(*stat->buf), GFP_KERNEL); if (!stat->buf) return -ENOMEM; isp_stat_buf_clear(stat); mutex_init(&stat->ioctl_lock); atomic_set(&stat->buf_err, 0); return isp_stat_init_entities(stat, name, sd_ops); }
/* * omap3isp_stat_enable - Disable/Enable statistic engine as soon as possible * @enable: 0/1 - Disables/Enables the engine. * * Client should configure all the module registers before this. * This function can be called from a userspace request. */ int omap3isp_stat_enable(struct ispstat *stat, u8 enable) { unsigned long irqflags; dev_dbg(stat->isp->dev, "%s: user wants to %s module.\n", stat->subdev.name, enable ? "enable" : "disable"); /* Prevent enabling while configuring */ mutex_lock(&stat->ioctl_lock); spin_lock_irqsave(&stat->isp->stat_lock, irqflags); if (!stat->configured && enable) { spin_unlock_irqrestore(&stat->isp->stat_lock, irqflags); mutex_unlock(&stat->ioctl_lock); dev_dbg(stat->isp->dev, "%s: cannot enable module as it's " "never been successfully configured so far.\n", stat->subdev.name); return -EINVAL; } if (enable) { if (stat->state == ISPSTAT_DISABLING) /* Previous disabling request wasn't done yet */ stat->state = ISPSTAT_ENABLED; else if (stat->state == ISPSTAT_DISABLED) /* Module is now being enabled */ stat->state = ISPSTAT_ENABLING; } else { if (stat->state == ISPSTAT_ENABLING) { /* Previous enabling request wasn't done yet */ stat->state = ISPSTAT_DISABLED; } else if (stat->state == ISPSTAT_ENABLED) { /* Module is now being disabled */ stat->state = ISPSTAT_DISABLING; isp_stat_buf_clear(stat); } } spin_unlock_irqrestore(&stat->isp->stat_lock, irqflags); mutex_unlock(&stat->ioctl_lock); return 0; }