On 02/20/2016 08:44 PM, Robert Jarzmik wrote:
In the conversion to regmap, I assumed that the 2 following functions was working symetrically:
- snd_soc_codec_init_regmap()
- snd_soc_codec_exit_regmap(codec)
As a mater of fact with the current code the regmap is freed twice because of the devm_() call: (mutex_lock) from (debugfs_remove_recursive+0x50/0x1d0) (debugfs_remove_recursive) from (regmap_debugfs_exit+0x1c/0xd4) (regmap_debugfs_exit) from (regmap_exit+0x28/0xc8) (regmap_exit) from (release_nodes+0x18c/0x204) (release_nodes) from (device_release+0x18/0x90) (device_release) from (kobject_release+0x90/0x1bc) (kobject_release) from (wm9713_soc_remove+0x1c/0x24) (wm9713_soc_remove) from (soc_remove_component+0x50/0x7c) (soc_remove_component) from (soc_remove_dai_links+0x118/0x228) (soc_remove_dai_links) from (snd_soc_register_card+0x4e4/0xdd4) (snd_soc_register_card) from (devm_snd_soc_register_card+0x34/0x70)
Fix this by removing the doubled regmap free.
The correct fix is to use the non devm variant of regmap_init_ac97() in this case. Device managed functions should only be used from inside a struct device probe function.
- Lars