diff options
Diffstat (limited to 'drivers/misc/m4sensorhub_download.c')
| -rw-r--r-- | drivers/misc/m4sensorhub_download.c | 93 |
1 files changed, 28 insertions, 65 deletions
diff --git a/drivers/misc/m4sensorhub_download.c b/drivers/misc/m4sensorhub_download.c index 7ad1aae47b5..a671a393f88 100644 --- a/drivers/misc/m4sensorhub_download.c +++ b/drivers/misc/m4sensorhub_download.c @@ -56,7 +56,7 @@ struct download_client { struct m4sensorhub_data *m4sensorhub; }; -struct download_client *misc_download_data; +static struct download_client *misc_download_data; static wait_queue_head_t download_wq; static atomic_t m4_dlcmd_resp_ready; static atomic_t download_client_entry; @@ -298,45 +298,6 @@ static long download_client_ioctl( return ret; } -static ssize_t download_get_loglevel(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int loglevel; - struct platform_device *pdev = to_platform_device(dev); - struct download_client *download_client_data = - platform_get_drvdata(pdev); - - m4sensorhub_reg_read(download_client_data->m4sensorhub, - M4SH_REG_LOG_LOGENABLE, (char *)&loglevel); - loglevel = get_log_level(loglevel, DOWNLOAD_MASK_BIT_1); - return sprintf(buf, "%d\n", loglevel); -} - -static ssize_t download_set_loglevel(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size) -{ - unsigned long level; - unsigned int mask = 0; - struct platform_device *pdev = to_platform_device(dev); - struct download_client *download_client_data = - platform_get_drvdata(pdev); - - if ((strict_strtoul(buf, 10, &level)) < 0) - return -EINVAL; - if (level > M4_MAX_LOG_LEVEL) { - KDEBUG(M4SH_ERROR, " Invalid log level - %d\n", (int)level); - return -EINVAL; - } - mask = (1 << DOWNLOAD_MASK_BIT_1) | (1 << DOWNLOAD_MASK_BIT_2); - level = (level << DOWNLOAD_MASK_BIT_1); - return m4sensorhub_reg_write(download_client_data->m4sensorhub, - M4SH_REG_LOG_LOGENABLE, (char *)&level, (unsigned char *)&mask); -} - -static DEVICE_ATTR(LogLevel, 0664, \ - download_get_loglevel, download_set_loglevel); - static const struct file_operations download_client_fops = { .owner = THIS_MODULE, .unlocked_ioctl = download_client_ioctl, @@ -350,6 +311,29 @@ static struct miscdevice download_client_miscdrv = { .fops = &download_client_fops, }; +static int download_driver_init(struct m4sensorhub_data *m4sensorhub) +{ + int ret; + ret = m4sensorhub_irq_register(m4sensorhub, M4SH_IRQ_DLCMD_RESP_READY, + m4_handle_download_irq, + misc_download_data); + if (ret < 0) { + KDEBUG(M4SH_ERROR, "Error registering int %d (%d)\n", + M4SH_IRQ_DLCMD_RESP_READY, ret); + return ret; + } + ret = m4sensorhub_irq_enable(m4sensorhub, M4SH_IRQ_DLCMD_RESP_READY); + if (ret < 0) { + KDEBUG(M4SH_ERROR, "Error enable irq %d (%d)\n", + M4SH_IRQ_DLCMD_RESP_READY, ret); + goto exit; + } + return ret; +exit: + m4sensorhub_irq_unregister(m4sensorhub, M4SH_IRQ_DLCMD_RESP_READY); + return ret; +} + static int download_client_probe(struct platform_device *pdev) { int ret = -1; @@ -376,29 +360,12 @@ static int download_client_probe(struct platform_device *pdev) goto free_memory; } misc_download_data = download_client_data; - ret = m4sensorhub_irq_register(m4sensorhub, M4SH_IRQ_DLCMD_RESP_READY, - m4_handle_download_irq, - download_client_data); + ret = m4sensorhub_register_initcall(download_driver_init); if (ret < 0) { - KDEBUG(M4SH_ERROR, "Error registering int %d (%d)\n", - M4SH_IRQ_DLCMD_RESP_READY, ret); + KDEBUG(M4SH_ERROR, "Unable to register init function " + "for download client = %d\n", ret); goto unregister_misc_device; } - - ret = m4sensorhub_irq_enable(m4sensorhub, M4SH_IRQ_DLCMD_RESP_READY); - if (ret < 0) { - KDEBUG(M4SH_ERROR, "Error enable irq %d (%d)\n", - M4SH_IRQ_DLCMD_RESP_READY, ret); - goto unregister_irq; - } - - if (device_create_file(&pdev->dev, &dev_attr_LogLevel)) { - KDEBUG(M4SH_ERROR, "Error creating %s sys entry\n", - DOWNLOAD_CLIENT_DRIVER_NAME); - ret = -1; - goto disable_irq; - } - init_waitqueue_head(&download_wq); atomic_set(&m4_dlcmd_resp_ready, false); atomic_set(&download_client_entry, 0); @@ -407,10 +374,6 @@ static int download_client_probe(struct platform_device *pdev) DOWNLOAD_CLIENT_DRIVER_NAME); return 0; -disable_irq: - m4sensorhub_irq_disable(m4sensorhub, M4SH_IRQ_DLCMD_RESP_READY); -unregister_irq: - m4sensorhub_irq_unregister(m4sensorhub, M4SH_IRQ_DLCMD_RESP_READY); unregister_misc_device: misc_download_data = NULL; misc_deregister(&download_client_miscdrv); @@ -427,11 +390,11 @@ static int __exit download_client_remove(struct platform_device *pdev) struct download_client *download_client_data = platform_get_drvdata(pdev); - device_remove_file(&pdev->dev, &dev_attr_LogLevel); m4sensorhub_irq_disable(download_client_data->m4sensorhub, M4SH_IRQ_DLCMD_RESP_READY); m4sensorhub_irq_unregister(download_client_data->m4sensorhub, M4SH_IRQ_DLCMD_RESP_READY); + m4sensorhub_unregister_initcall(download_driver_init); misc_download_data = NULL; misc_deregister(&download_client_miscdrv); platform_set_drvdata(pdev, NULL); |