static int dsps_open(struct inode *ip, struct file *fp) { int ret = 0; pr_debug("%s.\n", __func__); if (drv->ref_count == 0) { ret = dsps_power_on_handler(); if (ret) return ret; ret = dsps_load(); if (ret) { dsps_power_off_handler(); return ret; } if (!drv->pdata->dsps_pwr_ctl_en) dsps_resume(); } drv->ref_count++; return ret; }
/** * Open File. * */ static int dsps_open(struct inode *ip, struct file *fp) { int ret = 0; pr_debug("%s.\n", __func__); if (drv->ref_count == 0) { /* clocks must be ON before loading.*/ ret = dsps_power_on_handler(); if (ret) return ret; ret = dsps_load(drv->pdata->pil_name); if (ret) { dsps_power_off_handler(); return ret; } dsps_resume(); } drv->ref_count++; return ret; }
/** * IO Control - handle commands from client. * */ static int dsps_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { int ret = 0; u32 val = 0; pr_debug("%s.\n", __func__); switch (cmd) { case DSPS_IOCTL_ON: ret = dsps_power_on_handler(); dsps_resume(); break; case DSPS_IOCTL_OFF: dsps_suspend(); ret = dsps_power_off_handler(); break; case DSPS_IOCTL_READ_SLOW_TIMER: val = dsps_read_slow_timer(); ret = put_user(val, (u32 __user *) arg); break; case DSPS_IOCTL_READ_FAST_TIMER: val = dsps_read_fast_timer(); ret = put_user(val, (u32 __user *) arg); break; default: ret = -EINVAL; break; } return ret; }
static int dsps_shutdown(const struct subsys_data *subsys) { pr_debug("%s\n", __func__); disable_irq_nosync(drv->wdog_irq); pil_force_shutdown(drv->pdata->pil_name); dsps_power_off_handler(); return 0; }
/** * Shutdown function * called by the restart notifier * */ static int dsps_shutdown(const struct subsys_data *subsys) { pr_debug("%s\n", __func__); dsps_suspend(); pil_force_shutdown(drv->pdata->pil_name); dsps_power_off_handler(); return 0; }
/** * Shutdown function * called by the restart notifier * */ static int dsps_shutdown(const struct subsys_desc *subsys) { pr_debug("%s\n", __func__); disable_irq_nosync(drv->wdog_irq); if (drv->pdata->ppss_wdog_unmasked_int_en_reg) { writel_relaxed(0, (drv->ppss_base+ drv->pdata->ppss_wdog_unmasked_int_en_reg)); mb(); /* Make sure wdog is disabled before shutting down */ } pil_force_shutdown(drv->pdata->pil_name); dsps_power_off_handler(); return 0; }
static int msm_dsps_power(bool on) { int ret; if (on) { ret = dsps_power_on_handler(); dsps_resume(); } else { dsps_suspend(); ret = dsps_power_off_handler(); } return ret; }
/** * Close File. * * The client shall close and re-open the file for re-loading the DSPS * firmware. * The file system will close the file if the user space app has crashed. * * If the DSPS is running, then we must reset DSPS CPU & HW before * setting the clocks off. * The DSPS reset should be done as part of the pil_put(). * The DSPS reset should be used for error recovery if the DSPS firmware * has crashed and re-loading the firmware is required. */ static int dsps_release(struct inode *inode, struct file *file) { pr_debug("%s.\n", __func__); drv->ref_count--; if (drv->ref_count == 0) { dsps_suspend(); dsps_unload(); dsps_power_off_handler(); } return 0; }
static int __devexit dsps_remove(struct platform_device *pdev) { pr_debug("%s.\n", __func__); dsps_power_off_handler(); dsps_free_resources(); cdev_del(drv->cdev); kfree(drv->cdev); drv->cdev = NULL; device_destroy(drv->dev_class, drv->dev_num); unregister_chrdev_region(drv->dev_num, 1); class_destroy(drv->dev_class); kfree(drv); drv = NULL; return 0; }
static long dsps_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int ret = 0; u32 val = 0; pr_debug("%s.\n", __func__); switch (cmd) { case DSPS_IOCTL_ON: if (!drv->pdata->dsps_pwr_ctl_en) { ret = dsps_power_on_handler(); dsps_resume(); } break; case DSPS_IOCTL_OFF: if (!drv->pdata->dsps_pwr_ctl_en) { dsps_suspend(); ret = dsps_power_off_handler(); } break; case DSPS_IOCTL_READ_SLOW_TIMER: val = dsps_read_slow_timer(); ret = put_user(val, (u32 __user *) arg); break; case DSPS_IOCTL_READ_FAST_TIMER: val = dsps_read_fast_timer(); ret = put_user(val, (u32 __user *) arg); break; case DSPS_IOCTL_RESET: pr_err("%s: User-initiated DSPS reset.\nResetting DSPS\n", __func__); subsystem_restart("dsps"); ret = 0; break; default: ret = -EINVAL; break; } return ret; }