sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget+/translations/zh_CN/driver-api/tty/tty_portmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/zh_TW/driver-api/tty/tty_portmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/it_IT/driver-api/tty/tty_portmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ja_JP/driver-api/tty/tty_portmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ko_KR/driver-api/tty/tty_portmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/pt_BR/driver-api/tty/tty_portmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/sp_SP/driver-api/tty/tty_portmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhE/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port.rsthKubhsection)}(hhh](htitle)}(hTTY Porth]hTTY Port}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhtopic)}(hhh]h bullet_list)}(hhh](h list_item)}(hhh](h paragraph)}(hhh]h reference)}(hhh]hTTY Port Functions}(hhhhhNhNubah}(h]id1ah ]h"]h$]h&]refidtty-port-functionsuh1hhhubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh](h)}(hhh]h)}(hhh]h)}(hhh]hInit & Destroy}(hjhhhNhNubah}(h]id2ah ]h"]h$]h&]refid init-destroyuh1hhjubah}(h]h ]h"]h$]h&]uh1hhj ubah}(h]h ]h"]h$]h&]uh1hhj ubh)}(hhh]h)}(hhh]h)}(hhh]hOpen/Close/Hangup Helpers}(hj4hhhNhNubah}(h]id3ah ]h"]h$]h&]refidopen-close-hangup-helpersuh1hhj1ubah}(h]h ]h"]h$]h&]uh1hhj.ubah}(h]h ]h"]h$]h&]uh1hhj ubh)}(hhh]h)}(hhh]h)}(hhh]hTTY Refcounting}(hjVhhhNhNubah}(h]id4ah ]h"]h$]h&]refidtty-refcountinguh1hhjSubah}(h]h ]h"]h$]h&]uh1hhjPubah}(h]h ]h"]h$]h&]uh1hhj ubh)}(hhh]h)}(hhh]h)}(hhh]h TTY Helpers}(hjxhhhNhNubah}(h]id5ah ]h"]h$]h&]refid tty-helpersuh1hhjuubah}(h]h ]h"]h$]h&]uh1hhjrubah}(h]h ]h"]h$]h&]uh1hhj ubh)}(hhh]h)}(hhh]h)}(hhh]h Modem Signals}(hjhhhNhNubah}(h]id6ah ]h"]h$]h&]refid modem-signalsuh1hhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hTTY Port Reference}(hjhhhNhNubah}(h]id7ah ]h"]h$]h&]refidtty-port-referenceuh1hhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hTTY Port Operations Reference}(hjhhhNhNubah}(h]id8ah ]h"]h$]h&]refidtty-port-operations-referenceuh1hhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhNhNubah}(h]contentsah ](contentslocaleh"]contentsah$]h&]uh1hhhhKhhhhubh)}(hX+The TTY drivers are advised to use struct tty_port helpers as much as possible. If the drivers implement :c:member:`tty_port.ops.activate()` and :c:member:`tty_port.ops.shutdown()`, they can use tty_port_open(), tty_port_close(), and tty_port_hangup() in respective :c:member:`tty_struct.ops` hooks.h](hiThe TTY drivers are advised to use struct tty_port helpers as much as possible. If the drivers implement }(hjhhhNhNubh)}(h#:c:member:`tty_port.ops.activate()`h]hliteral)}(hj h]htty_port.ops.activate()}(hj$hhhNhNubah}(h]h ](xrefcc-membereh"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]refdocdriver-api/tty/tty_port refdomainj/reftypemember refexplicitrefwarn reftargettty_port.ops.activate()uh1hhhhK hjubh and }(hjhhhNhNubh)}(h#:c:member:`tty_port.ops.shutdown()`h]j#)}(hjIh]htty_port.ops.shutdown()}(hjKhhhNhNubah}(h]h ](j.j/c-membereh"]h$]h&]uh1j"hjGubah}(h]h ]h"]h$]h&]refdocj; refdomainj/reftypemember refexplicitrefwarnjAtty_port.ops.shutdown()uh1hhhhK hjubhV, they can use tty_port_open(), tty_port_close(), and tty_port_hangup() in respective }(hjhhhNhNubh)}(h:c:member:`tty_struct.ops`h]j#)}(hjlh]htty_struct.ops}(hjnhhhNhNubah}(h]h ](j.j/c-membereh"]h$]h&]uh1j"hjjubah}(h]h ]h"]h$]h&]refdocj; refdomainj/reftypemember refexplicitrefwarnjAtty_struct.opsuh1hhhhK hjubh hooks.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hThe reference and details are contained in the `TTY Port Reference`_ and `TTY Port Operations Reference`_ sections at the bottom.h](h/The reference and details are contained in the }(hjhhhNhNubh)}(h`TTY Port Reference`_h]hTTY Port Reference}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameTTY Port Referencerefidjuh1hhjresolvedKubh and }(hjhhhNhNubh)}(h `TTY Port Operations Reference`_h]hTTY Port Operations Reference}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameTTY Port Operations Referencejjuh1hhjjKubh sections at the bottom.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hTTY Port Functionsh]hTTY Port Functions}(hjhhhNhNubah}(h]h ]h"]h$]h&]jhuh1hhjhhhhhKubh)}(hhh](h)}(hInit & Destroyh]hInit & Destroy}(hjhhhNhNubah}(h]h ]h"]h$]h&]jjuh1hhjhhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singletty_port_init (C function)c.tty_port_inithNtauh1jhjhhhNhNubhdesc)}(hhh](hdesc_signature)}(h*void tty_port_init (struct tty_port *port)h]hdesc_signature_line)}(h)void tty_port_init(struct tty_port *port)h](hdesc_sig_keyword_type)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhj hhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chKNubhdesc_sig_space)}(h h]h }(hj#hhhNhNubah}(h]h ]wah"]h$]h&]uh1j!hj hhhj hKNubh desc_name)}(h tty_port_inith]h desc_sig_name)}(h tty_port_inith]h tty_port_init}(hj:hhhNhNubah}(h]h ]nah"]h$]h&]uh1j8hj4ubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1j2hj hhhj hKNubhdesc_parameterlist)}(h(struct tty_port *port)h]hdesc_parameter)}(hstruct tty_port *porth](hdesc_sig_keyword)}(hstructh]hstruct}(hj_hhhNhNubah}(h]h ]kah"]h$]h&]uh1j]hjYubj")}(h h]h }(hjnhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjYubh)}(hhh]j9)}(htty_porth]htty_port}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj|ubah}(h]h ]h"]h$]h&] refdomainj/reftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jj<sbc.tty_port_initasbuh1hhjYubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjYubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjYubj9)}(hporth]hport}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjYubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjSubah}(h]h ]h"]h$]h&]hhuh1jQhj hhhj hKNubeh}(h]h ]h"]h$]h&]hhƌ add_permalinkuh1j sphinx_line_type declaratorhjhhhj hKNubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhj hKNhjhhubh desc_content)}(hhh]h)}(hinitialize tty_porth]hinitialize tty_port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chKNhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hKNubeh}(h]h ](j/functioneh"]h$]h&]domainj/objtypejdesctypejnoindex noindexentrynocontentsentryuh1jhhhjhNhNubh container)}(hXU**Parameters** ``struct tty_port *port`` tty_port to initialize **Description** Initializes the state of struct tty_port. When a port was initialized using this function, one has to destroy the port by tty_port_destroy(). Either indirectly by using :c:type:`tty_port` refcounting (tty_port_put()) or directly if refcounting is not used.h](h)}(h**Parameters**h]hstrong)}(hj$h]h Parameters}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj"ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chKRhjubhdefinition_list)}(hhh]hdefinition_list_item)}(h1``struct tty_port *port`` tty_port to initialize h](hterm)}(h``struct tty_port *port``h]j#)}(hjKh]hstruct tty_port *port}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjIubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chKOhjCubh definition)}(hhh]h)}(htty_port to initializeh]htty_port to initialize}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hKOhjcubah}(h]h ]h"]h$]h&]uh1jahjCubeh}(h]h ]h"]h$]h&]uh1jAhj`hKOhj>ubah}(h]h ]h"]h$]h&]uh1j<hjubh)}(h**Description**h]j')}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chKQhjubh)}(hXInitializes the state of struct tty_port. When a port was initialized using this function, one has to destroy the port by tty_port_destroy(). Either indirectly by using :c:type:`tty_port` refcounting (tty_port_put()) or directly if refcounting is not used.h](hInitializes the state of struct tty_port. When a port was initialized using this function, one has to destroy the port by tty_port_destroy(). Either indirectly by using }(hjhhhNhNubh)}(h:c:type:`tty_port`h]j#)}(hjh]htty_port}(hjhhhNhNubah}(h]h ](j.j/c-typeeh"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]refdocj; refdomainj/reftypetype refexplicitrefwarnjj)}j]sbjAtty_portuh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chKPhjubhE refcounting (tty_port_put()) or directly if refcounting is not used.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKPhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_port_destroy (C function)c.tty_port_destroyhNtauh1jhjhhhNhNubj)}(hhh](j)}(h-void tty_port_destroy (struct tty_port *port)h]j )}(h,void tty_port_destroy(struct tty_port *port)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chM ubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjhhhjhM ubj3)}(htty_port_destroyh]j9)}(htty_port_destroyh]htty_port_destroy}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hjhhhjhM ubjR)}(h(struct tty_port *port)h]jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hj0hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj,ubj")}(h h]h }(hj=hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj,ubh)}(hhh]j9)}(htty_porth]htty_port}(hjNhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjKubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjPmodnameN classnameNjj)}j]j)}jjsbc.tty_port_destroyasbuh1hhj,ubj")}(h h]h }(hjnhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj,ubj)}(hjh]h*}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj9)}(hporth]hport}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj,ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj(ubah}(h]h ]h"]h$]h&]hhuh1jQhjhhhjhM ubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM hjhhubj)}(hhh]h)}(hdestroy inited porth]hdestroy inited port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](j/functioneh"]h$]h&]jj/jjjjjjjuh1jhhhjhNhNubj)}(hX***Parameters** ``struct tty_port *port`` tty port to be destroyed **Description** When a port was initialized using tty_port_init(), one has to destroy the port by this function. Either indirectly by using :c:type:`tty_port` refcounting (tty_port_put()) or directly if refcounting is not used.h](h)}(h**Parameters**h]j')}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chMhjubj=)}(hhh]jB)}(h3``struct tty_port *port`` tty port to be destroyed h](jH)}(h``struct tty_port *port``h]j#)}(hjh]hstruct tty_port *port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chMhjubjb)}(hhh]h)}(htty port to be destroyedh]htty port to be destroyed}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jahjubeh}(h]h ]h"]h$]h&]uh1jAhj hMhjubah}(h]h ]h"]h$]h&]uh1j<hjubh)}(h**Description**h]j')}(hj/h]h Description}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj-ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chMhjubh)}(hWhen a port was initialized using tty_port_init(), one has to destroy the port by this function. Either indirectly by using :c:type:`tty_port` refcounting (tty_port_put()) or directly if refcounting is not used.h](h|When a port was initialized using tty_port_init(), one has to destroy the port by this function. Either indirectly by using }(hjEhhhNhNubh)}(h:c:type:`tty_port`h]j#)}(hjOh]htty_port}(hjQhhhNhNubah}(h]h ](j.j/c-typeeh"]h$]h&]uh1j"hjMubah}(h]h ]h"]h$]h&]refdocj; refdomainj/reftypetype refexplicitrefwarnjjjAtty_portuh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chMhjEubhE refcounting (tty_port_put()) or directly if refcounting is not used.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjlhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_port_put (C function)c.tty_port_puthNtauh1jhjhhhNhNubj)}(hhh](j)}(h)void tty_port_put (struct tty_port *port)h]j )}(h(void tty_port_put(struct tty_port *port)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chM,ubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjhhhjhM,ubj3)}(h tty_port_puth]j9)}(h tty_port_puth]h tty_port_put}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hjhhhjhM,ubjR)}(h(struct tty_port *port)h]jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hjhhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubh)}(hhh]j9)}(htty_porth]htty_port}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.tty_port_putasbuh1hhjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hporth]hport}(hj-hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubah}(h]h ]h"]h$]h&]hhuh1jQhjhhhjhM,ubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhjhM,ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM,hjhhubj)}(hhh]h)}(hdrop a reference to tty_porth]hdrop a reference to tty_port}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chM,hjThhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM,ubeh}(h]h ](j/functioneh"]h$]h&]jj/jjojjojjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct tty_port *port`` port to drop a reference of (can be NULL) **Description** The final put will destroy and free up the **port** using **port->ops->destruct\(\)** hook, or using kfree() if not provided.h](h)}(h**Parameters**h]j')}(hjyh]h Parameters}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjwubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chM0hjsubj=)}(hhh]jB)}(hD``struct tty_port *port`` port to drop a reference of (can be NULL) h](jH)}(h``struct tty_port *port``h]j#)}(hjh]hstruct tty_port *port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chM-hjubjb)}(hhh]h)}(h)port to drop a reference of (can be NULL)h]h)port to drop a reference of (can be NULL)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM-hjubah}(h]h ]h"]h$]h&]uh1jahjubeh}(h]h ]h"]h$]h&]uh1jAhjhM-hjubah}(h]h ]h"]h$]h&]uh1j<hjsubh)}(h**Description**h]j')}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chM/hjsubh)}(h}The final put will destroy and free up the **port** using **port->ops->destruct\(\)** hook, or using kfree() if not provided.h](h+The final put will destroy and free up the }(hjhhhNhNubj')}(h**port**h]hport}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh using }(hjhhhNhNubj')}(h**port->ops->destruct\(\)**h]hport->ops->destruct()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh( hook, or using kfree() if not provided.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:24: ./drivers/tty/tty_port.chM.hjsubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]j!ah ]h"]init & destroyah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hOpen/Close/Hangup Helpersh]hOpen/Close/Hangup Helpers}(hj-hhhNhNubah}(h]h ]h"]h$]h&]jj=uh1hhj*hhhhhKubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_port_shutdown (C function)c.tty_port_shutdownhNtauh1jhj*hhhNhNubj)}(hhh](j)}(hFvoid tty_port_shutdown (struct tty_port *port, struct tty_struct *tty)h]j )}(hEvoid tty_port_shutdown(struct tty_port *port, struct tty_struct *tty)h](j)}(hvoidh]hvoid}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMXubj")}(h h]h }(hjchhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjPhhhjbhMXubj3)}(htty_port_shutdownh]j9)}(htty_port_shutdownh]htty_port_shutdown}(hjuhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjqubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hjPhhhjbhMXubjR)}(h/(struct tty_port *port, struct tty_struct *tty)h](jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hjhhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubh)}(hhh]j9)}(htty_porth]htty_port}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjmodnameN classnameNjj)}j]j)}jjwsbc.tty_port_shutdownasbuh1hhjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hporth]hport}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubjX)}(hstruct tty_struct *ttyh](j^)}(hjah]hstruct}(hj hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjubj")}(h h]h }(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubh)}(hhh]j9)}(h tty_structh]h tty_struct}(hj! hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetj# modnameN classnameNjj)}j]jc.tty_port_shutdownasbuh1hhjubj")}(h h]h }(hj? hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h*}(hjM hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(httyh]htty}(hjZ hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubeh}(h]h ]h"]h$]h&]hhuh1jQhjPhhhjbhMXubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjLhhhjbhMXubah}(h]jGah ](jjeh"]h$]h&]jj)jhuh1jhjbhMXhjIhhubj)}(hhh]h)}(h&internal helper to shutdown the deviceh]h&internal helper to shutdown the device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMXhj hhubah}(h]h ]h"]h$]h&]uh1jhjIhhhjbhMXubeh}(h]h ](j/functioneh"]h$]h&]jj/jj jj jjjuh1jhhhj*hNhNubj)}(hXp**Parameters** ``struct tty_port *port`` tty port to be shut down ``struct tty_struct *tty`` the associated tty **Description** It is used by tty_port_hangup() and tty_port_close(). Its task is to shutdown the device if it was initialized (note consoles remain functioning). It lowers DTR/RTS (if **tty** has HUPCL set) and invokes **port->ops->shutdown\(\)**.h](h)}(h**Parameters**h]j')}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chM\hj ubj=)}(hhh](jB)}(h3``struct tty_port *port`` tty port to be shut down h](jH)}(h``struct tty_port *port``h]j#)}(hj h]hstruct tty_port *port}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj ubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMYhj ubjb)}(hhh]h)}(htty port to be shut downh]htty port to be shut down}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMYhj ubah}(h]h ]h"]h$]h&]uh1jahj ubeh}(h]h ]h"]h$]h&]uh1jAhj hMYhj ubjB)}(h.``struct tty_struct *tty`` the associated tty h](jH)}(h``struct tty_struct *tty``h]j#)}(hj h]hstruct tty_struct *tty}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj ubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMZhj ubjb)}(hhh]h)}(hthe associated ttyh]hthe associated tty}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMZhj ubah}(h]h ]h"]h$]h&]uh1jahj ubeh}(h]h ]h"]h$]h&]uh1jAhj hMZhj ubeh}(h]h ]h"]h$]h&]uh1j<hj ubh)}(h**Description**h]j')}(hj9 h]h Description}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj7 ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chM\hj ubh)}(hIt is used by tty_port_hangup() and tty_port_close(). Its task is to shutdown the device if it was initialized (note consoles remain functioning). It lowers DTR/RTS (if **tty** has HUPCL set) and invokes **port->ops->shutdown\(\)**.h](hIt is used by tty_port_hangup() and tty_port_close(). Its task is to shutdown the device if it was initialized (note consoles remain functioning). It lowers DTR/RTS (if }(hjO hhhNhNubj')}(h**tty**h]htty}(hjW hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjO ubh has HUPCL set) and invokes }(hjO hhhNhNubj')}(h**port->ops->shutdown\(\)**h]hport->ops->shutdown()}(hji hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjO ubh.}(hjO hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chM[hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj*hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_port_hangup (C function)c.tty_port_hanguphNtauh1jhj*hhhNhNubj)}(hhh](j)}(h,void tty_port_hangup (struct tty_port *port)h]j )}(h+void tty_port_hangup(struct tty_port *port)h](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMxubj")}(h h]h }(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj hhhj hMxubj3)}(htty_port_hanguph]j9)}(htty_port_hanguph]htty_port_hangup}(hj hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj ubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hj hhhj hMxubjR)}(h(struct tty_port *port)h]jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hj hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj ubj")}(h h]h }(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj ubh)}(hhh]j9)}(htty_porth]htty_port}(hj hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetj modnameN classnameNjj)}j]j)}jj sbc.tty_port_hangupasbuh1hhj ubj")}(h h]h }(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj ubj)}(hjh]h*}(hj+ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj9)}(hporth]hport}(hj8 hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj ubah}(h]h ]h"]h$]h&]hhuh1jQhj hhhj hMxubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj hhhj hMxubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hMxhj hhubj)}(hhh]h)}(h hangup helperh]h hangup helper}(hjb hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMxhj_ hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMxubeh}(h]h ](j/functioneh"]h$]h&]jj/jjz jjz jjjuh1jhhhj*hNhNubj)}(h**Parameters** ``struct tty_port *port`` tty port **Description** Perform port level tty hangup flag and count changes. Drop the tty reference. Caller holds tty lock.h](h)}(h**Parameters**h]j')}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chM|hj~ ubj=)}(hhh]jB)}(h#``struct tty_port *port`` tty port h](jH)}(h``struct tty_port *port``h]j#)}(hj h]hstruct tty_port *port}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj ubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMyhj ubjb)}(hhh]h)}(htty porth]htty port}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMyhj ubah}(h]h ]h"]h$]h&]uh1jahj ubeh}(h]h ]h"]h$]h&]uh1jAhj hMyhj ubah}(h]h ]h"]h$]h&]uh1j<hj~ ubh)}(h**Description**h]j')}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chM{hj~ ubh)}(hMPerform port level tty hangup flag and count changes. Drop the tty reference.h]hMPerform port level tty hangup flag and count changes. Drop the tty reference.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMzhj~ ubh)}(hCaller holds tty lock.h]hCaller holds tty lock.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chM}hj~ ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj*hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%tty_port_block_til_ready (C function)c.tty_port_block_til_readyhNtauh1jhj*hhhNhNubj)}(hhh](j)}(h_int tty_port_block_til_ready (struct tty_port *port, struct tty_struct *tty, struct file *filp)h]j )}(h^int tty_port_block_til_ready(struct tty_port *port, struct tty_struct *tty, struct file *filp)h](j)}(hinth]hint}(hj2 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj. hhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMubj")}(h h]h }(hjA hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj. hhhj@ hMubj3)}(htty_port_block_til_readyh]j9)}(htty_port_block_til_readyh]htty_port_block_til_ready}(hjS hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjO ubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hj. hhhj@ hMubjR)}(hB(struct tty_port *port, struct tty_struct *tty, struct file *filp)h](jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hjo hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjk ubj")}(h h]h }(hj| hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjk ubh)}(hhh]j9)}(htty_porth]htty_port}(hj hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetj modnameN classnameNjj)}j]j)}jjU sbc.tty_port_block_til_readyasbuh1hhjk ubj")}(h h]h }(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjk ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk ubj9)}(hporth]hport}(hj hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjk ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjg ubjX)}(hstruct tty_struct *ttyh](j^)}(hjah]hstruct}(hj hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj ubj")}(h h]h }(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj ubh)}(hhh]j9)}(h tty_structh]h tty_struct}(hj hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetj modnameN classnameNjj)}j]j c.tty_port_block_til_readyasbuh1hhj ubj")}(h h]h }(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj ubj)}(hjh]h*}(hj+ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj9)}(httyh]htty}(hj8 hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjg ubjX)}(hstruct file *filph](j^)}(hjah]hstruct}(hjQ hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjM ubj")}(h h]h }(hj^ hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjM ubh)}(hhh]j9)}(hfileh]hfile}(hjo hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjl ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjq modnameN classnameNjj)}j]j c.tty_port_block_til_readyasbuh1hhjM ubj")}(h h]h }(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjM ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM ubj9)}(hfilph]hfilp}(hj hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjM ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjg ubeh}(h]h ]h"]h$]h&]hhuh1jQhj. hhhj@ hMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj* hhhj@ hMubah}(h]j% ah ](jjeh"]h$]h&]jj)jhuh1jhj@ hMhj' hhubj)}(hhh]h)}(hWaiting logic for tty openh]hWaiting logic for tty open}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhj' hhhj@ hMubeh}(h]h ](j/functioneh"]h$]h&]jj/jj jj jjjuh1jhhhj*hNhNubj)}(hXs**Parameters** ``struct tty_port *port`` the tty port being opened ``struct tty_struct *tty`` the tty device being bound ``struct file *filp`` the file pointer of the opener or ``NULL`` **Description** Implement the core POSIX/SuS tty behaviour when opening a tty device. Handles: - hangup (both before and during) - non blocking open - rts/dtr/dcd - signals - port flags and counts The passed **port** must implement the **port->ops->carrier_raised** method if it can do carrier detect and the **port->ops->dtr_rts** method if it supports software management of these lines. Note that the dtr/rts raise is done each iteration as a hangup may have previously dropped them while we wait. Caller holds tty lock. **Note** May drop and reacquire tty lock when blocking, so **tty** and **port** may have changed state (eg., may have been hung up).h](h)}(h**Parameters**h]j')}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj ubj=)}(hhh](jB)}(h4``struct tty_port *port`` the tty port being opened h](jH)}(h``struct tty_port *port``h]j#)}(hjh]hstruct tty_port *port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj ubjb)}(hhh]h)}(hthe tty port being openedh]hthe tty port being opened}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj)ubah}(h]h ]h"]h$]h&]uh1jahj ubeh}(h]h ]h"]h$]h&]uh1jAhj(hMhj ubjB)}(h6``struct tty_struct *tty`` the tty device being bound h](jH)}(h``struct tty_struct *tty``h]j#)}(hjLh]hstruct tty_struct *tty}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjJubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjFubjb)}(hhh]h)}(hthe tty device being boundh]hthe tty device being bound}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMhjbubah}(h]h ]h"]h$]h&]uh1jahjFubeh}(h]h ]h"]h$]h&]uh1jAhjahMhj ubjB)}(hA``struct file *filp`` the file pointer of the opener or ``NULL`` h](jH)}(h``struct file *filp``h]j#)}(hjh]hstruct file *filp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubjb)}(hhh]h)}(h*the file pointer of the opener or ``NULL``h](h"the file pointer of the opener or }(hjhhhNhNubj#)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jahjubeh}(h]h ]h"]h$]h&]uh1jAhjhMhj ubeh}(h]h ]h"]h$]h&]uh1j<hj ubh)}(h**Description**h]j')}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj ubh)}(hNImplement the core POSIX/SuS tty behaviour when opening a tty device. Handles:h]hNImplement the core POSIX/SuS tty behaviour when opening a tty device. Handles:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj ubh block_quote)}(hf- hangup (both before and during) - non blocking open - rts/dtr/dcd - signals - port flags and counts h]h)}(hhh](h)}(hhangup (both before and during)h]h)}(hjh]hhangup (both before and during)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubah}(h]h ]h"]h$]h&]uh1hhjubh)}(hnon blocking openh]h)}(hjh]hnon blocking open}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubah}(h]h ]h"]h$]h&]uh1hhjubh)}(h rts/dtr/dcdh]h)}(hj.h]h rts/dtr/dcd}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj,ubah}(h]h ]h"]h$]h&]uh1hhjubh)}(hsignalsh]h)}(hjFh]hsignals}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjDubah}(h]h ]h"]h$]h&]uh1hhjubh)}(hport flags and counts h]h)}(hport flags and countsh]hport flags and counts}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj\ubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]bullet-uh1hhj hMhjubah}(h]h ]h"]h$]h&]uh1jhj hMhj ubh)}(hX/The passed **port** must implement the **port->ops->carrier_raised** method if it can do carrier detect and the **port->ops->dtr_rts** method if it supports software management of these lines. Note that the dtr/rts raise is done each iteration as a hangup may have previously dropped them while we wait.h](h The passed }(hjhhhNhNubj')}(h**port**h]hport}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh must implement the }(hjhhhNhNubj')}(h**port->ops->carrier_raised**h]hport->ops->carrier_raised}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh, method if it can do carrier detect and the }(hjhhhNhNubj')}(h**port->ops->dtr_rts**h]hport->ops->dtr_rts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh method if it supports software management of these lines. Note that the dtr/rts raise is done each iteration as a hangup may have previously dropped them while we wait.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj ubh)}(hCaller holds tty lock.h]hCaller holds tty lock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj ubh)}(h**Note**h]j')}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj ubh)}(h{May drop and reacquire tty lock when blocking, so **tty** and **port** may have changed state (eg., may have been hung up).h](h2May drop and reacquire tty lock when blocking, so }(hjhhhNhNubj')}(h**tty**h]htty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh and }(hjhhhNhNubj')}(h**port**h]hport}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh5 may have changed state (eg., may have been hung up).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj*hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!tty_port_close_start (C function)c.tty_port_close_starthNtauh1jhj*hhhNhNubj)}(hhh](j)}(h[int tty_port_close_start (struct tty_port *port, struct tty_struct *tty, struct file *filp)h]j )}(hZint tty_port_close_start(struct tty_port *port, struct tty_struct *tty, struct file *filp)h](j)}(hinth]hint}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>hhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMXubj")}(h h]h }(hjQhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj>hhhjPhMXubj3)}(htty_port_close_starth]j9)}(htty_port_close_starth]htty_port_close_start}(hjchhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj_ubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hj>hhhjPhMXubjR)}(hB(struct tty_port *port, struct tty_struct *tty, struct file *filp)h](jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hjhhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj{ubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj{ubh)}(hhh]j9)}(htty_porth]htty_port}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjmodnameN classnameNjj)}j]j)}jjesbc.tty_port_close_startasbuh1hhj{ubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj{ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj9)}(hporth]hport}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj{ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjwubjX)}(hstruct tty_struct *ttyh](j^)}(hjah]hstruct}(hjhhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubh)}(hhh]j9)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjmodnameN classnameNjj)}j]jc.tty_port_close_startasbuh1hhjubj")}(h h]h }(hj-hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h*}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(httyh]htty}(hjHhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjwubjX)}(hstruct file *filph](j^)}(hjah]hstruct}(hjahhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj]ubj")}(h h]h }(hjnhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj]ubh)}(hhh]j9)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj|ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjmodnameN classnameNjj)}j]jc.tty_port_close_startasbuh1hhj]ubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj]ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj9)}(hfilph]hfilp}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj]ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjwubeh}(h]h ]h"]h$]h&]hhuh1jQhj>hhhjPhMXubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj:hhhjPhMXubah}(h]j5ah ](jjeh"]h$]h&]jj)jhuh1jhjPhMXhj7hhubj)}(hhh]h)}(h$helper for tty->ops->close, part 1/2h]h$helper for tty->ops->close, part 1/2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMXhjhhubah}(h]h ]h"]h$]h&]uh1jhj7hhhjPhMXubeh}(h]h ](j/functioneh"]h$]h&]jj/jjjjjjjuh1jhhhj*hNhNubj)}(hX**Parameters** ``struct tty_port *port`` tty_port of the device ``struct tty_struct *tty`` tty being closed ``struct file *filp`` passed file pointer **Description** Decrements and checks open count. Flushes the port if this is the last close. That means, dropping the data from the outpu buffer on the device and waiting for sending logic to finish. The rest of close handling is performed in tty_port_close_end(). Locking: Caller holds tty lock. **Return** 1 if this is the last close, otherwise 0h](h)}(h**Parameters**h]j')}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chM\hjubj=)}(hhh](jB)}(h1``struct tty_port *port`` tty_port of the device h](jH)}(h``struct tty_port *port``h]j#)}(hj#h]hstruct tty_port *port}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj!ubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMYhjubjb)}(hhh]h)}(htty_port of the deviceh]htty_port of the device}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMYhj9ubah}(h]h ]h"]h$]h&]uh1jahjubeh}(h]h ]h"]h$]h&]uh1jAhj8hMYhjubjB)}(h,``struct tty_struct *tty`` tty being closed h](jH)}(h``struct tty_struct *tty``h]j#)}(hj\h]hstruct tty_struct *tty}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjZubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMZhjVubjb)}(hhh]h)}(htty being closedh]htty being closed}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhMZhjrubah}(h]h ]h"]h$]h&]uh1jahjVubeh}(h]h ]h"]h$]h&]uh1jAhjqhMZhjubjB)}(h*``struct file *filp`` passed file pointer h](jH)}(h``struct file *filp``h]j#)}(hjh]hstruct file *filp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chM[hjubjb)}(hhh]h)}(hpassed file pointerh]hpassed file pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM[hjubah}(h]h ]h"]h$]h&]uh1jahjubeh}(h]h ]h"]h$]h&]uh1jAhjhM[hjubeh}(h]h ]h"]h$]h&]uh1j<hjubh)}(h**Description**h]j')}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chM]hjubh)}(hDecrements and checks open count. Flushes the port if this is the last close. That means, dropping the data from the outpu buffer on the device and waiting for sending logic to finish. The rest of close handling is performed in tty_port_close_end().h]hDecrements and checks open count. Flushes the port if this is the last close. That means, dropping the data from the outpu buffer on the device and waiting for sending logic to finish. The rest of close handling is performed in tty_port_close_end().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chM\hjubh)}(hLocking: Caller holds tty lock.h]hLocking: Caller holds tty lock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMahjubh)}(h **Return**h]j')}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMchjubh)}(h(1 if this is the last close, otherwise 0h]h(1 if this is the last close, otherwise 0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMdhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj*hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_port_close_end (C function)c.tty_port_close_endhNtauh1jhj*hhhNhNubj)}(hhh](j)}(hGvoid tty_port_close_end (struct tty_port *port, struct tty_struct *tty)h]j )}(hFvoid tty_port_close_end(struct tty_port *port, struct tty_struct *tty)h](j)}(hvoidh]hvoid}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMubj")}(h h]h }(hjZhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjGhhhjYhMubj3)}(htty_port_close_endh]j9)}(htty_port_close_endh]htty_port_close_end}(hjlhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjhubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hjGhhhjYhMubjR)}(h/(struct tty_port *port, struct tty_struct *tty)h](jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hjhhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubh)}(hhh]j9)}(htty_porth]htty_port}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjmodnameN classnameNjj)}j]j)}jjnsbc.tty_port_close_endasbuh1hhjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hporth]hport}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubjX)}(hstruct tty_struct *ttyh](j^)}(hjah]hstruct}(hjhhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubh)}(hhh]j9)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjmodnameN classnameNjj)}j]jc.tty_port_close_endasbuh1hhjubj")}(h h]h }(hj6hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h*}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(httyh]htty}(hjQhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubeh}(h]h ]h"]h$]h&]hhuh1jQhjGhhhjYhMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjChhhjYhMubah}(h]j>ah ](jjeh"]h$]h&]jj)jhuh1jhjYhMhj@hhubj)}(hhh]h)}(h$helper for tty->ops->close, part 2/2h]h$helper for tty->ops->close, part 2/2}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjxhhubah}(h]h ]h"]h$]h&]uh1jhj@hhhjYhMubeh}(h]h ](j/functioneh"]h$]h&]jj/jjjjjjjuh1jhhhj*hNhNubj)}(hXv**Parameters** ``struct tty_port *port`` tty_port of the device ``struct tty_struct *tty`` tty being closed **Description** This is a continuation of the first part: tty_port_close_start(). This should be called after turning off the device. It flushes the data from the line discipline and delays the close by **port->close_delay**. Locking: Caller holds tty lock.h](h)}(h**Parameters**h]j')}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubj=)}(hhh](jB)}(h1``struct tty_port *port`` tty_port of the device h](jH)}(h``struct tty_port *port``h]j#)}(hjh]hstruct tty_port *port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubjb)}(hhh]h)}(htty_port of the deviceh]htty_port of the device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jahjubeh}(h]h ]h"]h$]h&]uh1jAhjhMhjubjB)}(h,``struct tty_struct *tty`` tty being closed h](jH)}(h``struct tty_struct *tty``h]j#)}(hjh]hstruct tty_struct *tty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubjb)}(hhh]h)}(htty being closedh]htty being closed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jahjubeh}(h]h ]h"]h$]h&]uh1jAhj hMhjubeh}(h]h ]h"]h$]h&]uh1j<hjubh)}(h**Description**h]j')}(hj0h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj.ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubh)}(hThis is a continuation of the first part: tty_port_close_start(). This should be called after turning off the device. It flushes the data from the line discipline and delays the close by **port->close_delay**.h](hThis is a continuation of the first part: tty_port_close_start(). This should be called after turning off the device. It flushes the data from the line discipline and delays the close by }(hjFhhhNhNubj')}(h**port->close_delay**h]hport->close_delay}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjFubh.}(hjFhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubh)}(hLocking: Caller holds tty lock.h]hLocking: Caller holds tty lock.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj*hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_port_close (C function)c.tty_port_closehNtauh1jhj*hhhNhNubj)}(hhh](j)}(hVvoid tty_port_close (struct tty_port *port, struct tty_struct *tty, struct file *filp)h]j )}(hUvoid tty_port_close(struct tty_port *port, struct tty_struct *tty, struct file *filp)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjhhhjhMubj3)}(htty_port_closeh]j9)}(htty_port_closeh]htty_port_close}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hjhhhjhMubjR)}(hB(struct tty_port *port, struct tty_struct *tty, struct file *filp)h](jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hjhhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubh)}(hhh]j9)}(htty_porth]htty_port}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.tty_port_closeasbuh1hhjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hporth]hport}(hj,hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubjX)}(hstruct tty_struct *ttyQh](j^)}(hjah]hstruct}(hjEhhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjAubj")}(h h]h }(hjRhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjAubh)}(hhh]j9)}(h tty_structh]h tty_struct}(hjchhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj`ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjemodnameN classnameNjj)}j]j c.tty_port_closeasbuh1hhjAubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjAubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj9)}(httyh]htty}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjAubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubjX)}(hstruct file *filph](j^)}(hjah]hstruct}(hjhhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubh)}(hhh]j9)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjmodnameN classnameNjj)}j]j c.tty_port_closeasbuh1hhjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hfilph]hfilp}(hj hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubeh}(h]h ]h"]h$]h&]hhuh1jQhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(hgeneric tty->ops->close handlerh]hgeneric tty->ops->close handler}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj3hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](j/functioneh"]h$]h&]jj/jjNjjNjjjuh1jhhhj*hNhNubj)}(hX**Parameters** ``struct tty_port *port`` tty_port of the device ``struct tty_struct *tty`` tty being closed ``struct file *filp`` passed file pointer **Description** It is a generic helper to be used in driver's **tty->ops->close**. It wraps a sequence of tty_port_close_start(), tty_port_shutdown(), and tty_port_close_end(). The latter two are called only if this is the last close. See the respective functions for the details. Locking: Caller holds tty lockh](h)}(h**Parameters**h]j')}(hjXh]h Parameters}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjVubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjRubj=)}(hhh](jB)}(h1``struct tty_port *port`` tty_port of the device h](jH)}(h``struct tty_port *port``h]j#)}(hjwh]hstruct tty_port *port}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjuubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjqubjb)}(hhh]h)}(htty_port of the deviceh]htty_port of the device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jahjqubeh}(h]h ]h"]h$]h&]uh1jAhjhMhjnubjB)}(h,``struct tty_struct *tty`` tty being closed h](jH)}(h``struct tty_struct *tty``h]j#)}(hjh]hstruct tty_struct *tty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubjb)}(hhh]h)}(htty being closedh]htty being closed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jahjubeh}(h]h ]h"]h$]h&]uh1jAhjhMhjnubjB)}(h*``struct file *filp`` passed file pointer h](jH)}(h``struct file *filp``h]j#)}(hjh]hstruct file *filp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubjb)}(hhh]h)}(hpassed file pointerh]hpassed file pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jahjubeh}(h]h ]h"]h$]h&]uh1jAhjhMhjnubeh}(h]h ]h"]h$]h&]uh1j<hjRubh)}(h**Description**h]j')}(hj$h]h Description}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj"ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjRubh)}(hXIt is a generic helper to be used in driver's **tty->ops->close**. It wraps a sequence of tty_port_close_start(), tty_port_shutdown(), and tty_port_close_end(). The latter two are called only if this is the last close. See the respective functions for the details.h](h0It is a generic helper to be used in driver’s }(hj:hhhNhNubj')}(h**tty->ops->close**h]htty->ops->close}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj:ubh. It wraps a sequence of tty_port_close_start(), tty_port_shutdown(), and tty_port_close_end(). The latter two are called only if this is the last close. See the respective functions for the details.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjRubh)}(hLocking: Caller holds tty lockh]hLocking: Caller holds tty lock}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj*hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_port_install (C function)c.tty_port_installhNtauh1jhj*hhhNhNubj)}(hhh](j)}(h_int tty_port_install (struct tty_port *port, struct tty_driver *driver, struct tty_struct *tty)h]j )}(h^int tty_port_install(struct tty_port *port, struct tty_driver *driver, struct tty_struct *tty)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjhhhjhMubj3)}(htty_port_installh]j9)}(htty_port_installh]htty_port_install}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hjhhhjhMubjR)}(hJ(struct tty_port *port, struct tty_driver *driver, struct tty_struct *tty)h](jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hjhhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubh)}(hhh]j9)}(htty_porth]htty_port}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.tty_port_installasbuh1hhjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hporth]hport}(hj hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubjX)}(hstruct tty_driver *driverh](j^)}(hjah]hstruct}(hj9hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj5ubj")}(h h]h }(hjFhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj5ubh)}(hhh]j9)}(h tty_driverh]h tty_driver}(hjWhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjTubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjYmodnameN classnameNjj)}j]jc.tty_port_installasbuh1hhj5ubj")}(h h]h }(hjuhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj5ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj9)}(hdriverh]hdriver}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj5ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubjX)}(hstruct tty_struct *ttyh](j^)}(hjah]hstruct}(hjhhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubh)}(hhh]j9)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjmodnameN classnameNjj)}j]jc.tty_port_installasbuh1hhjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(httyh]htty}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubeh}(h]h ]h"]h$]h&]hhuh1jQhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhjhMubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h!generic tty->ops->install handlerh]h!generic tty->ops->install handler}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj'hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](j/functioneh"]h$]h&]jj/jjBjjBjjjuh1jhhhj*hNhNubj)}(hX**Parameters** ``struct tty_port *port`` tty_port of the device ``struct tty_driver *driver`` tty_driver for this device ``struct tty_struct *tty`` tty to be installed **Description** It is the same as tty_standard_install() except the provided **port** is linked to a concrete tty specified by **tty**. Use this or tty_port_register_device() (or both). Call tty_port_link_device() as a last resort.h](h)}(h**Parameters**h]j')}(hjLh]h Parameters}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjJubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjFubj=)}(hhh](jB)}(h1``struct tty_port *port`` tty_port of the device h](jH)}(h``struct tty_port *port``h]j#)}(hjkh]hstruct tty_port *port}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjiubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjeubjb)}(hhh]h)}(htty_port of the deviceh]htty_port of the device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jahjeubeh}(h]h ]h"]h$]h&]uh1jAhjhMhjbubjB)}(h9``struct tty_driver *driver`` tty_driver for this device h](jH)}(h``struct tty_driver *driver``h]j#)}(hjh]hstruct tty_driver *driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubjb)}(hhh]h)}(htty_driver for this deviceh]htty_driver for this device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jahjubeh}(h]h ]h"]h$]h&]uh1jAhjhMhjbubjB)}(h/``struct tty_struct *tty`` tty to be installed h](jH)}(h``struct tty_struct *tty``h]j#)}(hjh]hstruct tty_struct *tty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubjb)}(hhh]h)}(htty to be installedh]htty to be installed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jahjubeh}(h]h ]h"]h$]h&]uh1jAhjhMhjbubeh}(h]h ]h"]h$]h&]uh1j<hjFubh)}(h**Description**h]j')}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjFubh)}(hIt is the same as tty_standard_install() except the provided **port** is linked to a concrete tty specified by **tty**. Use this or tty_port_register_device() (or both). Call tty_port_link_device() as a last resort.h](h=It is the same as tty_standard_install() except the provided }(hj.hhhNhNubj')}(h**port**h]hport}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj.ubh* is linked to a concrete tty specified by }(hj.hhhNhNubj')}(h**tty**h]htty}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj.ubha. Use this or tty_port_register_device() (or both). Call tty_port_link_device() as a last resort.}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj*hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_port_open (C function)c.tty_port_openhNtauh1jhj*hhhNhNubj)}(hhh](j)}(hTint tty_port_open (struct tty_port *port, struct tty_struct *tty, struct file *filp)h]j )}(hSint tty_port_open(struct tty_port *port, struct tty_struct *tty, struct file *filp)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}hhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj}hhhjhMubj3)}(h tty_port_openh]j9)}(h tty_port_openh]h tty_port_open}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hj}hhhjhMubjR)}(hB(struct tty_port *port, struct tty_struct *tty, struct file *filp)h](jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hjhhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubh)}(hhh]j9)}(htty_porth]htty_port}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.tty_port_openasbuh1hhjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hporth]hport}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubjX)}(hstruct tty_struct *ttyh](j^)}(hjah]hstruct}(hj0hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj,ubj")}(h h]h }(hj=hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj,ubh)}(hhh]j9)}(h tty_structh]h tty_struct}(hjNhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjKubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjPmodnameN classnameNjj)}j]jc.tty_port_openasbuh1hhj,ubj")}(h h]h }(hjlhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj,ubj)}(hjh]h*}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj9)}(httyh]htty}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj,ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubjX)}(hstruct file *filph](j^)}(hjah]hstruct}(hjhhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubh)}(hhh]j9)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjmodnameN classnameNjj)}j]jc.tty_port_openasbuh1hhjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hfilph]hfilp}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubeh}(h]h ]h"]h$]h&]hhuh1jQhj}hhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjyhhhjhMubah}(h]jtah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjvhhubj)}(hhh]h)}(hgeneric tty->ops->open handlerh]hgeneric tty->ops->open handler}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjvhhhjhMubeh}(h]h ](j/functioneh"]h$]h&]jj/jj9jj9jjjuh1jhhhj*hNhNubj)}(hX**Parameters** ``struct tty_port *port`` tty_port of the device ``struct tty_struct *tty`` tty to be opened ``struct file *filp`` passed file pointer **Description** It is a generic helper to be used in driver's **tty->ops->open**. It activates the devices using **port->ops->activate** if not active already. And waits for the device to be ready using tty_port_block_til_ready() (e.g. raises DTR/CTS and waits for carrier). Note that **port->ops->shutdown** is not called when **port->ops->activate** returns an error (on the contrary, **tty->ops->close** is). Locking: Caller holds tty lock. **Note** may drop and reacquire tty lock (in tty_port_block_til_ready()) so **tty** and **port** may have changed state (eg., may be hung up now).h](h)}(h**Parameters**h]j')}(hjCh]h Parameters}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjAubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj=ubj=)}(hhh](jB)}(h1``struct tty_port *port`` tty_port of the device h](jH)}(h``struct tty_port *port``h]j#)}(hjbh]hstruct tty_port *port}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj`ubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj\ubjb)}(hhh]h)}(htty_port of the deviceh]htty_port of the device}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhMhjxubah}(h]h ]h"]h$]h&]uh1jahj\ubeh}(h]h ]h"]h$]h&]uh1jAhjwhMhjYubjB)}(h,``struct tty_struct *tty`` tty to be opened h](jH)}(h``struct tty_struct *tty``h]j#)}(hjh]hstruct tty_struct *tty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubjb)}(hhh]h)}(htty to be openedh]htty to be opened}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jahjubeh}(h]h ]h"]h$]h&]uh1jAhjhMhjYubjB)}(h*``struct file *filp`` passed file pointer h](jH)}(h``struct file *filp``h]j#)}(hjh]hstruct file *filp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhjubjb)}(hhh]h)}(hpassed file pointerh]hpassed file pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jahjubeh}(h]h ]h"]h$]h&]uh1jAhjhMhjYubeh}(h]h ]h"]h$]h&]uh1j<hj=ubh)}(h**Description**h]j')}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj=ubh)}(hXIt is a generic helper to be used in driver's **tty->ops->open**. It activates the devices using **port->ops->activate** if not active already. And waits for the device to be ready using tty_port_block_til_ready() (e.g. raises DTR/CTS and waits for carrier).h](h0It is a generic helper to be used in driver’s }(hj%hhhNhNubj')}(h**tty->ops->open**h]htty->ops->open}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj%ubh!. It activates the devices using }(hj%hhhNhNubj')}(h**port->ops->activate**h]hport->ops->activate}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj%ubh if not active already. And waits for the device to be ready using tty_port_block_til_ready() (e.g. raises DTR/CTS and waits for carrier).}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj=ubh)}(hNote that **port->ops->shutdown** is not called when **port->ops->activate** returns an error (on the contrary, **tty->ops->close** is).h](h Note that }(hjXhhhNhNubj')}(h**port->ops->shutdown**h]hport->ops->shutdown}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjXubh is not called when }(hjXhhhNhNubj')}(h**port->ops->activate**h]hport->ops->activate}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjXubh$ returns an error (on the contrary, }(hjXhhhNhNubj')}(h**tty->ops->close**h]htty->ops->close}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjXubh is).}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj=ubh)}(hLocking: Caller holds tty lock.h]hLocking: Caller holds tty lock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj=ubh)}(h**Note**h]j')}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj=ubh)}(hmay drop and reacquire tty lock (in tty_port_block_til_ready()) so **tty** and **port** may have changed state (eg., may be hung up now).h](hCmay drop and reacquire tty lock (in tty_port_block_til_ready()) so }(hjhhhNhNubj')}(h**tty**h]htty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh and }(hjhhhNhNubj')}(h**port**h]hport}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjubh2 may have changed state (eg., may be hung up now).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:31: ./drivers/tty/tty_port.chMhj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj*hhhNhNubeh}(h]jCah ]h"]open/close/hangup helpersah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(hTTY Refcountingh]hTTY Refcounting}(hjhhhNhNubah}(h]h ]h"]h$]h&]jj_uh1hhjhhhhhK%ubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_port_tty_get (C function)c.tty_port_tty_gethNtauh1jhjhhhNhNubj)}(hhh](j)}(hhjF ubj=)}(hhh]jB)}(h#``struct tty_port *port`` tty port h](jH)}(h``struct tty_port *port``h]j#)}(hjk h]hstruct tty_port *port}(hjm hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hji ubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:39: ./drivers/tty/tty_port.chM;hje ubjb)}(hhh]h)}(htty porth]htty port}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM;hj ubah}(h]h ]h"]h$]h&]uh1jahje ubeh}(h]h ]h"]h$]h&]uh1jAhj hM;hjb ubah}(h]h ]h"]h$]h&]uh1j<hjF ubh)}(h**Description**h]j')}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:39: ./drivers/tty/tty_port.chM=hjF ubh)}(hzReturn a refcount protected tty instance or ``NULL`` if the port is not associated with a tty (eg due to close or hangup).h](h,Return a refcount protected tty instance or }(hj hhhNhNubj#)}(h``NULL``h]hNULL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj ubhF if the port is not associated with a tty (eg due to close or hangup).}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:39: ./drivers/tty/tty_port.chM<hjF ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_port_tty_set (C function)c.tty_port_tty_sethNtauh1jhjhhhNhNubj)}(hhh](j)}(hEvoid tty_port_tty_set (struct tty_port *port, struct tty_struct *tty)h]j )}(hDvoid tty_port_tty_set(struct tty_port *port, struct tty_struct *tty)h](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:39: ./drivers/tty/tty_port.chMHubj")}(h h]h }(hj !hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj hhhj !hMHubj3)}(htty_port_tty_seth]j9)}(htty_port_tty_seth]htty_port_tty_set}(hj!hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj!ubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hj hhhj !hMHubjR)}(h/(struct tty_port *port, struct tty_struct *tty)h](jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hj:!hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj6!ubj")}(h h]h }(hjG!hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj6!ubh)}(hhh]j9)}(htty_porth]htty_port}(hjX!hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjU!ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjZ!modnameN classnameNjj)}j]j)}jj !sbc.tty_port_tty_setasbuh1hhj6!ubj")}(h h]h }(hjx!hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj6!ubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6!ubj9)}(hporth]hport}(hj!hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj6!ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj2!ubjX)}(hstruct tty_struct *ttyh](j^)}(hjah]hstruct}(hj!hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj!ubj")}(h h]h }(hj!hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj!ubh)}(hhh]j9)}(h tty_structh]h tty_struct}(hj!hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj!ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetj!modnameN classnameNjj)}j]jt!c.tty_port_tty_setasbuh1hhj!ubj")}(h h]h }(hj!hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj!ubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj9)}(httyh]htty}(hj"hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj!ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj2!ubeh}(h]h ]h"]h$]h&]hhuh1jQhj hhhj !hMHubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj hhhj !hMHubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj !hMHhj hhubj)}(hhh]h)}(hset the tty of a porth]hset the tty of a port}(hj-"hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:39: ./drivers/tty/tty_port.chMHhj*"hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj !hMHubeh}(h]h ](j/functioneh"]h$]h&]jj/jjE"jjE"jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct tty_port *port`` tty port ``struct tty_struct *tty`` the tty **Description** Associate the port and tty pair. Manages any internal refcounts. Pass ``NULL`` to deassociate a port.h](h)}(h**Parameters**h]j')}(hjO"h]h Parameters}(hjQ"hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjM"ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:39: ./drivers/tty/tty_port.chMLhjI"ubj=)}(hhh](jB)}(h#``struct tty_port *port`` tty port h](jH)}(h``struct tty_port *port``h]j#)}(hjn"h]hstruct tty_port *port}(hjp"hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjl"ubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:39: ./drivers/tty/tty_port.chMIhjh"ubjb)}(hhh]h)}(htty porth]htty port}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMIhj"ubah}(h]h ]h"]h$]h&]uh1jahjh"ubeh}(h]h ]h"]h$]h&]uh1jAhj"hMIhje"ubjB)}(h#``struct tty_struct *tty`` the tty h](jH)}(h``struct tty_struct *tty``h]j#)}(hj"h]hstruct tty_struct *tty}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj"ubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:39: ./drivers/tty/tty_port.chMJhj"ubjb)}(hhh]h)}(hthe ttyh]hthe tty}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMJhj"ubah}(h]h ]h"]h$]h&]uh1jahj"ubeh}(h]h ]h"]h$]h&]uh1jAhj"hMJhje"ubeh}(h]h ]h"]h$]h&]uh1j<hjI"ubh)}(h**Description**h]j')}(hj"h]h Description}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj"ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:39: ./drivers/tty/tty_port.chMLhjI"ubh)}(heAssociate the port and tty pair. Manages any internal refcounts. Pass ``NULL`` to deassociate a port.h](hFAssociate the port and tty pair. Manages any internal refcounts. Pass }(hj"hhhNhNubj#)}(h``NULL``h]hNULL}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj"ubh to deassociate a port.}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:39: ./drivers/tty/tty_port.chMKhjI"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]jeah ]h"]tty refcountingah$]h&]uh1hhjhhhhhK%ubh)}(hhh](h)}(h TTY Helpersh]h TTY Helpers}(hj*#hhhNhNubah}(h]h ]h"]h$]h&]jjuh1hhj'#hhhhhK+ubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j tty_port_tty_hangup (C function)c.tty_port_tty_hanguphNtauh1jhj'#hhhNhNubj)}(hhh](j)}(hCvoid tty_port_tty_hangup (struct tty_port *port, bool check_clocal)h]j )}(hBvoid tty_port_tty_hangup(struct tty_port *port, bool check_clocal)h](j)}(hvoidh]hvoid}(hjQ#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM#hhh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:45: ./include/linux/tty_port.hhM ubj")}(h h]h }(hj`#hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjM#hhhj_#hM ubj3)}(htty_port_tty_hanguph]j9)}(htty_port_tty_hanguph]htty_port_tty_hangup}(hjr#hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjn#ubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hjM#hhhj_#hM ubjR)}(h*(struct tty_port *port, bool check_clocal)h](jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hj#hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj#ubj")}(h h]h }(hj#hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj#ubh)}(hhh]j9)}(htty_porth]htty_port}(hj#hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj#ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetj#modnameN classnameNjj)}j]j)}jjt#sbc.tty_port_tty_hangupasbuh1hhj#ubj")}(h h]h }(hj#hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj#ubj)}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj9)}(hporth]hport}(hj#hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj#ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj#ubjX)}(hbool check_clocalh](j)}(hboolh]hbool}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj")}(h h]h }(hj$hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj#ubj9)}(h check_clocalh]h check_clocal}(hj$hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj#ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj#ubeh}(h]h ]h"]h$]h&]hhuh1jQhjM#hhhj_#hM ubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjI#hhhj_#hM ubah}(h]jD#ah ](jjeh"]h$]h&]jj)jhuh1jhj_#hM hjF#hhubj)}(hhh]h)}(h&helper to hang up a tty asynchronouslyh]h&helper to hang up a tty asynchronously}(hjF$hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:45: ./include/linux/tty_port.hhM hjC$hhubah}(h]h ]h"]h$]h&]uh1jhjF#hhhj_#hM ubeh}(h]h ](j/functioneh"]h$]h&]jj/jj^$jj^$jjjuh1jhhhj'#hNhNubj)}(hs**Parameters** ``struct tty_port *port`` tty port ``bool check_clocal`` hang only ttys with ``CLOCAL`` unset?h](h)}(h**Parameters**h]j')}(hjh$h]h Parameters}(hjj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjf$ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:45: ./include/linux/tty_port.hhMhjb$ubj=)}(hhh](jB)}(h#``struct tty_port *port`` tty port h](jH)}(h``struct tty_port *port``h]j#)}(hj$h]hstruct tty_port *port}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj$ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:45: ./include/linux/tty_port.hhM hj$ubjb)}(hhh]h)}(htty porth]htty port}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hM hj$ubah}(h]h ]h"]h$]h&]uh1jahj$ubeh}(h]h ]h"]h$]h&]uh1jAhj$hM hj~$ubjB)}(h;``bool check_clocal`` hang only ttys with ``CLOCAL`` unset?h](jH)}(h``bool check_clocal``h]j#)}(hj$h]hbool check_clocal}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj$ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:45: ./include/linux/tty_port.hhMhj$ubjb)}(hhh]h)}(h%hang only ttys with ``CLOCAL`` unset?h](hhang only ttys with }(hj$hhhNhNubj#)}(h ``CLOCAL``h]hCLOCAL}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj$ubh unset?}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:45: ./include/linux/tty_port.hhMhj$ubah}(h]h ]h"]h$]h&]uh1jahj$ubeh}(h]h ]h"]h$]h&]uh1jAhj$hMhj~$ubeh}(h]h ]h"]h$]h&]uh1j<hjb$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'#hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!tty_port_tty_vhangup (C function)c.tty_port_tty_vhanguphNtauh1jhj'#hhhNhNubj)}(hhh](j)}(h1void tty_port_tty_vhangup (struct tty_port *port)h]j )}(h0void tty_port_tty_vhangup(struct tty_port *port)h](j)}(hvoidh]hvoid}(hj,%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(%hhh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:45: ./include/linux/tty_port.hhMubj")}(h h]h }(hj;%hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj(%hhhj:%hMubj3)}(htty_port_tty_vhanguph]j9)}(htty_port_tty_vhanguph]htty_port_tty_vhangup}(hjM%hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjI%ubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hj(%hhhj:%hMubjR)}(h(struct tty_port *port)h]jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hji%hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hje%ubj")}(h h]h }(hjv%hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hje%ubh)}(hhh]j9)}(htty_porth]htty_port}(hj%hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj%ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetj%modnameN classnameNjj)}j]j)}jjO%sbc.tty_port_tty_vhangupasbuh1hhje%ubj")}(h h]h }(hj%hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hje%ubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje%ubj9)}(hporth]hport}(hj%hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hje%ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhja%ubah}(h]h ]h"]h$]h&]hhuh1jQhj(%hhhj:%hMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj$%hhhj:%hMubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1jhj:%hMhj!%hhubj)}(hhh]h)}(h%helper to hang up a tty synchronouslyh]h%helper to hang up a tty synchronously}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:45: ./include/linux/tty_port.hhMhj%hhubah}(h]h ]h"]h$]h&]uh1jhj!%hhhj:%hMubeh}(h]h ](j/functioneh"]h$]h&]jj/jj&jj&jjjuh1jhhhj'#hNhNubj)}(h4**Parameters** ``struct tty_port *port`` tty porth](h)}(h**Parameters**h]j')}(hj&h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj &ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:45: ./include/linux/tty_port.hhMhj&ubj=)}(hhh]jB)}(h"``struct tty_port *port`` tty porth](jH)}(h``struct tty_port *port``h]j#)}(hj-&h]hstruct tty_port *port}(hj/&hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj+&ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:45: ./include/linux/tty_port.hhMhj'&ubjb)}(hhh]h)}(htty porth]htty port}(hjF&hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:45: ./include/linux/tty_port.hhMhjC&ubah}(h]h ]h"]h$]h&]uh1jahj'&ubeh}(h]h ]h"]h$]h&]uh1jAhjB&hMhj$&ubah}(h]h ]h"]h$]h&]uh1j<hj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'#hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j tty_port_tty_wakeup (C function)c.tty_port_tty_wakeuphNtauh1jhj'#hhhNhNubj)}(hhh](j)}(h0void tty_port_tty_wakeup (struct tty_port *port)h]j )}(h/void tty_port_tty_wakeup(struct tty_port *port)h](j)}(hvoidh]hvoid}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&hhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:47: ./drivers/tty/tty_port.chMubj")}(h h]h }(hj&hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj&hhhj&hMubj3)}(htty_port_tty_wakeuph]j9)}(htty_port_tty_wakeuph]htty_port_tty_wakeup}(hj&hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj&ubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hj&hhhj&hMubjR)}(h(struct tty_port *port)h]jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hj&hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj&ubj")}(h h]h }(hj&hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj&ubh)}(hhh]j9)}(htty_porth]htty_port}(hj&hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj&ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetj&modnameN classnameNjj)}j]j)}jj&sbc.tty_port_tty_wakeupasbuh1hhj&ubj")}(h h]h }(hj'hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj&ubj)}(hjh]h*}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj9)}(hporth]hport}(hj'hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj&ubah}(h]h ]h"]h$]h&]hhuh1jQhj&hhhj&hMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj&hhhj&hMubah}(h]jz&ah ](jjeh"]h$]h&]jj)jhuh1jhj&hMhj|&hhubj)}(hhh]h)}(hhelper to wake up a ttyh]hhelper to wake up a tty}(hjG'hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:47: ./drivers/tty/tty_port.chMhjD'hhubah}(h]h ]h"]h$]h&]uh1jhj|&hhhj&hMubeh}(h]h ](j/functioneh"]h$]h&]jj/jj_'jj_'jjjuh1jhhhj'#hNhNubj)}(h4**Parameters** ``struct tty_port *port`` tty porth](h)}(h**Parameters**h]j')}(hji'h]h Parameters}(hjk'hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjg'ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:47: ./drivers/tty/tty_port.chMhjc'ubj=)}(hhh]jB)}(h"``struct tty_port *port`` tty porth](jH)}(h``struct tty_port *port``h]j#)}(hj'h]hstruct tty_port *port}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj'ubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:47: ./drivers/tty/tty_port.chMhj'ubjb)}(hhh]h)}(htty porth]htty port}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:47: ./drivers/tty/tty_port.chMhj'ubah}(h]h ]h"]h$]h&]uh1jahj'ubeh}(h]h ]h"]h$]h&]uh1jAhj'hMhj'ubah}(h]h ]h"]h$]h&]uh1j<hjc'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'#hhhNhNubeh}(h]jah ]h"] tty helpersah$]h&]uh1hhjhhhhhK+ubh)}(hhh](h)}(h Modem Signalsh]h Modem Signals}(hj'hhhNhNubah}(h]h ]h"]h$]h&]jjuh1hhj'hhhhhK3ubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$tty_port_carrier_raised (C function)c.tty_port_carrier_raisedhNtauh1jhj'hhhNhNubj)}(hhh](j)}(h4bool tty_port_carrier_raised (struct tty_port *port)h]j )}(h3bool tty_port_carrier_raised(struct tty_port *port)h](j)}(hj$h]hbool}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'hhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMubj")}(h h]h }(hj(hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj'hhhj(hMubj3)}(htty_port_carrier_raisedh]j9)}(htty_port_carrier_raisedh]htty_port_carrier_raised}(hj(hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj(ubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hj'hhhj(hMubjR)}(h(struct tty_port *port)h]jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hj6(hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj2(ubj")}(h h]h }(hjC(hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj2(ubh)}(hhh]j9)}(htty_porth]htty_port}(hjT(hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjQ(ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjV(modnameN classnameNjj)}j]j)}jj(sbc.tty_port_carrier_raisedasbuh1hhj2(ubj")}(h h]h }(hjt(hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj2(ubj)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2(ubj9)}(hporth]hport}(hj(hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj2(ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj.(ubah}(h]h ]h"]h$]h&]hhuh1jQhj'hhhj(hMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj'hhhj(hMubah}(h]j'ah ](jjeh"]h$]h&]jj)jhuh1jhj(hMhj'hhubj)}(hhh]h)}(hcarrier raised checkh]hcarrier raised check}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhj(hhubah}(h]h ]h"]h$]h&]uh1jhj'hhhj(hMubeh}(h]h ](j/functioneh"]h$]h&]jj/jj(jj(jjjuh1jhhhj'hNhNubj)}(h**Parameters** ``struct tty_port *port`` tty port **Description** Wrapper for the carrier detect logic. For the moment this is used to hide some internal details. This will eventually become entirely internal to the tty port.h](h)}(h**Parameters**h]j')}(hj(h]h Parameters}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj(ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhj(ubj=)}(hhh]jB)}(h#``struct tty_port *port`` tty port h](jH)}(h``struct tty_port *port``h]j#)}(hj(h]hstruct tty_port *port}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj(ubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhj(ubjb)}(hhh]h)}(htty porth]htty port}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMhj)ubah}(h]h ]h"]h$]h&]uh1jahj(ubeh}(h]h ]h"]h$]h&]uh1jAhj)hMhj(ubah}(h]h ]h"]h$]h&]uh1j<hj(ubh)}(h**Description**h]j')}(hj5)h]h Description}(hj7)hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj3)ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhj(ubh)}(hWrapper for the carrier detect logic. For the moment this is used to hide some internal details. This will eventually become entirely internal to the tty port.h]hWrapper for the carrier detect logic. For the moment this is used to hide some internal details. This will eventually become entirely internal to the tty port.}(hjK)hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#tty_port_raise_dtr_rts (C function)c.tty_port_raise_dtr_rtshNtauh1jhj'hhhNhNubj)}(hhh](j)}(h3void tty_port_raise_dtr_rts (struct tty_port *port)h]j )}(h2void tty_port_raise_dtr_rts(struct tty_port *port)h](j)}(hvoidh]hvoid}(hjz)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv)hhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMubj")}(h h]h }(hj)hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjv)hhhj)hMubj3)}(htty_port_raise_dtr_rtsh]j9)}(htty_port_raise_dtr_rtsh]htty_port_raise_dtr_rts}(hj)hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj)ubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hjv)hhhj)hMubjR)}(h(struct tty_port *port)h]jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hj)hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj)ubj")}(h h]h }(hj)hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj)ubh)}(hhh]j9)}(htty_porth]htty_port}(hj)hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj)ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetj)modnameN classnameNjj)}j]j)}jj)sbc.tty_port_raise_dtr_rtsasbuh1hhj)ubj")}(h h]h }(hj)hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj)ubj)}(hjh]h*}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj9)}(hporth]hport}(hj*hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj)ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj)ubah}(h]h ]h"]h$]h&]hhuh1jQhjv)hhhj)hMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjr)hhhj)hMubah}(h]jm)ah ](jjeh"]h$]h&]jj)jhuh1jhj)hMhjo)hhubj)}(hhh]h)}(h Raise DTR/RTSh]h Raise DTR/RTS}(hj:*hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhj7*hhubah}(h]h ]h"]h$]h&]uh1jhjo)hhhj)hMubeh}(h]h ](j/functioneh"]h$]h&]jj/jjR*jjR*jjjuh1jhhhj'hNhNubj)}(h**Parameters** ``struct tty_port *port`` tty port **Description** Wrapper for the DTR/RTS raise logic. For the moment this is used to hide some internal details. This will eventually become entirely internal to the tty port.h](h)}(h**Parameters**h]j')}(hj\*h]h Parameters}(hj^*hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjZ*ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhjV*ubj=)}(hhh]jB)}(h#``struct tty_port *port`` tty port h](jH)}(h``struct tty_port *port``h]j#)}(hj{*h]hstruct tty_port *port}(hj}*hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjy*ubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhju*ubjb)}(hhh]h)}(htty porth]htty port}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jahju*ubeh}(h]h ]h"]h$]h&]uh1jAhj*hMhjr*ubah}(h]h ]h"]h$]h&]uh1j<hjV*ubh)}(h**Description**h]j')}(hj*h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj*ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhjV*ubh)}(hWrapper for the DTR/RTS raise logic. For the moment this is used to hide some internal details. This will eventually become entirely internal to the tty port.h]hWrapper for the DTR/RTS raise logic. For the moment this is used to hide some internal details. This will eventually become entirely internal to the tty port.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhjV*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#tty_port_lower_dtr_rts (C function)c.tty_port_lower_dtr_rtshNtauh1jhj'hhhNhNubj)}(hhh](j)}(h3void tty_port_lower_dtr_rts (struct tty_port *port)h]j )}(h2void tty_port_lower_dtr_rts(struct tty_port *port)h](j)}(hvoidh]hvoid}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*hhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMubj")}(h h]h }(hj +hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj*hhhj +hMubj3)}(htty_port_lower_dtr_rtsh]j9)}(htty_port_lower_dtr_rtsh]htty_port_lower_dtr_rts}(hj+hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj+ubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hj*hhhj +hMubjR)}(h(struct tty_port *port)h]jX)}(hstruct tty_port *porth](j^)}(hjah]hstruct}(hj8+hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj4+ubj")}(h h]h }(hjE+hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj4+ubh)}(hhh]j9)}(htty_porth]htty_port}(hjV+hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjS+ubah}(h]h ]h"]h$]h&] refdomainj/reftypej reftargetjX+modnameN classnameNjj)}j]j)}jj+sbc.tty_port_lower_dtr_rtsasbuh1hhj4+ubj")}(h h]h }(hjv+hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj4+ubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4+ubj9)}(hporth]hport}(hj+hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj4+ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj0+ubah}(h]h ]h"]h$]h&]hhuh1jQhj*hhhj +hMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj*hhhj +hMubah}(h]j*ah ](jjeh"]h$]h&]jj)jhuh1jhj +hMhj*hhubj)}(hhh]h)}(h Lower DTR/RTSh]h Lower DTR/RTS}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhj+hhubah}(h]h ]h"]h$]h&]uh1jhj*hhhj +hMubeh}(h]h ](j/functioneh"]h$]h&]jj/jj+jj+jjjuh1jhhhj'hNhNubj)}(h**Parameters** ``struct tty_port *port`` tty port **Description** Wrapper for the DTR/RTS raise logic. For the moment this is used to hide some internal details. This will eventually become entirely internal to the tty port.h](h)}(h**Parameters**h]j')}(hj+h]h Parameters}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj+ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhj+ubj=)}(hhh]jB)}(h#``struct tty_port *port`` tty port h](jH)}(h``struct tty_port *port``h]j#)}(hj+h]hstruct tty_port *port}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj+ubah}(h]h ]h"]h$]h&]uh1jGh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhj+ubjb)}(hhh]h)}(htty porth]htty port}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1jahj+ubeh}(h]h ]h"]h$]h&]uh1jAhj,hMhj+ubah}(h]h ]h"]h$]h&]uh1j<hj+ubh)}(h**Description**h]j')}(hj7,h]h Description}(hj9,hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj5,ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhj+ubh)}(hWrapper for the DTR/RTS raise logic. For the moment this is used to hide some internal details. This will eventually become entirely internal to the tty port.h]hWrapper for the DTR/RTS raise logic. For the moment this is used to hide some internal details. This will eventually become entirely internal to the tty port.}(hjM,hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:53: ./drivers/tty/tty_port.chMhj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj'hhhNhNubeh}(h]jah ]h"] modem signalsah$]h&]uh1hhjhhhhhK3ubeh}(h]jah ]h"]tty port functionsah$]h&]uh1hhhhhhhhKubh transition)}(h----h]h}(h]h ]h"]h$]h&]uh1jq,hhhK9hhhhubh)}(hhh](h)}(hTTY Port Referenceh]hTTY Port Reference}(hj,hhhNhNubah}(h]h ]h"]h$]h&]jjuh1hhj},hhhhhK`, valid only if the tty is open. Use tty_port_tty_get() to obtain it (and tty_kref_put() to release). ``itty`` internal back pointer to :c:type:`struct tty_struct `. Avoid this. It should be eliminated in the long term. ``ops`` tty port operations (like activate, shutdown), see :c:type:`struct tty_port_operations ` ``client_ops`` tty port client operations (like receive_buf, write_wakeup). By default, tty_port_default_client_ops is used. ``lock`` lock protecting **tty** ``blocked_open`` # of procs waiting for open in tty_port_block_til_ready() ``count`` usage count ``open_wait`` open waiters queue (waiting e.g. for a carrier) ``delta_msr_wait`` modem status change queue (waiting for MSR changes) ``flags`` user TTY flags (``ASYNC_``) ``iflags`` internal flags (``TTY_PORT_``) ``console`` when set, the port is a console ``mutex`` locking, for open, shutdown and other port operations ``buf_mutex`` **xmit_buf** alloc lock ``xmit_buf`` optional xmit buffer used by some drivers ``xmit_fifo`` optional xmit buffer used by some drivers ``close_delay`` delay in jiffies to wait when closing the port ``closing_wait`` delay in jiffies for output to be sent before closing ``drain_delay`` set to zero if no pure time based drain is needed else set to size of fifo ``kref`` references counter. Reaching zero calls **ops->destruct\(\)** if non-``NULL`` or frees the port otherwise. ``client_data`` pointer to private data, for **client_ops**h](h)}(h**Definition**::h](j')}(h**Definition**h]h Definition}(hj -hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj-ubh:}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhK8hj-ubh literal_block)}(hXstruct tty_port { struct tty_bufhead buf; struct tty_struct *tty; struct tty_struct *itty; const struct tty_port_operations *ops; const struct tty_port_client_operations *client_ops; spinlock_t lock; int blocked_open; int count; wait_queue_head_t open_wait; wait_queue_head_t delta_msr_wait; unsigned long flags; unsigned long iflags; unsigned char console:1; struct mutex mutex; struct mutex buf_mutex; u8 *xmit_buf; u8 *xmit_fifo; unsigned int close_delay; unsigned int closing_wait; int drain_delay; struct kref kref; void *client_data; };h]hXstruct tty_port { struct tty_bufhead buf; struct tty_struct *tty; struct tty_struct *itty; const struct tty_port_operations *ops; const struct tty_port_client_operations *client_ops; spinlock_t lock; int blocked_open; int count; wait_queue_head_t open_wait; wait_queue_head_t delta_msr_wait; unsigned long flags; unsigned long iflags; unsigned char console:1; struct mutex mutex; struct mutex buf_mutex; u8 *xmit_buf; u8 *xmit_fifo; unsigned int close_delay; unsigned int closing_wait; int drain_delay; struct kref kref; void *client_data; };}hj;-sbah}(h]h ]h"]h$]h&]hhuh1j9-h`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhK:hj-ubh)}(h **Members**h]j')}(hjL-h]hMembers}(hjN-hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjJ-ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKShj-ubj=)}(hhh](jB)}(h0``buf`` buffer for this port, locked internally h](jH)}(h``buf``h]j#)}(hjk-h]hbuf}(hjm-hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hji-ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhK7hje-ubjb)}(hhh]h)}(h'buffer for this port, locked internallyh]h'buffer for this port, locked internally}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hK7hj-ubah}(h]h ]h"]h$]h&]uh1jahje-ubeh}(h]h ]h"]h$]h&]uh1jAhj-hK7hjb-ubjB)}(h``tty`` back pointer to :c:type:`struct tty_struct `, valid only if the tty is open. Use tty_port_tty_get() to obtain it (and tty_kref_put() to release). h](jH)}(h``tty``h]j#)}(hj-h]htty}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj-ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhK9hj-ubjb)}(hhh]h)}(hback pointer to :c:type:`struct tty_struct `, valid only if the tty is open. Use tty_port_tty_get() to obtain it (and tty_kref_put() to release).h](hback pointer to }(hj-hhhNhNubh)}(h(:c:type:`struct tty_struct `h]j#)}(hj-h]hstruct tty_struct}(hj-hhhNhNubah}(h]h ](j.j/c-typeeh"]h$]h&]uh1j"hj-ubah}(h]h ]h"]h$]h&]refdocj; refdomainj/reftypetype refexplicitrefwarnjjjA tty_structuh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhK8hj-ubhe, valid only if the tty is open. Use tty_port_tty_get() to obtain it (and tty_kref_put() to release).}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj-hK8hj-ubah}(h]h ]h"]h$]h&]uh1jahj-ubeh}(h]h ]h"]h$]h&]uh1jAhj-hK9hjb-ubjB)}(h``itty`` internal back pointer to :c:type:`struct tty_struct `. Avoid this. It should be eliminated in the long term. h](jH)}(h``itty``h]j#)}(hj.h]hitty}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj-ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhK;hj-ubjb)}(hhh]h)}(hxinternal back pointer to :c:type:`struct tty_struct `. Avoid this. It should be eliminated in the long term.h](hinternal back pointer to }(hj.hhhNhNubh)}(h(:c:type:`struct tty_struct `h]j#)}(hj$.h]hstruct tty_struct}(hj&.hhhNhNubah}(h]h ](j.j/c-typeeh"]h$]h&]uh1j"hj".ubah}(h]h ]h"]h$]h&]refdocj; refdomainj/reftypetype refexplicitrefwarnjjjA tty_structuh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhK:hj.ubh7. Avoid this. It should be eliminated in the long term.}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjA.hK:hj.ubah}(h]h ]h"]h$]h&]uh1jahj-ubeh}(h]h ]h"]h$]h&]uh1jAhj.hK;hjb-ubjB)}(hv``ops`` tty port operations (like activate, shutdown), see :c:type:`struct tty_port_operations ` h](jH)}(h``ops``h]j#)}(hj^.h]hops}(hj`.hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj\.ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhK=hjX.ubjb)}(hhh]h)}(hmtty port operations (like activate, shutdown), see :c:type:`struct tty_port_operations `h](h3tty port operations (like activate, shutdown), see }(hjw.hhhNhNubh)}(h::c:type:`struct tty_port_operations `h]j#)}(hj.h]hstruct tty_port_operations}(hj.hhhNhNubah}(h]h ](j.j/c-typeeh"]h$]h&]uh1j"hj.ubah}(h]h ]h"]h$]h&]refdocj; refdomainj/reftypetype refexplicitrefwarnjjjAtty_port_operationsuh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKhj.ubah}(h]h ]h"]h$]h&]uh1jahj.ubeh}(h]h ]h"]h$]h&]uh1jAhj.hK?hjb-ubjB)}(h!``lock`` lock protecting **tty** h](jH)}(h``lock``h]j#)}(hj.h]hlock}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj.ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhK@hj.ubjb)}(hhh]h)}(hlock protecting **tty**h](hlock protecting }(hj /hhhNhNubj')}(h**tty**h]htty}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj /ubeh}(h]h ]h"]h$]h&]uh1hhj/hK@hj/ubah}(h]h ]h"]h$]h&]uh1jahj.ubeh}(h]h ]h"]h$]h&]uh1jAhj/hK@hjb-ubjB)}(hK``blocked_open`` # of procs waiting for open in tty_port_block_til_ready() h](jH)}(h``blocked_open``h]j#)}(hj8/h]h blocked_open}(hj:/hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj6/ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKAhj2/ubjb)}(hhh]h)}(h9# of procs waiting for open in tty_port_block_til_ready()h]h9# of procs waiting for open in tty_port_block_til_ready()}(hjQ/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjM/hKAhjN/ubah}(h]h ]h"]h$]h&]uh1jahj2/ubeh}(h]h ]h"]h$]h&]uh1jAhjM/hKAhjb-ubjB)}(h``count`` usage count h](jH)}(h ``count``h]j#)}(hjq/h]hcount}(hjs/hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjo/ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKBhjk/ubjb)}(hhh]h)}(h usage counth]h usage count}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hKBhj/ubah}(h]h ]h"]h$]h&]uh1jahjk/ubeh}(h]h ]h"]h$]h&]uh1jAhj/hKBhjb-ubjB)}(h>``open_wait`` open waiters queue (waiting e.g. for a carrier) h](jH)}(h ``open_wait``h]j#)}(hj/h]h open_wait}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj/ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKChj/ubjb)}(hhh]h)}(h/open waiters queue (waiting e.g. for a carrier)h]h/open waiters queue (waiting e.g. for a carrier)}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hKChj/ubah}(h]h ]h"]h$]h&]uh1jahj/ubeh}(h]h ]h"]h$]h&]uh1jAhj/hKChjb-ubjB)}(hG``delta_msr_wait`` modem status change queue (waiting for MSR changes) h](jH)}(h``delta_msr_wait``h]j#)}(hj/h]hdelta_msr_wait}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj/ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKDhj/ubjb)}(hhh]h)}(h3modem status change queue (waiting for MSR changes)h]h3modem status change queue (waiting for MSR changes)}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hKDhj/ubah}(h]h ]h"]h$]h&]uh1jahj/ubeh}(h]h ]h"]h$]h&]uh1jAhj/hKDhjb-ubjB)}(h&``flags`` user TTY flags (``ASYNC_``) h](jH)}(h ``flags``h]j#)}(hj0h]hflags}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj0ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKEhj0ubjb)}(hhh]h)}(huser TTY flags (``ASYNC_``)h](huser TTY flags (}(hj50hhhNhNubj#)}(h ``ASYNC_``h]hASYNC_}(hj=0hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj50ubh)}(hj50hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj10hKEhj20ubah}(h]h ]h"]h$]h&]uh1jahj0ubeh}(h]h ]h"]h$]h&]uh1jAhj10hKEhjb-ubjB)}(h*``iflags`` internal flags (``TTY_PORT_``) h](jH)}(h ``iflags``h]j#)}(hjg0h]hiflags}(hji0hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hje0ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKFhja0ubjb)}(hhh]h)}(hinternal flags (``TTY_PORT_``)h](hinternal flags (}(hj0hhhNhNubj#)}(h ``TTY_PORT_``h]h TTY_PORT_}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj0ubh)}(hj0hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj|0hKFhj}0ubah}(h]h ]h"]h$]h&]uh1jahja0ubeh}(h]h ]h"]h$]h&]uh1jAhj|0hKFhjb-ubjB)}(h,``console`` when set, the port is a console h](jH)}(h ``console``h]j#)}(hj0h]hconsole}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj0ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKGhj0ubjb)}(hhh]h)}(hwhen set, the port is a consoleh]hwhen set, the port is a console}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hKGhj0ubah}(h]h ]h"]h$]h&]uh1jahj0ubeh}(h]h ]h"]h$]h&]uh1jAhj0hKGhjb-ubjB)}(h@``mutex`` locking, for open, shutdown and other port operations h](jH)}(h ``mutex``h]j#)}(hj0h]hmutex}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj0ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKHhj0ubjb)}(hhh]h)}(h5locking, for open, shutdown and other port operationsh]h5locking, for open, shutdown and other port operations}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hKHhj1ubah}(h]h ]h"]h$]h&]uh1jahj0ubeh}(h]h ]h"]h$]h&]uh1jAhj1hKHhjb-ubjB)}(h&``buf_mutex`` **xmit_buf** alloc lock h](jH)}(h ``buf_mutex``h]j#)}(hj$1h]h buf_mutex}(hj&1hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj"1ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKIhj1ubjb)}(hhh]h)}(h**xmit_buf** alloc lockh](j')}(h **xmit_buf**h]hxmit_buf}(hjA1hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj=1ubh alloc lock}(hj=1hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj91hKIhj:1ubah}(h]h ]h"]h$]h&]uh1jahj1ubeh}(h]h ]h"]h$]h&]uh1jAhj91hKIhjb-ubjB)}(h7``xmit_buf`` optional xmit buffer used by some drivers h](jH)}(h ``xmit_buf``h]j#)}(hjk1h]hxmit_buf}(hjm1hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hji1ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKJhje1ubjb)}(hhh]h)}(h)optional xmit buffer used by some driversh]h)optional xmit buffer used by some drivers}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hKJhj1ubah}(h]h ]h"]h$]h&]uh1jahje1ubeh}(h]h ]h"]h$]h&]uh1jAhj1hKJhjb-ubjB)}(h8``xmit_fifo`` optional xmit buffer used by some drivers h](jH)}(h ``xmit_fifo``h]j#)}(hj1h]h xmit_fifo}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj1ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKKhj1ubjb)}(hhh]h)}(h)optional xmit buffer used by some driversh]h)optional xmit buffer used by some drivers}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hKKhj1ubah}(h]h ]h"]h$]h&]uh1jahj1ubeh}(h]h ]h"]h$]h&]uh1jAhj1hKKhjb-ubjB)}(h?``close_delay`` delay in jiffies to wait when closing the port h](jH)}(h``close_delay``h]j#)}(hj1h]h close_delay}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj1ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKLhj1ubjb)}(hhh]h)}(h.delay in jiffies to wait when closing the porth]h.delay in jiffies to wait when closing the port}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hKLhj1ubah}(h]h ]h"]h$]h&]uh1jahj1ubeh}(h]h ]h"]h$]h&]uh1jAhj1hKLhjb-ubjB)}(hG``closing_wait`` delay in jiffies for output to be sent before closing h](jH)}(h``closing_wait``h]j#)}(hj2h]h closing_wait}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj2ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKMhj2ubjb)}(hhh]h)}(h5delay in jiffies for output to be sent before closingh]h5delay in jiffies for output to be sent before closing}(hj/2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+2hKMhj,2ubah}(h]h ]h"]h$]h&]uh1jahj2ubeh}(h]h ]h"]h$]h&]uh1jAhj+2hKMhjb-ubjB)}(h[``drain_delay`` set to zero if no pure time based drain is needed else set to size of fifo h](jH)}(h``drain_delay``h]j#)}(hjO2h]h drain_delay}(hjQ2hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hjM2ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKOhjI2ubjb)}(hhh]h)}(hJset to zero if no pure time based drain is needed else set to size of fifoh]hJset to zero if no pure time based drain is needed else set to size of fifo}(hjh2hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKNhje2ubah}(h]h ]h"]h$]h&]uh1jahjI2ubeh}(h]h ]h"]h$]h&]uh1jAhjd2hKOhjb-ubjB)}(ht``kref`` references counter. Reaching zero calls **ops->destruct\(\)** if non-``NULL`` or frees the port otherwise. h](jH)}(h``kref``h]j#)}(hj2h]hkref}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj2ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKQhj2ubjb)}(hhh]h)}(hjreferences counter. Reaching zero calls **ops->destruct\(\)** if non-``NULL`` or frees the port otherwise.h](h(references counter. Reaching zero calls }(hj2hhhNhNubj')}(h**ops->destruct\(\)**h]hops->destruct()}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj2ubh if non-}(hj2hhhNhNubj#)}(h``NULL``h]hNULL}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj2ubh or frees the port otherwise.}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKPhj2ubah}(h]h ]h"]h$]h&]uh1jahj2ubeh}(h]h ]h"]h$]h&]uh1jAhj2hKQhjb-ubjB)}(h;``client_data`` pointer to private data, for **client_ops**h](jH)}(h``client_data``h]j#)}(hj2h]h client_data}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj2ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKQhj2ubjb)}(hhh]h)}(h+pointer to private data, for **client_ops**h](hpointer to private data, for }(hj3hhhNhNubj')}(h**client_ops**h]h client_ops}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj3ubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKRhj2ubah}(h]h ]h"]h$]h&]uh1jahj2ubeh}(h]h ]h"]h$]h&]uh1jAhj2hKQhjb-ubeh}(h]h ]h"]h$]h&]uh1j<hj-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj},hhhj,hNubh)}(h**Description**h]j')}(hj83h]h Description}(hj:3hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj63ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKUhj},hhubh)}(hEach device keeps its own port level information. :c:type:`struct tty_port ` was introduced as a common structure for such information. As every TTY device shall have a backing tty_port structure, every driver can use these members.h](h2Each device keeps its own port level information. }(hjN3hhhNhNubh)}(h$:c:type:`struct tty_port `h]j#)}(hjX3h]hstruct tty_port}(hjZ3hhhNhNubah}(h]h ](j.j/c-typeeh"]h$]h&]uh1j"hjV3ubah}(h]h ]h"]h$]h&]refdocj; refdomainj/reftypetype refexplicitrefwarnjjjAtty_portuh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKRhjN3ubh was introduced as a common structure for such information. As every TTY device shall have a backing tty_port structure, every driver can use these members.}(hjN3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhju3hKRhj},hhubh)}(hXThe tty port has a different lifetime to the tty so must be kept apart. In addition be careful as tty -> port mappings are valid for the life of the tty object but in many cases port -> tty mappings are valid only until a hangup so don't use the wrong path.h]hXThe tty port has a different lifetime to the tty so must be kept apart. In addition be careful as tty -> port mappings are valid for the life of the tty object but in many cases port -> tty mappings are valid only until a hangup so don’t use the wrong path.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhKVhj},hhubh)}(hTty port shall be initialized by tty_port_init() and shut down either by tty_port_destroy() (refcounting not used), or tty_port_put() (refcounting).h]hTty port shall be initialized by tty_port_init() and shut down either by tty_port_destroy() (refcounting not used), or tty_port_put() (refcounting).}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhK[hj},hhubh)}(hX8There is a lot of helpers around :c:type:`struct tty_port ` too. To name the most significant ones: tty_port_open(), tty_port_close() (or tty_port_close_start() and tty_port_close_end() separately if need be), and tty_port_hangup(). These call **ops->activate\(\)** and **ops->shutdown\(\)** as needed.h](h!There is a lot of helpers around }(hj3hhhNhNubh)}(h$:c:type:`struct tty_port `h]j#)}(hj3h]hstruct tty_port}(hj3hhhNhNubah}(h]h ](j.j/c-typeeh"]h$]h&]uh1j"hj3ubah}(h]h ]h"]h$]h&]refdocj; refdomainj/reftypetype refexplicitrefwarnjjjAtty_portuh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:62: ./include/linux/tty_port.hhK^hj3ubh too. To name the most significant ones: tty_port_open(), tty_port_close() (or tty_port_close_start() and tty_port_close_end() separately if need be), and tty_port_hangup(). These call }(hj3hhhNhNubj')}(h**ops->activate\(\)**h]hops->activate()}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj3ubh and }(hj3hhhNhNubj')}(h**ops->shutdown\(\)**h]hops->shutdown()}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj3ubh as needed.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj3hK^hj},hhubeh}(h]jah ]h"]tty port referenceah$]h&]uh1hhhhhhhhK< referencedKubjr,)}(h----h]h}(h]h ]h"]h$]h&]uh1jq,hhhKAhhhhubh)}(hhh](h)}(hTTY Port Operations Referenceh]hTTY Port Operations Reference}(hj 4hhhNhNubah}(h]h ]h"]h$]h&]jjuh1hhj4hhhhhKDubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_port_operations (C struct)c.tty_port_operationshNtauh1jhj4hhh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhNubj)}(hhh](j)}(htty_port_operationsh]j )}(hstruct tty_port_operationsh](j^)}(hjah]hstruct}(hj14hhhNhNubah}(h]h ]jjah"]h$]h&]uh1j]hj-4hhh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhKubj")}(h h]h }(hj?4hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj-4hhhj>4hKubj3)}(htty_port_operationsh]j9)}(hj+4h]htty_port_operations}(hjQ4hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjM4ubah}(h]h ](jLjMeh"]h$]h&]hhuh1j2hj-4hhhj>4hKubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj)4hhhj>4hKubah}(h]j#4ah ](jjeh"]h$]h&]jj)jhuh1jhj>4hKhj&4hhubj)}(hhh]h)}(hhh]h)}(hoperations on tty_porth]h)}(hjx4h]hoperations on tty_port}(hjz4hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhKhjv4ubah}(h]h ]h"]h$]h&]uh1hhjs4hhhj4hNubah}(h]h ]h"]h$]h&]j{j|uh1hhj4hKhjp4hhubah}(h]h ]h"]h$]h&]uh1jhj&4hhhj>4hKubeh}(h]h ](j/structeh"]h$]h&]jj/jj4jj4jjjuh1jhhhj4hj%4hNubj)}(hX**Definition**:: struct tty_port_operations { bool (*carrier_raised)(struct tty_port *port); void (*dtr_rts)(struct tty_port *port, bool active); void (*shutdown)(struct tty_port *port); int (*activate)(struct tty_port *port, struct tty_struct *tty); void (*destruct)(struct tty_port *port); }; **Members** ``carrier_raised`` return true if the carrier is raised on **port** ``dtr_rts`` raise the DTR line if **active** is true, otherwise lower DTR ``shutdown`` called when the last close completes or a hangup finishes IFF the port was initialized. Do not use to free resources. Turn off the device only. Called under the port mutex to serialize against **activate** and **shutdown**. ``activate`` called under the port mutex from tty_port_open(), serialized using the port mutex. Supposed to turn on the device. ``destruct`` called on the final put of a port. Free resources, possibly incl. the port itself.h](h)}(h**Definition**::h](j')}(h**Definition**h]h Definition}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj4ubh:}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhKhj4ubj:-)}(hX)struct tty_port_operations { bool (*carrier_raised)(struct tty_port *port); void (*dtr_rts)(struct tty_port *port, bool active); void (*shutdown)(struct tty_port *port); int (*activate)(struct tty_port *port, struct tty_struct *tty); void (*destruct)(struct tty_port *port); };h]hX)struct tty_port_operations { bool (*carrier_raised)(struct tty_port *port); void (*dtr_rts)(struct tty_port *port, bool active); void (*shutdown)(struct tty_port *port); int (*activate)(struct tty_port *port, struct tty_struct *tty); void (*destruct)(struct tty_port *port); };}hj4sbah}(h]h ]h"]h$]h&]hhuh1j9-h`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhKhj4ubh)}(h **Members**h]j')}(hj4h]hMembers}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj4ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhKhj4ubj=)}(hhh](jB)}(hD``carrier_raised`` return true if the carrier is raised on **port** h](jH)}(h``carrier_raised``h]j#)}(hj4h]hcarrier_raised}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj4ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhKhj4ubjb)}(hhh]h)}(h0return true if the carrier is raised on **port**h](h(return true if the carrier is raised on }(hj 5hhhNhNubj')}(h**port**h]hport}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj 5ubeh}(h]h ]h"]h$]h&]uh1hhj5hKhj5ubah}(h]h ]h"]h$]h&]uh1jahj4ubeh}(h]h ]h"]h$]h&]uh1jAhj5hKhj4ubjB)}(hJ``dtr_rts`` raise the DTR line if **active** is true, otherwise lower DTR h](jH)}(h ``dtr_rts``h]j#)}(hj95h]hdtr_rts}(hj;5hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj75ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhKhj35ubjb)}(hhh]h)}(h=raise the DTR line if **active** is true, otherwise lower DTRh](hraise the DTR line if }(hjR5hhhNhNubj')}(h **active**h]hactive}(hjZ5hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hjR5ubh is true, otherwise lower DTR}(hjR5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjN5hKhjO5ubah}(h]h ]h"]h$]h&]uh1jahj35ubeh}(h]h ]h"]h$]h&]uh1jAhjN5hKhj4ubjB)}(h``shutdown`` called when the last close completes or a hangup finishes IFF the port was initialized. Do not use to free resources. Turn off the device only. Called under the port mutex to serialize against **activate** and **shutdown**. h](jH)}(h ``shutdown``h]j#)}(hj5h]hshutdown}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj5ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhKhj~5ubjb)}(hhh]h)}(hcalled when the last close completes or a hangup finishes IFF the port was initialized. Do not use to free resources. Turn off the device only. Called under the port mutex to serialize against **activate** and **shutdown**.h](hcalled when the last close completes or a hangup finishes IFF the port was initialized. Do not use to free resources. Turn off the device only. Called under the port mutex to serialize against }(hj5hhhNhNubj')}(h **activate**h]hactivate}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj5ubh and }(hj5hhhNhNubj')}(h **shutdown**h]hshutdown}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj5ubh.}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhKhj5ubah}(h]h ]h"]h$]h&]uh1jahj~5ubeh}(h]h ]h"]h$]h&]uh1jAhj5hKhj4ubjB)}(h``activate`` called under the port mutex from tty_port_open(), serialized using the port mutex. Supposed to turn on the device. h](jH)}(h ``activate``h]j#)}(hj5h]hactivate}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj5ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhKhj5ubjb)}(hhh]h)}(hrcalled under the port mutex from tty_port_open(), serialized using the port mutex. Supposed to turn on the device.h]hrcalled under the port mutex from tty_port_open(), serialized using the port mutex. Supposed to turn on the device.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhKhj5ubah}(h]h ]h"]h$]h&]uh1jahj5ubeh}(h]h ]h"]h$]h&]uh1jAhj5hKhj4ubjB)}(h_``destruct`` called on the final put of a port. Free resources, possibly incl. the port itself.h](jH)}(h ``destruct``h]j#)}(hj6h]hdestruct}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j"hj6ubah}(h]h ]h"]h$]h&]uh1jGh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhKhj6ubjb)}(hhh]h)}(hRcalled on the final put of a port. Free resources, possibly incl. the port itself.h]hRcalled on the final put of a port. Free resources, possibly incl. the port itself.}(hj56hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj16hKhj26ubah}(h]h ]h"]h$]h&]uh1jahj6ubeh}(h]h ]h"]h$]h&]uh1jAhj16hKhj4ubeh}(h]h ]h"]h$]h&]uh1j<hj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj4hhhj%4hNubh)}(h**Description**h]j')}(hj^6h]h Description}(hj`6hhhNhNubah}(h]h ]h"]h$]h&]uh1j&hj\6ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhK#hj4hhubj)}(hUFIXME: long term getting the tty argument *out* of this would be good for consoles. h]h)}(hSFIXME: long term getting the tty argument *out* of this would be good for consoles.h](h*FIXME: long term getting the tty argument }(hjx6hhhNhNubhemphasis)}(h*out*h]hout}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j6hjx6ubh$ of this would be good for consoles.}(hjx6hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_port:70: ./include/linux/tty_port.hhKhjt6ubah}(h]h ]h"]h$]h&]uh1jhj6hKhj4hhubeh}(h]jah ]h"]tty port operations referenceah$]h&]uh1hhhhhhhhKDj3Kubeh}(h]tty-portah ]h"]tty portah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj6error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}(tty port reference]jatty port operations reference]jaurefids}nameids}(j6j6jjjn,jj'j!jjCj$#jej'jjg,jj3jj6ju nametypes}(j6jjn,j'jj$#j'jg,j3j6uh}(j6hjhjjj!jjjjjjjjCj*jGjLj j j% j* j5j:j>jCjjj}jjtjyjejj"j'j j jj'#jD#jI#j%j$%jz&j&jj'j'j'jm)jr)j*j*jj},j,j,jj4j#4j)4hhjjj=j4j_jVjjxjjjjjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j6KsRparse_messages]transform_messages] transformerN include_log] decorationNhhub.