/* * Apple Onboard Audio driver core * * Copyright 2006 Johannes Berg * * GPL v2, can be found in COPYING. */ #include #include #include #include "../aoa.h" #include "alsa.h" MODULE_DESCRIPTION("Apple Onboard Audio Sound Driver"); MODULE_AUTHOR("Johannes Berg "); MODULE_LICENSE("GPL"); /* We allow only one fabric. This simplifies things, * and more don't really make that much sense */ static struct aoa_fabric *fabric; static LIST_HEAD(codec_list); static int attach_codec_to_fabric(struct aoa_codec *c) { int err; if (!try_module_get(c->owner)) return -EBUSY; /* found_codec has to be assigned */ err = -ENOENT; if (fabric->found_codec) err = fabric->found_codec(c); if (err) { module_put(c->owner); printk(KERN_ERR "snd-aoa: fabric didn't like codec %s\n", c->name); return err; } c->fabric = fabric; err = 0; if (c->init) err = c->init(c); if (err) { printk(KERN_ERR "snd-aoa: codec %s didn't init\n", c->name); c->fabric = NULL; if (fabric->remove_codec) fabric->remove_codec(c); module_put(c->owner); return err; } if (fabric->attached_codec) fabric->attached_codec(c); return 0; } int aoa_codec_register(struct aoa_codec *codec) { int err = 0; /* if there's a fabric already, we can tell if we * will want to have this codec, so propagate error * through. Otherwise, this will happen later... */ if (fabric) err = attach_codec_to_fabric(codec); if (!err) list_add(&codec->list, &codec_list); return err; } EXPORT_SYMBOL_GPL(aoa_codec_register); void aoa_codec_unregister(struct aoa_codec *codec) { list_del(&codec->list); if (codec->fabric && codec->exit) codec->exit(codec); if (fabric && fabric->remove_codec) fabric->remove_codec(codec); codec->fabric = NULL; module_put(codec->owner); } EXPORT_SYMBOL_GPL(aoa_codec_unregister); int aoa_fabric_register(struct aoa_fabric *new_fabric, struct device *dev) { struct aoa_codec *c; int err; /* allow querying for presence of fabric * (i.e. do this test first!) */ if (new_fabric == fabric) { err = -EALREADY; goto attach; } if (fabric) return -EEXIST; if (!new_fabric) return -EINVAL; err = aoa_alsa_init(new_fabric->name, new_fabric->owner, dev); if (err) return err; fabric = new_fabric; attach: list_for_each_entry(c, &codec_list, list) { if (c->fabric != fabric) attach_codec_to_fabric(c); } return err; } EXPORT_SYMBOL_GPL(aoa_fabric_register); void aoa_fabric_unregister(struct aoa_fabric *old_fabric) { struct aoa_codec *c; if (fabric != old_fabric) return; list_for_each_entry(c, &codec_list, list) { if (c->fabric) aoa_fabric_unlink_codec(c); } aoa_alsa_cleanup(); fabric = NULL; } EXPORT_SYMBOL_GPL(aoa_fabric_unregister); void aoa_fabric_unlink_codec(struct aoa_codec *codec) { if (!codec->fabric) { printk(KERN_ERR "snd-aoa: fabric unassigned " "in aoa_fabric_unlink_codec\n"); dump_stack(); return; } if (codec->exit) codec->exit(codec); if (codec->fabric->remove_codec) codec->fabric->remove_codec(codec); codec->fabric = NULL; module_put(codec->owner); } EXPORT_SYMBOL_GPL(aoa_fabric_unlink_codec); static int __init aoa_init(void) { return 0; } static void __exit aoa_exit(void) { aoa_alsa_cleanup(); } module_init(aoa_init); module_exit(aoa_exit); t'>
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2016-12-18 14:35:45 +0100
committerDaniel Vetter <daniel.vetter@ffwll.ch>2017-01-30 10:17:17 +0100
commit4e5b54f127426c82dc2816340c26d951a5bb3429 (patch)
treecc3a8f7e335cf12880bc8d1a1e2066f6cfe0a68e /sound/oss/dmasound/dmasound_paula.c
parent566cf877a1fcb6d6dc0126b076aad062054c2637 (diff)
drm: prevent double-(un)registration for connectors
If we're unlucky then the registration from a hotplugged connector might race with the final registration step on driver load. And since MST topology discover is asynchronous that's even somewhat likely. v2: Also update the kerneldoc for @registered! v3: Review from Chris: - Improve kerneldoc for late_register/early_unregister callbacks. - Use mutex_destroy. Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Sean Paul <seanpaul@chromium.org> Reported-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20161218133545.2106-1-daniel.vetter@ffwll.ch (cherry picked from commit e73ab00e9a0f1731f34d0620a9c55f5c30c4ad4e)
Diffstat (limited to 'sound/oss/dmasound/dmasound_paula.c')
79/0x90 entry_SYSCALL_64_fastpath+0x13/0x94 - i915 unpin_work workqueue: intel_unpin_work_fn+0x58/0x140 [i915] process_one_work+0x1f1/0x480 worker_thread+0x48/0x4d0 kthread+0x101/0x140 and this patch purely papers over the issue by adding a NULL pointer check and a WARN_ON_ONCE() to avoid the oops that would then generally make the machine unresponsive. Other callers of i915_gem_object_to_ggtt() seem to also check for the returned pointer being NULL and warn about it, so this clearly has happened before in other places. [ Reported it originally to the i915 developers on Jan 8, applying the ugly workaround on my own now after triggering the problem for the second time with no feedback. This is likely to be the same bug reported as https://bugs.freedesktop.org/show_bug.cgi?id=98829 https://bugs.freedesktop.org/show_bug.cgi?id=99134 which has a patch for the underlying problem, but it hasn't gotten to me, so I'm applying the workaround. ] Cc: Daniel Vetter <daniel.vetter@intel.com> Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Imre Deak <imre.deak@intel.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'sound/soc/ux500/mop500_ab8500.c')