Loading drivers/soc/qcom/Kconfig +1 −1 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ config QCOM_GLINK_SSR config MSM_SPSS_UTILS depends on MSM_PIL bool "Secure Processor Utilities" tristate "Secure Processor Utilities" help spss-utils driver selects Secure Processor firmware file name.name The firmware file name for dev, test or production is selected Loading drivers/soc/qcom/spss_utils.c +47 −0 Original line number Diff line number Diff line Loading @@ -366,7 +366,17 @@ static int spss_create_sysfs(struct device *dev) return ret; } static void spss_destroy_sysfs(struct device *dev) { device_remove_file(dev, &dev_attr_pbl_cmac); device_remove_file(dev, &dev_attr_iar_enabled); device_remove_file(dev, &dev_attr_iar_state); device_remove_file(dev, &dev_attr_cmac_buf); device_remove_file(dev, &dev_attr_spss_debug_reg); device_remove_file(dev, &dev_attr_test_fuse_state); device_remove_file(dev, &dev_attr_firmware_name); } /*==========================================================================*/ /* IOCTL */ /*==========================================================================*/ Loading Loading @@ -509,6 +519,13 @@ static int spss_utils_create_chardev(struct device *dev) return ret; } static void spss_utils_destroy_chardev(void) { device_destroy(spss_utils_dev->driver_class, spss_utils_dev->device_no); class_destroy(spss_utils_dev->driver_class); unregister_chrdev_region(spss_utils_dev->device_no, 1); } /*==========================================================================*/ /* Device Tree */ /*==========================================================================*/ Loading Loading @@ -728,6 +745,7 @@ static int spss_parse_dt(struct device_node *node) /* read IAR_FEATURE_ENABLED from soc fuse */ val1 = readl_relaxed(spss_fuse3_reg); iounmap(spss_fuse3_reg); spss_fuse3_mask = (1<<spss_fuse3_bit); pr_debug("iar_enabled fuse, addr [0x%x] val [0x%x] mask [0x%x].\n", spss_fuse3_addr, val1, spss_fuse3_mask); Loading Loading @@ -760,6 +778,7 @@ static int spss_parse_dt(struct device_node *node) } val1 = readl_relaxed(spss_fuse4_reg); iounmap(spss_fuse4_reg); spss_fuse4_mask = (0x07 << spss_fuse4_bit); /* 3 bits */ pr_debug("IAR_STATE fuse, addr [0x%x] val [0x%x] mask [0x%x].\n", spss_fuse4_addr, val1, spss_fuse4_mask); Loading Loading @@ -796,6 +815,7 @@ static int spss_set_fw_cmac(u32 *cmac, size_t cmac_size) pr_debug("cmac[%d] [0x%x]\n", i, cmac[i]); } reg += cmac_size; iounmap(cmac_mem); return 0; } Loading Loading @@ -1025,8 +1045,28 @@ static int spss_probe(struct platform_device *pdev) if (IS_ERR_OR_NULL(iar_notif_handle)) { pr_err("register fail for IAR notifier\n"); kfree(iar_nb); iar_notif_handle = NULL; iar_nb = NULL; } return 0; } static int spss_remove(struct platform_device *pdev) { spss_utils_destroy_chardev(); spss_destroy_sysfs(spss_dev); if (!iar_notif_handle && !iar_nb) subsys_notif_unregister_notifier(iar_notif_handle, iar_nb); kfree(iar_nb); iar_nb = 0; kfree(spss_utils_dev); spss_utils_dev = 0; return 0; } Loading @@ -1037,6 +1077,7 @@ static const struct of_device_id spss_match_table[] = { static struct platform_driver spss_driver = { .probe = spss_probe, .remove = spss_remove, .driver = { .name = DEVICE_NAME, .of_match_table = of_match_ptr(spss_match_table), Loading @@ -1058,5 +1099,11 @@ static int __init spss_init(void) } late_initcall(spss_init); /* start after PIL driver */ static void __exit spss_exit(void) { platform_driver_unregister(&spss_driver); } module_exit(spss_exit) MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("Secure Processor Utilities"); Loading
drivers/soc/qcom/Kconfig +1 −1 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ config QCOM_GLINK_SSR config MSM_SPSS_UTILS depends on MSM_PIL bool "Secure Processor Utilities" tristate "Secure Processor Utilities" help spss-utils driver selects Secure Processor firmware file name.name The firmware file name for dev, test or production is selected Loading
drivers/soc/qcom/spss_utils.c +47 −0 Original line number Diff line number Diff line Loading @@ -366,7 +366,17 @@ static int spss_create_sysfs(struct device *dev) return ret; } static void spss_destroy_sysfs(struct device *dev) { device_remove_file(dev, &dev_attr_pbl_cmac); device_remove_file(dev, &dev_attr_iar_enabled); device_remove_file(dev, &dev_attr_iar_state); device_remove_file(dev, &dev_attr_cmac_buf); device_remove_file(dev, &dev_attr_spss_debug_reg); device_remove_file(dev, &dev_attr_test_fuse_state); device_remove_file(dev, &dev_attr_firmware_name); } /*==========================================================================*/ /* IOCTL */ /*==========================================================================*/ Loading Loading @@ -509,6 +519,13 @@ static int spss_utils_create_chardev(struct device *dev) return ret; } static void spss_utils_destroy_chardev(void) { device_destroy(spss_utils_dev->driver_class, spss_utils_dev->device_no); class_destroy(spss_utils_dev->driver_class); unregister_chrdev_region(spss_utils_dev->device_no, 1); } /*==========================================================================*/ /* Device Tree */ /*==========================================================================*/ Loading Loading @@ -728,6 +745,7 @@ static int spss_parse_dt(struct device_node *node) /* read IAR_FEATURE_ENABLED from soc fuse */ val1 = readl_relaxed(spss_fuse3_reg); iounmap(spss_fuse3_reg); spss_fuse3_mask = (1<<spss_fuse3_bit); pr_debug("iar_enabled fuse, addr [0x%x] val [0x%x] mask [0x%x].\n", spss_fuse3_addr, val1, spss_fuse3_mask); Loading Loading @@ -760,6 +778,7 @@ static int spss_parse_dt(struct device_node *node) } val1 = readl_relaxed(spss_fuse4_reg); iounmap(spss_fuse4_reg); spss_fuse4_mask = (0x07 << spss_fuse4_bit); /* 3 bits */ pr_debug("IAR_STATE fuse, addr [0x%x] val [0x%x] mask [0x%x].\n", spss_fuse4_addr, val1, spss_fuse4_mask); Loading Loading @@ -796,6 +815,7 @@ static int spss_set_fw_cmac(u32 *cmac, size_t cmac_size) pr_debug("cmac[%d] [0x%x]\n", i, cmac[i]); } reg += cmac_size; iounmap(cmac_mem); return 0; } Loading Loading @@ -1025,8 +1045,28 @@ static int spss_probe(struct platform_device *pdev) if (IS_ERR_OR_NULL(iar_notif_handle)) { pr_err("register fail for IAR notifier\n"); kfree(iar_nb); iar_notif_handle = NULL; iar_nb = NULL; } return 0; } static int spss_remove(struct platform_device *pdev) { spss_utils_destroy_chardev(); spss_destroy_sysfs(spss_dev); if (!iar_notif_handle && !iar_nb) subsys_notif_unregister_notifier(iar_notif_handle, iar_nb); kfree(iar_nb); iar_nb = 0; kfree(spss_utils_dev); spss_utils_dev = 0; return 0; } Loading @@ -1037,6 +1077,7 @@ static const struct of_device_id spss_match_table[] = { static struct platform_driver spss_driver = { .probe = spss_probe, .remove = spss_remove, .driver = { .name = DEVICE_NAME, .of_match_table = of_match_ptr(spss_match_table), Loading @@ -1058,5 +1099,11 @@ static int __init spss_init(void) } late_initcall(spss_init); /* start after PIL driver */ static void __exit spss_exit(void) { platform_driver_unregister(&spss_driver); } module_exit(spss_exit) MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("Secure Processor Utilities");