`sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget0/translations/zh_CN/driver-api/tty/tty_internalsmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/zh_TW/driver-api/tty/tty_internalsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/it_IT/driver-api/tty/tty_internalsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/ja_JP/driver-api/tty/tty_internalsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/ko_KR/driver-api/tty/tty_internalsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/sp_SP/driver-api/tty/tty_internalsmodnameN 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:spacepreserveuh1hhhhhhJ/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals.rsthKubhsection)}(hhh](htitle)}(h TTY Internalsh]h TTY Internals}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhtopic)}(hhh]h bullet_list)}(hhh](h list_item)}(hhh]h paragraph)}(hhh]h reference)}(hhh]hKopen}(hhhhhNhNubah}(h]id1ah ]h"]h$]h&]refidkopenuh1hhhubah}(h]h ]h"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hExported Internal Functions}(hjhhhNhNubah}(h]id2ah ]h"]h$]h&]refidexported-internal-functionsuh1hhhubah}(h]h ]h"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hInternal Functions}(hj#hhhNhNubah}(h]id3ah ]h"]h$]h&]refidinternal-functionsuh1hhj ubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhNhNubah}(h]contentsah ](contentslocaleh"]contentsah$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hKopenh]hKopen}(hjRhhhNhNubah}(h]h ]h"]h$]h&]refidhuh1hhjOhhhhhK ubh)}(h=These functions serve for opening a TTY from the kernelspace:h]h=These functions serve for opening a TTY from the kernelspace:}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjOhhubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singletty_kclose (C function) c.tty_kclosehNtauh1johjOhhhNhNubhdesc)}(hhh](hdesc_signature)}(h(void tty_kclose (struct tty_struct *tty)h]hdesc_signature_line)}(h'void tty_kclose(struct tty_struct *tty)h](hdesc_sig_keyword_type)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhjhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMwubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhMwubh desc_name)}(h tty_kcloseh]h desc_sig_name)}(h tty_kcloseh]h tty_kclose}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jhjhhhjhMwubhdesc_parameterlist)}(h(struct tty_struct *tty)h]hdesc_parameter)}(hstruct tty_struct *ttyh](hdesc_sig_keyword)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jjsb c.tty_kcloseasbuh1hhjubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubhdesc_sig_punctuation)}(h*h]h*}(hj:hhhNhNubah}(h]h ]pah"]h$]h&]uh1j8hjubj)}(httyh]htty}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhjhhhjhMwubeh}(h]h ]h"]h$]h&]hh add_permalinkuh1jsphinx_line_type declaratorhjhhhjhMwubah}(h]j~ah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhMwhjhhubh desc_content)}(hhh]h)}(hcloses tty opened by tty_kopenh]hcloses tty opened by tty_kopen}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMphjzhhubah}(h]h ]h"]h$]h&]uh1jxhjhhhjhMwubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1jhhhjOhNhNubh container)}(h**Parameters** ``struct tty_struct *tty`` tty device **Description** Performs the final steps to release and free a tty device. It is the same as tty_release_struct() except that it also resets ``TTY_PORT_KOPENED`` flag on **tty->port**.h](h)}(h**Parameters**h]hstrong)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMthjubhdefinition_list)}(hhh]hdefinition_list_item)}(h&``struct tty_struct *tty`` tty device h](hterm)}(h``struct tty_struct *tty``h]hliteral)}(hjh]hstruct tty_struct *tty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMqhjubh definition)}(hhh]h)}(h tty deviceh]h tty device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMqhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMqhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hj h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMshjubh)}(hPerforms the final steps to release and free a tty device. It is the same as tty_release_struct() except that it also resets ``TTY_PORT_KOPENED`` flag on **tty->port**.h](h}Performs the final steps to release and free a tty device. It is the same as tty_release_struct() except that it also resets }(hj#hhhNhNubj)}(h``TTY_PORT_KOPENED``h]hTTY_PORT_KOPENED}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh flag on }(hj#hhhNhNubj)}(h **tty->port**h]h tty->port}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMshjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjOhhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j| tty_kopen_exclusive (C function)c.tty_kopen_exclusivehNtauh1johjOhhhNhNubj)}(hhh](j)}(h6struct tty_struct * tty_kopen_exclusive (dev_t device)h]j)}(h4struct tty_struct *tty_kopen_exclusive(dev_t device)h](j)}(hjh]hstruct}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrhhhjhMubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j"]j%)}jtty_kopen_exclusivesbc.tty_kopen_exclusiveasbuh1hhjrhhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrhhhjhMubj9)}(hj<h]h*}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjrhhhjhMubj)}(htty_kopen_exclusiveh]j)}(hjh]htty_kopen_exclusive}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjrhhhjhMubj)}(h(dev_t device)h]j)}(h dev_t deviceh](h)}(hhh]j)}(hdev_th]hdev_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j"]jc.tty_kopen_exclusiveasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhjrhhhjhMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjnhhhjhMubah}(h]jiah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjhMhjkhhubjy)}(hhh]h)}(hopen a tty device for kernelh]hopen a tty device for kernel}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjFhhubah}(h]h ]h"]h$]h&]uh1jxhjkhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjajjajjjuh1jhhhjOhNhNubj)}(hX**Parameters** ``dev_t device`` dev_t of device to open **Description** Opens tty exclusively for kernel. Performs the driver lookup, makes sure it's not already opened and performs the first-time tty initialization. Claims the global ``tty_mutex`` to serialize: * concurrent first-time tty initialization * concurrent tty driver removal w/ lookup * concurrent tty removal from driver table **Return** the locked initialized :c:type:`tty_struct`h](h)}(h**Parameters**h]j)}(hjkh]h Parameters}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjeubj)}(hhh]j)}(h)``dev_t device`` dev_t of device to open h](j)}(h``dev_t device``h]j)}(hjh]h dev_t device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubj)}(hhh]h)}(hdev_t of device to openh]hdev_t of device to open}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjeubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjeubh)}(hOpens tty exclusively for kernel. Performs the driver lookup, makes sure it's not already opened and performs the first-time tty initialization.h]hOpens tty exclusively for kernel. Performs the driver lookup, makes sure it’s not already opened and performs the first-time tty initialization.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjeubj)}(hhh]j)}(hClaims the global ``tty_mutex`` to serialize: * concurrent first-time tty initialization * concurrent tty driver removal w/ lookup * concurrent tty removal from driver table h](j)}(h-Claims the global ``tty_mutex`` to serialize:h](hClaims the global }(hjhhhNhNubj)}(h ``tty_mutex``h]h tty_mutex}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to serialize:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubj)}(hhh]h)}(hhh](h)}(h(concurrent first-time tty initializationh]h)}(hjh]h(concurrent first-time tty initialization}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubah}(h]h ]h"]h$]h&]uh1hhjubh)}(h'concurrent tty driver removal w/ lookuph]h)}(hj2h]h'concurrent tty driver removal w/ lookup}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhj0ubah}(h]h ]h"]h$]h&]uh1hhjubh)}(h)concurrent tty removal from driver table h]h)}(h(concurrent tty removal from driver tableh]h(concurrent tty removal from driver table}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjHubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]bulletj<uh1hhj)hMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjeubh)}(h **Return**h]j)}(hj{h]hReturn}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjeubh)}(h+the locked initialized :c:type:`tty_struct`h](hthe locked initialized }(hjhhhNhNubh)}(h:c:type:`tty_struct`h]j)}(hjh]h tty_struct}(hjhhhNhNubah}(h]h ](xrefjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocdriver-api/tty/tty_internals refdomainjreftypetype refexplicitrefwarnjj)}j"]sb reftarget tty_structuh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubeh}(h]h ]h"]h$]h&]uh1hhjhMhjeubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjOhhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_kopen_shared (C function)c.tty_kopen_sharedhNtauh1johjOhhhNhNubj)}(hhh](j)}(h3struct tty_struct * tty_kopen_shared (dev_t device)h]j)}(h1struct tty_struct *tty_kopen_shared(dev_t device)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j"]j%)}jtty_kopen_sharedsbc.tty_kopen_sharedasbuh1hhjhhhjhMubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj9)}(hj<h]h*}(hj3hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjhhhjhMubj)}(htty_kopen_sharedh]j)}(hj"h]htty_kopen_shared}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhMubj)}(h(dev_t device)h]j)}(h dev_t deviceh](h)}(hhh]j)}(hdev_th]hdev_t}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjdmodnameN classnameNjj)}j"]j c.tty_kopen_sharedasbuh1hhj[ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjWubah}(h]h ]h"]h$]h&]hhuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjhhhjhMubah}(h]jah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjhMhjhhubjy)}(hhh]h)}(h*open a tty device for shared in-kernel useh]h*open a tty device for shared in-kernel use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjhhubah}(h]h ]h"]h$]h&]uh1jxhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjOhNhNubj)}(h**Parameters** ``dev_t device`` dev_t of device to open **Description** Opens an already existing tty for in-kernel use. Compared to tty_kopen_exclusive() above it doesn't ensure to be the only user. Locking: identical to tty_kopen() above.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubj)}(hhh]j)}(h)``dev_t device`` dev_t of device to open h](j)}(h``dev_t device``h]j)}(hjh]h dev_t device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubj)}(hhh]h)}(hdev_t of device to openh]hdev_t of device to open}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hj4h]h Description}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubh)}(hOpens an already existing tty for in-kernel use. Compared to tty_kopen_exclusive() above it doesn't ensure to be the only user.h]hOpens an already existing tty for in-kernel use. Compared to tty_kopen_exclusive() above it doesn’t ensure to be the only user.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubh)}(h(Locking: identical to tty_kopen() above.h]h(Locking: identical to tty_kopen() above.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:14: ./drivers/tty/tty_io.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjOhhhNhNubeh}(h]hah ]h"]kopenah$]h&]uh1hhhhhhhhK ubh transition)}(h----h]h}(h]h ]h"]h$]h&]uh1jvhhhKhhhhubh)}(hhh](h)}(hExported Internal Functionsh]hExported Internal Functions}(hjhhhNhNubah}(h]h ]h"]h$]h&]j`j uh1hhjhhhhhKubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|#tty_dev_name_to_number (C function)c.tty_dev_name_to_numberhNtauh1johjhhhNhNubj)}(hhh](j)}(h hMEhj? ubah}(h]h ]h"]h$]h&]uh1jhj# ubeh}(h]h ]h"]h$]h&]uh1jhj> hMEhjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjd h]h Description}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjb ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMGhjubh)}(hThis function converts device names like ttyS0 or ttyUSB1 into dev_t like (4, 64) or (188, 1). If no corresponding driver is registered then the function returns -``ENODEV``.h](hThis function converts device names like ttyS0 or ttyUSB1 into dev_t like (4, 64) or (188, 1). If no corresponding driver is registered then the function returns -}(hjz hhhNhNubj)}(h ``ENODEV``h]hENODEV}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz ubh.}(hjz hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMGhjubj)}(hhh]j)}(hLocking: this acquires tty_mutex to protect the tty_drivers list from being modified while we are traversing it, and makes sure to release it before exiting.h](j)}(hELocking: this acquires tty_mutex to protect the tty_drivers list fromh]hELocking: this acquires tty_mutex to protect the tty_drivers list from}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMLhj ubj)}(hhh]h)}(hWbeing modified while we are traversing it, and makes sure to release it before exiting.h]hWbeing modified while we are traversing it, and makes sure to release it before exiting.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMLhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMLhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_release_struct (C function)c.tty_release_structhNtauh1johjhhhNhNubj)}(hhh](j)}(h9void tty_release_struct (struct tty_struct *tty, int idx)h]j)}(h8void tty_release_struct(struct tty_struct *tty, int idx)h](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubj)}(htty_release_structh]j)}(htty_release_structh]htty_release_struct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj hhhj hMubj)}(h!(struct tty_struct *tty, int idx)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj1 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj- ubj)}(h h]h }(hj> hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj- ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjO hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjQ modnameN classnameNjj)}j"]j%)}jj sbc.tty_release_structasbuh1hhj- ubj)}(h h]h }(hjo hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj- ubj9)}(hj<h]h*}(hj} hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj- ubj)}(httyh]htty}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj- ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj) ubj)}(hint idxh](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hidxh]hidx}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj) ubeh}(h]h ]h"]h$]h&]hhuh1jhj hhhj hMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj hhhj hMubah}(h]j ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj hMhj hhubjy)}(hhh]h)}(hrelease a tty structh]hrelease a tty struct}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMhj hhubah}(h]h ]h"]h$]h&]uh1jxhj hhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct tty_struct *tty`` tty device ``int idx`` index of the tty **Description** Performs the final steps to release and free a tty device. It is roughly the reverse of tty_init_dev().h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMhj ubj)}(hhh](j)}(h&``struct tty_struct *tty`` tty device h](j)}(h``struct tty_struct *tty``h]j)}(hj* h]hstruct tty_struct *tty}(hj, hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj( ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMhj$ ubj)}(hhh]h)}(h tty deviceh]h tty device}(hjC hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj? hMhj@ ubah}(h]h ]h"]h$]h&]uh1jhj$ ubeh}(h]h ]h"]h$]h&]uh1jhj? hMhj! ubj)}(h``int idx`` index of the tty h](j)}(h ``int idx``h]j)}(hjc h]hint idx}(hje hhhNhNubah}(h]h ]h"]h$]h&]uh1jhja ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMhj] ubj)}(hhh]h)}(hindex of the ttyh]hindex of the tty}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjx hMhjy ubah}(h]h ]h"]h$]h&]uh1jhj] ubeh}(h]h ]h"]h$]h&]uh1jhjx hMhj! ubeh}(h]h ]h"]h$]h&]uh1jhj ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMhj ubh)}(hgPerforms the final steps to release and free a tty device. It is roughly the reverse of tty_init_dev().h]hgPerforms the final steps to release and free a tty device. It is roughly the reverse of tty_init_dev().}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_get_icount (C function)c.tty_get_icounthNtauh1johjhhhNhNubj)}(hhh](j)}(hRint tty_get_icount (struct tty_struct *tty, struct serial_icounter_struct *icount)h]j)}(hQint tty_get_icount(struct tty_struct *tty, struct serial_icounter_struct *icount)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM% ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hM% ubj)}(htty_get_icounth]j)}(htty_get_icounth]htty_get_icount}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj hhhj hM% ubj)}(h?(struct tty_struct *tty, struct serial_icounter_struct *icount)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj- hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj> hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj; ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj@ modnameN classnameNjj)}j"]j%)}jj sbc.tty_get_icountasbuh1hhj ubj)}(h h]h }(hj^ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj9)}(hj<h]h*}(hjl hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj ubj)}(httyh]htty}(hjy hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj ubj)}(h%struct serial_icounter_struct *icounth](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hserial_icounter_structh]hserial_icounter_struct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j"]jZ c.tty_get_icountasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj9)}(hj<h]h*}(hj hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj ubj)}(hicounth]hicount}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj ubeh}(h]h ]h"]h$]h&]hhuh1jhj hhhj hM% ubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj hhhj hM% ubah}(h]j ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj hM% hj hhubjy)}(hhh]h)}(hget tty statisticsh]hget tty statistics}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM hj hhubah}(h]h ]h"]h$]h&]uh1jxhj hhhj hM% ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj+ jj+ jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct tty_struct *tty`` tty device ``struct serial_icounter_struct *icount`` output parameter **Description** Gets a copy of the **tty**'s icount statistics. Locking: none (up to the driver)h](h)}(h**Parameters**h]j)}(hj5 h]h Parameters}(hj7 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3 ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM! hj/ ubj)}(hhh](j)}(h&``struct tty_struct *tty`` tty device h](j)}(h``struct tty_struct *tty``h]j)}(hjT h]hstruct tty_struct *tty}(hjV hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjR ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM hjN ubj)}(hhh]h)}(h tty deviceh]h tty device}(hjm hhhNhNubah}(h]h ]h"]h$]h&]uh1hhji hM hjj ubah}(h]h ]h"]h$]h&]uh1jhjN ubeh}(h]h ]h"]h$]h&]uh1jhji hM hjK ubj)}(h;``struct serial_icounter_struct *icount`` output parameter h](j)}(h)``struct serial_icounter_struct *icount``h]j)}(hj h]h%struct serial_icounter_struct *icount}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM hj ubj)}(hhh]h)}(houtput parameterh]houtput parameter}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hM hjK ubeh}(h]h ]h"]h$]h&]uh1jhj/ ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM! hj/ ubh)}(h/Gets a copy of the **tty**'s icount statistics.h](hGets a copy of the }(hj hhhNhNubj)}(h**tty**h]htty}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh’s icount statistics.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM! hj/ ubh)}(h Locking: none (up to the driver)h]h Locking: none (up to the driver)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:22: ./drivers/tty/tty_io.chM# hj/ ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]jah ]h"]exported internal functionsah$]h&]uh1hhhhhhhhKubjw)}(h----h]h}(h]h ]h"]h$]h&]uh1jvhhhKhhhhubh)}(hhh](h)}(hInternal Functionsh]hInternal Functions}(hj)hhhNhNubah}(h]h ]h"]h$]h&]j`j,uh1hhj&hhhhhKubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|free_tty_struct (C function)c.free_tty_structhNtauh1johj&hhhNhNubj)}(hhh](j)}(h-void free_tty_struct (struct tty_struct *tty)h]j)}(h,void free_tty_struct(struct tty_struct *tty)h](j)}(hvoidh]hvoid}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLhhhj^hKubj)}(hfree_tty_structh]j)}(hfree_tty_structh]hfree_tty_struct}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ](jjeh"]h$]h&]hhuh1jhjLhhhj^hKubj)}(h(struct tty_struct *tty)h]j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j"]j%)}jjssbc.free_tty_structasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hj<h]h*}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubj)}(httyh]htty}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhjLhhhj^hKubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjHhhhj^hKubah}(h]jCah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj^hKhjEhhubjy)}(hhh]h)}(hfree a disused ttyh]hfree a disused tty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhj hhubah}(h]h ]h"]h$]h&]uh1jxhjEhhhj^hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj(jj(jjjuh1jhhhj&hNhNubj)}(h**Parameters** ``struct tty_struct *tty`` tty struct to free **Description** Free the write buffers, tty queue and tty memory itself. Locking: none. Must be called after tty is definitely unusedh](h)}(h**Parameters**h]j)}(hj2h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhj,ubj)}(hhh]j)}(h.``struct tty_struct *tty`` tty struct to free h](j)}(h``struct tty_struct *tty``h]j)}(hjQh]hstruct tty_struct *tty}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhjKubj)}(hhh]h)}(htty struct to freeh]htty struct to free}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhKhjgubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1jhjfhKhjHubah}(h]h ]h"]h$]h&]uh1jhj,ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhj,ubh)}(h8Free the write buffers, tty queue and tty memory itself.h]h8Free the write buffers, tty queue and tty memory itself.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhj,ubh)}(hprivate_datah]hfree file->private_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhjhhubah}(h]h ]h"]h$]h&]uh1jxhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj&hNhNubj)}(h**Parameters** ``struct file *file`` to free private_data of **Description** This shall be used only for fail path handling when tty_add_file was not called yet.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhjubj)}(hhh]j)}(h.``struct file *file`` to free private_data of h](j)}(h``struct file *file``h]j)}(hjh]hstruct file *file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhjubj)}(hhh]h)}(hto free private_data ofh]hto free private_data of}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhjubh)}(hTThis shall be used only for fail path handling when tty_add_file was not called yet.h]hTThis shall be used only for fail path handling when tty_add_file was not called yet.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|get_tty_driver (C function)c.get_tty_driverhNtauh1johj&hhhNhNubj)}(hhh](j)}(h=struct tty_driver * get_tty_driver (dev_t device, int *index)h]j)}(h;struct tty_driver *get_tty_driver(dev_t device, int *index)h](j)}(hjh]hstruct}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM3ubj)}(h h]h }(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]hhhjnhM3ubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j"]j%)}jget_tty_driversbc.get_tty_driverasbuh1hhj]hhhjnhM3ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]hhhjnhM3ubj9)}(hj<h]h*}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj]hhhjnhM3ubj)}(hget_tty_driverh]j)}(hjh]hget_tty_driver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhj]hhhjnhM3ubj)}(h(dev_t device, int *index)h](j)}(h dev_t deviceh](h)}(hhh]j)}(hdev_th]hdev_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j"]jc.get_tty_driverasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdeviceh]hdevice}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(h int *indexh](j)}(hinth]hint}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hj<h]h*}(hj?hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubj)}(hindexh]hindex}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubeh}(h]h ]h"]h$]h&]hhuh1jhj]hhhjnhM3ubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjYhhhjnhM3ubah}(h]jTah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjnhM3hjVhhubjy)}(hhh]h)}(hfind device of a ttyh]hfind device of a tty}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM*hjshhubah}(h]h ]h"]h$]h&]uh1jxhjVhhhjnhM3ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``dev_t device`` device identifier ``int *index`` returns the index of the tty **Description** This routine returns a tty driver structure, given a device number and also passes back the index number. Locking: caller must hold tty_mutexh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM.hjubj)}(hhh](j)}(h#``dev_t device`` device identifier h](j)}(h``dev_t device``h]j)}(hjh]h dev_t device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM+hjubj)}(hhh]h)}(hdevice identifierh]hdevice identifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM+hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM+hjubj)}(h,``int *index`` returns the index of the tty h](j)}(h``int *index``h]j)}(hjh]h int *index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM,hjubj)}(hhh]h)}(hreturns the index of the ttyh]hreturns the index of the tty}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM,hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM,hjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hj+h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM.hjubh)}(hiThis routine returns a tty driver structure, given a device number and also passes back the index number.h]hiThis routine returns a tty driver structure, given a device number and also passes back the index number.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM.hjubh)}(h#Locking: caller must hold tty_mutexh]h#Locking: caller must hold tty_mutex}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM1hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|!tty_release_redirect (C function)c.tty_release_redirecthNtauh1johj&hhhNhNubj)}(hhh](j)}(h;struct file * tty_release_redirect (struct tty_struct *tty)h]j)}(h9struct file *tty_release_redirect(struct tty_struct *tty)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhhjhMubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j"]j%)}jtty_release_redirectsbc.tty_release_redirectasbuh1hhj{hhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhhjhMubj9)}(hj<h]h*}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj{hhhjhMubj)}(htty_release_redirecth]j)}(hjh]htty_release_redirect}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhj{hhhjhMubj)}(h(struct tty_struct *tty)h]j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j"]jc.tty_release_redirectasbuh1hhjubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hj<h]h*}(hjChhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubj)}(httyh]htty}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhj{hhhjhMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjwhhhjhMubah}(h]jrah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjhMhjthhubjy)}(hhh]h)}(h&Release a redirect on a pty if presenth]h&Release a redirect on a pty if present}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjwhhubah}(h]h ]h"]h$]h&]uh1jxhjthhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj&hNhNubj)}(h**Parameters** ``struct tty_struct *tty`` tty device **Description** This is available to the pty code so if the master closes, if the slave is a redirect it can release the redirect.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubj)}(hhh]j)}(h&``struct tty_struct *tty`` tty device h](j)}(h``struct tty_struct *tty``h]j)}(hjh]hstruct tty_struct *tty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubj)}(hhh]h)}(h tty deviceh]h tty device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubh)}(hrThis is available to the pty code so if the master closes, if the slave is a redirect it can release the redirect.h]hrThis is available to the pty code so if the master closes, if the slave is a redirect it can release the redirect.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|__tty_hangup (C function)c.__tty_hanguphNtauh1johj&hhhNhNubj)}(hhh](j)}(hsiglock to protect ->signal/->sighand,h](h)}(h**Parameters**h]j)}(hjRh]h Parameters}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM'hjLubj)}(hhh](j)}(h&``struct tty_struct *tty`` tty device h](j)}(h``struct tty_struct *tty``h]j)}(hjqh]hstruct tty_struct *tty}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM$hjkubj)}(hhh]h)}(h tty deviceh]h tty device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM$hjubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jhjhM$hjhubj)}(hH``int exit_session`` if non-zero, signal all foreground group processes h](j)}(h``int exit_session``h]j)}(hjh]hint exit_session}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM%hjubj)}(hhh]h)}(h2if non-zero, signal all foreground group processesh]h2if non-zero, signal all foreground group processes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM%hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM%hjhubeh}(h]h ]h"]h$]h&]uh1jhjLubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM'hjLubh)}(hThis can be called by a "kworker" kernel thread. That is process synchronous but doesn't hold any locks, so we need to make sure we have the appropriate locks for what we're doing.h]hThis can be called by a “kworker” kernel thread. That is process synchronous but doesn’t hold any locks, so we need to make sure we have the appropriate locks for what we’re doing.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM'hjLubh)}(hThe hangup event clears any pending redirections onto the hung up device. It ensures future writes will error and it does the needed line discipline hangup and signal delivery. The tty object itself remains intact.h]hThe hangup event clears any pending redirections onto the hung up device. It ensures future writes will error and it does the needed line discipline hangup and signal delivery. The tty object itself remains intact.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM+hjLubj)}(hhh]j)}(hXLocking: * BTM * redirect lock for undoing redirection * file list lock for manipulating list of ttys * tty_ldiscs_lock from called functions * termios_rwsem resetting termios data * tasklist_lock to walk task list for hangup event * ->siglock to protect ->signal/->sighandh](j)}(hLocking:h]hLocking:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM7hjubj)}(hhh](h)}(hhh]h)}(hBTM h]h)}(hBTMh]hBTM}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM0hj5ubah}(h]h ]h"]h$]h&]uh1hhj2ubah}(h]h ]h"]h$]h&]jfj<uh1hhjGhM0hj/ubh block_quote)}(hX* redirect lock for undoing redirection * file list lock for manipulating list of ttys * tty_ldiscs_lock from called functions * termios_rwsem resetting termios data * tasklist_lock to walk task list for hangup event * ->siglock to protect ->signal/->sighandh](h)}(hhh](h)}(h%redirect lock for undoing redirectionh]h)}(hj_h]h%redirect lock for undoing redirection}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM2hj]ubah}(h]h ]h"]h$]h&]uh1hhjZubh)}(h,file list lock for manipulating list of ttysh]h)}(hjwh]h,file list lock for manipulating list of ttys}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM3hjuubah}(h]h ]h"]h$]h&]uh1hhjZubh)}(h%tty_ldiscs_lock from called functionsh]h)}(hjh]h%tty_ldiscs_lock from called functions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM4hjubah}(h]h ]h"]h$]h&]uh1hhjZubh)}(h$termios_rwsem resetting termios datah]h)}(hjh]h$termios_rwsem resetting termios data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM5hjubah}(h]h ]h"]h$]h&]uh1hhjZubh)}(h1tasklist_lock to walk task list for hangup event h]h)}(h0tasklist_lock to walk task list for hangup eventh]h0tasklist_lock to walk task list for hangup event}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM6hjubah}(h]h ]h"]h$]h&]uh1hhjZubeh}(h]h ]h"]h$]h&]jfj<uh1hhjnhM2hjVubjU)}(h)* ->siglock to protect ->signal/->sighandh]h)}(hhh]h)}(h'->siglock to protect ->signal/->sighandh]h)}(hjh]h'->siglock to protect ->signal/->sighand}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM8hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]jfj<uh1hhjhM8hjubah}(h]h ]h"]h$]h&]uh1jThjhM8hjVubeh}(h]h ]h"]h$]h&]uh1jThjnhM2hj/ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj.hM7hjubah}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_vhangup_self (C function)c.tty_vhangup_selfhNtauh1johj&hhhNhNubj)}(hhh](j)}(hvoid tty_vhangup_self (void)h]j)}(hvoid tty_vhangup_self(void)h](j)}(hvoidh]hvoid}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhhjMhMubj)}(htty_vhangup_selfh]j)}(htty_vhangup_selfh]htty_vhangup_self}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj;hhhjMhMubj)}(h(void)h]j)}(hvoidh]j)}(hvoidh]hvoid}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]noemphhhuh1jhjtubah}(h]h ]h"]h$]h&]hhuh1jhj;hhhjMhMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj7hhhjMhMubah}(h]j2ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjMhMhj4hhubjy)}(hhh]h)}(hprocess vhangup for own cttyh]hprocess vhangup for own ctty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjhhubah}(h]h ]h"]h$]h&]uh1jxhj4hhhjMhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj&hNhNubj)}(hj**Parameters** ``void`` no arguments **Description** Perform a vhangup on the current controlling ttyh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubj)}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubj)}(hhh]h)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hj"h]h Description}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubh)}(h0Perform a vhangup on the current controlling ttyh]h0Perform a vhangup on the current controlling tty}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j| tty_vhangup_session (C function)c.tty_vhangup_sessionhNtauh1johj&hhhNhNubj)}(hhh](j)}(h1void tty_vhangup_session (struct tty_struct *tty)h]j)}(h0void tty_vhangup_session(struct tty_struct *tty)h](j)}(hvoidh]hvoid}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhhjuhMubj)}(htty_vhangup_sessionh]j)}(htty_vhangup_sessionh]htty_vhangup_session}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjchhhjuhMubj)}(h(struct tty_struct *tty)h]j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j"]j%)}jjsbc.tty_vhangup_sessionasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hj<h]h*}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubj)}(httyh]htty}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhjchhhjuhMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj_hhhjuhMubah}(h]jZah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjuhMhj\hhubjy)}(hhh]h)}(hhangup session leader exith]hhangup session leader exit}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj$hhubah}(h]h ]h"]h$]h&]uh1jxhj\hhhjuhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj?jj?jjjuh1jhhhj&hNhNubj)}(hX`**Parameters** ``struct tty_struct *tty`` tty to hangup **Description** The session leader is exiting and hanging up its controlling terminal. Every process in the foreground process group is signalled ``SIGHUP``. We do this synchronously so that when the syscall returns the process is complete. That guarantee is necessary for security reasons.h](h)}(h**Parameters**h]j)}(hjIh]h Parameters}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjCubj)}(hhh]j)}(h)``struct tty_struct *tty`` tty to hangup h](j)}(h``struct tty_struct *tty``h]j)}(hjhh]hstruct tty_struct *tty}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjbubj)}(hhh]h)}(h tty to hanguph]h tty to hangup}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hMhj~ubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jhj}hMhj_ubah}(h]h ]h"]h$]h&]uh1jhjCubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjCubh)}(hThe session leader is exiting and hanging up its controlling terminal. Every process in the foreground process group is signalled ``SIGHUP``.h](hThe session leader is exiting and hanging up its controlling terminal. Every process in the foreground process group is signalled }(hjhhhNhNubj)}(h ``SIGHUP``h]hSIGHUP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjCubh)}(hWe do this synchronously so that when the syscall returns the process is complete. That guarantee is necessary for security reasons.h]hWe do this synchronously so that when the syscall returns the process is complete. That guarantee is necessary for security reasons.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_read (C function) c.tty_readhNtauh1johj&hhhNhNubj)}(hhh](j)}(h:ssize_t tty_read (struct kiocb *iocb, struct iov_iter *to)h]j)}(h9ssize_t tty_read(struct kiocb *iocb, struct iov_iter *to)h](h)}(hhh]j)}(hssize_th]hssize_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j"]j%)}jtty_readsb c.tty_readasbuh1hhjhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj-hMubj)}(htty_readh]j)}(hj*h]htty_read}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhj-hMubj)}(h)(struct kiocb *iocb, struct iov_iter *to)h](j)}(hstruct kiocb *iocbh](j)}(hjh]hstruct}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubh)}(hhh]j)}(hkiocbh]hkiocb}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj{modnameN classnameNjj)}j"]j( c.tty_readasbuh1hhjWubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj9)}(hj<h]h*}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjWubj)}(hiocbh]hiocb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjSubj)}(hstruct iov_iter *toh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hiov_iterh]hiov_iter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j"]j( c.tty_readasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hj<h]h*}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubj)}(htoh]hto}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjSubeh}(h]h ]h"]h$]h&]hhuh1jhjhhhj-hMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjhhhj-hMubah}(h]jah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj-hMhjhhubjy)}(hhh]h)}(h read method for tty device filesh]h read method for tty device files}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjIhhubah}(h]h ]h"]h$]h&]uh1jxhjhhhj-hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjdjjdjjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``struct kiocb *iocb`` kernel I/O control block ``struct iov_iter *to`` destination for the data read **Description** Perform the read system call function on this terminal device. Checks for hung up devices before calling the line discipline method. Locking: Locks the line discipline internally while needed. Multiple read calls may be outstanding in parallel.h](h)}(h**Parameters**h]j)}(hjnh]h Parameters}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjhubj)}(hhh](j)}(h0``struct kiocb *iocb`` kernel I/O control block h](j)}(h``struct kiocb *iocb``h]j)}(hjh]hstruct kiocb *iocb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubj)}(hhh]h)}(hkernel I/O control blockh]hkernel I/O control block}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h6``struct iov_iter *to`` destination for the data read h](j)}(h``struct iov_iter *to``h]j)}(hjh]hstruct iov_iter *to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubj)}(hhh]h)}(hdestination for the data readh]hdestination for the data read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjhubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjhubh)}(hPerform the read system call function on this terminal device. Checks for hung up devices before calling the line discipline method.h]hPerform the read system call function on this terminal device. Checks for hung up devices before calling the line discipline method.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjhubj)}(hhh]j)}(hoLocking: Locks the line discipline internally while needed. Multiple read calls may be outstanding in parallel.h](j)}(hLocking:h]hLocking:}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj)ubj)}(hhh]h)}(hfLocks the line discipline internally while needed. Multiple read calls may be outstanding in parallel.h]hfLocks the line discipline internally while needed. Multiple read calls may be outstanding in parallel.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMhj<ubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jhj;hMhj&ubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_write_message (C function)c.tty_write_messagehNtauh1johj&hhhNhNubj)}(hhh](j)}(h:void tty_write_message (struct tty_struct *tty, char *msg)h]j)}(h9void tty_write_message(struct tty_struct *tty, char *msg)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM"ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhhjhM"ubj)}(htty_write_messageh]j)}(htty_write_messageh]htty_write_message}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhj{hhhjhM"ubj)}(h#(struct tty_struct *tty, char *msg)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j"]j%)}jjsbc.tty_write_messageasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj9)}(hj<h]h*}(hjhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjubj)}(httyh]htty}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(h char *msgh](j)}(hcharh]hchar}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj9)}(hj<h]h*}(hjJhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj*ubj)}(hmsgh]hmsg}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubeh}(h]h ]h"]h$]h&]hhuh1jhj{hhhjhM"ubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjwhhhjhM"ubah}(h]jrah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjhM"hjthhubjy)}(hhh]h)}(h7write a message to a certain tty, not just the console.h]h7write a message to a certain tty, not just the console.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj~hhubah}(h]h ]h"]h$]h&]uh1jxhjthhhjhM"ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``struct tty_struct *tty`` the destination tty_struct ``char *msg`` the message to write **Description** This is used for messages that need to be redirected to a specific tty. We don't put it into the syslog queue right now maybe in the future if really needed. We must still hold the BTM and test the CLOSING flag for the moment. This function is DEPRECATED, do not use in new code.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubj)}(hhh](j)}(h6``struct tty_struct *tty`` the destination tty_struct h](j)}(h``struct tty_struct *tty``h]j)}(hjh]hstruct tty_struct *tty}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubj)}(hhh]h)}(hthe destination tty_structh]hthe destination tty_struct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h#``char *msg`` the message to write h](j)}(h ``char *msg``h]j)}(hjh]h char *msg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubj)}(hhh]h)}(hthe message to writeh]hthe message to write}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hj6h]h Description}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubh)}(hThis is used for messages that need to be redirected to a specific tty. We don't put it into the syslog queue right now maybe in the future if really needed.h]hThis is used for messages that need to be redirected to a specific tty. We don’t put it into the syslog queue right now maybe in the future if really needed.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubh)}(hDWe must still hold the BTM and test the CLOSING flag for the moment.h]hDWe must still hold the BTM and test the CLOSING flag for the moment.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjubh)}(h4This function is DEPRECATED, do not use in new code.h]h4This function is DEPRECATED, do not use in new code.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_write (C function) c.tty_writehNtauh1johj&hhhNhNubj)}(hhh](j)}(h=ssize_t tty_write (struct kiocb *iocb, struct iov_iter *from)h]j)}(h$ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj$hhhj/$hMubj)}(h/(struct tty_driver *driver, int index, char *p)h](j)}(hstruct tty_driver *driverh](j)}(hjh]hstruct}(hj^$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ$ubj)}(h h]h }(hjk$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ$ubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj|$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy$ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj~$modnameN classnameNjj)}j"]j%)}jjD$sbc.pty_line_nameasbuh1hhjZ$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ$ubj9)}(hj<h]h*}(hj$hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjZ$ubj)}(hdriverh]hdriver}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ$ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjV$ubj)}(h int indexh](j)}(hinth]hint}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hindexh]hindex}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjV$ubj)}(hchar *ph](j)}(hcharh]hchar}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj9)}(hj<h]h*}(hj!%hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj%ubj)}(hjEh]hp}(hj.%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjV$ubeh}(h]h ]h"]h$]h&]hhuh1jhj$hhhj/$hMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj$hhhj/$hMubah}(h]j$ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj/$hMhj$hhubjy)}(hhh]h)}(hgenerate name for a ptyh]hgenerate name for a pty}(hjW%hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjT%hhubah}(h]h ]h"]h$]h&]uh1jxhj$hhhj/$hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjo%jjo%jjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``struct tty_driver *driver`` the tty driver in use ``int index`` the minor number ``char *p`` output buffer of at least 6 bytes **Description** Generate a name from a **driver** reference and write it to the output buffer **p**. Locking: Noneh](h)}(h**Parameters**h]j)}(hjy%h]h Parameters}(hj{%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw%ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjs%ubj)}(hhh](j)}(h4``struct tty_driver *driver`` the tty driver in use h](j)}(h``struct tty_driver *driver``h]j)}(hj%h]hstruct tty_driver *driver}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj%ubj)}(hhh]h)}(hthe tty driver in useh]hthe tty driver in use}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hMhj%ubj)}(h``int index`` the minor number h](j)}(h ``int index``h]j)}(hj%h]h int index}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj%ubj)}(hhh]h)}(hthe minor numberh]hthe minor number}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hMhj%ubj)}(h.``char *p`` output buffer of at least 6 bytes h](j)}(h ``char *p``h]j)}(hj &h]hchar *p}(hj &hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj&ubj)}(hhh]h)}(h!output buffer of at least 6 bytesh]h!output buffer of at least 6 bytes}(hj#&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMhj &ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhj%ubeh}(h]h ]h"]h$]h&]uh1jhjs%ubh)}(h**Description**h]j)}(hjE&h]h Description}(hjG&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC&ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjs%ubh)}(hTGenerate a name from a **driver** reference and write it to the output buffer **p**.h](hGenerate a name from a }(hj[&hhhNhNubj)}(h **driver**h]hdriver}(hjc&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[&ubh- reference and write it to the output buffer }(hj[&hhhNhNubj)}(h**p**h]hp}(hju&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[&ubh.}(hj[&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjs%ubh)}(h Locking: Noneh]h Locking: None}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjs%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_line_name (C function)c.tty_line_namehNtauh1johj&hhhNhNubj)}(hhh](j)}(hEssize_t tty_line_name (struct tty_driver *driver, int index, char *p)h]j)}(hDssize_t tty_line_name(struct tty_driver *driver, int index, char *p)h](h)}(hhh]j)}(hssize_th]hssize_t}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj&modnameN classnameNjj)}j"]j%)}j tty_line_namesbc.tty_line_nameasbuh1hhj&hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&hhhj&hMubj)}(h tty_line_nameh]j)}(hj&h]h tty_line_name}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj&hhhj&hMubj)}(h/(struct tty_driver *driver, int index, char *p)h](j)}(hstruct tty_driver *driverh](j)}(hjh]hstruct}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 'ubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj-'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*'ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj/'modnameN classnameNjj)}j"]j&c.tty_line_nameasbuh1hhj 'ubj)}(h h]h }(hjK'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 'ubj9)}(hj<h]h*}(hjY'hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj 'ubj)}(hdriverh]hdriver}(hjf'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 'ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj'ubj)}(h int indexh](j)}(hinth]hint}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{'ubj)}(hindexh]hindex}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{'ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj'ubj)}(hchar *ph](j)}(hcharh]hchar}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj9)}(hj<h]h*}(hj'hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj'ubj)}(hjEh]hp}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj'ubeh}(h]h ]h"]h$]h&]hhuh1jhj&hhhj&hMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj&hhhj&hMubah}(h]j&ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj&hMhj&hhubjy)}(hhh]h)}(hgenerate name for a ttyh]hgenerate name for a tty}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj(hhubah}(h]h ]h"]h$]h&]uh1jxhj&hhhj&hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj(jj(jjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``struct tty_driver *driver`` the tty driver in use ``int index`` the minor number ``char *p`` output buffer of at least 7 bytes **Description** Generate a name from a **driver** reference and write it to the output buffer **p**. Locking: Noneh](h)}(h**Parameters**h]j)}(hj((h]h Parameters}(hj*(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&(ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj"(ubj)}(hhh](j)}(h4``struct tty_driver *driver`` the tty driver in use h](j)}(h``struct tty_driver *driver``h]j)}(hjG(h]hstruct tty_driver *driver}(hjI(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjE(ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjA(ubj)}(hhh]h)}(hthe tty driver in useh]hthe tty driver in use}(hj`(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\(hMhj](ubah}(h]h ]h"]h$]h&]uh1jhjA(ubeh}(h]h ]h"]h$]h&]uh1jhj\(hMhj>(ubj)}(h``int index`` the minor number h](j)}(h ``int index``h]j)}(hj(h]h int index}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~(ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjz(ubj)}(hhh]h)}(hthe minor numberh]hthe minor number}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj(ubah}(h]h ]h"]h$]h&]uh1jhjz(ubeh}(h]h ]h"]h$]h&]uh1jhj(hMhj>(ubj)}(h.``char *p`` output buffer of at least 7 bytes h](j)}(h ``char *p``h]j)}(hj(h]hchar *p}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj(ubj)}(hhh]h)}(h!output buffer of at least 7 bytesh]h!output buffer of at least 7 bytes}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj(ubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jhj(hMhj>(ubeh}(h]h ]h"]h$]h&]uh1jhj"(ubh)}(h**Description**h]j)}(hj(h]h Description}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj"(ubh)}(hTGenerate a name from a **driver** reference and write it to the output buffer **p**.h](hGenerate a name from a }(hj )hhhNhNubj)}(h **driver**h]hdriver}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj )ubh- reference and write it to the output buffer }(hj )hhhNhNubj)}(h**p**h]hp}(hj$)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj )ubh.}(hj )hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj"(ubh)}(h Locking: Noneh]h Locking: None}(hj=)hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj"(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|"tty_driver_lookup_tty (C function)c.tty_driver_lookup_ttyhNtauh1johj&hhhNhNubj)}(hhh](j)}(hastruct tty_struct * tty_driver_lookup_tty (struct tty_driver *driver, struct file *file, int idx)h]j)}(h_struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver, struct file *file, int idx)h](j)}(hjh]hstruct}(hjl)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh)hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjz)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh)hhhjy)hMubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj)modnameN classnameNjj)}j"]j%)}jtty_driver_lookup_ttysbc.tty_driver_lookup_ttyasbuh1hhjh)hhhjy)hMubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh)hhhjy)hMubj9)}(hj<h]h*}(hj)hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjh)hhhjy)hMubj)}(htty_driver_lookup_ttyh]j)}(hj)h]htty_driver_lookup_tty}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjh)hhhjy)hMubj)}(h7(struct tty_driver *driver, struct file *file, int idx)h](j)}(hstruct tty_driver *driverh](j)}(hjh]hstruct}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj*modnameN classnameNjj)}j"]j)c.tty_driver_lookup_ttyasbuh1hhj)ubj)}(h h]h }(hj"*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj9)}(hj<h]h*}(hj0*hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj)ubj)}(hdriverh]hdriver}(hj=*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj)ubj)}(hstruct file *fileh](j)}(hjh]hstruct}(hjV*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR*ubj)}(h h]h }(hjc*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR*ubh)}(hhh]j)}(hfileh]hfile}(hjt*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq*ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjv*modnameN classnameNjj)}j"]j)c.tty_driver_lookup_ttyasbuh1hhjR*ubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR*ubj9)}(hj<h]h*}(hj*hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjR*ubj)}(hfileh]hfile}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR*ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj)ubj)}(hint idxh](j)}(hinth]hint}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hidxh]hidx}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj)ubeh}(h]h ]h"]h$]h&]hhuh1jhjh)hhhjy)hMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjd)hhhjy)hMubah}(h]j_)ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjy)hMhja)hhubjy)}(hhh]h)}(hfind an existing tty, if anyh]hfind an existing tty, if any}(hj +hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj +hhubah}(h]h ]h"]h$]h&]uh1jxhja)hhhjy)hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj$+jj$+jjjuh1jhhhj&hNhNubj)}(hXa**Parameters** ``struct tty_driver *driver`` the driver for the tty ``struct file *file`` file object ``int idx`` the minor number **Return** the tty, if found. If not found, return ``NULL`` or ERR_PTR() if the driver lookup() method returns an error. **Description** Locking: tty_mutex must be held. If the tty is found, bump the tty kref.h](h)}(h**Parameters**h]j)}(hj.+h]h Parameters}(hj0+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,+ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj(+ubj)}(hhh](j)}(h5``struct tty_driver *driver`` the driver for the tty h](j)}(h``struct tty_driver *driver``h]j)}(hjM+h]hstruct tty_driver *driver}(hjO+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK+ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjG+ubj)}(hhh]h)}(hthe driver for the ttyh]hthe driver for the tty}(hjf+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjb+hMhjc+ubah}(h]h ]h"]h$]h&]uh1jhjG+ubeh}(h]h ]h"]h$]h&]uh1jhjb+hMhjD+ubj)}(h"``struct file *file`` file object h](j)}(h``struct file *file``h]j)}(hj+h]hstruct file *file}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj+ubj)}(hhh]h)}(h file objecth]h file object}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMhj+ubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jhj+hMhjD+ubj)}(h``int idx`` the minor number h](j)}(h ``int idx``h]j)}(hj+h]hint idx}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj+ubj)}(hhh]h)}(hthe minor numberh]hthe minor number}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMhj+ubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jhj+hMhjD+ubeh}(h]h ]h"]h$]h&]uh1jhj(+ubh)}(h **Return**h]j)}(hj+h]hReturn}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj(+ubh)}(hmthe tty, if found. If not found, return ``NULL`` or ERR_PTR() if the driver lookup() method returns an error.uh](h(the tty, if found. If not found, return }(hj,hhhNhNubj)}(h``NULL``h]hNULL}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubh= or ERR_PTR() if the driver lookup() method returns an error.}(hj,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj(+ubh)}(h**Description**h]j)}(hj3,h]h Description}(hj5,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1,ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj(+ubh)}(hHLocking: tty_mutex must be held. If the tty is found, bump the tty kref.h]hHLocking: tty_mutex must be held. If the tty is found, bump the tty kref.}(hjI,hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj(+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|#tty_driver_install_tty (C function)c.tty_driver_install_ttyhNtauh1johj&hhhNhNubj)}(hhh](j)}(hNint tty_driver_install_tty (struct tty_driver *driver, struct tty_struct *tty)h]j)}(hMint tty_driver_install_tty(struct tty_driver *driver, struct tty_struct *tty)h](j)}(hinth]hint}(hjx,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt,hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt,hhhj,hMubj)}(htty_driver_install_ttyh]j)}(htty_driver_install_ttyh]htty_driver_install_tty}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjt,hhhj,hMubj)}(h3(struct tty_driver *driver, struct tty_struct *tty)h](j)}(hstruct tty_driver *driverh](j)}(hjh]hstruct}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj,modnameN classnameNjj)}j"]j%)}jj,sbc.tty_driver_install_ttyasbuh1hhj,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj9)}(hj<h]h*}(hj-hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj,ubj)}(hdriverh]hdriver}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj,ubj)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj'-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#-ubj)}(h h]h }(hj4-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#-ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjE-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB-ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjG-modnameN classnameNjj)}j"]j,c.tty_driver_install_ttyasbuh1hhj#-ubj)}(h h]h }(hjc-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#-ubj9)}(hj<h]h*}(hjq-hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj#-ubj)}(httyh]htty}(hj~-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#-ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj,ubeh}(h]h ]h"]h$]h&]hhuh1jhjt,hhhj,hMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjp,hhhj,hMubah}(h]jk,ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj,hMhjm,hhubjy)}(hhh]h)}(h!install a tty entry in the driverh]h!install a tty entry in the driver}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj-hhubah}(h]h ]h"]h$]h&]uh1jxhjm,hhhj,hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj-jj-jjjuh1jhhhj&hNhNubj)}(hXm**Parameters** ``struct tty_driver *driver`` the driver for the tty ``struct tty_struct *tty`` the tty **Description** Install a tty object into the driver tables. The **tty->index** field will be set by the time this is called. This method is responsible for ensuring any need additional structures are allocated and configured. Locking: tty_mutex for nowh](h)}(h**Parameters**h]j)}(hj-h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj-ubj)}(hhh](j)}(h5``struct tty_driver *driver`` the driver for the tty h](j)}(h``struct tty_driver *driver``h]j)}(hj-h]hstruct tty_driver *driver}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj-ubj)}(hhh]h)}(hthe driver for the ttyh]hthe driver for the tty}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hM hj-ubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jhj-hM hj-ubj)}(h#``struct tty_struct *tty`` the tty h](j)}(h``struct tty_struct *tty``h]j)}(hj".h]hstruct tty_struct *tty}(hj$.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj .ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj.ubj)}(hhh]h)}(hthe ttyh]hthe tty}(hj;.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7.hM hj8.ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj7.hM hj-ubeh}(h]h ]h"]h$]h&]uh1jhj-ubh)}(h**Description**h]j)}(hj].h]h Description}(hj_.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[.ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj-ubh)}(hInstall a tty object into the driver tables. The **tty->index** field will be set by the time this is called. This method is responsible for ensuring any need additional structures are allocated and configured.h](h1Install a tty object into the driver tables. The }(hjs.hhhNhNubj)}(h**tty->index**h]h tty->index}(hj{.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs.ubh field will be set by the time this is called. This method is responsible for ensuring any need additional structures are allocated and configured.}(hjs.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj-ubh)}(hLocking: tty_mutex for nowh]hLocking: tty_mutex for now}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|"tty_driver_remove_tty (C function)c.tty_driver_remove_ttyhNtauh1johj&hhhNhNubj)}(hhh](j)}(hNvoid tty_driver_remove_tty (struct tty_driver *driver, struct tty_struct *tty)h]j)}(hMvoid tty_driver_remove_tty(struct tty_driver *driver, struct tty_struct *tty)h](j)}(hvoidh]hvoid}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM&ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.hhhj.hM&ubj)}(htty_driver_remove_ttyh]j)}(htty_driver_remove_ttyh]htty_driver_remove_tty}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj.hhhj.hM&ubj)}(h3(struct tty_driver *driver, struct tty_struct *tty)h](j)}(hstruct tty_driver *driverh](j)}(hjh]hstruct}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(h h]h }(hj /hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj /modnameN classnameNjj)}j"]j%)}jj.sbc.tty_driver_remove_ttyasbuh1hhj.ubj)}(h h]h }(hj>/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj9)}(hj<h]h*}(hjL/hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj.ubj)}(hdriverh]hdriver}(hjY/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj.ubj)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjr/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn/ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn/ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj/modnameN classnameNjj)}j"]j:/c.tty_driver_remove_ttyasbuh1hhjn/ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn/ubj9)}(hj<h]h*}(hj/hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjn/ubj)}(httyh]htty}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn/ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj.ubeh}(h]h ]h"]h$]h&]hhuh1jhj.hhhj.hM&ubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj.hhhj.hM&ubah}(h]j.ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj.hM&hj.hhubjy)}(hhh]h)}(h#remove a tty from the driver tablesh]h#remove a tty from the driver tables}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj/hhubah}(h]h ]h"]h$]h&]uh1jxhj.hhhj.hM&ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj 0jj 0jjjuh1jhhhj&hNhNubj)}(hX **Parameters** ``struct tty_driver *driver`` the driver for the tty ``struct tty_struct *tty`` tty to remove **Description** Remove a tty object from the driver tables. The tty->index field will be set by the time this is called. Locking: tty_mutex for nowh](h)}(h**Parameters**h]j)}(hj0h]h Parameters}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM!hj0ubj)}(hhh](j)}(h5``struct tty_driver *driver`` the driver for the tty h](j)}(h``struct tty_driver *driver``h]j)}(hj40h]hstruct tty_driver *driver}(hj60hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj20ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj.0ubj)}(hhh]h)}(hthe driver for the ttyh]hthe driver for the tty}(hjM0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjI0hMhjJ0ubah}(h]h ]h"]h$]h&]uh1jhj.0ubeh}(h]h ]h"]h$]h&]uh1jhjI0hMhj+0ubj)}(h)``struct tty_struct *tty`` tty to remove h](j)}(h``struct tty_struct *tty``h]j)}(hjm0h]hstruct tty_struct *tty}(hjo0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk0ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjg0ubj)}(hhh]h)}(h tty to removeh]h tty to remove}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1jhjg0ubeh}(h]h ]h"]h$]h&]uh1jhj0hMhj+0ubeh}(h]h ]h"]h$]h&]uh1jhj0ubh)}(h**Description**h]j)}(hj0h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM!hj0ubh)}(hhRemove a tty object from the driver tables. The tty->index field will be set by the time this is called.h]hhRemove a tty object from the driver tables. The tty->index field will be set by the time this is called.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM!hj0ubh)}(hLocking: tty_mutex for nowh]hLocking: tty_mutex for now}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM$hj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_reopen (C function) c.tty_reopenhNtauh1johj&hhhNhNubj)}(hhh](j)}(h'int tty_reopen (struct tty_struct *tty)h]j)}(h&int tty_reopen(struct tty_struct *tty)h](j)}(hinth]hint}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM7ubj)}(h h]h }(hj 1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0hhhj 1hM7ubj)}(h tty_reopenh]j)}(h tty_reopenh]h tty_reopen}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj0hhhj 1hM7ubj)}(h(struct tty_struct *tty)h]j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj91hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj51ubj)}(h h]h }(hjF1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj51ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjW1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT1ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjY1modnameN classnameNjj)}j"]j%)}jj1sb c.tty_reopenasbuh1hhj51ubj)}(h h]h }(hjw1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj51ubj9)}(hj<h]h*}(hj1hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj51ubj)}(httyh]htty}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj51ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj11ubah}(h]h ]h"]h$]h&]hhuh1jhj0hhhj 1hM7ubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj0hhhj 1hM7ubah}(h]j0ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj 1hM7hj0hhubjy)}(hhh]h)}(hfast re-open of an open ttyh]hfast re-open of an open tty}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM/hj1hhubah}(h]h ]h"]h$]h&]uh1jxhj0hhhj 1hM7ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj1jj1jjjuh1jhhhj&hNhNubj)}(h**Parameters** ``struct tty_struct *tty`` the tty to open **Description** Re-opens on master ptys are not allowed and return -``EIO``. Locking: Caller must hold tty_lock **Return** 0 on success, -errno on error.h](h)}(h**Parameters**h]j)}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM3hj1ubj)}(hhh]j)}(h+``struct tty_struct *tty`` the tty to open h](j)}(h``struct tty_struct *tty``h]j)}(hj1h]hstruct tty_struct *tty}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM0hj1ubj)}(hhh]h)}(hthe tty to openh]hthe tty to open}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hM0hj2ubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhj2hM0hj1ubah}(h]h ]h"]h$]h&]uh1jhj1ubh)}(h**Description**h]j)}(hj82h]h Description}(hj:2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj62ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM2hj1ubh)}(h7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:7ubj)}(h h]h }(hjK7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:7ubh)}(hhh]j)}(h work_structh]h work_struct}(hj\7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY7ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj^7modnameN classnameNjj)}j"]j%)}jj$7sbc.release_one_ttyasbuh1hhj:7ubj)}(h h]h }(hj|7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:7ubj9)}(hj<h]h*}(hj7hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj:7ubj)}(hworkh]hwork}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:7ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj67ubah}(h]h ]h"]h$]h&]hhuh1jhj6hhhj7hMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj6hhhj7hMubah}(h]j6ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj7hMhj6hhubjy)}(hhh]h)}(hrelease tty structure memoryh]hrelease tty structure memory}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj7hhubah}(h]h ]h"]h$]h&]uh1jxhj6hhhj7hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj7jj7jjjuh1jhhhj&hNhNubj)}(hX **Parameters** ``struct work_struct *work`` work of tty we are obliterating **Description** Releases memory associated with a tty structure, and clears out the driver table slots. This function is called when a device is no longer in use. It also gets called when setup of a device fails. Locking: takes the file list lock internally when working on the list of ttys that the driver keeps. This method gets called from a work queue so that the driver private cleanup ops can sleep (needed for USB at least)h](h)}(h**Parameters**h]j)}(hj7h]h Parameters}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj7ubj)}(hhh]j)}(h=``struct work_struct *work`` work of tty we are obliterating h](j)}(h``struct work_struct *work``h]j)}(hj8h]hstruct work_struct *work}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj7ubj)}(hhh]h)}(hwork of tty we are obliteratingh]hwork of tty we are obliterating}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhj8hMhj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubh)}(h**Description**h]j)}(hj=8h]h Description}(hj?8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;8ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj7ubh)}(hReleases memory associated with a tty structure, and clears out the driver table slots. This function is called when a device is no longer in use. It also gets called when setup of a device fails.h]hReleases memory associated with a tty structure, and clears out the driver table slots. This function is called when a device is no longer in use. It also gets called when setup of a device fails.}(hjS8hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj7ubj)}(hhh]j)}(heLocking: takes the file list lock internally when working on the list of ttys that the driver keeps. h](j)}(hLocking:h]hLocking:}(hji8hhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhje8ubj)}(hhh]h)}(h[takes the file list lock internally when working on the list of ttys that the driver keeps.h]h[takes the file list lock internally when working on the list of ttys that the driver keeps.}(hj{8hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjx8ubah}(h]h ]h"]h$]h&]uh1jhje8ubeh}(h]h ]h"]h$]h&]uh1jhjw8hMhjb8ubah}(h]h ]h"]h$]h&]uh1jhj7ubh)}(htThis method gets called from a work queue so that the driver private cleanup ops can sleep (needed for USB at least)h]htThis method gets called from a work queue so that the driver private cleanup ops can sleep (needed for USB at least)}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|release_tty (C function) c.release_ttyhNtauh1johj&hhhNhNubj)}(hhh](j)}(h2void release_tty (struct tty_struct *tty, int idx)h]j)}(h1void release_tty(struct tty_struct *tty, int idx)h](j)}(hvoidh]hvoid}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM/ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhhj8hM/ubj)}(h release_ttyh]j)}(h release_ttyh]h release_tty}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj8hhhj8hM/ubj)}(h!(struct tty_struct *tty, int idx)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj&9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#9ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj(9modnameN classnameNjj)}j"]j%)}jj8sb c.release_ttyasbuh1hhj9ubj)}(h h]h }(hjF9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj9)}(hj<h]h*}(hjT9hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj9ubj)}(httyh]htty}(hja9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj9ubj)}(hint idxh](j)}(hinth]hint}(hjz9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv9ubj)}(hidxh]hidx}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv9ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj9ubeh}(h]h ]h"]h$]h&]hhuh1jhj8hhhj8hM/ubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj8hhhj8hM/ubah}(h]j8ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj8hM/hj8hhubjy)}(hhh]h)}(hrelease tty structure memoryh]hrelease tty structure memory}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM#hj9hhubah}(h]h ]h"]h$]h&]uh1jxhj8hhhj8hM/ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj9jj9jjjuh1jhhhj&hNhNubj)}(hXv**Parameters** ``struct tty_struct *tty`` tty device release ``int idx`` index of the tty device release **Description** Release both **tty** and a possible linked partner (think pty pair), and decrement the refcount of the backing module. Locking: tty_mutex takes the file list lock internally when working on the list of ttys that the driver keeps.h](h)}(h**Parameters**h]j)}(hj9h]h Parameters}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM'hj9ubj)}(hhh](j)}(h.``struct tty_struct *tty`` tty device release h](j)}(h``struct tty_struct *tty``h]j)}(hj:h]hstruct tty_struct *tty}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM$hj9ubj)}(hhh]h)}(htty device releaseh]htty device release}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hM$hj:ubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jhj:hM$hj9ubj)}(h,``int idx`` index of the tty device release h](j)}(h ``int idx``h]j)}(hj::h]hint idx}(hj<:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8:ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM%hj4:ubj)}(hhh]h)}(hindex of the tty device releaseh]hindex of the tty device release}(hjS:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjO:hM%hjP:ubah}(h]h ]h"]h$]h&]uh1jhj4:ubeh}(h]h ]h"]h$]h&]uh1jhjO:hM%hj9ubeh}(h]h ]h"]h$]h&]uh1jhj9ubh)}(h**Description**h]j)}(hju:h]h Description}(hjw:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs:ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM'hj9ubh)}(hvRelease both **tty** and a possible linked partner (think pty pair), and decrement the refcount of the backing module.h](h Release both }(hj:hhhNhNubj)}(h**tty**h]htty}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubhb and a possible linked partner (think pty pair), and decrement the refcount of the backing module.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM'hj9ubj)}(hhh]j)}(hnLocking: tty_mutex takes the file list lock internally when working on the list of ttys that the driver keeps.h](j)}(hLocking:h]hLocking:}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM,hj:ubj)}(hhh]h)}(hetty_mutex takes the file list lock internally when working on the list of ttys that the driver keeps.h]hetty_mutex takes the file list lock internally when working on the list of ttys that the driver keeps.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM+hj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhj:hM,hj:ubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_release_checks (C function)c.tty_release_checkshNtauh1johj&hhhNhNubj)}(hhh](j)}(h8int tty_release_checks (struct tty_struct *tty, int idx)h]j)}(h7int tty_release_checks(struct tty_struct *tty, int idx)h](j)}(hinth]hint}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMMubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhhj;hMMubj)}(htty_release_checksh]j)}(htty_release_checksh]htty_release_checks}(hj';hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#;ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj;hhhj;hMMubj)}(h!(struct tty_struct *tty, int idx)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjC;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?;ubj)}(h h]h }(hjP;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?;ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hja;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^;ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjc;modnameN classnameNjj)}j"]j%)}jj);sbc.tty_release_checksasbuh1hhj?;ubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?;ubj9)}(hj<h]h*}(hj;hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj?;ubj)}(httyh]htty}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?;ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj;;ubj)}(hint idxh](j)}(hinth]hint}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj)}(hidxh]hidx}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj;;ubeh}(h]h ]h"]h$]h&]hhuh1jhj;hhhj;hMMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj:hhhj;hMMubah}(h]j:ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj;hMMhj:hhubjy)}(hhh]h)}(hcheck a tty before real releaseh]hcheck a tty before real release}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMFhj;hhubah}(h]h ]h"]h$]h&]uh1jxhj:hhhj;hMMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj<jj<jjjuh1jhhhj&hNhNubj)}(h**Parameters** ``struct tty_struct *tty`` tty to check ``int idx`` index of the tty **Description** Performs some paranoid checking before true release of the **tty**. This is a no-op unless ``TTY_PARANOIA_CHECK`` is defined.h](h)}(h**Parameters**h]j)}(hj<h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMJhj<ubj)}(hhh](j)}(h(``struct tty_struct *tty`` tty to check h](j)}(h``struct tty_struct *tty``h]j)}(hj<<h]hstruct tty_struct *tty}(hj><hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:<ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMGhj6<ubj)}(hhh]h)}(h tty to checkh]h tty to check}(hjU<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQ<hMGhjR<ubah}(h]h ]h"]h$]h&]uh1jhj6<ubeh}(h]h ]h"]h$]h&]uh1jhjQ<hMGhj3<ubj)}(h``int idx`` index of the tty h](j)}(h ``int idx``h]j)}(hju<h]hint idx}(hjw<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs<ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMHhjo<ubj)}(hhh]h)}(hindex of the ttyh]hindex of the tty}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMHhj<ubah}(h]h ]h"]h$]h&]uh1jhjo<ubeh}(h]h ]h"]h$]h&]uh1jhj<hMHhj3<ubeh}(h]h ]h"]h$]h&]uh1jhj<ubh)}(h**Description**h]j)}(hj<h]h Description}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMJhj<ubh)}(h}Performs some paranoid checking before true release of the **tty**. This is a no-op unless ``TTY_PARANOIA_CHECK`` is defined.h](h;Performs some paranoid checking before true release of the }(hj<hhhNhNubj)}(h**tty**h]htty}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubh. This is a no-op unless }(hj<hhhNhNubj)}(h``TTY_PARANOIA_CHECK``h]hTTY_PARANOIA_CHECK}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubh is defined.}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMJhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_release (C function) c.tty_releasehNtauh1johj&hhhNhNubj)}(hhh](j)}(h8int tty_release (struct inode *inode, struct file *filp)h]j)}(h7int tty_release(struct inode *inode, struct file *filp)h](j)}(hinth]hint}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj(=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhj'=hMubj)}(h tty_releaseh]j)}(h tty_releaseh]h tty_release}(hj:=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6=ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj=hhhj'=hMubj)}(h((struct inode *inode, struct file *filp)h](j)}(hstruct inode *inodeh](j)}(hjh]hstruct}(hjV=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR=ubj)}(h h]h }(hjc=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR=ubh)}(hhh]j)}(hinodeh]hinode}(hjt=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq=ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjv=modnameN classnameNjj)}j"]j%)}jj<=sb c.tty_releaseasbuh1hhjR=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR=ubj9)}(hj<h]h*}(hj=hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjR=ubj)}(hinodeh]hinode}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR=ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjN=ubj)}(hstruct file *filph](j)}(hjh]hstruct}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubh)}(hhh]j)}(hfileh]hfile}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj=modnameN classnameNjj)}j"]j= c.tty_releaseasbuh1hhj=ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj9)}(hj<h]h*}(hj>hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj=ubj)}(hfilph]hfilp}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjN=ubeh}(h]h ]h"]h$]h&]hhuh1jhj=hhhj'=hMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj=hhhj'=hMubah}(h]j =ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj'=hMhj=hhubjy)}(hhh]h)}(hvfs callback for closeh]hvfs callback for close}(hjI>hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjF>hhubah}(h]h ]h"]h$]h&]uh1jxhj=hhhj'=hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjja>jja>jjjuh1jhhhj&hNhNubj)}(hXi**Parameters** ``struct inode *inode`` inode of tty ``struct file *filp`` file pointer for handle to tty **Description** Called the last time each file handle is closed that references this tty. There may however be several such references. Locking: Takes BKL. See tty_release_dev(). Even releasing the tty structures is a tricky business. We have to be very careful that the structures are all released at the same time, as interrupts might otherwise get the wrong pointers. WSH 09/09/97: rewritten to avoid some nasty race conditions that could lead to double frees or releasing memory still in use.h](h)}(h**Parameters**h]j)}(hjk>h]h Parameters}(hjm>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhji>ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhje>ubj)}(hhh](j)}(h%``struct inode *inode`` inode of tty h](j)}(h``struct inode *inode``h]j)}(hj>h]hstruct inode *inode}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj>ubj)}(hhh]h)}(h inode of ttyh]h inode of tty}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>hMhj>ubj)}(h5``struct file *filp`` file pointer for handle to tty h](j)}(h``struct file *filp``h]j)}(hj>h]hstruct file *filp}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj>ubj)}(hhh]h)}(hfile pointer for handle to ttyh]hfile pointer for handle to tty}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>hMhj>ubeh}(h]h ]h"]h$]h&]uh1jhje>ubh)}(h**Description**h]j)}(hj>h]h Description}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhje>ubh)}(hwCalled the last time each file handle is closed that references this tty. There may however be several such references.h]hwCalled the last time each file handle is closed that references this tty. There may however be several such references.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhje>ubj)}(hhh]j)}(h+Locking: Takes BKL. See tty_release_dev(). h](j)}(hLocking:h]hLocking:}(hj*?hhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhj&?ubj)}(hhh]h)}(h!Takes BKL. See tty_release_dev().h]h!Takes BKL. See tty_release_dev().}(hjubh)}(hEven releasing the tty structures is a tricky business. We have to be very careful that the structures are all released at the same time, as interrupts might otherwise get the wrong pointers.h]hEven releasing the tty structures is a tricky business. We have to be very careful that the structures are all released at the same time, as interrupts might otherwise get the wrong pointers.}(hj\?hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhje>ubh)}(h}WSH 09/09/97: rewritten to avoid some nasty race conditions that could lead to double frees or releasing memory still in use.h]h}WSH 09/09/97: rewritten to avoid some nasty race conditions that could lead to double frees or releasing memory still in use.}(hjk?hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhje>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|!tty_open_current_tty (C function)c.tty_open_current_ttyhNtauh1johj&hhhNhNubj)}(hhh](j)}(hJstruct tty_struct * tty_open_current_tty (dev_t device, struct file *filp)h]j)}(hHstruct tty_struct *tty_open_current_tty(dev_t device, struct file *filp)h](j)}(hjh]hstruct}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMTubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhj?hMTubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj?modnameN classnameNjj)}j"]j%)}jtty_open_current_ttysbc.tty_open_current_ttyasbuh1hhj?hhhj?hMTubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhj?hMTubj9)}(hj<h]h*}(hj?hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj?hhhj?hMTubj)}(htty_open_current_ttyh]j)}(hj?h]htty_open_current_tty}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj?hhhj?hMTubj)}(h!(dev_t device, struct file *filp)h](j)}(h dev_t deviceh](h)}(hhh]j)}(hdev_th]hdev_t}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj@modnameN classnameNjj)}j"]j?c.tty_open_current_ttyasbuh1hhj@ubj)}(h h]h }(hj5@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hdeviceh]hdevice}(hjC@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj @ubj)}(hstruct file *filph](j)}(hjh]hstruct}(hj\@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX@ubj)}(h h]h }(hji@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX@ubh)}(hhh]j)}(hfileh]hfile}(hjz@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw@ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj|@modnameN classnameNjj)}j"]j?c.tty_open_current_ttyasbuh1hhjX@ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX@ubj9)}(hj<h]h*}(hj@hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjX@ubj)}(hfilph]hfilp}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX@ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj @ubeh}(h]h ]h"]h$]h&]hhuh1jhj?hhhj?hMTubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj?hhhj?hMTubah}(h]j?ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj?hMThj?hhubjy)}(hhh]h)}(hget locked tty of current taskh]hget locked tty of current task}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMJhj@hhubah}(h]h ]h"]h$]h&]uh1jxhj?hhhj?hMTubeh}(h]h ](jfunctioneh"]h$]h&]jjjj@jj@jjjuh1jhhhj&hNhNubj)}(hXw**Parameters** ``dev_t device`` device number ``struct file *filp`` file pointer to tty **Return** locked tty of the current task iff **device** is /dev/tty **Description** Performs a re-open of the current task's controlling tty. We cannot return driver and index like for the other nodes because devpts will not work then. It expects inodes to be from devpts FS.h](h)}(h**Parameters**h]j)}(hj@h]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMNhj@ubj)}(hhh](j)}(h``dev_t device`` device number h](j)}(h``dev_t device``h]j)}(hjAh]h dev_t device}(hj AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMKhjAubj)}(hhh]h)}(h device numberh]h device number}(hj7AhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3AhMKhj4Aubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jhj3AhMKhjAubj)}(h*``struct file *filp`` file pointer to tty h](j)}(h``struct file *filp``h]j)}(hjWAh]hstruct file *filp}(hjYAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUAubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMLhjQAubj)}(hhh]h)}(hfile pointer to ttyh]hfile pointer to tty}(hjpAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlAhMLhjmAubah}(h]h ]h"]h$]h&]uh1jhjQAubeh}(h]h ]h"]h$]h&]uh1jhjlAhMLhjAubeh}(h]h ]h"]h$]h&]uh1jhj@ubh)}(h **Return**h]j)}(hjAh]hReturn}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMNhj@ubh)}(h9locked tty of the current task iff **device** is /dev/ttyh](h#locked tty of the current task iff }(hjAhhhNhNubj)}(h **device**h]hdevice}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh is /dev/tty}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMMhj@ubh)}(h**Description**h]j)}(hjAh]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMOhj@ubh)}(h9Performs a re-open of the current task's controlling tty.h]h;Performs a re-open of the current task’s controlling tty.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMOhj@ubh)}(hWe cannot return driver and index like for the other nodes because devpts will not work then. It expects inodes to be from devpts FS.h]hWe cannot return driver and index like for the other nodes because devpts will not work then. It expects inodes to be from devpts FS.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMQhj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_lookup_driver (C function)c.tty_lookup_driverhNtauh1johj&hhhNhNubj)}(hhh](j)}(hSstruct tty_driver * tty_lookup_driver (dev_t device, struct file *filp, int *index)h]j)}(hQstruct tty_driver *tty_lookup_driver(dev_t device, struct file *filp, int *index)h](j)}(hjh]hstruct}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMzubj)}(h h]h }(hj-BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBhhhj,BhMzubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj>BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;Bubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj@BmodnameN classnameNjj)}j"]j%)}jtty_lookup_driversbc.tty_lookup_driverasbuh1hhjBhhhj,BhMzubj)}(h h]h }(hj_BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBhhhj,BhMzubj9)}(hj<h]h*}(hjmBhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjBhhhj,BhMzubj)}(htty_lookup_driverh]j)}(hj\Bh]htty_lookup_driver}(hj~BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzBubah}(h]h ](jjeh"]h$]h&]hhuh1jhjBhhhj,BhMzubj)}(h-(dev_t device, struct file *filp, int *index)h](j)}(h dev_t deviceh](h)}(hhh]j)}(hdev_th]hdev_t}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjBmodnameN classnameNjj)}j"]jZBc.tty_lookup_driverasbuh1hhjBubj)}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(hdeviceh]hdevice}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjBubj)}(hstruct file *filph](j)}(hjh]hstruct}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj)}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubh)}(hhh]j)}(hfileh]hfile}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjCmodnameN classnameNjj)}j"]jZBc.tty_lookup_driverasbuh1hhjBubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj9)}(hj<h]h*}(hj+ChhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjBubj)}(hfilph]hfilp}(hj8ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjBubj)}(h int *indexh](j)}(hinth]hint}(hjQChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMCubj)}(h h]h }(hj_ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMCubj9)}(hj<h]h*}(hjmChhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjMCubj)}(hindexh]hindex}(hjzChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMCubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjBubeh}(h]h ]h"]h$]h&]hhuh1jhjBhhhj,BhMzubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjBhhhj,BhMzubah}(h]jBah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj,BhMzhjBhhubjy)}(hhh]h)}(h+lookup a tty driver for a given device fileh]h+lookup a tty driver for a given device file}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMnhjChhubah}(h]h ]h"]h$]h&]uh1jxhjBhhhj,BhMzubeh}(h]h ](jfunctioneh"]h$]h&]jjjjCjjCjjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``dev_t device`` device number ``struct file *filp`` file pointer to tty ``int *index`` index for the device in the **return** driver **Description** If returned value is not erroneous, the caller is responsible to decrement the refcount by tty_driver_kref_put(). Locking: ``tty_mutex`` protects get_tty_driver() **Return** driver for this inode (with increased refcount)h](h)}(h**Parameters**h]j)}(hjCh]h Parameters}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMrhjCubj)}(hhh](j)}(h``dev_t device`` device number h](j)}(h``dev_t device``h]j)}(hjCh]h dev_t device}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMohjCubj)}(hhh]h)}(h device numberh]h device number}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMohjCubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhjChMohjCubj)}(h*``struct file *filp`` file pointer to tty h](j)}(h``struct file *filp``h]j)}(hjDh]hstruct file *filp}(hj DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMphjDubj)}(hhh]h)}(hfile pointer to ttyh]hfile pointer to tty}(hj7DhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3DhMphj4Dubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhj3DhMphjCubj)}(h=``int *index`` index for the device in the **return** driver h](j)}(h``int *index``h]j)}(hjWDh]h int *index}(hjYDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUDubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMqhjQDubj)}(hhh]h)}(h-index for the device in the **return** driverh](hindex for the device in the }(hjpDhhhNhNubj)}(h **return**h]hreturn}(hjxDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpDubh driver}(hjpDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjlDhMqhjmDubah}(h]h ]h"]h$]h&]uh1jhjQDubeh}(h]h ]h"]h$]h&]uh1jhjlDhMqhjCubeh}(h]h ]h"]h$]h&]uh1jhjCubh)}(h**Description**h]j)}(hjDh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMshjCubh)}(hqIf returned value is not erroneous, the caller is responsible to decrement the refcount by tty_driver_kref_put().h]hqIf returned value is not erroneous, the caller is responsible to decrement the refcount by tty_driver_kref_put().}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMshjCubh)}(h0Locking: ``tty_mutex`` protects get_tty_driver()h](h Locking: }(hjDhhhNhNubj)}(h ``tty_mutex``h]h tty_mutex}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh protects get_tty_driver()}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMvhjCubh)}(h **Return**h]j)}(hjDh]hReturn}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMxhjCubh)}(h/driver for this inode (with increased refcount)h]h/driver for this inode (with increased refcount)}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMxhjCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_open_by_driver (C function)c.tty_open_by_driverhNtauh1johj&hhhNhNubj)}(hhh](j)}(hHstruct tty_struct * tty_open_by_driver (dev_t device, struct file *filp)h]j)}(hFstruct tty_struct *tty_open_by_driver(dev_t device, struct file *filp)h](j)}(hjh]hstruct}(hj1EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-Ehhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hj?EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-Ehhhj>EhMubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjPEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMEubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjREmodnameN classnameNjj)}j"]j%)}jtty_open_by_driversbc.tty_open_by_driverasbuh1hhj-Ehhhj>EhMubj)}(h h]h }(hjqEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-Ehhhj>EhMubj9)}(hj<h]h*}(hjEhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj-Ehhhj>EhMubj)}(htty_open_by_driverh]j)}(hjnEh]htty_open_by_driver}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ](jjeh"]h$]h&]hhuh1jhj-Ehhhj>EhMubj)}(h!(dev_t device, struct file *filp)h](j)}(h dev_t deviceh](h)}(hhh]j)}(hdev_th]hdev_t}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjEmodnameN classnameNjj)}j"]jlEc.tty_open_by_driverasbuh1hhjEubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hdeviceh]hdevice}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjEubj)}(hstruct file *filph](j)}(hjh]hstruct}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubh)}(hhh]j)}(hfileh]hfile}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjFmodnameN classnameNjj)}j"]jlEc.tty_open_by_driverasbuh1hhjEubj)}(h h]h }(hj/FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj9)}(hj<h]h*}(hj=FhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjEubj)}(hfilph]hfilp}(hjJFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjEubeh}(h]h ]h"]h$]h&]hhuh1jhj-Ehhhj>EhMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj)Ehhhj>EhMubah}(h]j$Eah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj>EhMhj&Ehhubjy)}(hhh]h)}(hopen a tty deviceh]hopen a tty device}(hjtFhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjqFhhubah}(h]h ]h"]h$]h&]uh1jxhj&Ehhhj>EhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjFjjFjjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``dev_t device`` dev_t of device to open ``struct file *filp`` file pointer to tty **Description** Performs the driver lookup, checks for a reopen, or otherwise performs the first-time tty initialization. Claims the global tty_mutex to serialize: * concurrent first-time tty initialization * concurrent tty driver removal w/ lookup * concurrent tty removal from driver table **Return** the locked initialized or re-opened :c:type:`tty_struct`h](h)}(h**Parameters**h]j)}(hjFh]h Parameters}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjFubj)}(hhh](j)}(h)``dev_t device`` dev_t of device to open h](j)}(h``dev_t device``h]j)}(hjFh]h dev_t device}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjFubj)}(hhh]h)}(hdev_t of device to openh]hdev_t of device to open}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhMhjFubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhjFhMhjFubj)}(h*``struct file *filp`` file pointer to tty h](j)}(h``struct file *filp``h]j)}(hjFh]hstruct file *filp}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjFubj)}(hhh]h)}(hfile pointer to ttyh]hfile pointer to tty}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhMhjGubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhjGhMhjFubeh}(h]h ]h"]h$]h&]uh1jhjFubh)}(h**Description**h]j)}(hj)Gh]h Description}(hj+GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'Gubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjFubh)}(hiPerforms the driver lookup, checks for a reopen, or otherwise performs the first-time tty initialization.h]hiPerforms the driver lookup, checks for a reopen, or otherwise performs the first-time tty initialization.}(hj?GhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjFubj)}(hhh]j)}(hClaims the global tty_mutex to serialize: * concurrent first-time tty initialization * concurrent tty driver removal w/ lookup * concurrent tty removal from driver table h](j)}(h)Claims the global tty_mutex to serialize:h]h)Claims the global tty_mutex to serialize:}(hjUGhhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjQGubj)}(hhh]h)}(hhh](h)}(h(concurrent first-time tty initializationh]h)}(hjlGh]h(concurrent first-time tty initialization}(hjnGhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjjGubah}(h]h ]h"]h$]h&]uh1hhjgGubh)}(h'concurrent tty driver removal w/ lookuph]h)}(hjGh]h'concurrent tty driver removal w/ lookup}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjGubah}(h]h ]h"]h$]h&]uh1hhjgGubh)}(h)concurrent tty removal from driver table h]h)}(h(concurrent tty removal from driver tableh]h(concurrent tty removal from driver table}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjcGhMhjGubah}(h]h ]h"]h$]h&]uh1hhjgGubeh}(h]h ]h"]h$]h&]jfj<uh1hhj{GhMhjdGubah}(h]h ]h"]h$]h&]uh1jhjQGubeh}(h]h ]h"]h$]h&]uh1jhjcGhMhjNGubah}(h]h ]h"]h$]h&]uh1jhjFubh)}(h **Return**h]j)}(hjGh]hReturn}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjFubh)}(h8the locked initialized or re-opened :c:type:`tty_struct`h](h$the locked initialized or re-opened }(hjGhhhNhNubh)}(h:c:type:`tty_struct`h]j)}(hjGh]h tty_struct}(hjGhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjj tty_structuh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjGubeh}(h]h ]h"]h$]h&]uh1hhj HhMhjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_open (C function) c.tty_openhNtauh1johj&hhhNhNubj)}(hhh](j)}(h5int tty_open (struct inode *inode, struct file *filp)h]j)}(h4int tty_open(struct inode *inode, struct file *filp)h](j)}(hinth]hint}(hj0HhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,Hhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMAubj)}(h h]h }(hj?HhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,Hhhhj>HhMAubj)}(htty_openh]j)}(htty_openh]htty_open}(hjQHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMHubah}(h]h ](jjeh"]h$]h&]hhuh1jhj,Hhhhj>HhMAubj)}(h((struct inode *inode, struct file *filp)h](j)}(hstruct inode *inodeh](j)}(hjh]hstruct}(hjmHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiHubj)}(h h]h }(hjzHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiHubh)}(hhh]j)}(hinodeh]hinode}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjHmodnameN classnameNjj)}j"]j%)}jjSHsb c.tty_openasbuh1hhjiHubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiHubj9)}(hj<h]h*}(hjHhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjiHubj)}(hinodeh]hinode}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiHubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjeHubj)}(hstruct file *filph](j)}(hjh]hstruct}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubh)}(hhh]j)}(hfileh]hfile}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjHmodnameN classnameNjj)}j"]jH c.tty_openasbuh1hhjHubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj9)}(hj<h]h*}(hj)IhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjHubj)}(hfilph]hfilp}(hj6IhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjeHubeh}(h]h ]h"]h$]h&]hhuh1jhj,Hhhhj>HhMAubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj(Hhhhj>HhMAubah}(h]j#Hah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj>HhMAhj%Hhhubjy)}(hhh]h)}(hopen a tty deviceh]hopen a tty device}(hj`IhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM+hj]Ihhubah}(h]h ]h"]h$]h&]uh1jxhj%Hhhhj>HhMAubeh}(h]h ](jfunctioneh"]h$]h&]jjjjxIjjxIjjjuh1jhhhj&hNhNubj)}(hXV**Parameters** ``struct inode *inode`` inode of device file ``struct file *filp`` file pointer to tty **Description** tty_open() and tty_release() keep up the tty count that contains the number of opens done on a tty. We cannot use the inode-count, as different inodes might point to the same tty. Open-counting is needed for pty masters, as well as for keeping track of serial lines: DTR is dropped when the last close happens. (This is not done solely through tty->count, now. - Ted 1/27/92) The termios state of a pty is reset on the first open so that settings don't persist across reuse. Locking: * ``tty_mutex`` protects tty, tty_lookup_driver() and tty_init_dev(). * **tty->count** should protect the rest. * ->siglock protects ->signal/->sighand **Note** the tty_unlock/lock cases without a ref are only safe due to ``tty_mutex``h](h)}(h**Parameters**h]j)}(hjIh]h Parameters}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM/hj|Iubj)}(hhh](j)}(h-``struct inode *inode`` inode of device file h](j)}(h``struct inode *inode``h]j)}(hjIh]hstruct inode *inode}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM,hjIubj)}(hhh]h)}(hinode of device fileh]hinode of device file}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhM,hjIubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhjIhM,hjIubj)}(h*``struct file *filp`` file pointer to tty h](j)}(h``struct file *filp``h]j)}(hjIh]hstruct file *filp}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM-hjIubj)}(hhh]h)}(hfile pointer to ttyh]hfile pointer to tty}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhM-hjIubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhjIhM-hjIubeh}(h]h ]h"]h$]h&]uh1jhj|Iubh)}(h**Description**h]j)}(hjJh]h Description}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM/hj|Iubh)}(htty_open() and tty_release() keep up the tty count that contains the number of opens done on a tty. We cannot use the inode-count, as different inodes might point to the same tty.h]htty_open() and tty_release() keep up the tty count that contains the number of opens done on a tty. We cannot use the inode-count, as different inodes might point to the same tty.}(hj+JhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM/hj|Iubh)}(hOpen-counting is needed for pty masters, as well as for keeping track of serial lines: DTR is dropped when the last close happens. (This is not done solely through tty->count, now. - Ted 1/27/92)h]hOpen-counting is needed for pty masters, as well as for keeping track of serial lines: DTR is dropped when the last close happens. (This is not done solely through tty->count, now. - Ted 1/27/92)}(hj:JhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM3hj|Iubh)}(hbThe termios state of a pty is reset on the first open so that settings don't persist across reuse.h]hdThe termios state of a pty is reset on the first open so that settings don’t persist across reuse.}(hjIJhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM7hj|Iubj)}(hhh]j)}(hLocking: * ``tty_mutex`` protects tty, tty_lookup_driver() and tty_init_dev(). * **tty->count** should protect the rest. * ->siglock protects ->signal/->sighand h](j)}(hLocking:h]hLocking:}(hj_JhhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM=hj[Jubj)}(hhh]h)}(hhh](h)}(hC``tty_mutex`` protects tty, tty_lookup_driver() and tty_init_dev().h]h)}(hjvJh](j)}(h ``tty_mutex``h]h tty_mutex}(hj{JhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxJubh6 protects tty, tty_lookup_driver() and tty_init_dev().}(hjxJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM;hjtJubah}(h]h ]h"]h$]h&]uh1hhjqJubh)}(h'**tty->count** should protect the rest.h]h)}(hjJh](j)}(h**tty->count**h]h tty->count}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh should protect the rest.}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM<hjJubah}(h]h ]h"]h$]h&]uh1hhjqJubh)}(h&->siglock protects ->signal/->sighand h]h)}(h%->siglock protects ->signal/->sighandh]h%->siglock protects ->signal/->sighand}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmJhM=hjJubah}(h]h ]h"]h$]h&]uh1hhjqJubeh}(h]h ]h"]h$]h&]jfj<uh1hhjJhM;hjnJubah}(h]h ]h"]h$]h&]uh1jhj[Jubeh}(h]h ]h"]h$]h&]uh1jhjmJhM=hjXJubah}(h]h ]h"]h$]h&]uh1jhj|Iubh)}(h**Note**h]j)}(hjJh]hNote}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM?hj|Iubh)}(hJthe tty_unlock/lock cases without a ref are only safe due to ``tty_mutex``h](h=the tty_unlock/lock cases without a ref are only safe due to }(hjKhhhNhNubj)}(h ``tty_mutex``h]h tty_mutex}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM?hj|Iubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_poll (C function) c.tty_pollhNtauh1johj&hhhNhNubj)}(hhh](j)}(h7__poll_t tty_poll (struct file *filp, poll_table *wait)h]j)}(h6__poll_t tty_poll(struct file *filp, poll_table *wait)h](h)}(hhh]j)}(h__poll_th]h__poll_t}(hjHKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEKubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjJKmodnameN classnameNjj)}j"]j%)}jtty_pollsb c.tty_pollasbuh1hhjAKhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAKhhhjiKhMubj)}(htty_pollh]j)}(hjfKh]htty_poll}(hj|KhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxKubah}(h]h ](jjeh"]h$]h&]hhuh1jhjAKhhhjiKhMubj)}(h%(struct file *filp, poll_table *wait)h](j)}(hstruct file *filph](j)}(hjh]hstruct}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubh)}(hhh]j)}(hfileh]hfile}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjKmodnameN classnameNjj)}j"]jdK c.tty_pollasbuh1hhjKubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj9)}(hj<h]h*}(hjKhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjKubj)}(hfilph]hfilp}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjKubj)}(hpoll_table *waith](h)}(hhh]j)}(h poll_tableh]h poll_table}(hj LhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj LmodnameN classnameNjj)}j"]jdK c.tty_pollasbuh1hhjLubj)}(h h]h }(hj(LhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj9)}(hj<h]h*}(hj6LhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjLubj)}(hwaith]hwait}(hjCLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjKubeh}(h]h ]h"]h$]h&]hhuh1jhjAKhhhjiKhMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj=KhhhjiKhMubah}(h]j8Kah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjiKhMhj:Khhubjy)}(hhh]h)}(hcheck tty statush]hcheck tty status}(hjmLhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjjLhhubah}(h]h ]h"]h$]h&]uh1jxhj:KhhhjiKhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjLjjLjjjuh1jhhhj&hNhNubj)}(hX;**Parameters** ``struct file *filp`` file being polled ``poll_table *wait`` poll wait structures to update **Description** Call the line discipline polling method to obtain the poll status of the device. Locking: locks called line discipline but ldisc poll method may be re-entered freely by other callers.h](h)}(h**Parameters**h]j)}(hjLh]h Parameters}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjLubj)}(hhh](j)}(h(``struct file *filp`` file being polled h](j)}(h``struct file *filp``h]j)}(hjLh]hstruct file *filp}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjLubj)}(hhh]h)}(hfile being polledh]hfile being polled}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMhjLubah}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]uh1jhjLhMhjLubj)}(h4``poll_table *wait`` poll wait structures to update h](j)}(h``poll_table *wait``h]j)}(hjLh]hpoll_table *wait}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjLubj)}(hhh]h)}(hpoll wait structures to updateh]hpoll wait structures to update}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMhjLubah}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]uh1jhjLhMhjLubeh}(h]h ]h"]h$]h&]uh1jhjLubh)}(h**Description**h]j)}(hj"Mh]h Description}(hj$MhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Mubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjLubh)}(hPCall the line discipline polling method to obtain the poll status of the device.h]hPCall the line discipline polling method to obtain the poll status of the device.}(hj8MhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjLubh)}(hfLocking: locks called line discipline but ldisc poll method may be re-entered freely by other callers.h]hfLocking: locks called line discipline but ldisc poll method may be re-entered freely by other callers.}(hjGMhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjLubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tiocsti (C function) c.tiocstihNtauh1johj&hhhNhNubj)}(hhh](j)}(h2int tiocsti (struct tty_struct *tty, u8 __user *p)h]j)}(h1int tiocsti(struct tty_struct *tty, u8 __user *p)h](j)}(hinth]hint}(hjvMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrMhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrMhhhjMhMubj)}(htiocstih]j)}(htiocstih]htiocsti}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ](jjeh"]h$]h&]hhuh1jhjrMhhhjMhMubj)}(h&(struct tty_struct *tty, u8 __user *p)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjMmodnameN classnameNjj)}j"]j%)}jjMsb c.tiocstiasbuh1hhjMubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj9)}(hj<h]h*}(hjMhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjMubj)}(httyh]htty}(hj NhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjMubj)}(h u8 __user *ph](h)}(hhh]j)}(hu8h]hu8}(hj(NhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%Nubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj*NmodnameN classnameNjj)}j"]jM c.tiocstiasbuh1hhj!Nubj)}(h h]h }(hjFNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!Nubh__user}(hj!NhhhNhNubj)}(h h]h }(hjXNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!Nubj9)}(hj<h]h*}(hjfNhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj!Nubj)}(hjEh]hp}(hjsNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!Nubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjMubeh}(h]h ]h"]h$]h&]hhuh1jhjrMhhhjMhMubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjnMhhhjMhMubah}(h]jiMah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjMhMhjkMhhubjy)}(hhh]h)}(hfake input characterh]hfake input character}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjNhhubah}(h]h ]h"]h$]h&]uh1jxhjkMhhhjMhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjNjjNjjjuh1jhhhj&hNhNubj)}(hXZ**Parameters** ``struct tty_struct *tty`` tty to fake input into ``u8 __user *p`` pointer to character **Description** Fake input to a tty device. Does the necessary locking and input management. FIXME: does not honour flow control ?? Locking: * Called functions take tty_ldiscs_lock * current->signal->tty check is safe without locksh](h)}(h**Parameters**h]j)}(hjNh]h Parameters}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjNubj)}(hhh](j)}(h2``struct tty_struct *tty`` tty to fake input into h](j)}(h``struct tty_struct *tty``h]j)}(hjNh]hstruct tty_struct *tty}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjNubj)}(hhh]h)}(htty to fake input intoh]htty to fake input into}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhMhjNubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhjNhMhjNubj)}(h&``u8 __user *p`` pointer to character h](j)}(h``u8 __user *p``h]j)}(hjOh]h u8 __user *p}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjOubj)}(hhh]h)}(hpointer to characterh]hpointer to character}(hj/OhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+OhMhj,Oubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jhj+OhMhjNubeh}(h]h ]h"]h$]h&]uh1jhjNubh)}(h**Description**h]j)}(hjQOh]h Description}(hjSOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOOubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjNubh)}(hLFake input to a tty device. Does the necessary locking and input management.h]hLFake input to a tty device. Does the necessary locking and input management.}(hjgOhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjNubh)}(h&FIXME: does not honour flow control ??h]h&FIXME: does not honour flow control ??}(hjvOhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjNubj)}(hhh]j)}(hcLocking: * Called functions take tty_ldiscs_lock * current->signal->tty check is safe without locksh](j)}(hLocking:h]hLocking:}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjOubj)}(hhh]h)}(hhh](h)}(h%Called functions take tty_ldiscs_lockh]h)}(hjOh]h%Called functions take tty_ldiscs_lock}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjOubah}(h]h ]h"]h$]h&]uh1hhjOubh)}(h0current->signal->tty check is safe without locksh]h)}(hjOh]h0current->signal->tty check is safe without locks}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMhjOubah}(h]h ]h"]h$]h&]uh1hhjOubeh}(h]h ]h"]h$]h&]jfj<uh1hhjOhMhjOubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jhjOhMhjOubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tiocgwinsz (C function) c.tiocgwinszhNtauh1johj&hhhNhNubj)}(hhh](j)}(hCint tiocgwinsz (struct tty_struct *tty, struct winsize __user *arg)h]j)}(hBint tiocgwinsz(struct tty_struct *tty, struct winsize __user *arg)h](j)}(hinth]hint}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM ubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPhhhjPhM ubj)}(h tiocgwinszh]j)}(h tiocgwinszh]h tiocgwinsz}(hj)PhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%Pubah}(h]h ](jjeh"]h$]h&]hhuh1jhjPhhhjPhM ubj)}(h4(struct tty_struct *tty, struct winsize __user *arg)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjEPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAPubj)}(h h]h }(hjRPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAPubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjcPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`Pubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjePmodnameN classnameNjj)}j"]j%)}jj+Psb c.tiocgwinszasbuh1hhjAPubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAPubj9)}(hj<h]h*}(hjPhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjAPubj)}(httyh]htty}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAPubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj=Pubj)}(hstruct winsize __user *argh](j)}(hjh]hstruct}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubh)}(hhh]j)}(hwinsizeh]hwinsize}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjPmodnameN classnameNjj)}j"]jP c.tiocgwinszasbuh1hhjPubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubh__user}(hjPhhhNhNubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj9)}(hj<h]h*}(hjQhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjPubj)}(hargh]harg}(hj QhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj=Pubeh}(h]h ]h"]h$]h&]hhuh1jhjPhhhjPhM ubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjPhhhjPhM ubah}(h]jOah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjPhM hjOhhubjy)}(hhh]h)}(himplement window query ioctlh]himplement window query ioctl}(hjJQhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjGQhhubah}(h]h ]h"]h$]h&]uh1jxhjOhhhjPhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjbQjjbQjjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``struct tty_struct *tty`` tty ``struct winsize __user *arg`` user buffer for result **Description** Copies the kernel idea of the window size into the user buffer. Locking: **tty->winsize_mutex** is taken to ensure the winsize data is consistent.h](h)}(h**Parameters**h]j)}(hjlQh]h Parameters}(hjnQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjQubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjfQubj)}(hhh](j)}(h``struct tty_struct *tty`` tty h](j)}(h``struct tty_struct *tty``h]j)}(hjQh]hstruct tty_struct *tty}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjQubj)}(hhh]h)}(httyh]htty}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhM hjQubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjQhM hjQubj)}(h6``struct winsize __user *arg`` user buffer for result h](j)}(h``struct winsize __user *arg``h]j)}(hjQh]hstruct winsize __user *arg}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjQubj)}(hhh]h)}(huser buffer for resulth]huser buffer for result}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhM hjQubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjQhM hjQubeh}(h]h ]h"]h$]h&]uh1jhjfQubh)}(h**Description**h]j)}(hjQh]h Description}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjfQubh)}(h?Copies the kernel idea of the window size into the user buffer.h]h?Copies the kernel idea of the window size into the user buffer.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjfQubh)}(hRLocking: **tty->winsize_mutex** is taken to ensure the winsize data is consistent.h](h Locking: }(hj$RhhhNhNubj)}(h**tty->winsize_mutex**h]htty->winsize_mutex}(hj,RhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$Rubh3 is taken to ensure the winsize data is consistent.}(hj$RhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjfQubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tiocswinsz (C function) c.tiocswinszhNtauh1johj&hhhNhNubj)}(hhh](j)}(hCint tiocswinsz (struct tty_struct *tty, struct winsize __user *arg)h]j)}(hBint tiocswinsz(struct tty_struct *tty, struct winsize __user *arg)h](j)}(hinth]hint}(hjeRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaRhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMB ubj)}(h h]h }(hjtRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaRhhhjsRhMB ubj)}(h tiocswinszh]j)}(h tiocswinszh]h tiocswinsz}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ](jjeh"]h$]h&]hhuh1jhjaRhhhjsRhMB ubj)}(h4(struct tty_struct *tty, struct winsize __user *arg)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubj)}(h h]h }(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjRmodnameN classnameNjj)}j"]j%)}jjRsb c.tiocswinszasbuh1hhjRubj)}(h h]h }(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubj9)}(hj<h]h*}(hjRhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjRubj)}(httyh]htty}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjRubj)}(hstruct winsize __user *argh](j)}(hjh]hstruct}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj)}(h h]h }(hj!ShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubh)}(hhh]j)}(hwinsizeh]hwinsize}(hj2ShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/Subah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj4SmodnameN classnameNjj)}j"]jR c.tiocswinszasbuh1hhjSubj)}(h h]h }(hjPShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubh__user}(hjShhhNhNubj)}(h h]h }(hjbShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj9)}(hj<h]h*}(hjpShhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjSubj)}(hargh]harg}(hj}ShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjRubeh}(h]h ]h"]h$]h&]hhuh1jhjaRhhhjsRhMB ubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj]RhhhjsRhMB ubah}(h]jXRah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjsRhMB hjZRhhubjy)}(hhh]h)}(himplement window size set ioctlh]himplement window size set ioctl}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM5 hjShhubah}(h]h ]h"]h$]h&]uh1jxhjZRhhhjsRhMB ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjSjjSjjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``struct tty_struct *tty`` tty side of tty ``struct winsize __user *arg`` user buffer for result **Description** Copies the user idea of the window size to the kernel. Traditionally this is just advisory information but for the Linux console it actually has driver level meaning and triggers a VC resize. Locking: Driver dependent. The default do_resize method takes the tty termios mutex and ctrl.lock. The console takes its own lock then calls into the default method.h](h)}(h**Parameters**h]j)}(hjSh]h Parameters}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM9 hjSubj)}(hhh](j)}(h+``struct tty_struct *tty`` tty side of tty h](j)}(h``struct tty_struct *tty``h]j)}(hjSh]hstruct tty_struct *tty}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM6 hjSubj)}(hhh]h)}(htty side of ttyh]htty side of tty}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShM6 hjSubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhjShM6 hjSubj)}(h6``struct winsize __user *arg`` user buffer for result h](j)}(h``struct winsize __user *arg``h]j)}(hj!Th]hstruct winsize __user *arg}(hj#ThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM7 hjTubj)}(hhh]h)}(huser buffer for resulth]huser buffer for result}(hj:ThhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6ThM7 hj7Tubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhj6ThM7 hjSubeh}(h]h ]h"]h$]h&]uh1jhjSubh)}(h**Description**h]j)}(hj\Th]h Description}(hj^ThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZTubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM9 hjSubh)}(hCopies the user idea of the window size to the kernel. Traditionally this is just advisory information but for the Linux console it actually has driver level meaning and triggers a VC resize.h]hCopies the user idea of the window size to the kernel. Traditionally this is just advisory information but for the Linux console it actually has driver level meaning and triggers a VC resize.}(hjrThhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM9 hjSubj)}(hhh]j)}(hLocking: Driver dependent. The default do_resize method takes the tty termios mutex and ctrl.lock. The console takes its own lock then calls into the default method.h](j)}(hLocking:h]hLocking:}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM? hjTubj)}(hhh]h)}(hDriver dependent. The default do_resize method takes the tty termios mutex and ctrl.lock. The console takes its own lock then calls into the default method.h]hDriver dependent. The default do_resize method takes the tty termios mutex and ctrl.lock. The console takes its own lock then calls into the default method.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM> hjTubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhjThM? hjTubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tioccons (C function) c.tiocconshNtauh1johj&hhhNhNubj)}(hhh](j)}(h int tioccons (struct file *file)h]j)}(hint tioccons(struct file *file)h](j)}(hinth]hint}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjThhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMW ubj)}(h h]h }(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjThhhjThMW ubj)}(htiocconsh]j)}(htiocconsh]htioccons}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ](jjeh"]h$]h&]hhuh1jhjThhhjThMW ubj)}(h(struct file *file)h]j)}(hstruct file *fileh](j)}(hjh]hstruct}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(h h]h }(hj%UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubh)}(hhh]j)}(hfileh]hfile}(hj6UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3Uubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj8UmodnameN classnameNjj)}j"]j%)}jjTsb c.tiocconsasbuh1hhjUubj)}(h h]h }(hjVUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj9)}(hj<h]h*}(hjdUhhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjUubj)}(hfileh]hfile}(hjqUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjUubah}(h]h ]h"]h$]h&]hhuh1jhjThhhjThMW ubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjThhhjThMW ubah}(h]jTah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjThMW hjThhubjy)}(hhh]h)}(h#allow admin to move logical consoleh]h#allow admin to move logical console}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMP hjUhhubah}(h]h ]h"]h$]h&]uh1jxhjThhhjThMW ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjUjjUjjjuh1jhhhj&hNhNubj)}(h**Parameters** ``struct file *file`` the file to become console **Description** Allow the administrator to move the redirected console device. Locking: uses redirect_lock to guard the redirect informationh](h)}(h**Parameters**h]j)}(hjUh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMT hjUubj)}(hhh]j)}(h1``struct file *file`` the file to become console h](j)}(h``struct file *file``h]j)}(hjUh]hstruct file *file}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMQ hjUubj)}(hhh]h)}(hthe file to become consoleh]hthe file to become console}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhMQ hjUubah}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]uh1jhjUhMQ hjUubah}(h]h ]h"]h$]h&]uh1jhjUubh)}(h**Description**h]j)}(hjVh]h Description}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMS hjUubh)}(h>Allow the administrator to move the redirected console device.h]h>Allow the administrator to move the redirected console device.}(hj-VhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chMS hjUubh)}(h=Locking: uses redirect_lock to guard the redirect informationh]h=Locking: uses redirect_lock to guard the redirect information}(hjint send_break (struct tty_struct *tty, unsigned int duration)h]j)}(h=int send_break(struct tty_struct *tty, unsigned int duration)h](j)}(hinth]hint}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM ubj)}(h h]h }(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhjZhM ubj)}(h send_breakh]j)}(h send_breakh]h send_break}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ](jjeh"]h$]h&]hhuh1jhjZhhhjZhM ubj)}(h/(struct tty_struct *tty, unsigned int duration)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(h h]h }(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj [ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj[modnameN classnameNjj)}j"]j%)}jjZsb c.send_breakasbuh1hhjZubj)}(h h]h }(hj0[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj9)}(hj<h]h*}(hj>[hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjZubj)}(httyh]htty}(hjK[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjZubj)}(hunsigned int durationh](j)}(hunsignedh]hunsigned}(hjd[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`[ubj)}(h h]h }(hjr[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`[ubj)}(hinth]hint}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`[ubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`[ubj)}(hdurationh]hduration}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`[ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjZubeh}(h]h ]h"]h$]h&]hhuh1jhjZhhhjZhM ubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhjZhhhjZhM ubah}(h]jZah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjZhM hjZhhubjy)}(hhh]h)}(hperformed time breakh]hperformed time break}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj[hhubah}(h]h ]h"]h$]h&]uh1jxhjZhhhjZhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj[jj[jjjuh1jhhhj&hNhNubj)}(hX**Parameters** ``struct tty_struct *tty`` device to break on ``unsigned int duration`` timeout in mS **Description** Perform a timed break on hardware that lacks its own driver level timed break functionality. Locking: **tty->atomic_write_lock** serializesh](h)}(h**Parameters**h]j)}(hj[h]h Parameters}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj[ubj)}(hhh](j)}(h.``struct tty_struct *tty`` device to break on h](j)}(h``struct tty_struct *tty``h]j)}(hj\h]hstruct tty_struct *tty}(hj \hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj\ubj)}(hhh]h)}(hdevice to break onh]hdevice to break on}(hj \hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hM hj\ubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jhj\hM hj[ubj)}(h(``unsigned int duration`` timeout in mS h](j)}(h``unsigned int duration``h]j)}(hj@\h]hunsigned int duration}(hjB\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>\ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj:\ubj)}(hhh]h)}(h timeout in mSh]h timeout in mS}(hjY\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU\hM hjV\ubah}(h]h ]h"]h$]h&]uh1jhj:\ubeh}(h]h ]h"]h$]h&]uh1jhjU\hM hj[ubeh}(h]h ]h"]h$]h&]uh1jhj[ubh)}(h**Description**h]j)}(hj{\h]h Description}(hj}\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjy\ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj[ubh)}(h\Perform a timed break on hardware that lacks its own driver level timed break functionality.h]h\Perform a timed break on hardware that lacks its own driver level timed break functionality.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj[ubj)}(hhh]j)}(h.Locking: **tty->atomic_write_lock** serializesh](j)}(hLocking:h]hLocking:}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj\ubj)}(hhh]h)}(h%**tty->atomic_write_lock** serializesh](j)}(h**tty->atomic_write_lock**h]htty->atomic_write_lock}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh serializes}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj\ubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jhj\hM hj\ubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_tiocmget (C function)c.tty_tiocmgethNtauh1johj&hhhNhNubj)}(hhh](j)}(h8int tty_tiocmget (struct tty_struct *tty, int __user *p)h]j)}(h7int tty_tiocmget(struct tty_struct *tty, int __user *p)h](j)}(hinth]hint}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM ubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]hhhj]hM ubj)}(h tty_tiocmgeth]j)}(h tty_tiocmgeth]h tty_tiocmget}(hj)]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%]ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj]hhhj]hM ubj)}(h'(struct tty_struct *tty, int __user *p)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjE]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA]ubj)}(h h]h }(hjR]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA]ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hjc]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`]ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetje]modnameN classnameNjj)}j"]j%)}jj+]sbc.tty_tiocmgetasbuh1hhjA]ubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA]ubj9)}(hj<h]h*}(hj]hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjA]ubj)}(httyh]htty}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA]ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj=]ubj)}(h int __user *ph](j)}(hinth]hint}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubh__user}(hj]hhhNhNubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj9)}(hj<h]h*}(hj]hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj]ubj)}(hjEh]hp}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj=]ubeh}(h]h ]h"]h$]h&]hhuh1jhj]hhhj]hM ubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj]hhhj]hM ubah}(h]j\ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhj]hM hj\hhubjy)}(hhh]h)}(hget modem statush]hget modem status}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj^hhubah}(h]h ]h"]h$]h&]uh1jxhj\hhhj]hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj3^jj3^jjjuh1jhhhj&hNhNubj)}(hX **Parameters** ``struct tty_struct *tty`` tty device ``int __user *p`` pointer to result **Description** Obtain the modem status bits from the tty driver if the feature is supported. Return -``ENOTTY`` if it is not available. Locking: none (up to the driver)h](h)}(h**Parameters**h]j)}(hj=^h]h Parameters}(hj?^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;^ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj7^ubj)}(hhh](j)}(h&``struct tty_struct *tty`` tty device h](j)}(h``struct tty_struct *tty``h]j)}(hj\^h]hstruct tty_struct *tty}(hj^^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ^ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjV^ubj)}(hhh]h)}(h tty deviceh]h tty device}(hju^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjq^hM hjr^ubah}(h]h ]h"]h$]h&]uh1jhjV^ubeh}(h]h ]h"]h$]h&]uh1jhjq^hM hjS^ubj)}(h$``int __user *p`` pointer to result h](j)}(h``int __user *p``h]j)}(hj^h]h int __user *p}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj^ubj)}(hhh]h)}(hpointer to resulth]hpointer to result}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM hj^ubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhj^hM hjS^ubeh}(h]h ]h"]h$]h&]uh1jhj7^ubh)}(h**Description**h]j)}(hj^h]h Description}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj7^ubh)}(hxObtain the modem status bits from the tty driver if the feature is supported. Return -``ENOTTY`` if it is not available.h](hVObtain the modem status bits from the tty driver if the feature is supported. Return -}(hj^hhhNhNubj)}(h ``ENOTTY``h]hENOTTY}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubh if it is not available.}(hj^hhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj7^ubh)}(h Locking: none (up to the driver)h]h Locking: none (up to the driver)}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj7^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|tty_tiocmset (C function)c.tty_tiocmsethNtauh1johj&hhhNhNubj)}(hhh](j)}(hOint tty_tiocmset (struct tty_struct *tty, unsigned int cmd, unsigned __user *p)h]j)}(hNint tty_tiocmset(struct tty_struct *tty, unsigned int cmd, unsigned __user *p)h](j)}(hinth]hint}(hj6_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2_hhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM ubj)}(h h]h }(hjE_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2_hhhjD_hM ubj)}(h tty_tiocmseth]j)}(h tty_tiocmseth]h tty_tiocmset}(hjW_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjS_ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj2_hhhjD_hM ubj)}(h>(struct tty_struct *tty, unsigned int cmd, unsigned __user *p)h](j)}(hstruct tty_struct *ttyh](j)}(hjh]hstruct}(hjs_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjo_ubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjo_ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj_modnameN classnameNjj)}j"]j%)}jjY_sbc.tty_tiocmsetasbuh1hhjo_ubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjo_ubj9)}(hj<h]h*}(hj_hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hjo_ubj)}(httyh]htty}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjo_ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjk_ubj)}(hunsigned int cmdh](j)}(hunsignedh]hunsigned}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hinth]hint}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hcmdh]hcmd}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjk_ubj)}(hunsigned __user *ph](j)}(hunsignedh]hunsigned}(hj6`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2`ubj)}(h h]h }(hjD`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2`ubh__user}(hj2`hhhNhNubj)}(h h]h }(hjV`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2`ubj9)}(hj<h]h*}(hjd`hhhNhNubah}(h]h ]jEah"]h$]h&]uh1j8hj2`ubj)}(hjEh]hp}(hjq`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2`ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjk_ubeh}(h]h ]h"]h$]h&]hhuh1jhj2_hhhjD_hM ubeh}(h]h ]h"]h$]h&]hhjjuh1jjkjlhj._hhhjD_hM ubah}(h]j)_ah ](jpjqeh"]h$]h&]jujv)jwhuh1jhjD_hM hj+_hhubjy)}(hhh]h)}(hset modem statush]hset modem status}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj`hhubah}(h]h ]h"]h$]h&]uh1jxhj+_hhhjD_hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj`jj`jjjuh1jhhhj&hNhNubj)}(hXU**Parameters** ``struct tty_struct *tty`` tty device ``unsigned int cmd`` command - clear bits, set bits or set all ``unsigned __user *p`` pointer to desired bits **Description** Set the modem status bits from the tty driver if the feature is supported. Return -``ENOTTY`` if it is not available. Locking: none (up to the driver)h](h)}(h**Parameters**h]j)}(hj`h]h Parameters}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj`ubj)}(hhh](j)}(h&``struct tty_struct *tty`` tty device h](j)}(h``struct tty_struct *tty``h]j)}(hj`h]hstruct tty_struct *tty}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj`ubj)}(hhh]h)}(h tty deviceh]h tty device}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hM hj`ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhj`hM hj`ubj)}(h?``unsigned int cmd`` command - clear bits, set bits or set all h](j)}(h``unsigned int cmd``h]j)}(hjah]hunsigned int cmd}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjaubj)}(hhh]h)}(h)command - clear bits, set bits or set allh]h)command - clear bits, set bits or set all}(hj-ahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)ahM hj*aubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhj)ahM hj`ubj)}(h/``unsigned __user *p`` pointer to desired bits h](j)}(h``unsigned __user *p``h]j)}(hjMah]hunsigned __user *p}(hjOahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKaubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjGaubj)}(hhh]h)}(hpointer to desired bitsh]hpointer to desired bits}(hjfahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbahM hjcaubah}(h]h ]h"]h$]h&]uh1jhjGaubeh}(h]h ]h"]h$]h&]uh1jhjbahM hj`ubeh}(h]h ]h"]h$]h&]uh1jhj`ubh)}(h**Description**h]j)}(hjah]h Description}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj`ubh)}(huSet the modem status bits from the tty driver if the feature is supported. Return -``ENOTTY`` if it is not available.h](hSSet the modem status bits from the tty driver if the feature is supported. Return -}(hjahhhNhNubj)}(h ``ENOTTY``h]hENOTTY}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh if it is not available.}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj`ubh)}(h Locking: none (up to the driver)h]h Locking: none (up to the driver)}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hj`ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubjp)}(hhh]h}(h]h ]h"]h$]h&]entries](j|alloc_tty_struct (C function)c.alloc_tty_structhNtauh1johj&hhhNhNubj)}(hhh](j)}(hIstruct tty_struct * alloc_tty_struct (struct tty_driver *driver, int idx)h]j)}(hGstruct tty_struct *alloc_tty_struct(struct tty_driver *driver, int idx)h](j)}(hjh]hstruct}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM' ubj)}(h h]h }(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhjahM' ubh)}(hhh]j)}(h tty_structh]h tty_struct}(hj bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj bubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjbmodnameN classnameNjj)}j"]j%)}jalloc_tty_structsbc.alloc_tty_structasbuh1hhjahhhjahM' ubj)}(h h]h }(hj.bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhjahM' ubj9)}(hj<h]h*}(hjcubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM# hj:cubj)}(hhh](j)}(hH``struct tty_driver *driver`` driver which will handle the returned tty h](j)}(h``struct tty_driver *driver``h]j)}(hj_ch]hstruct tty_driver *driver}(hjachhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]cubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM hjYcubj)}(hhh]h)}(h)driver which will handle the returned ttyh]h)driver which will handle the returned tty}(hjxchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjtchM hjucubah}(h]h ]h"]h$]h&]uh1jhjYcubeh}(h]h ]h"]h$]h&]uh1jhjtchM hjVcubj)}(h``int idx`` minor of the tty h](j)}(h ``int idx``h]j)}(hjch]hint idx}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM! hjcubj)}(hhh]h)}(hminor of the ttyh]hminor of the tty}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchM! hjcubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhjchM! hjVcubeh}(h]h ]h"]h$]h&]uh1jhj:cubh)}(h**Description**h]j)}(hjch]h Description}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM# hj:cubh)}(h:This subroutine allocates and initializes a tty structure.h]h:This subroutine allocates and initializes a tty structure.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM# hj:cubh)}(h@Locking: none - **tty** in question is not exposed at this pointh](hLocking: none - }(hjchhhNhNubj)}(h**tty**h]htty}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubh) in question is not exposed at this point}(hjchhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_internals:30: ./drivers/tty/tty_io.chM% hj:cubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj&hhhNhNubeh}(h]j2ah ]h"]internal functionsah$]h&]uh1hhhhhhhhKubeh}(h] tty-internalsah ]h"] tty internalsah$]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_handlerjRderror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _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}refids}nameids}(j,dj)djLjGjshjjj$dj2u nametypes}(j,djLjsjj$duh}(j)dhjGhhjOj~jjijnjjjjjjj j j j j2j&jCjHjjjTjYjrjwj.j3j2j7jZj_jjjrjwjjj"j"j$j$j&j&j_)jd)jk,jp,j.j.j0j0j2j2ja5jf5j6j6j8j8j:j:j =j=j?j?jBjBj$Ej)Ej#Hj(Hj8Kj=KjiMjnMjOjPjXRj]RjTjTj^VjcVjzXjXjZjZj\j]j)_j._jajahhj jj,j#u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j`dKsRparse_messages]transform_messages] transformerN include_log] decorationNhhub.