€•‚QŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ0/translations/zh_CN/driver-api/soundwire/locking”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/zh_TW/driver-api/soundwire/locking”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/it_IT/driver-api/soundwire/locking”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/ja_JP/driver-api/soundwire/locking”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/ko_KR/driver-api/soundwire/locking”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/sp_SP/driver-api/soundwire/locking”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒSoundWire Locking”h]”hŒSoundWire Locking”…””}”(hh¨hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hh£hžhhŸŒJ/var/lib/git/docbuild/linux/Documentation/driver-api/soundwire/locking.rst”h KubhŒ paragraph”“”)”}”(hŒ This document explains locking mechanism of the SoundWire Bus. Bus uses following locks in order to avoid race conditions in Bus operations on shared resources.”h]”hŒ This document explains locking mechanism of the SoundWire Bus. Bus uses following locks in order to avoid race conditions in Bus operations on shared resources.”…””}”(hh¹hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khh£hžhubhŒ block_quote”“”)”}”(hŒ- Bus lock - Message lock ”h]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ Bus lock ”h]”h¸)”}”(hŒBus lock”h]”hŒBus lock”…””}”(hhØhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K hhÔubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhhÏubhÓ)”}”(hŒ Message lock ”h]”h¸)”}”(hŒ Message lock”h]”hŒ Message lock”…””}”(hhðhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K hhìubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhhÏubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1hÍhŸh¶h K hhÉubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhŸh¶h K hh£hžhubh¢)”}”(hhh]”(h§)”}”(hŒBus lock”h]”hŒBus lock”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjhžhhŸh¶h Kubh¸)”}”(hŒÑSoundWire Bus lock is a mutex and is part of Bus data structure (sdw_bus) which is used for every Bus instance. This lock is used to serialize each of the following operations(s) within SoundWire Bus instance.”h]”hŒÑSoundWire Bus lock is a mutex and is part of Bus data structure (sdw_bus) which is used for every Bus instance. This lock is used to serialize each of the following operations(s) within SoundWire Bus instance.”…””}”(hj#hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KhjhžhubhÈ)”}”(hŒ- Addition and removal of Slave(s), changing Slave status. - Prepare, Enable, Disable and De-prepare stream operations. - Access of Stream data structure. ”h]”hÎ)”}”(hhh]”(hÓ)”}”(hŒ9Addition and removal of Slave(s), changing Slave status. ”h]”h¸)”}”(hŒ8Addition and removal of Slave(s), changing Slave status.”h]”hŒ8Addition and removal of Slave(s), changing Slave status.”…””}”(hj<hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj5ubhÓ)”}”(hŒ;Prepare, Enable, Disable and De-prepare stream operations. ”h]”h¸)”}”(hŒ:Prepare, Enable, Disable and De-prepare stream operations.”h]”hŒ:Prepare, Enable, Disable and De-prepare stream operations.”…””}”(hjThžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KhjPubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj5ubhÓ)”}”(hŒ!Access of Stream data structure. ”h]”h¸)”}”(hŒ Access of Stream data structure.”h]”hŒ Access of Stream data structure.”…””}”(hjlhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khjhubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj5ubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1hÍhŸh¶h Khj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhŸh¶h Khjhžhubeh}”(h]”Œbus-lock”ah ]”h"]”Œbus lock”ah$]”h&]”uh1h¡hh£hžhhŸh¶h Kubh¢)”}”(hhh]”(h§)”}”(hŒ Message lock”h]”hŒ Message lock”…””}”(hj—hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hj”hžhhŸh¶h Kubh¸)”}”(hŒ·SoundWire message transfer lock. This mutex is part of Bus data structure (sdw_bus). This lock is used to serialize the message transfers (read/write) within a SoundWire Bus instance.”h]”hŒ·SoundWire message transfer lock. This mutex is part of Bus data structure (sdw_bus). This lock is used to serialize the message transfers (read/write) within a SoundWire Bus instance.”…””}”(hj¥hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj”hžhubh¸)”}”(hŒ+Below examples show how locks are acquired.”h]”hŒ+Below examples show how locks are acquired.”…””}”(hj³hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K!hj”hžhubh¢)”}”(hhh]”(h§)”}”(hŒ Example 1”h]”hŒ Example 1”…””}”(hjÄhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjÁhžhhŸh¶h K$ubh¸)”}”(hŒMessage transfer.”h]”hŒMessage transfer.”…””}”(hjÒhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K&hjÁhžhubhÈ)”}”(hXí1. For every message transfer a. Acquire Message lock. b. Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch. c. Release Message lock :: +----------+ +---------+ | | | | | Bus | | Master | | | | Driver | | | | | +----+-----+ +----+----+ | | | bus->ops->xfer_msg() | <-------------------------------+ a. Acquire Message lock | | b. Transfer message | | +-------------------------------> c. Release Message lock | return success/error | d. Return success/error | | + + ”h]”hŒenumerated_list”“”)”}”(hhh]”hÓ)”}”(hX®For every message transfer a. Acquire Message lock. b. Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch. c. Release Message lock :: +----------+ +---------+ | | | | | Bus | | Master | | | | Driver | | | | | +----+-----+ +----+----+ | | | bus->ops->xfer_msg() | <-------------------------------+ a. Acquire Message lock | | b. Transfer message | | +-------------------------------> c. Release Message lock | return success/error | d. Return success/error | | + + ”h]”(h¸)”}”(hŒFor every message transfer”h]”hŒFor every message transfer”…””}”(hjíhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K(hjéubjå)”}”(hhh]”(hÓ)”}”(hŒAcquire Message lock. ”h]”h¸)”}”(hŒAcquire Message lock.”h]”hŒAcquire Message lock.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K*hjþubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjûubhÓ)”}”(hŒ\Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch. ”h]”h¸)”}”(hŒ[Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch.”h]”hŒ[Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K,hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjûubhÓ)”}”(hŒRelease Message lock ”h]”h¸)”}”(hŒRelease Message lock”h]”hŒRelease Message lock”…””}”(hj2hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K/hj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjûubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œ loweralpha”Œprefix”hŒsuffix”Œ.”uh1jähjéubhŒ literal_block”“”)”}”(hXÊ+----------+ +---------+ | | | | | Bus | | Master | | | | Driver | | | | | +----+-----+ +----+----+ | | | bus->ops->xfer_msg() | <-------------------------------+ a. Acquire Message lock | | b. Transfer message | | +-------------------------------> c. Release Message lock | return success/error | d. Return success/error | | + +”h]”hXÊ+----------+ +---------+ | | | | | Bus | | Master | | | | Driver | | | | | +----+-----+ +----+----+ | | | bus->ops->xfer_msg() | <-------------------------------+ a. Acquire Message lock | | b. Transfer message | | +-------------------------------> c. Release Message lock | return success/error | d. Return success/error | | + +”…””}”hjSsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jQhŸh¶h K3hjéubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjæubah}”(h]”h ]”h"]”h$]”h&]”jLŒarabic”jNhjOjPuh1jähjàubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhŸh¶h K(hjÁhžhubeh}”(h]”Œ example-1”ah ]”h"]”Œ example 1”ah$]”h&]”uh1h¡hj”hžhhŸh¶h K$ubh¢)”}”(hhh]”(h§)”}”(hŒ Example 2”h]”hŒ Example 2”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hj~hžhhŸh¶h KDubh¸)”}”(hŒPrepare operation.”h]”hŒPrepare operation.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KFhj~hžhubhÈ)”}”(hXl1. Acquire lock for Bus instance associated with Master 1. 2. For every message transfer in Prepare operation a. Acquire Message lock. b. Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch. c. Release Message lock. 3. Release lock for Bus instance associated with Master 1 :: +----------+ +---------+ | | | | | Bus | | Master | | | | Driver | | | | | +----+-----+ +----+----+ | | | sdw_prepare_stream() | <-------------------------------+ 1. Acquire bus lock | | 2. Perform stream prepare | | | | | bus->ops->xfer_msg() | <-------------------------------+ a. Acquire Message lock | | b. Transfer message | | +-------------------------------> c. Release Message lock | return success/error | d. Return success/error | | | | | return success/error | 3. Release bus lock +-------------------------------> 4. Return success/error | | + +”h]”jå)”}”(hhh]”(hÓ)”}”(hŒ8Acquire lock for Bus instance associated with Master 1. ”h]”h¸)”}”(hŒ7Acquire lock for Bus instance associated with Master 1.”h]”hŒ7Acquire lock for Bus instance associated with Master 1.”…””}”(hj¨hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KHhj¤ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj¡ubhÓ)”}”(hŒÇFor every message transfer in Prepare operation a. Acquire Message lock. b. Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch. c. Release Message lock. ”h]”(h¸)”}”(hŒ/For every message transfer in Prepare operation”h]”hŒ/For every message transfer in Prepare operation”…””}”(hjÀhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KJhj¼ubjå)”}”(hhh]”(hÓ)”}”(hŒAcquire Message lock. ”h]”h¸)”}”(hŒAcquire Message lock.”h]”hŒAcquire Message lock.”…””}”(hjÕhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KLhjÑubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjÎubhÓ)”}”(hŒ\Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch. ”h]”h¸)”}”(hŒ[Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch.”h]”hŒ[Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch.”…””}”(hjíhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KNhjéubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjÎubhÓ)”}”(hŒRelease Message lock. ”h]”h¸)”}”(hŒRelease Message lock.”h]”hŒRelease Message lock.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KQhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjÎubeh}”(h]”h ]”h"]”h$]”h&]”jLjMjNhjOjPuh1jähj¼ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj¡ubhÓ)”}”(hXRelease lock for Bus instance associated with Master 1 :: +----------+ +---------+ | | | | | Bus | | Master | | | | Driver | | | | | +----+-----+ +----+----+ | | | sdw_prepare_stream() | <-------------------------------+ 1. Acquire bus lock | | 2. Perform stream prepare | | | | | bus->ops->xfer_msg() | <-------------------------------+ a. Acquire Message lock | | b. Transfer message | | +-------------------------------> c. Release Message lock | return success/error | d. Return success/error | | | | | return success/error | 3. Release bus lock +-------------------------------> 4. Return success/error | | + +”h]”(h¸)”}”(hŒ9Release lock for Bus instance associated with Master 1 ::”h]”hŒ6Release lock for Bus instance associated with Master 1”…””}”(hj)hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KShj%ubjR)”}”(hX‹+----------+ +---------+ | | | | | Bus | | Master | | | | Driver | | | | | +----+-----+ +----+----+ | | | sdw_prepare_stream() | <-------------------------------+ 1. Acquire bus lock | | 2. Perform stream prepare | | | | | bus->ops->xfer_msg() | <-------------------------------+ a. Acquire Message lock | | b. Transfer message | | +-------------------------------> c. Release Message lock | return success/error | d. Return success/error | | | | | return success/error | 3. Release bus lock +-------------------------------> 4. Return success/error | | + +”h]”hX‹+----------+ +---------+ | | | | | Bus | | Master | | | | Driver | | | | | +----+-----+ +----+----+ | | | sdw_prepare_stream() | <-------------------------------+ 1. Acquire bus lock | | 2. Perform stream prepare | | | | | bus->ops->xfer_msg() | <-------------------------------+ a. Acquire Message lock | | b. Transfer message | | +-------------------------------> c. Release Message lock | return success/error | d. Return success/error | | | | | return success/error | 3. Release bus lock +-------------------------------> 4. Return success/error | | + +”…””}”hj7sbah}”(h]”h ]”h"]”h$]”h&]”jajbuh1jQhŸh¶h KUhj%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj¡ubeh}”(h]”h ]”h"]”h$]”h&]”jLjojNhjOjPuh1jähjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhŸh¶h KHhj~hžhubeh}”(h]”Œ example-2”ah ]”h"]”Œ example 2”ah$]”h&]”uh1h¡hj”hžhhŸh¶h KDubeh}”(h]”Œ message-lock”ah ]”h"]”Œ message lock”ah$]”h&]”uh1h¡hh£hžhhŸh¶h Kubeh}”(h]”Œsoundwire-locking”ah ]”h"]”Œsoundwire locking”ah$]”h&]”uh1h¡hhhžhhŸh¶h Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”h¶uh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(h¦NŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j’Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”h¶Œ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jljij‘jŽjdjaj{jxj\jYuŒ nametypes”}”(jl‰j‘‰jd‰j{‰j\‰uh}”(jih£jŽjjaj”jxjÁjYj~uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nhžhub.