sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget-/translations/zh_CN/driver-api/tty/tty_drivermodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/zh_TW/driver-api/tty/tty_drivermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/it_IT/driver-api/tty/tty_drivermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/ja_JP/driver-api/tty/tty_drivermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/ko_KR/driver-api/tty/tty_drivermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/pt_BR/driver-api/tty/tty_drivermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/sp_SP/driver-api/tty/tty_drivermodnameN 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:spacepreserveuh1hhhhhhG/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver.rsthKubhsection)}(hhh](htitle)}(hTTY Driver and TTY Operationsh]hTTY Driver and TTY Operations}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhtopic)}(hhh]h bullet_list)}(hhh](h list_item)}(hhh](h paragraph)}(hhh]h reference)}(hhh]h Allocation}(hhhhhNhNubah}(h]id1ah ]h"]h$]h&]refid allocationuh1hhhubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]h)}(hhh]hTTY Driver Flags}(hjhhhNhNubah}(h]id2ah ]h"]h$]h&]refidtty-driver-flagsuh1hhjubah}(h]h ]h"]h$]h&]uh1hhj ubah}(h]h ]h"]h$]h&]uh1hhj ubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh](h)}(hhh]h)}(hhh]h Registration}(hj@hhhNhNubah}(h]id3ah ]h"]h$]h&]refid registrationuh1hhj=ubah}(h]h ]h"]h$]h&]uh1hhj:ubh)}(hhh](h)}(hhh]h)}(hhh]h)}(hhh]hRegistering Devices}(hj_hhhNhNubah}(h]id4ah ]h"]h$]h&]refidregistering-devicesuh1hhj\ubah}(h]h ]h"]h$]h&]uh1hhjYubah}(h]h ]h"]h$]h&]uh1hhjVubh)}(hhh]h)}(hhh]h)}(hhh]hLinking Devices to Ports}(hjhhhNhNubah}(h]id5ah ]h"]h$]h&]refidlinking-devices-to-portsuh1hhj~ubah}(h]h ]h"]h$]h&]uh1hhj{ubah}(h]h ]h"]h$]h&]uh1hhjVubeh}(h]h ]h"]h$]h&]uh1hhj:ubeh}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hTTY Driver Reference}(hjhhhNhNubah}(h]id6ah ]h"]h$]h&]refidtty-driver-referenceuh1hhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hTTY Operations Reference}(hjhhhNhNubah}(h]id7ah ]h"]h$]h&]refidtty-operations-referenceuh1hhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhNhNubah}(h]contentsah ](contentslocaleh"]contentsah$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h Allocationh]h Allocation}(hjhhhNhNubah}(h]h ]h"]h$]h&]refidhuh1hhjhhhhhK ubh)}(hX#The first thing a driver needs to do is to allocate a struct tty_driver. This is done by tty_alloc_driver() (or __tty_alloc_driver()). Next, the newly allocated structure is filled with information. See `TTY Driver Reference`_ at the end of this document on what actually shall be filled in.h](hThe first thing a driver needs to do is to allocate a struct tty_driver. This is done by tty_alloc_driver() (or __tty_alloc_driver()). Next, the newly allocated structure is filled with information. See }(hjhhhNhNubh)}(h`TTY Driver Reference`_h]hTTY Driver Reference}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameTTY Driver Referencejjuh1hhjresolvedKubhA at the end of this document on what actually shall be filled in.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hjhhubh)}(hThe allocation routines expect a number of devices the driver can handle at most and flags. Flags are those starting ``TTY_DRIVER_`` listed and described in `TTY Driver Flags`_ below.h](huThe allocation routines expect a number of devices the driver can handle at most and flags. Flags are those starting }(hj2hhhNhNubhliteral)}(h``TTY_DRIVER_``h]h TTY_DRIVER_}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj2ubh listed and described in }(hj2hhhNhNubh)}(h`TTY Driver Flags`_h]hTTY Driver Flags}(hjNhhhNhNubah}(h]h ]h"]h$]h&]nameTTY Driver Flagsjj!uh1hhj2j'Kubh below.}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hWhen the driver is about to be freed, tty_driver_kref_put() is called on that. It will decrements the reference count and if it reaches zero, the driver is freed.h]hWhen the driver is about to be freed, tty_driver_kref_put() is called on that. It will decrements the reference count and if it reaches zero, the driver is freed.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hWFor reference, both allocation and deallocation functions are explained here in detail:h]hWFor reference, both allocation and deallocation functions are explained here in detail:}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singletty_alloc_driver (C macro)c.tty_alloc_driverhNtauh1jhjhhhNhNubhdesc)}(hhh](hdesc_signature)}(htty_alloc_driverh]hdesc_signature_line)}(htty_alloc_driverh]h desc_name)}(htty_alloc_driverh]h desc_sig_name)}(hjh]htty_alloc_driver}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:28: ./include/linux/tty_driver.hhM?ubah}(h]h ]h"]h$]h&]hhƌ add_permalinkuh1jsphinx_line_type declaratorhjhhhjhM?ubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhM?hjhhubh desc_content)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhM?ubeh}(h]h ](cmacroeh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1jhhhjhNhNubh)}(h#``tty_alloc_driver (lines, flags)``h]j;)}(hjh]htty_alloc_driver (lines, flags)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:28: ./include/linux/tty_driver.hhMAhjhhubh block_quote)}(hallocate tty driver h]h)}(hallocate tty driverh]hallocate tty driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:28: ./include/linux/tty_driver.hhM?hj ubah}(h]h ]h"]h$]h&]uh1j hjhM?hjhhubh container)}(h**Parameters** ``lines`` count of lines this driver can handle at most ``flags`` some of enum tty_driver_flag, will be set in driver->flags **Return** struct tty_driver or a PTR-encoded error (use IS_ERR() and friends).h](h)}(h**Parameters**h]hstrong)}(hj-h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj+ubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:28: ./include/linux/tty_driver.hhMChj'ubhdefinition_list)}(hhh](hdefinition_list_item)}(h8``lines`` count of lines this driver can handle at most h](hterm)}(h ``lines``h]j;)}(hjTh]hlines}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjRubah}(h]h ]h"]h$]h&]uh1jPhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:28: ./include/linux/tty_driver.hhM@hjLubh definition)}(hhh]h)}(h-count of lines this driver can handle at mosth]h-count of lines this driver can handle at most}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihM@hjlubah}(h]h ]h"]h$]h&]uh1jjhjLubeh}(h]h ]h"]h$]h&]uh1jJhjihM@hjGubjK)}(hE``flags`` some of enum tty_driver_flag, will be set in driver->flags h](jQ)}(h ``flags``h]j;)}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjubah}(h]h ]h"]h$]h&]uh1jPhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:28: ./include/linux/tty_driver.hhMAhjubjk)}(hhh]h)}(h:some of enum tty_driver_flag, will be set in driver->flagsh]h:some of enum tty_driver_flag, will be set in driver->flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMAhjubah}(h]h ]h"]h$]h&]uh1jjhjubeh}(h]h ]h"]h$]h&]uh1jJhjhMAhjGubeh}(h]h ]h"]h$]h&]uh1jEhj'ubh)}(h **Return**h]j0)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:28: ./include/linux/tty_driver.hhMChj'ubh)}(hDstruct tty_driver or a PTR-encoded error (use IS_ERR() and friends).h]hDstruct tty_driver or a PTR-encoded error (use IS_ERR() and friends).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:28: ./include/linux/tty_driver.hhMChj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1j%hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j__tty_alloc_driver (C function)c.__tty_alloc_driverhNtauh1jhjhhhNhNubj)}(hhh](j)}(hfstruct tty_driver * __tty_alloc_driver (unsigned int lines, struct module *owner, unsigned long flags)h]j)}(hdstruct tty_driver *__tty_alloc_driver(unsigned int lines, struct module *owner, unsigned long flags)h](hdesc_sig_keyword)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhj hhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chM ubhdesc_sig_space)}(h h]h }(hj#hhhNhNubah}(h]h ]wah"]h$]h&]uh1j!hj hhhj hM ubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjreftype identifier reftargetj7modnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]jP ASTIdentifier)}jK__tty_alloc_driversbc.__tty_alloc_driverasbuh1hhj hhhj hM ubj")}(h h]h }(hj^hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj hhhj hM ubhdesc_sig_punctuation)}(h*h]h*}(hjnhhhNhNubah}(h]h ]pah"]h$]h&]uh1jlhj hhhj hM ubj)}(h__tty_alloc_driverh]j)}(hj[h]h__tty_alloc_driver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj hhhj hM ubhdesc_parameterlist)}(h?(unsigned int lines, struct module *owner, unsigned long flags)h](hdesc_parameter)}(hunsigned int linesh](hdesc_sig_keyword_type)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hlinesh]hlines}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hstruct module *ownerh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubh)}(hhh]j)}(hmoduleh]hmodule}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypejK reftargetjmodnameN classnameNjOjR)}jU]jYc.__tty_alloc_driverasbuh1hhjubj")}(h h]h }(hj0hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubjm)}(hjph]h*}(hj>hhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjubj)}(hownerh]howner}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hunsigned long flagsh](j)}(hunsignedh]hunsigned}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj")}(h h]h }(hjrhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj`ubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj`ubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubeh}(h]h ]h"]h$]h&]hhuh1jhj hhhj hM ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhj hM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hM hjhhubj)}(hhh]h)}(hallocate tty driverh]hallocate tty driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj&)}(hX**Parameters** ``unsigned int lines`` count of lines this driver can handle at most ``struct module *owner`` module which is responsible for this driver ``unsigned long flags`` some of enum tty_driver_flag, will be set in driver->flags **Description** This should not be called directly, tty_alloc_driver() should be used instead. **Return** struct tty_driver or a PTR-encoded error (use IS_ERR() and friends).h](h)}(h**Parameters**h]j0)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chM hjubjF)}(hhh](jK)}(hE``unsigned int lines`` count of lines this driver can handle at most h](jQ)}(h``unsigned int lines``h]j;)}(hjh]hunsigned int lines}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjubah}(h]h ]h"]h$]h&]uh1jPh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chM hjubjk)}(hhh]h)}(h-count of lines this driver can handle at mosth]h-count of lines this driver can handle at most}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jjhjubeh}(h]h ]h"]h$]h&]uh1jJhjhM hjubjK)}(hE``struct module *owner`` module which is responsible for this driver h](jQ)}(h``struct module *owner``h]j;)}(hj@h]hstruct module *owner}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj>ubah}(h]h ]h"]h$]h&]uh1jPh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chM hj:ubjk)}(hhh]h)}(h+module which is responsible for this driverh]h+module which is responsible for this driver}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhM hjVubah}(h]h ]h"]h$]h&]uh1jjhj:ubeh}(h]h ]h"]h$]h&]uh1jJhjUhM hjubjK)}(hS``unsigned long flags`` some of enum tty_driver_flag, will be set in driver->flags h](jQ)}(h``unsigned long flags``h]j;)}(hjyh]hunsigned long flags}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjwubah}(h]h ]h"]h$]h&]uh1jPh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chM hjsubjk)}(hhh]h)}(h:some of enum tty_driver_flag, will be set in driver->flagsh]h:some of enum tty_driver_flag, will be set in driver->flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jjhjsubeh}(h]h ]h"]h$]h&]uh1jJhjhM hjubeh}(h]h ]h"]h$]h&]uh1jEhjubh)}(h**Description**h]j0)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chM hjubh)}(hNThis should not be called directly, tty_alloc_driver() should be used instead.h]hNThis should not be called directly, tty_alloc_driver() should be used instead.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chM hjubh)}(h **Return**h]j0)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chM hjubh)}(hDstruct tty_driver or a PTR-encoded error (use IS_ERR() and friends).h]hDstruct tty_driver or a PTR-encoded error (use IS_ERR() and friends).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j%hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j tty_driver_kref_put (C function)c.tty_driver_kref_puthNtauh1jhjhhhNhNubj)}(hhh](j)}(h4void tty_driver_kref_put (struct tty_driver *driver)h]j)}(h3void tty_driver_kref_put(struct tty_driver *driver)h](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chMP ubj")}(h h]h }(hj/hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjhhhj.hMP ubj)}(htty_driver_kref_puth]j)}(htty_driver_kref_puth]htty_driver_kref_put}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhj.hMP ubj)}(h(struct tty_driver *driver)h]j)}(hstruct tty_driver *driverh](j)}(hjh]hstruct}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj")}(h h]h }(hjjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjYubh)}(hhh]j)}(h tty_driverh]h tty_driver}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&] refdomainjreftypejK reftargetj}modnameN classnameNjOjR)}jU]jX)}jKjCsbc.tty_driver_kref_putasbuh1hhjYubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjYubjm)}(hjph]h*}(hjhhhNhNubah}(h]h ]jyah"]h$]h&]uh1jlhjYubj)}(hdriverh]hdriver}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjUubah}(h]h ]h"]h$]h&]hhuh1jhjhhhj.hMP ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhj.hMP ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj.hMP hjhhubj)}(hhh]h)}(h drop a reference to a tty driverh]h drop a reference to a tty driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chMP hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj.hMP ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj&)}(h**Parameters** ``struct tty_driver *driver`` driver of which to drop the reference **Description** The final put will destroy and free up the driver.h](h)}(h**Parameters**h]j0)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chMT hjubjF)}(hhh]jK)}(hD``struct tty_driver *driver`` driver of which to drop the reference h](jQ)}(h``struct tty_driver *driver``h]j;)}(hj!h]hstruct tty_driver *driver}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjubah}(h]h ]h"]h$]h&]uh1jPh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chMQ hjubjk)}(hhh]h)}(h%driver of which to drop the referenceh]h%driver of which to drop the reference}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMQ hj7ubah}(h]h ]h"]h$]h&]uh1jjhjubeh}(h]h ]h"]h$]h&]uh1jJhj6hMQ hjubah}(h]h ]h"]h$]h&]uh1jEhjubh)}(h**Description**h]j0)}(hj\h]h Description}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjZubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chMS hjubh)}(h2The final put will destroy and free up the driver.h]h2The final put will destroy and free up the driver.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:30: ./drivers/tty/tty_io.chMR hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j%hjhhhNhNubh)}(hhh](h)}(hTTY Driver Flagsh]hTTY Driver Flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]jjuh1hhjhhhhhK"ubh)}(h_Here comes the documentation of flags accepted by tty_alloc_driver() (or __tty_alloc_driver()):h]h_Here comes the documentation of flags accepted by tty_alloc_driver() (or __tty_alloc_driver()):}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_driver_flag (C enum)c.tty_driver_flaghNtauh1jhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhNubj)}(hhh](j)}(htty_driver_flagh]j)}(henum tty_driver_flagh](j)}(henumh]henum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhKubj")}(h h]h }(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjhhhjhKubj)}(htty_driver_flagh]j)}(hjh]htty_driver_flag}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(hhh]h)}(hTTY Driver Flagsh]h)}(hj h]hTTY Driver Flags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhKhj ubah}(h]h ]h"]h$]h&]uh1hhj hhhj hNubah}(h]h ]h"]h$]h&]bullet-uh1hhj hKhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jenumeh"]h$]h&]jjjj0 jj0 jjjuh1jhhhjhjhNubj&)}(hX&**Constants** ``TTY_DRIVER_INSTALLED`` Whether this driver was succesfully installed. This is a tty internal flag. Do not touch. ``TTY_DRIVER_RESET_TERMIOS`` Requests the tty layer to reset the termios setting when the last process has closed the device. Used for PTYs, in particular. ``TTY_DRIVER_REAL_RAW`` Indicates that the driver will guarantee not to set any special character handling flags if this is set for the tty: ``TTY_DRIVER_DYNAMIC_DEV`` The individual tty devices need to be registered with a call to tty_register_device() when the device is found in the system and unregistered with a call to tty_unregister_device() so the devices will be show up properly in sysfs. If not set, all :c:type:`tty_driver.num ` entries will be created by the tty core in sysfs when tty_register_driver() is called. This is to be used by drivers that have tty devices that can appear and disappear while the main tty driver is registered with the tty core. ``TTY_DRIVER_DEVPTS_MEM`` Don't use the standard arrays (:c:type:`tty_driver.ttys ` and :c:type:`tty_driver.termios `), instead use dynamic memory keyed through the devpts filesystem. This is only applicable to the PTY driver. ``TTY_DRIVER_HARDWARE_BREAK`` Hardware handles break signals. Pass the requested timeout to the :c:type:`tty_operations.break_ctl ` instead of using a simple on/off interface. ``TTY_DRIVER_DYNAMIC_ALLOC`` Do not allocate structures which are needed per line for this driver (:c:type:`tty_driver.ports `) as it would waste memory. The driver will take care. This is only applicable to the PTY driver. ``TTY_DRIVER_UNNUMBERED_NODE`` Do not create numbered ``/dev`` nodes. For example, create ``/dev/ttyprintk`` and not ``/dev/ttyprintk0``. Applicable only when a driver for a single tty device is being allocated. ``TTY_DRIVER_NO_WORKQUEUE`` Do not create workqueue when tty_register_driver(). Whenever set, flip buffer workqueue can be set by tty_port_link_wq() for every port.h](h)}(h **Constants**h]j0)}(hj: h]h Constants}(hj< hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj8 ubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhKhj4 ubjF)}(hhh](jK)}(hs``TTY_DRIVER_INSTALLED`` Whether this driver was succesfully installed. This is a tty internal flag. Do not touch. h](jQ)}(h``TTY_DRIVER_INSTALLED``h]j;)}(hjY h]hTTY_DRIVER_INSTALLED}(hj[ hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjW ubah}(h]h ]h"]h$]h&]uh1jPhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhKhjS ubjk)}(hhh]h)}(hYWhether this driver was succesfully installed. This is a tty internal flag. Do not touch.h]hYWhether this driver was succesfully installed. This is a tty internal flag. Do not touch.}(hjr hhhNhNubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhKhjo ubah}(h]h ]h"]h$]h&]uh1jjhjS ubeh}(h]h ]h"]h$]h&]uh1jJhjn hKhjP ubjK)}(h``TTY_DRIVER_RESET_TERMIOS`` Requests the tty layer to reset the termios setting when the last process has closed the device. Used for PTYs, in particular. h](jQ)}(h``TTY_DRIVER_RESET_TERMIOS``h]j;)}(hj h]hTTY_DRIVER_RESET_TERMIOS}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj ubah}(h]h ]h"]h$]h&]uh1jPhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhK hj ubjk)}(hhh]h)}(h~Requests the tty layer to reset the termios setting when the last process has closed the device. Used for PTYs, in particular.h]h~Requests the tty layer to reset the termios setting when the last process has closed the device. Used for PTYs, in particular.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhKhj ubah}(h]h ]h"]h$]h&]uh1jjhj ubeh}(h]h ]h"]h$]h&]uh1jJhj hK hjP ubjK)}(h``TTY_DRIVER_REAL_RAW`` Indicates that the driver will guarantee not to set any special character handling flags if this is set for the tty: h](jQ)}(h``TTY_DRIVER_REAL_RAW``h]j;)}(hj h]hTTY_DRIVER_REAL_RAW}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj ubah}(h]h ]h"]h$]h&]uh1jPhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhK$hj ubjk)}(hhh]h)}(htIndicates that the driver will guarantee not to set any special character handling flags if this is set for the tty:h]htIndicates that the driver will guarantee not to set any special character handling flags if this is set for the tty:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhK#hj ubah}(h]h ]h"]h$]h&]uh1jjhj ubeh}(h]h ]h"]h$]h&]uh1jJhj hK$hjP ubjK)}(hX``TTY_DRIVER_DYNAMIC_DEV`` The individual tty devices need to be registered with a call to tty_register_device() when the device is found in the system and unregistered with a call to tty_unregister_device() so the devices will be show up properly in sysfs. If not set, all :c:type:`tty_driver.num ` entries will be created by the tty core in sysfs when tty_register_driver() is called. This is to be used by drivers that have tty devices that can appear and disappear while the main tty driver is registered with the tty core. h](jQ)}(h``TTY_DRIVER_DYNAMIC_DEV``h]j;)}(hj h]hTTY_DRIVER_DYNAMIC_DEV}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj ubah}(h]h ]h"]h$]h&]uh1jPhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhK.hj ubjk)}(hhh]h)}(hXThe individual tty devices need to be registered with a call to tty_register_device() when the device is found in the system and unregistered with a call to tty_unregister_device() so the devices will be show up properly in sysfs. If not set, all :c:type:`tty_driver.num ` entries will be created by the tty core in sysfs when tty_register_driver() is called. This is to be used by drivers that have tty devices that can appear and disappear while the main tty driver is registered with the tty core.h](hThe individual tty devices need to be registered with a call to tty_register_device() when the device is found in the system and unregistered with a call to tty_unregister_device() so the devices will be show up properly in sysfs. If not set, all }(hj hhhNhNubh)}(h%:c:type:`tty_driver.num `h]j;)}(hj* h]htty_driver.num}(hj, hhhNhNubah}(h]h ](xrefjc-typeeh"]h$]h&]uh1j:hj( ubah}(h]h ]h"]h$]h&]refdocdriver-api/tty/tty_driver refdomainjreftypetype refexplicitrefwarnjOjR)}jU]sb reftarget tty_driveruh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhK'hj ubh entries will be created by the tty core in sysfs when tty_register_driver() is called. This is to be used by drivers that have tty devices that can appear and disappear while the main tty driver is registered with the tty core.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjM hK'hj ubah}(h]h ]h"]h$]h&]uh1jjhj ubeh}(h]h ]h"]h$]h&]uh1jJhj hK.hjP ubjK)}(h``TTY_DRIVER_DEVPTS_MEM`` Don't use the standard arrays (:c:type:`tty_driver.ttys ` and :c:type:`tty_driver.termios `), instead use dynamic memory keyed through the devpts filesystem. This is only applicable to the PTY driver. h](jQ)}(h``TTY_DRIVER_DEVPTS_MEM``h]j;)}(hjj h]hTTY_DRIVER_DEVPTS_MEM}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjh ubah}(h]h ]h"]h$]h&]uh1jPhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhK3hjd ubjk)}(hhh]h)}(hDon't use the standard arrays (:c:type:`tty_driver.ttys ` and :c:type:`tty_driver.termios `), instead use dynamic memory keyed through the devpts filesystem. This is only applicable to the PTY driver.h](h!Don’t use the standard arrays (}(hj hhhNhNubh)}(h&:c:type:`tty_driver.ttys `h]j;)}(hj h]htty_driver.ttys}(hj hhhNhNubah}(h]h ](j6 jc-typeeh"]h$]h&]uh1j:hj ubah}(h]h ]h"]h$]h&]refdocjB refdomainjreftypetype refexplicitrefwarnjOjH jK tty_driveruh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhK1hj ubh and }(hj hhhNhNubh)}(h):c:type:`tty_driver.termios `h]j;)}(hj h]htty_driver.termios}(hj hhhNhNubah}(h]h ](j6 jc-typeeh"]h$]h&]uh1j:hj ubah}(h]h ]h"]h$]h&]refdocjB refdomainjreftypetype refexplicitrefwarnjOjH jK tty_driveruh1hhj hK1hj ubhm), instead use dynamic memory keyed through the devpts filesystem. This is only applicable to the PTY driver.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hK1hj ubah}(h]h ]h"]h$]h&]uh1jjhjd ubeh}(h]h ]h"]h$]h&]uh1jJhj hK3hjP ubjK)}(h``TTY_DRIVER_HARDWARE_BREAK`` Hardware handles break signals. Pass the requested timeout to the :c:type:`tty_operations.break_ctl ` instead of using a simple on/off interface. h](jQ)}(h``TTY_DRIVER_HARDWARE_BREAK``h]j;)}(hj h]hTTY_DRIVER_HARDWARE_BREAK}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj ubah}(h]h ]h"]h$]h&]uh1jPhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhK7hj ubjk)}(hhh]h)}(hHardware handles break signals. Pass the requested timeout to the :c:type:`tty_operations.break_ctl ` instead of using a simple on/off interface.h](hBHardware handles break signals. Pass the requested timeout to the }(hj hhhNhNubh)}(h3:c:type:`tty_operations.break_ctl `h]j;)}(hj h]htty_operations.break_ctl}(hj hhhNhNubah}(h]h ](j6 jc-typeeh"]h$]h&]uh1j:hj ubah}(h]h ]h"]h$]h&]refdocjB refdomainjreftypetype refexplicitrefwarnjOjH jK tty_operationsuh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhK6hj ubh, instead of using a simple on/off interface.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj* hK6hj ubah}(h]h ]h"]h$]h&]uh1jjhj ubeh}(h]h ]h"]h$]h&]uh1jJhj hK7hjP ubjK)}(h``TTY_DRIVER_DYNAMIC_ALLOC`` Do not allocate structures which are needed per line for this driver (:c:type:`tty_driver.ports `) as it would waste memory. The driver will take care. This is only applicable to the PTY driver. h](jQ)}(h``TTY_DRIVER_DYNAMIC_ALLOC``h]j;)}(hjG h]hTTY_DRIVER_DYNAMIC_ALLOC}(hjI hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjE ubah}(h]h ]h"]h$]h&]uh1jPhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhK`) as it would waste memory. The driver will take care. This is only applicable to the PTY driver.h](hFDo not allocate structures which are needed per line for this driver (}(hj` hhhNhNubh)}(h':c:type:`tty_driver.ports `h]j;)}(hjj h]htty_driver.ports}(hjl hhhNhNubah}(h]h ](j6 jc-typeeh"]h$]h&]uh1j:hjh ubah}(h]h ]h"]h$]h&]refdocjB refdomainjreftypetype refexplicitrefwarnjOjH jK tty_driveruh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:39: ./include/linux/tty_driver.hhK:hj` ubha) as it would waste memory. The driver will take care. This is only applicable to the PTY driver.}(hj` hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hK:hj] ubah}(h]h ]h"]h$]h&]uh1jjhjA ubeh}(h]h ]h"]h$]h&]uh1jJhj\ hK`, set by tty_standard_install() ``ports`` array of :c:type:`struct tty_port `; can be set during initialization by tty_port_link_device() and similar ``termios`` storage for termios at each TTY close for the next open ``driver_state`` pointer to driver's arbitrary data ``ops`` driver hooks for TTYs. Set them using tty_set_operations(). Use :c:type:`struct tty_port ` helpers in them as much as possible. ``tty_drivers`` used internally to link tty_drivers togetherh](h)}(h**Definition**::h](j0)}(h**Definition**h]h Definition}(hj\'hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjX'ubh:}(hjX'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhjT'ubh literal_block)}(hXstruct tty_driver { struct kref kref; struct cdev **cdevs; struct module *owner; const char *driver_name; const char *name; int name_base; int major; int minor_start; unsigned int num; enum tty_driver_type type; enum tty_driver_subtype subtype; struct ktermios init_termios; unsigned long flags; struct proc_dir_entry *proc_entry; struct tty_driver *other; struct workqueue_struct *flip_wq; struct tty_struct **ttys; struct tty_port **ports; struct ktermios **termios; void *driver_state; const struct tty_operations *ops; struct list_head tty_drivers; };h]hXstruct tty_driver { struct kref kref; struct cdev **cdevs; struct module *owner; const char *driver_name; const char *name; int name_base; int major; int minor_start; unsigned int num; enum tty_driver_type type; enum tty_driver_subtype subtype; struct ktermios init_termios; unsigned long flags; struct proc_dir_entry *proc_entry; struct tty_driver *other; struct workqueue_struct *flip_wq; struct tty_struct **ttys; struct tty_port **ports; struct ktermios **termios; void *driver_state; const struct tty_operations *ops; struct list_head tty_drivers; };}hjw'sbah}(h]h ]h"]h$]h&]hhuh1ju'he/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhjT'ubh)}(h **Members**h]j0)}(hj'h]hMembers}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj'ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhjT'ubjF)}(hhh](jK)}(hS``kref`` reference counting. Reaching zero frees all the internals and the driver. h](jQ)}(h``kref``h]j;)}(hj'h]hkref}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj'ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj'ubjk)}(hhh]h)}(hIreference counting. Reaching zero frees all the internals and the driver.h]hIreference counting. Reaching zero frees all the internals and the driver.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj'ubah}(h]h ]h"]h$]h&]uh1jjhj'ubeh}(h]h ]h"]h$]h&]uh1jJhj'hMhj'ubjK)}(h6``cdevs`` allocated/registered character /dev devices h](jQ)}(h ``cdevs``h]j;)}(hj'h]hcdevs}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj'ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj'ubjk)}(hhh]h)}(h+allocated/registered character /dev devicesh]h+allocated/registered character /dev devices}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hMhj'ubah}(h]h ]h"]h$]h&]uh1jjhj'ubeh}(h]h ]h"]h$]h&]uh1jJhj'hMhj'ubjK)}(hp``owner`` modules owning this driver. Used drivers cannot be rmmod'ed. Automatically set by tty_alloc_driver(). h](jQ)}(h ``owner``h]j;)}(hj(h]howner}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj(ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj(ubjk)}(hhh]h)}(hemodules owning this driver. Used drivers cannot be rmmod'ed. Automatically set by tty_alloc_driver().h]hgmodules owning this driver. Used drivers cannot be rmmod’ed. Automatically set by tty_alloc_driver().}(hj3(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj0(ubah}(h]h ]h"]h$]h&]uh1jjhj(ubeh}(h]h ]h"]h$]h&]uh1jJhj/(hMhj'ubjK)}(h5``driver_name`` name of the driver used in /proc/tty h](jQ)}(h``driver_name``h]j;)}(hjT(h]h driver_name}(hjV(hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjR(ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhjN(ubjk)}(hhh]h)}(h$name of the driver used in /proc/ttyh]h$name of the driver used in /proc/tty}(hjm(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhji(hMhjj(ubah}(h]h ]h"]h$]h&]uh1jjhjN(ubeh}(h]h ]h"]h$]h&]uh1jJhji(hMhj'ubjK)}(h.``name`` used for constructing /dev node name h](jQ)}(h``name``h]j;)}(hj(h]hname}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj(ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj(ubjk)}(hhh]h)}(h$used for constructing /dev node nameh]h$used for constructing /dev node name}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj(ubah}(h]h ]h"]h$]h&]uh1jjhj(ubeh}(h]h ]h"]h$]h&]uh1jJhj(hMhj'ubjK)}(hD``name_base`` used as a number base for constructing /dev node name h](jQ)}(h ``name_base``h]j;)}(hj(h]h name_base}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj(ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj(ubjk)}(hhh]h)}(h5used as a number base for constructing /dev node nameh]h5used as a number base for constructing /dev node name}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj(ubah}(h]h ]h"]h$]h&]uh1jjhj(ubeh}(h]h ]h"]h$]h&]uh1jJhj(hMhj'ubjK)}(h=``major`` major /dev device number (zero for autoassignment) h](jQ)}(h ``major``h]j;)}(hj(h]hmajor}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj(ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj(ubjk)}(hhh]h)}(h2major /dev device number (zero for autoassignment)h]h2major /dev device number (zero for autoassignment)}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMhj)ubah}(h]h ]h"]h$]h&]uh1jjhj(ubeh}(h]h ]h"]h$]h&]uh1jJhj)hMhj'ubjK)}(h3``minor_start`` the first minor /dev device number h](jQ)}(h``minor_start``h]j;)}(hj8)h]h minor_start}(hj:)hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj6)ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj2)ubjk)}(hhh]h)}(h"the first minor /dev device numberh]h"the first minor /dev device number}(hjQ)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjM)hMhjN)ubah}(h]h ]h"]h$]h&]uh1jjhj2)ubeh}(h]h ]h"]h$]h&]uh1jJhjM)hMhj'ubjK)}(h$``num`` number of devices allocated h](jQ)}(h``num``h]j;)}(hjq)h]hnum}(hjs)hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjo)ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhjk)ubjk)}(hhh]h)}(hnumber of devices allocatedh]hnumber of devices allocated}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMhj)ubah}(h]h ]h"]h$]h&]uh1jjhjk)ubeh}(h]h ]h"]h$]h&]uh1jJhj)hMhj'ubjK)}(h3``type`` type of tty driver (enum tty_driver_type) h](jQ)}(h``type``h]j;)}(hj)h]htype}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj)ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj)ubjk)}(hhh]h)}(h)type of tty driver (enum tty_driver_type)h]h)type of tty driver (enum tty_driver_type)}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMhj)ubah}(h]h ]h"]h$]h&]uh1jjhj)ubeh}(h]h ]h"]h$]h&]uh1jJhj)hMhj'ubjK)}(h<``subtype`` subtype of tty driver (enum tty_driver_subtype) h](jQ)}(h ``subtype``h]j;)}(hj)h]hsubtype}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj)ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj)ubjk)}(hhh]h)}(h/subtype of tty driver (enum tty_driver_subtype)h]h/subtype of tty driver (enum tty_driver_subtype)}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMhj)ubah}(h]h ]h"]h$]h&]uh1jjhj)ubeh}(h]h ]h"]h$]h&]uh1jJhj)hMhj'ubjK)}(hQ``init_termios`` termios to set to each tty initially (e.g. ``tty_std_termios``) h](jQ)}(h``init_termios``h]j;)}(hj*h]h init_termios}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj*ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj*ubjk)}(hhh]h)}(h?termios to set to each tty initially (e.g. ``tty_std_termios``)h](h+termios to set to each tty initially (e.g. }(hj5*hhhNhNubj;)}(h``tty_std_termios``h]htty_std_termios}(hj=*hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj5*ubh)}(hj5*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj1*hMhj2*ubah}(h]h ]h"]h$]h&]uh1jjhj*ubeh}(h]h ]h"]h$]h&]uh1jJhj1*hMhj'ubjK)}(h-``flags`` tty driver flags (``TTY_DRIVER_``) h](jQ)}(h ``flags``h]j;)}(hjg*h]hflags}(hji*hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hje*ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhja*ubjk)}(hhh]h)}(h"tty driver flags (``TTY_DRIVER_``)h](htty driver flags (}(hj*hhhNhNubj;)}(h``TTY_DRIVER_``h]h TTY_DRIVER_}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj*ubh)}(hj*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj|*hMhj}*ubah}(h]h ]h"]h$]h&]uh1jjhja*ubeh}(h]h ]h"]h$]h&]uh1jJhj|*hMhj'ubjK)}(h.``proc_entry`` proc fs entry, used internally h](jQ)}(h``proc_entry``h]j;)}(hj*h]h proc_entry}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj*ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj*ubjk)}(hhh]h)}(hproc fs entry, used internallyh]hproc fs entry, used internally}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jjhj*ubeh}(h]h ]h"]h$]h&]uh1jJhj*hMhj'ubjK)}(hA``other`` driver of the linked tty; only used for the PTY driver h](jQ)}(h ``other``h]j;)}(hj*h]hother}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj*ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj*ubjk)}(hhh]h)}(h6driver of the linked tty; only used for the PTY driverh]h6driver of the linked tty; only used for the PTY driver}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMhj+ubah}(h]h ]h"]h$]h&]uh1jjhj*ubeh}(h]h ]h"]h$]h&]uh1jJhj+hMhj'ubjK)}(h3``flip_wq`` workqueue to queue flip buffer work on h](jQ)}(h ``flip_wq``h]j;)}(hj$+h]hflip_wq}(hj&+hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj"+ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj+ubjk)}(hhh]h)}(h&workqueue to queue flip buffer work onh]h&workqueue to queue flip buffer work on}(hj=+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9+hMhj:+ubah}(h]h ]h"]h$]h&]uh1jjhj+ubeh}(h]h ]h"]h$]h&]uh1jJhj9+hMhj'ubjK)}(ha``ttys`` array of active :c:type:`struct tty_struct `, set by tty_standard_install() h](jQ)}(h``ttys``h]j;)}(hj]+h]httys}(hj_+hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj[+ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhjW+ubjk)}(hhh]h)}(hWarray of active :c:type:`struct tty_struct `, set by tty_standard_install()h](harray of active }(hjv+hhhNhNubh)}(h(:c:type:`struct tty_struct `h]j;)}(hj+h]hstruct tty_struct}(hj+hhhNhNubah}(h]h ](j6 jc-typeeh"]h$]h&]uh1j:hj~+ubah}(h]h ]h"]h$]h&]refdocjB refdomainjreftypetype refexplicitrefwarnjOjH jK tty_structuh1hhjr+hMhjv+ubh, set by tty_standard_install()}(hjv+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjr+hMhjs+ubah}(h]h ]h"]h$]h&]uh1jjhjW+ubeh}(h]h ]h"]h$]h&]uh1jJhjr+hMhj'ubjK)}(h``ports`` array of :c:type:`struct tty_port `; can be set during initialization by tty_port_link_device() and similar h](jQ)}(h ``ports``h]j;)}(hj+h]hports}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj+ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj+ubjk)}(hhh]h)}(huarray of :c:type:`struct tty_port `; can be set during initialization by tty_port_link_device() and similarh](h array of }(hj+hhhNhNubh)}(h$:c:type:`struct tty_port `h]j;)}(hj+h]hstruct tty_port}(hj+hhhNhNubah}(h]h ](j6 jc-typeeh"]h$]h&]uh1j:hj+ubah}(h]h ]h"]h$]h&]refdocjB refdomainjreftypetype refexplicitrefwarnjOjH jK tty_portuh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj+ubhH; can be set during initialization by tty_port_link_device() and similar}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj+hMhj+ubah}(h]h ]h"]h$]h&]uh1jjhj+ubeh}(h]h ]h"]h$]h&]uh1jJhj+hMhj'ubjK)}(hD``termios`` storage for termios at each TTY close for the next open h](jQ)}(h ``termios``h]j;)}(hj,h]htermios}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj,ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj,ubjk)}(hhh]h)}(h7storage for termios at each TTY close for the next openh]h7storage for termios at each TTY close for the next open}(hj/,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+,hMhj,,ubah}(h]h ]h"]h$]h&]uh1jjhj,ubeh}(h]h ]h"]h$]h&]uh1jJhj+,hMhj'ubjK)}(h4``driver_state`` pointer to driver's arbitrary data h](jQ)}(h``driver_state``h]j;)}(hjO,h]h driver_state}(hjQ,hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjM,ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhjI,ubjk)}(hhh]h)}(h"pointer to driver's arbitrary datah]h$pointer to driver’s arbitrary data}(hjh,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjd,hMhje,ubah}(h]h ]h"]h$]h&]uh1jjhjI,ubeh}(h]h ]h"]h$]h&]uh1jJhjd,hMhj'ubjK)}(h``ops`` driver hooks for TTYs. Set them using tty_set_operations(). Use :c:type:`struct tty_port ` helpers in them as much as possible. h](jQ)}(h``ops``h]j;)}(hj,h]hops}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj,ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhM hj,ubjk)}(hhh]h)}(hdriver hooks for TTYs. Set them using tty_set_operations(). Use :c:type:`struct tty_port ` helpers in them as much as possible.h](h@driver hooks for TTYs. Set them using tty_set_operations(). Use }(hj,hhhNhNubh)}(h$:c:type:`struct tty_port `h]j;)}(hj,h]hstruct tty_port}(hj,hhhNhNubah}(h]h ](j6 jc-typeeh"]h$]h&]uh1j:hj,ubah}(h]h ]h"]h$]h&]refdocjB refdomainjreftypetype refexplicitrefwarnjOjH jK tty_portuh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhM hj,ubh% helpers in them as much as possible.}(hj,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hM hj,ubah}(h]h ]h"]h$]h&]uh1jjhj,ubeh}(h]h ]h"]h$]h&]uh1jJhj,hM hj'ubjK)}(h<``tty_drivers`` used internally to link tty_drivers togetherh](jQ)}(h``tty_drivers``h]j;)}(hj,h]h tty_drivers}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj,ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhM hj,ubjk)}(hhh]h)}(h,used internally to link tty_drivers togetherh]h,used internally to link tty_drivers together}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhM hj,ubah}(h]h ]h"]h$]h&]uh1jjhj,ubeh}(h]h ]h"]h$]h&]uh1jJhj,hM hj'ubeh}(h]h ]h"]h$]h&]uh1jEhjT'ubeh}(h]h ] kernelindentah"]h$]h&]uh1j%hj&hhhj&hNubh)}(h**Description**h]j0)}(hj(-h]h Description}(hj*-hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj&-ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj&hhubh)}(hXThe usual handling of :c:type:`struct tty_driver ` is to allocate it by tty_alloc_driver(), set up all the necessary members, and register it by tty_register_driver(). At last, the driver is torn down by calling tty_unregister_driver() followed by tty_driver_kref_put().h](hThe usual handling of }(hj>-hhhNhNubh)}(h(:c:type:`struct tty_driver `h]j;)}(hjH-h]hstruct tty_driver}(hjJ-hhhNhNubah}(h]h ](j6 jc-typeeh"]h$]h&]uh1j:hjF-ubah}(h]h ]h"]h$]h&]refdocjB refdomainjreftypetype refexplicitrefwarnjOjH jK tty_driveruh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhM hj>-ubh is to allocate it by tty_alloc_driver(), set up all the necessary members, and register it by tty_register_driver(). At last, the driver is torn down by calling tty_unregister_driver() followed by tty_driver_kref_put().}(hj>-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhje-hM hj&hhubh)}(hThe fields required to be set before calling tty_register_driver() include **driver_name**, **name**, **type**, **subtype**, **init_termios**, and **ops**.h](hKThe fields required to be set before calling tty_register_driver() include }(hjp-hhhNhNubj0)}(h**driver_name**h]h driver_name}(hjx-hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjp-ubh, }(hjp-hhhNhNubj0)}(h**name**h]hname}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjp-ubh, }hjp-sbj0)}(h**type**h]htype}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjp-ubh, }hjp-sbj0)}(h **subtype**h]hsubtype}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjp-ubh, }hjp-sbj0)}(h**init_termios**h]h init_termios}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjp-ubh, and }(hjp-hhhNhNubj0)}(h**ops**h]hops}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjp-ubh.}(hjp-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:118: ./include/linux/tty_driver.hhMhj&hhubeh}(h]jah ]h"]tty driver referenceah$]h&]uh1hhhhhhhhKqj Kubj )}(h----h]h}(h]h ]h"]h$]h&]uh1j hhhKyhhhhubh)}(hhh](h)}(hTTY Operations Referenceh]hTTY Operations Reference}(hj-hhhNhNubah}(h]h ]h"]h$]h&]jjuh1hhj-hhhhhK|ubh)}(hMWhen a TTY is registered, these driver hooks can be invoked by the TTY layer:h]hMWhen a TTY is registered, these driver hooks can be invoked by the TTY layer:}(hj .hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK~hj-hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jtty_operations (C struct)c.tty_operationshNtauh1jhj-hhhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhNubj)}(hhh](j)}(htty_operationsh]j)}(hstruct tty_operationsh](j)}(hjh]hstruct}(hj5.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1.hhhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKubj")}(h h]h }(hjC.hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj1.hhhjB.hKubj)}(htty_operationsh]j)}(hj/.h]htty_operations}(hjU.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ.ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj1.hhhjB.hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj-.hhhjB.hKubah}(h]j'.ah ](jjeh"]h$]h&]jj)jhuh1jhjB.hKhj*.hhubj)}(hhh]h)}(hhh]h)}(h interface between driver and ttyh]h)}(hj|.h]h interface between driver and tty}(hj~.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKohjz.ubah}(h]h ]h"]h$]h&]uh1hhjw.hhhj.hNubah}(h]h ]h"]h$]h&]j% j& uh1hhj.hKohjt.hhubah}(h]h ]h"]h$]h&]uh1jhj*.hhhjB.hKubeh}(h]h ](jstructeh"]h$]h&]jjjj.jj.jjjuh1jhhhj-hj).hNubj&)}(hXi**Definition**:: struct tty_operations { struct tty_struct * (*lookup)(struct tty_driver *driver, struct file *filp, int idx); int (*install)(struct tty_driver *driver, struct tty_struct *tty); void (*remove)(struct tty_driver *driver, struct tty_struct *tty); int (*open)(struct tty_struct * tty, struct file * filp); void (*close)(struct tty_struct * tty, struct file * filp); void (*shutdown)(struct tty_struct *tty); void (*cleanup)(struct tty_struct *tty); ssize_t (*write)(struct tty_struct *tty, const u8 *buf, size_t count); int (*put_char)(struct tty_struct *tty, u8 ch); void (*flush_chars)(struct tty_struct *tty); unsigned int (*write_room)(struct tty_struct *tty); unsigned int (*chars_in_buffer)(struct tty_struct *tty); int (*ioctl)(struct tty_struct *tty, unsigned int cmd, unsigned long arg); long (*compat_ioctl)(struct tty_struct *tty, unsigned int cmd, unsigned long arg); void (*set_termios)(struct tty_struct *tty, const struct ktermios *old); void (*throttle)(struct tty_struct * tty); void (*unthrottle)(struct tty_struct * tty); void (*stop)(struct tty_struct *tty); void (*start)(struct tty_struct *tty); void (*hangup)(struct tty_struct *tty); int (*break_ctl)(struct tty_struct *tty, int state); void (*flush_buffer)(struct tty_struct *tty); int (*ldisc_ok)(struct tty_struct *tty, int ldisc); void (*set_ldisc)(struct tty_struct *tty); void (*wait_until_sent)(struct tty_struct *tty, int timeout); void (*send_xchar)(struct tty_struct *tty, u8 ch); int (*tiocmget)(struct tty_struct *tty); int (*tiocmset)(struct tty_struct *tty, unsigned int set, unsigned int clear); int (*resize)(struct tty_struct *tty, struct winsize *ws); int (*get_icount)(struct tty_struct *tty, struct serial_icounter_struct *icount); int (*get_serial)(struct tty_struct *tty, struct serial_struct *p); int (*set_serial)(struct tty_struct *tty, struct serial_struct *p); void (*show_fdinfo)(struct tty_struct *tty, struct seq_file *m); #ifdef CONFIG_CONSOLE_POLL; int (*poll_init)(struct tty_driver *driver, int line, char *options); int (*poll_get_char)(struct tty_driver *driver, int line); void (*poll_put_char)(struct tty_driver *driver, int line, char ch); #endif; int (*proc_show)(struct seq_file *m, void *driver); }; **Members** ``lookup`` ``struct tty_struct *()(struct tty_driver *self, struct file *, int idx)`` ``install`` ``int ()(struct tty_driver *self, struct tty_struct *tty)`` ``remove`` ``void ()(struct tty_driver *self, struct tty_struct *tty)`` ``open`` ``int ()(struct tty_struct *tty, struct file *)`` ``close`` ``void ()(struct tty_struct *tty, struct file *)`` ``shutdown`` ``void ()(struct tty_struct *tty)`` ``cleanup`` ``void ()(struct tty_struct *tty)`` ``write`` ``ssize_t ()(struct tty_struct *tty, const u8 *buf, size_t count)`` ``put_char`` ``int ()(struct tty_struct *tty, u8 ch)`` ``flush_chars`` ``void ()(struct tty_struct *tty)`` ``write_room`` ``unsigned int ()(struct tty_struct *tty)`` ``chars_in_buffer`` ``unsigned int ()(struct tty_struct *tty)`` ``ioctl`` ``int ()(struct tty_struct *tty, unsigned int cmd, unsigned long arg)`` ``compat_ioctl`` ``long ()(struct tty_struct *tty, unsigned int cmd, unsigned long arg)`` ``set_termios`` ``void ()(struct tty_struct *tty, const struct ktermios *old)`` ``throttle`` ``void ()(struct tty_struct *tty)`` ``unthrottle`` ``void ()(struct tty_struct *tty)`` ``stop`` ``void ()(struct tty_struct *tty)`` ``start`` ``void ()(struct tty_struct *tty)`` ``hangup`` ``void ()(struct tty_struct *tty)`` ``break_ctl`` ``int ()(struct tty_struct *tty, int state)`` ``flush_buffer`` ``void ()(struct tty_struct *tty)`` ``ldisc_ok`` ``int ()(struct tty_struct *tty, int ldisc)`` ``set_ldisc`` ``void ()(struct tty_struct *tty)`` ``wait_until_sent`` ``void ()(struct tty_struct *tty, int timeout)`` ``send_xchar`` ``void ()(struct tty_struct *tty, u8 ch)`` ``tiocmget`` ``int ()(struct tty_struct *tty)`` ``tiocmset`` ``int ()(struct tty_struct *tty, unsigned int set, unsigned int clear)`` ``resize`` ``int ()(struct tty_struct *tty, struct winsize *ws)`` ``get_icount`` ``int ()(struct tty_struct *tty, struct serial_icounter *icount)`` ``get_serial`` ``int ()(struct tty_struct *tty, struct serial_struct *p)`` ``set_serial`` ``int ()(struct tty_struct *tty, struct serial_struct *p)`` ``show_fdinfo`` ``void ()(struct tty_struct *tty, struct seq_file *m)`` ``poll_init`` ``int ()(struct tty_driver *driver, int line, char *options)`` ``poll_get_char`` ``int ()(struct tty_driver *driver, int line)`` ``poll_put_char`` ``void ()(struct tty_driver *driver, int line, char ch)`` ``proc_show`` ``int ()(struct seq_file *m, void *driver)``h](h)}(h**Definition**::h](j0)}(h**Definition**h]h Definition}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj.ubh:}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKshj.ubjv')}(hX7 struct tty_operations { struct tty_struct * (*lookup)(struct tty_driver *driver, struct file *filp, int idx); int (*install)(struct tty_driver *driver, struct tty_struct *tty); void (*remove)(struct tty_driver *driver, struct tty_struct *tty); int (*open)(struct tty_struct * tty, struct file * filp); void (*close)(struct tty_struct * tty, struct file * filp); void (*shutdown)(struct tty_struct *tty); void (*cleanup)(struct tty_struct *tty); ssize_t (*write)(struct tty_struct *tty, const u8 *buf, size_t count); int (*put_char)(struct tty_struct *tty, u8 ch); void (*flush_chars)(struct tty_struct *tty); unsigned int (*write_room)(struct tty_struct *tty); unsigned int (*chars_in_buffer)(struct tty_struct *tty); int (*ioctl)(struct tty_struct *tty, unsigned int cmd, unsigned long arg); long (*compat_ioctl)(struct tty_struct *tty, unsigned int cmd, unsigned long arg); void (*set_termios)(struct tty_struct *tty, const struct ktermios *old); void (*throttle)(struct tty_struct * tty); void (*unthrottle)(struct tty_struct * tty); void (*stop)(struct tty_struct *tty); void (*start)(struct tty_struct *tty); void (*hangup)(struct tty_struct *tty); int (*break_ctl)(struct tty_struct *tty, int state); void (*flush_buffer)(struct tty_struct *tty); int (*ldisc_ok)(struct tty_struct *tty, int ldisc); void (*set_ldisc)(struct tty_struct *tty); void (*wait_until_sent)(struct tty_struct *tty, int timeout); void (*send_xchar)(struct tty_struct *tty, u8 ch); int (*tiocmget)(struct tty_struct *tty); int (*tiocmset)(struct tty_struct *tty, unsigned int set, unsigned int clear); int (*resize)(struct tty_struct *tty, struct winsize *ws); int (*get_icount)(struct tty_struct *tty, struct serial_icounter_struct *icount); int (*get_serial)(struct tty_struct *tty, struct serial_struct *p); int (*set_serial)(struct tty_struct *tty, struct serial_struct *p); void (*show_fdinfo)(struct tty_struct *tty, struct seq_file *m); #ifdef CONFIG_CONSOLE_POLL; int (*poll_init)(struct tty_driver *driver, int line, char *options); int (*poll_get_char)(struct tty_driver *driver, int line); void (*poll_put_char)(struct tty_driver *driver, int line, char ch); #endif; int (*proc_show)(struct seq_file *m, void *driver); };h]hX7 struct tty_operations { struct tty_struct * (*lookup)(struct tty_driver *driver, struct file *filp, int idx); int (*install)(struct tty_driver *driver, struct tty_struct *tty); void (*remove)(struct tty_driver *driver, struct tty_struct *tty); int (*open)(struct tty_struct * tty, struct file * filp); void (*close)(struct tty_struct * tty, struct file * filp); void (*shutdown)(struct tty_struct *tty); void (*cleanup)(struct tty_struct *tty); ssize_t (*write)(struct tty_struct *tty, const u8 *buf, size_t count); int (*put_char)(struct tty_struct *tty, u8 ch); void (*flush_chars)(struct tty_struct *tty); unsigned int (*write_room)(struct tty_struct *tty); unsigned int (*chars_in_buffer)(struct tty_struct *tty); int (*ioctl)(struct tty_struct *tty, unsigned int cmd, unsigned long arg); long (*compat_ioctl)(struct tty_struct *tty, unsigned int cmd, unsigned long arg); void (*set_termios)(struct tty_struct *tty, const struct ktermios *old); void (*throttle)(struct tty_struct * tty); void (*unthrottle)(struct tty_struct * tty); void (*stop)(struct tty_struct *tty); void (*start)(struct tty_struct *tty); void (*hangup)(struct tty_struct *tty); int (*break_ctl)(struct tty_struct *tty, int state); void (*flush_buffer)(struct tty_struct *tty); int (*ldisc_ok)(struct tty_struct *tty, int ldisc); void (*set_ldisc)(struct tty_struct *tty); void (*wait_until_sent)(struct tty_struct *tty, int timeout); void (*send_xchar)(struct tty_struct *tty, u8 ch); int (*tiocmget)(struct tty_struct *tty); int (*tiocmset)(struct tty_struct *tty, unsigned int set, unsigned int clear); int (*resize)(struct tty_struct *tty, struct winsize *ws); int (*get_icount)(struct tty_struct *tty, struct serial_icounter_struct *icount); int (*get_serial)(struct tty_struct *tty, struct serial_struct *p); int (*set_serial)(struct tty_struct *tty, struct serial_struct *p); void (*show_fdinfo)(struct tty_struct *tty, struct seq_file *m); #ifdef CONFIG_CONSOLE_POLL; int (*poll_init)(struct tty_driver *driver, int line, char *options); int (*poll_get_char)(struct tty_driver *driver, int line); void (*poll_put_char)(struct tty_driver *driver, int line, char ch); #endif; int (*proc_show)(struct seq_file *m, void *driver); };}hj.sbah}(h]h ]h"]h$]h&]hhuh1ju'he/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKuhj.ubh)}(h **Members**h]j0)}(hj.h]hMembers}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj.ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj.ubjF)}(hhh](jK)}(hV``lookup`` ``struct tty_struct *()(struct tty_driver *self, struct file *, int idx)`` h](jQ)}(h ``lookup``h]j;)}(hj.h]hlookup}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj.ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKshj.ubjk)}(hhh]h)}(hJ``struct tty_struct *()(struct tty_driver *self, struct file *, int idx)``h]j;)}(hj/h]hFstruct tty_struct *()(struct tty_driver *self, struct file *, int idx)}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj/ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKrhj /ubah}(h]h ]h"]h$]h&]uh1jjhj.ubeh}(h]h ]h"]h$]h&]uh1jJhj /hKshj.ubjK)}(hH``install`` ``int ()(struct tty_driver *self, struct tty_struct *tty)`` h](jQ)}(h ``install``h]j;)}(hj9/h]hinstall}(hj;/hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj7/ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhK{hj3/ubjk)}(hhh]h)}(h;``int ()(struct tty_driver *self, struct tty_struct *tty)``h]j;)}(hjT/h]h7int ()(struct tty_driver *self, struct tty_struct *tty)}(hjV/hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjR/ubah}(h]h ]h"]h$]h&]uh1hhjN/hK{hjO/ubah}(h]h ]h"]h$]h&]uh1jjhj3/ubeh}(h]h ]h"]h$]h&]uh1jJhjN/hK{hj.ubjK)}(hH``remove`` ``void ()(struct tty_driver *self, struct tty_struct *tty)`` h](jQ)}(h ``remove``h]j;)}(hj{/h]hremove}(hj}/hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjy/ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhju/ubjk)}(hhh]h)}(h<``void ()(struct tty_driver *self, struct tty_struct *tty)``h]j;)}(hj/h]h8void ()(struct tty_driver *self, struct tty_struct *tty)}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj/ubah}(h]h ]h"]h$]h&]uh1hhj/hKhj/ubah}(h]h ]h"]h$]h&]uh1jjhju/ubeh}(h]h ]h"]h$]h&]uh1jJhj/hKhj.ubjK)}(h;``open`` ``int ()(struct tty_struct *tty, struct file *)`` h](jQ)}(h``open``h]j;)}(hj/h]hopen}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj/ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj/ubjk)}(hhh]h)}(h1``int ()(struct tty_struct *tty, struct file *)``h]j;)}(hj/h]h-int ()(struct tty_struct *tty, struct file *)}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj/ubah}(h]h ]h"]h$]h&]uh1hhj/hKhj/ubah}(h]h ]h"]h$]h&]uh1jjhj/ubeh}(h]h ]h"]h$]h&]uh1jJhj/hKhj.ubjK)}(h=``close`` ``void ()(struct tty_struct *tty, struct file *)`` h](jQ)}(h ``close``h]j;)}(hj/h]hclose}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj/ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj/ubjk)}(hhh]h)}(h2``void ()(struct tty_struct *tty, struct file *)``h]j;)}(hj0h]h.void ()(struct tty_struct *tty, struct file *)}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj0ubah}(h]h ]h"]h$]h&]uh1hhj0hKhj0ubah}(h]h ]h"]h$]h&]uh1jjhj/ubeh}(h]h ]h"]h$]h&]uh1jJhj0hKhj.ubjK)}(h1``shutdown`` ``void ()(struct tty_struct *tty)`` h](jQ)}(h ``shutdown``h]j;)}(hjA0h]hshutdown}(hjC0hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj?0ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj;0ubjk)}(hhh]h)}(h#``void ()(struct tty_struct *tty)``h]j;)}(hj\0h]hvoid ()(struct tty_struct *tty)}(hj^0hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjZ0ubah}(h]h ]h"]h$]h&]uh1hhjV0hKhjW0ubah}(h]h ]h"]h$]h&]uh1jjhj;0ubeh}(h]h ]h"]h$]h&]uh1jJhjV0hKhj.ubjK)}(h0``cleanup`` ``void ()(struct tty_struct *tty)`` h](jQ)}(h ``cleanup``h]j;)}(hj0h]hcleanup}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj0ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj}0ubjk)}(hhh]h)}(h#``void ()(struct tty_struct *tty)``h]j;)}(hj0h]hvoid ()(struct tty_struct *tty)}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj0ubah}(h]h ]h"]h$]h&]uh1hhj0hKhj0ubah}(h]h ]h"]h$]h&]uh1jjhj}0ubeh}(h]h ]h"]h$]h&]uh1jJhj0hKhj.ubjK)}(hN``write`` ``ssize_t ()(struct tty_struct *tty, const u8 *buf, size_t count)`` h](jQ)}(h ``write``h]j;)}(hj0h]hwrite}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj0ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj0ubjk)}(hhh]h)}(hC``ssize_t ()(struct tty_struct *tty, const u8 *buf, size_t count)``h]j;)}(hj0h]h?ssize_t ()(struct tty_struct *tty, const u8 *buf, size_t count)}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj0ubah}(h]h ]h"]h$]h&]uh1hhj0hKhj0ubah}(h]h ]h"]h$]h&]uh1jjhj0ubeh}(h]h ]h"]h$]h&]uh1jJhj0hKhj.ubjK)}(h7``put_char`` ``int ()(struct tty_struct *tty, u8 ch)`` h](jQ)}(h ``put_char``h]j;)}(hj1h]hput_char}(hj 1hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj1ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj1ubjk)}(hhh]h)}(h)``int ()(struct tty_struct *tty, u8 ch)``h]j;)}(hj"1h]h%int ()(struct tty_struct *tty, u8 ch)}(hj$1hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj 1ubah}(h]h ]h"]h$]h&]uh1hhj1hKhj1ubah}(h]h ]h"]h$]h&]uh1jjhj1ubeh}(h]h ]h"]h$]h&]uh1jJhj1hKhj.ubjK)}(h4``flush_chars`` ``void ()(struct tty_struct *tty)`` h](jQ)}(h``flush_chars``h]j;)}(hjI1h]h flush_chars}(hjK1hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjG1ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhjC1ubjk)}(hhh]h)}(h#``void ()(struct tty_struct *tty)``h]j;)}(hjd1h]hvoid ()(struct tty_struct *tty)}(hjf1hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjb1ubah}(h]h ]h"]h$]h&]uh1hhj^1hKhj_1ubah}(h]h ]h"]h$]h&]uh1jjhjC1ubeh}(h]h ]h"]h$]h&]uh1jJhj^1hKhj.ubjK)}(h;``write_room`` ``unsigned int ()(struct tty_struct *tty)`` h](jQ)}(h``write_room``h]j;)}(hj1h]h write_room}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj1ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj1ubjk)}(hhh]h)}(h+``unsigned int ()(struct tty_struct *tty)``h]j;)}(hj1h]h'unsigned int ()(struct tty_struct *tty)}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj1ubah}(h]h ]h"]h$]h&]uh1hhj1hKhj1ubah}(h]h ]h"]h$]h&]uh1jjhj1ubeh}(h]h ]h"]h$]h&]uh1jJhj1hKhj.ubjK)}(h@``chars_in_buffer`` ``unsigned int ()(struct tty_struct *tty)`` h](jQ)}(h``chars_in_buffer``h]j;)}(hj1h]hchars_in_buffer}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj1ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj1ubjk)}(hhh]h)}(h+``unsigned int ()(struct tty_struct *tty)``h]j;)}(hj1h]h'unsigned int ()(struct tty_struct *tty)}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj1ubah}(h]h ]h"]h$]h&]uh1hhj1hKhj1ubah}(h]h ]h"]h$]h&]uh1jjhj1ubeh}(h]h ]h"]h$]h&]uh1jJhj1hKhj.ubjK)}(hR``ioctl`` ``int ()(struct tty_struct *tty, unsigned int cmd, unsigned long arg)`` h](jQ)}(h ``ioctl``h]j;)}(hj2h]hioctl}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj 2ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj 2ubjk)}(hhh]h)}(hG``int ()(struct tty_struct *tty, unsigned int cmd, unsigned long arg)``h]j;)}(hj*2h]hCint ()(struct tty_struct *tty, unsigned int cmd, unsigned long arg)}(hj,2hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj(2ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj%2ubah}(h]h ]h"]h$]h&]uh1jjhj 2ubeh}(h]h ]h"]h$]h&]uh1jJhj$2hKhj.ubjK)}(hZ``compat_ioctl`` ``long ()(struct tty_struct *tty, unsigned int cmd, unsigned long arg)`` h](jQ)}(h``compat_ioctl``h]j;)}(hjR2h]h compat_ioctl}(hjT2hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjP2ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhjL2ubjk)}(hhh]h)}(hH``long ()(struct tty_struct *tty, unsigned int cmd, unsigned long arg)``h]j;)}(hjm2h]hDlong ()(struct tty_struct *tty, unsigned int cmd, unsigned long arg)}(hjo2hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjk2ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhjh2ubah}(h]h ]h"]h$]h&]uh1jjhjL2ubeh}(h]h ]h"]h$]h&]uh1jJhjg2hKhj.ubjK)}(hP``set_termios`` ``void ()(struct tty_struct *tty, const struct ktermios *old)`` h](jQ)}(h``set_termios``h]j;)}(hj2h]h set_termios}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj2ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj2ubjk)}(hhh]h)}(h?``void ()(struct tty_struct *tty, const struct ktermios *old)``h]j;)}(hj2h]h;void ()(struct tty_struct *tty, const struct ktermios *old)}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj2ubah}(h]h ]h"]h$]h&]uh1hhj2hKhj2ubah}(h]h ]h"]h$]h&]uh1jjhj2ubeh}(h]h ]h"]h$]h&]uh1jJhj2hKhj.ubjK)}(h1``throttle`` ``void ()(struct tty_struct *tty)`` h](jQ)}(h ``throttle``h]j;)}(hj2h]hthrottle}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj2ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj2ubjk)}(hhh]h)}(h#``void ()(struct tty_struct *tty)``h]j;)}(hj2h]hvoid ()(struct tty_struct *tty)}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj2ubah}(h]h ]h"]h$]h&]uh1hhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1jjhj2ubeh}(h]h ]h"]h$]h&]uh1jJhj2hMhj.ubjK)}(h3``unthrottle`` ``void ()(struct tty_struct *tty)`` h](jQ)}(h``unthrottle``h]j;)}(hj3h]h unthrottle}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj3ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj3ubjk)}(hhh]h)}(h#``void ()(struct tty_struct *tty)``h]j;)}(hj43h]hvoid ()(struct tty_struct *tty)}(hj63hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj23ubah}(h]h ]h"]h$]h&]uh1hhj.3hMhj/3ubah}(h]h ]h"]h$]h&]uh1jjhj3ubeh}(h]h ]h"]h$]h&]uh1jJhj.3hMhj.ubjK)}(h-``stop`` ``void ()(struct tty_struct *tty)`` h](jQ)}(h``stop``h]j;)}(hj[3h]hstop}(hj]3hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjY3ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhjU3ubjk)}(hhh]h)}(h#``void ()(struct tty_struct *tty)``h]j;)}(hjv3h]hvoid ()(struct tty_struct *tty)}(hjx3hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjt3ubah}(h]h ]h"]h$]h&]uh1hhjp3hMhjq3ubah}(h]h ]h"]h$]h&]uh1jjhjU3ubeh}(h]h ]h"]h$]h&]uh1jJhjp3hMhj.ubjK)}(h.``start`` ``void ()(struct tty_struct *tty)`` h](jQ)}(h ``start``h]j;)}(hj3h]hstart}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj3ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM&hj3ubjk)}(hhh]h)}(h#``void ()(struct tty_struct *tty)``h]j;)}(hj3h]hvoid ()(struct tty_struct *tty)}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj3ubah}(h]h ]h"]h$]h&]uh1hhj3hM&hj3ubah}(h]h ]h"]h$]h&]uh1jjhj3ubeh}(h]h ]h"]h$]h&]uh1jJhj3hM&hj.ubjK)}(h/``hangup`` ``void ()(struct tty_struct *tty)`` h](jQ)}(h ``hangup``h]j;)}(hj3h]hhangup}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj3ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM/hj3ubjk)}(hhh]h)}(h#``void ()(struct tty_struct *tty)``h]j;)}(hj3h]hvoid ()(struct tty_struct *tty)}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj3ubah}(h]h ]h"]h$]h&]uh1hhj3hM/hj3ubah}(h]h ]h"]h$]h&]uh1jjhj3ubeh}(h]h ]h"]h$]h&]uh1jJhj3hM/hj.ubjK)}(h<``break_ctl`` ``int ()(struct tty_struct *tty, int state)`` h](jQ)}(h ``break_ctl``h]j;)}(hj!4h]h break_ctl}(hj#4hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj4ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM6hj4ubjk)}(hhh]h)}(h-``int ()(struct tty_struct *tty, int state)``h]j;)}(hj<4h]h)int ()(struct tty_struct *tty, int state)}(hj>4hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj:4ubah}(h]h ]h"]h$]h&]uh1hhj64hM6hj74ubah}(h]h ]h"]h$]h&]uh1jjhj4ubeh}(h]h ]h"]h$]h&]uh1jJhj64hM6hj.ubjK)}(h5``flush_buffer`` ``void ()(struct tty_struct *tty)`` h](jQ)}(h``flush_buffer``h]j;)}(hjc4h]h flush_buffer}(hje4hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hja4ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMFhj]4ubjk)}(hhh]h)}(h#``void ()(struct tty_struct *tty)``h]j;)}(hj~4h]hvoid ()(struct tty_struct *tty)}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj|4ubah}(h]h ]h"]h$]h&]uh1hhjx4hMFhjy4ubah}(h]h ]h"]h$]h&]uh1jjhj]4ubeh}(h]h ]h"]h$]h&]uh1jJhjx4hMFhj.ubjK)}(h;``ldisc_ok`` ``int ()(struct tty_struct *tty, int ldisc)`` h](jQ)}(h ``ldisc_ok``h]j;)}(hj4h]hldisc_ok}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj4ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj4ubjk)}(hhh]h)}(h-``int ()(struct tty_struct *tty, int ldisc)``h]j;)}(hj4h]h)int ()(struct tty_struct *tty, int ldisc)}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj4ubah}(h]h ]h"]h$]h&]uh1hhj4hKhj4ubah}(h]h ]h"]h$]h&]uh1jjhj4ubeh}(h]h ]h"]h$]h&]uh1jJhj4hKhj.ubjK)}(h2``set_ldisc`` ``void ()(struct tty_struct *tty)`` h](jQ)}(h ``set_ldisc``h]j;)}(hj4h]h set_ldisc}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj4ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj4ubjk)}(hhh]h)}(h#``void ()(struct tty_struct *tty)``h]j;)}(hj5h]hvoid ()(struct tty_struct *tty)}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj5ubah}(h]h ]h"]h$]h&]uh1hhj4hMhj4ubah}(h]h ]h"]h$]h&]uh1jjhj4ubeh}(h]h ]h"]h$]h&]uh1jJhj4hMhj.ubjK)}(hE``wait_until_sent`` ``void ()(struct tty_struct *tty, int timeout)`` h](jQ)}(h``wait_until_sent``h]j;)}(hj)5h]hwait_until_sent}(hj+5hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj'5ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMOhj#5ubjk)}(hhh]h)}(h0``void ()(struct tty_struct *tty, int timeout)``h]j;)}(hjD5h]h,void ()(struct tty_struct *tty, int timeout)}(hjF5hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjB5ubah}(h]h ]h"]h$]h&]uh1hhj>5hMOhj?5ubah}(h]h ]h"]h$]h&]uh1jjhj#5ubeh}(h]h ]h"]h$]h&]uh1jJhj>5hMOhj.ubjK)}(h:``send_xchar`` ``void ()(struct tty_struct *tty, u8 ch)`` h](jQ)}(h``send_xchar``h]j;)}(hjk5h]h send_xchar}(hjm5hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hji5ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMXhje5ubjk)}(hhh]h)}(h*``void ()(struct tty_struct *tty, u8 ch)``h]j;)}(hj5h]h&void ()(struct tty_struct *tty, u8 ch)}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj5ubah}(h]h ]h"]h$]h&]uh1hhj5hMXhj5ubah}(h]h ]h"]h$]h&]uh1jjhje5ubeh}(h]h ]h"]h$]h&]uh1jJhj5hMXhj.ubjK)}(h0``tiocmget`` ``int ()(struct tty_struct *tty)`` h](jQ)}(h ``tiocmget``h]j;)}(hj5h]htiocmget}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj5ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM`hj5ubjk)}(hhh]h)}(h"``int ()(struct tty_struct *tty)``h]j;)}(hj5h]hint ()(struct tty_struct *tty)}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj5ubah}(h]h ]h"]h$]h&]uh1hhj5hM`hj5ubah}(h]h ]h"]h$]h&]uh1jjhj5ubeh}(h]h ]h"]h$]h&]uh1jJhj5hM`hj.ubjK)}(hV``tiocmset`` ``int ()(struct tty_struct *tty, unsigned int set, unsigned int clear)`` h](jQ)}(h ``tiocmset``h]j;)}(hj5h]htiocmset}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj5ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMihj5ubjk)}(hhh]h)}(hH``int ()(struct tty_struct *tty, unsigned int set, unsigned int clear)``h]j;)}(hj 6h]hDint ()(struct tty_struct *tty, unsigned int set, unsigned int clear)}(hj 6hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj6ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhhj6ubah}(h]h ]h"]h$]h&]uh1jjhj5ubeh}(h]h ]h"]h$]h&]uh1jJhj6hMihj.ubjK)}(hB``resize`` ``int ()(struct tty_struct *tty, struct winsize *ws)`` h](jQ)}(h ``resize``h]j;)}(hj26h]hresize}(hj46hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj06ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMqhj,6ubjk)}(hhh]h)}(h6``int ()(struct tty_struct *tty, struct winsize *ws)``h]j;)}(hjM6h]h2int ()(struct tty_struct *tty, struct winsize *ws)}(hjO6hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjK6ubah}(h]h ]h"]h$]h&]uh1hhjG6hMqhjH6ubah}(h]h ]h"]h$]h&]uh1jjhj,6ubeh}(h]h ]h"]h$]h&]uh1jJhjG6hMqhj.ubjK)}(hR``get_icount`` ``int ()(struct tty_struct *tty, struct serial_icounter *icount)`` h](jQ)}(h``get_icount``h]j;)}(hjt6h]h get_icount}(hjv6hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjr6ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM}hjn6ubjk)}(hhh]h)}(hB``int ()(struct tty_struct *tty, struct serial_icounter *icount)``h]j;)}(hj6h]h>int ()(struct tty_struct *tty, struct serial_icounter *icount)}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj6ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM|hj6ubah}(h]h ]h"]h$]h&]uh1jjhjn6ubeh}(h]h ]h"]h$]h&]uh1jJhj6hM}hj.ubjK)}(hK``get_serial`` ``int ()(struct tty_struct *tty, struct serial_struct *p)`` h](jQ)}(h``get_serial``h]j;)}(hj6h]h get_serial}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj6ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj6ubjk)}(hhh]h)}(h;``int ()(struct tty_struct *tty, struct serial_struct *p)``h]j;)}(hj6h]h7int ()(struct tty_struct *tty, struct serial_struct *p)}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj6ubah}(h]h ]h"]h$]h&]uh1hhj6hMhj6ubah}(h]h ]h"]h$]h&]uh1jjhj6ubeh}(h]h ]h"]h$]h&]uh1jJhj6hMhj.ubjK)}(hK``set_serial`` ``int ()(struct tty_struct *tty, struct serial_struct *p)`` h](jQ)}(h``set_serial``h]j;)}(hj6h]h set_serial}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj6ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj6ubjk)}(hhh]h)}(h;``int ()(struct tty_struct *tty, struct serial_struct *p)``h]j;)}(hj7h]h7int ()(struct tty_struct *tty, struct serial_struct *p)}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj7ubah}(h]h ]h"]h$]h&]uh1hhj7hMhj7ubah}(h]h ]h"]h$]h&]uh1jjhj6ubeh}(h]h ]h"]h$]h&]uh1jJhj7hMhj.ubjK)}(hH``show_fdinfo`` ``void ()(struct tty_struct *tty, struct seq_file *m)`` h](jQ)}(h``show_fdinfo``h]j;)}(hj;7h]h show_fdinfo}(hj=7hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj97ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj57ubjk)}(hhh]h)}(h7``void ()(struct tty_struct *tty, struct seq_file *m)``h]j;)}(hjV7h]h3void ()(struct tty_struct *tty, struct seq_file *m)}(hjX7hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjT7ubah}(h]h ]h"]h$]h&]uh1hhjP7hMhjQ7ubah}(h]h ]h"]h$]h&]uh1jjhj57ubeh}(h]h ]h"]h$]h&]uh1jJhjP7hMhj.ubjK)}(hM``poll_init`` ``int ()(struct tty_driver *driver, int line, char *options)`` h](jQ)}(h ``poll_init``h]j;)}(hj}7h]h poll_init}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj{7ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhjw7ubjk)}(hhh]h)}(h>``int ()(struct tty_driver *driver, int line, char *options)``h]j;)}(hj7h]h:int ()(struct tty_driver *driver, int line, char *options)}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj7ubah}(h]h ]h"]h$]h&]uh1hhj7hMhj7ubah}(h]h ]h"]h$]h&]uh1jjhjw7ubeh}(h]h ]h"]h$]h&]uh1jJhj7hMhj.ubjK)}(hB``poll_get_char`` ``int ()(struct tty_driver *driver, int line)`` h](jQ)}(h``poll_get_char``h]j;)}(hj7h]h poll_get_char}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj7ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj7ubjk)}(hhh]h)}(h/``int ()(struct tty_driver *driver, int line)``h]j;)}(hj7h]h+int ()(struct tty_driver *driver, int line)}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj7ubah}(h]h ]h"]h$]h&]uh1hhj7hMhj7ubah}(h]h ]h"]h$]h&]uh1jjhj7ubeh}(h]h ]h"]h$]h&]uh1jJhj7hMhj.ubjK)}(hL``poll_put_char`` ``void ()(struct tty_driver *driver, int line, char ch)`` h](jQ)}(h``poll_put_char``h]j;)}(hj8h]h poll_put_char}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj7ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj7ubjk)}(hhh]h)}(h9``void ()(struct tty_driver *driver, int line, char ch)``h]j;)}(hj8h]h5void ()(struct tty_driver *driver, int line, char ch)}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj8ubah}(h]h ]h"]h$]h&]uh1hhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1jjhj7ubeh}(h]h ]h"]h$]h&]uh1jJhj8hMhj.ubjK)}(h:``proc_show`` ``int ()(struct seq_file *m, void *driver)``h](jQ)}(h ``proc_show``h]j;)}(hjC8h]h proc_show}(hjE8hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjA8ubah}(h]h ]h"]h$]h&]uh1jPhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj=8ubjk)}(hhh]h)}(h,``int ()(struct seq_file *m, void *driver)``h]j;)}(hj^8h]h(int ()(struct seq_file *m, void *driver)}(hj`8hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj\8ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhjY8ubah}(h]h ]h"]h$]h&]uh1jjhj=8ubeh}(h]h ]h"]h$]h&]uh1jJhjX8hMhj.ubeh}(h]h ]h"]h$]h&]uh1jEhj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1j%hj-hhhj).hNubh)}(h**Description**h]j0)}(hj8h]h Description}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj8ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj-hhubj )}(hX&Return the tty device corresponding to **idx**, ``NULL`` if there is not one currently in use and an ``ERR_PTR`` value on error. Called under ``tty_mutex`` (for now!) Optional method. Default behaviour is to use the **self->ttys** array. Install a new **tty** into the **self**'s internal tables. Used in conjunction with **lookup** and **remove** methods. Optional method. Default behaviour is to use the **self->ttys** array. Remove a closed **tty** from the **self**'s internal tables. Used in conjunction with **lookup** and **remove** methods. Optional method. Default behaviour is to use the **self->ttys** array. This routine is called when a particular **tty** device is opened. This routine is mandatory; if this routine is not filled in, the attempted open will fail with ``ENODEV``. Required method. Called with tty lock held. May sleep. This routine is called when a particular **tty** device is closed. At the point of return from this call the driver must make no further ldisc calls of any kind. Remark: called even if the corresponding **open\(\)** failed. Required method. Called with tty lock held. May sleep. This routine is called under the tty lock when a particular **tty** device is closed for the last time. It executes before the **tty** resources are freed so may execute while another function holds a **tty** kref. This routine is called asynchronously when a particular **tty** device is closed for the last time freeing up the resources. This is actually the second part of shutdown for routines that might sleep. This routine is called by the kernel to write a series (**count**) of characters (**buf**) to the **tty** device. The characters may come from user space or kernel space. This routine will return the number of characters actually accepted for writing. May occur in parallel in special cases. Because this includes panic paths drivers generally shouldn't try and do clever locking here. Optional: Required for writable devices. May not sleep. This routine is called by the kernel to write a single character **ch** to the **tty** device. If the kernel uses this routine, it must call the **flush_chars\(\)** routine (if defined) when it is done stuffing characters into the driver. If there is no room in the queue, the character is ignored. Optional: Kernel will use the **write** method if not provided. Do not call this function directly, call tty_put_char(). This routine is called by the kernel after it has written a series of characters to the tty device using **put_char\(\)**. Optional. Do not call this function directly, call tty_driver_flush_chars(). This routine returns the numbers of characters the **tty** driver will accept for queuing to be written. This number is subject to change as output buffers get emptied, or if the output flow control is acted. The ldisc is responsible for being intelligent about multi-threading of write_room/write calls Required if **write** method is provided else not needed. Do not call this function directly, call tty_write_room() This routine returns the number of characters in the device private output queue. Used in tty_wait_until_sent() and for poll() implementation. Optional: if not provided, it is assumed there is no queue on the device. Do not call this function directly, call tty_chars_in_buffer(). This routine allows the **tty** driver to implement device-specific ioctls. If the ioctl number passed in **cmd** is not recognized by the driver, it should return ``ENOIOCTLCMD``. Optional. Implement ioctl processing for 32 bit process on 64 bit system. Optional. This routine allows the **tty** driver to be notified when device's termios settings have changed. New settings are in **tty->termios**. Previous settings are passed in the **old** argument. The API is defined such that the driver should return the actual modes selected. This means that the driver is responsible for modifying any bits in **tty->termios** it cannot fulfill to indicate the actual modes being used. Optional. Called under the **tty->termios_rwsem**. May sleep. This routine allows the **tty** driver to decide if it can deal with a particular **ldisc**. Optional. Called under the **tty->ldisc_sem** and **tty->termios_rwsem**. This routine allows the **tty** driver to be notified when the device's line discipline is being changed. At the point this is done the discipline is not yet usable. Optional. Called under the **tty->ldisc_sem** and **tty->termios_rwsem**. This routine notifies the **tty** driver that input buffers for the line discipline are close to full, and it should somehow signal that no more characters should be sent to the **tty**. Serialization including with **unthrottle\(\)** is the job of the ldisc layer. Optional: Always invoke via tty_throttle_safe(). Called under the **tty->termios_rwsem**. This routine notifies the **tty** driver that it should signal that characters can now be sent to the **tty** without fear of overrunning the input buffers of the line disciplines. Optional. Always invoke via tty_unthrottle(). Called under the **tty->termios_rwsem**. This routine notifies the **tty** driver that it should stop outputting characters to the tty device. Called with **tty->flow.lock** held. Serialized with **start\(\)** method. Optional. Always invoke via stop_tty(). This routine notifies the **tty** driver that it resumed sending characters to the **tty** device. Called with **tty->flow.lock** held. Serialized with stop() method. Optional. Always invoke via start_tty(). This routine notifies the **tty** driver that it should hang up the **tty** device. Optional. Called with tty lock held. This optional routine requests the **tty** driver to turn on or off BREAK status on the RS-232 port. If **state** is -1, then the BREAK status should be turned on; if **state** is 0, then BREAK should be turned off. If this routine is implemented, the high-level tty driver will handle the following ioctls: ``TCSBRK``, ``TCSBRKP``, ``TIOCSBRK``, ``TIOCCBRK``. If the driver sets ``TTY_DRIVER_HARDWARE_BREAK`` in tty_alloc_driver(), then the interface will also be called with actual times and the hardware is expected to do the delay work itself. 0 and -1 are still used for on/off. Optional: Required for ``TCSBRK``/``BRKP``/etc. handling. May sleep. This routine discards device private output buffer. Invoked on close, hangup, to implement ``TCOFLUSH`` ioctl and similar. Optional: if not provided, it is assumed there is no queue on the device. Do not call this function directly, call tty_driver_flush_buffer(). This routine waits until the device has written out all of the characters in its transmitter FIFO. Or until **timeout** (in jiffies) is reached. Optional: If not provided, the device is assumed to have no FIFO. Usually correct to invoke via tty_wait_until_sent(). May sleep. This routine is used to send a high-priority XON/XOFF character (**ch**) to the **tty** device. Optional: If not provided, then the **write** method is called under the **tty->atomic_write_lock** to keep it serialized with the ldisc. This routine is used to obtain the modem status bits from the **tty** driver. Optional: If not provided, then ``ENOTTY`` is returned from the ``TIOCMGET`` ioctl. Do not call this function directly, call tty_tiocmget(). This routine is used to set the modem status bits to the **tty** driver. First, **clear** bits should be cleared, then **set** bits set. Optional: If not provided, then ``ENOTTY`` is returned from the ``TIOCMSET`` ioctl. Do not call this function directly, call tty_tiocmset(). Called when a termios request is issued which changes the requested terminal geometry to **ws**. Optional: the default action is to update the termios structure without error. This is usually the correct behaviour. Drivers should not force errors here if they are not resizable objects (e.g. a serial line). See tty_do_resize() if you need to wrap the standard method in your own logic -- the usual case. Called when the **tty** device receives a ``TIOCGICOUNT`` ioctl. Passed a kernel structure **icount** to complete. Optional: called only if provided, otherwise ``ENOTTY`` will be returned. Called when the **tty** device receives a ``TIOCGSERIAL`` ioctl. Passed a kernel structure **p** (:c:type:`struct serial_struct `) to complete. Optional: called only if provided, otherwise ``ENOTTY`` will be returned. Do not call this function directly, call tty_tiocgserial(). Called when the **tty** device receives a ``TIOCSSERIAL`` ioctl. Passed a kernel structure **p** (:c:type:`struct serial_struct `) to set the values from. Optional: called only if provided, otherwise ``ENOTTY`` will be returned. Do not call this function directly, call tty_tiocsserial(). Called when the **tty** device file descriptor receives a fdinfo request from VFS (to show in /proc//fdinfo/). **m** should be filled with information. Optional: called only if provided, otherwise nothing is written to **m**. Do not call this function directly, call tty_show_fdinfo(). kgdboc support (Documentation/process/debugging/kgdb.rst). This routine is called to initialize the HW for later use by calling **poll_get_char** or **poll_put_char**. Optional: called only if provided, otherwise skipped as a non-polling driver. kgdboc support (see **poll_init**). **driver** should read a character from a tty identified by **line** and return it. Optional: called only if **poll_init** provided. kgdboc support (see **poll_init**). **driver** should write character **ch** to a tty identified by **line**. Optional: called only if **poll_init** provided. Driver **driver** (cast to :c:type:`struct tty_driver `) can show additional info in /proc/tty/driver/. It is enough to fill in the information into **m**. Optional: called only if provided, otherwise no /proc entry created. h](h)}(hReturn the tty device corresponding to **idx**, ``NULL`` if there is not one currently in use and an ``ERR_PTR`` value on error. Called under ``tty_mutex`` (for now!)h](h'Return the tty device corresponding to }(hj8hhhNhNubj0)}(h**idx**h]hidx}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj8ubh, }(hj8hhhNhNubj;)}(h``NULL``h]hNULL}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj8ubh- if there is not one currently in use and an }(hj8hhhNhNubj;)}(h ``ERR_PTR``h]hERR_PTR}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj8ubh value on error. Called under }(hj8hhhNhNubj;)}(h ``tty_mutex``h]h tty_mutex}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj8ubh (for now!)}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKshj8ubh)}(hFOptional method. Default behaviour is to use the **self->ttys** array.h](h1Optional method. Default behaviour is to use the }(hj9hhhNhNubj0)}(h**self->ttys**h]h self->ttys}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj9ubh array.}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKwhj8ubh)}(hvInstall a new **tty** into the **self**'s internal tables. Used in conjunction with **lookup** and **remove** methods.h](hInstall a new }(hj!9hhhNhNubj0)}(h**tty**h]htty}(hj)9hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj!9ubh into the }(hj!9hhhNhNubj0)}(h**self**h]hself}(hj;9hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj!9ubh/’s internal tables. Used in conjunction with }(hj!9hhhNhNubj0)}(h **lookup**h]hlookup}(hjM9hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj!9ubh and }(hj!9hhhNhNubj0)}(h **remove**h]hremove}(hj_9hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj!9ubh methods.}(hj!9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKzhj8ubh)}(hFOptional method. Default behaviour is to use the **self->ttys** array.h](h1Optional method. Default behaviour is to use the }(hjx9hhhNhNubj0)}(h**self->ttys**h]h self->ttys}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjx9ubh array.}(hjx9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhK}hj8ubh)}(hxRemove a closed **tty** from the **self**'s internal tables. Used in conjunction with **lookup** and **remove** methods.h](hRemove a closed }(hj9hhhNhNubj0)}(h**tty**h]htty}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj9ubh from the }(hj9hhhNhNubj0)}(h**self**h]hself}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj9ubh/’s internal tables. Used in conjunction with }(hj9hhhNhNubj0)}(h **lookup**h]hlookup}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj9ubh and }(hj9hhhNhNubj0)}(h **remove**h]hremove}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj9ubh methods.}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(hFOptional method. Default behaviour is to use the **self->ttys** array.h](h1Optional method. Default behaviour is to use the }(hj9hhhNhNubj0)}(h**self->ttys**h]h self->ttys}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj9ubh array.}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(hThis routine is called when a particular **tty** device is opened. This routine is mandatory; if this routine is not filled in, the attempted open will fail with ``ENODEV``.h](h)This routine is called when a particular }(hj:hhhNhNubj0)}(h**tty**h]htty}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj:ubhr device is opened. This routine is mandatory; if this routine is not filled in, the attempted open will fail with }(hj:hhhNhNubj;)}(h ``ENODEV``h]hENODEV}(hj+:hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj:ubh.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(h6Required method. Called with tty lock held. May sleep.h]h6Required method. Called with tty lock held. May sleep.}(hjD:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(hThis routine is called when a particular **tty** device is closed. At the point of return from this call the driver must make no further ldisc calls of any kind.h](h)This routine is called when a particular }(hjS:hhhNhNubj0)}(h**tty**h]htty}(hj[:hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjS:ubhq device is closed. At the point of return from this call the driver must make no further ldisc calls of any kind.}(hjS:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(h=Remark: called even if the corresponding **open\(\)** failed.h](h)Remark: called even if the corresponding }(hjt:hhhNhNubj0)}(h **open\(\)**h]hopen()}(hj|:hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjt:ubh failed.}(hjt:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(h6Required method. Called with tty lock held. May sleep.h]h6Required method. Called with tty lock held. May sleep.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(hThis routine is called under the tty lock when a particular **tty** device is closed for the last time. It executes before the **tty** resources are freed so may execute while another function holds a **tty** kref.h](htermios**. Previous settings are passed in the **old** argument.h](hThis routine allows the }(hj<hhhNhNubj0)}(h**tty**h]htty}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj<ubhZ driver to be notified when device’s termios settings have changed. New settings are in }(hj<hhhNhNubj0)}(h**tty->termios**h]h tty->termios}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj<ubh&. Previous settings are passed in the }(hj<hhhNhNubj0)}(h**old**h]hold}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj<ubh argument.}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(hThe API is defined such that the driver should return the actual modes selected. This means that the driver is responsible for modifying any bits in **tty->termios** it cannot fulfill to indicate the actual modes being used.h](hThe API is defined such that the driver should return the actual modes selected. This means that the driver is responsible for modifying any bits in }(hj)=hhhNhNubj0)}(h**tty->termios**h]h tty->termios}(hj1=hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj)=ubh; it cannot fulfill to indicate the actual modes being used.}(hj)=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(h=Optional. Called under the **tty->termios_rwsem**. May sleep.h](hOptional. Called under the }(hjJ=hhhNhNubj0)}(h**tty->termios_rwsem**h]htty->termios_rwsem}(hjR=hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjJ=ubh . May sleep.}(hjJ=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(h\This routine allows the **tty** driver to decide if it can deal with a particular **ldisc**.h](hThis routine allows the }(hjk=hhhNhNubj0)}(h**tty**h]htty}(hjs=hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjk=ubh3 driver to decide if it can deal with a particular }(hjk=hhhNhNubj0)}(h **ldisc**h]hldisc}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjk=ubh.}(hjk=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(hIOptional. Called under the **tty->ldisc_sem** and **tty->termios_rwsem**.h](hOptional. Called under the }(hj=hhhNhNubj0)}(h**tty->ldisc_sem**h]htty->ldisc_sem}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj=ubh and }(hj=hhhNhNubj0)}(h**tty->termios_rwsem**h]htty->termios_rwsem}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj=ubh.}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(hThis routine allows the **tty** driver to be notified when the device's line discipline is being changed. At the point this is done the discipline is not yet usable.h](hThis routine allows the }(hj=hhhNhNubj0)}(h**tty**h]htty}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj=ubh driver to be notified when the device’s line discipline is being changed. At the point this is done the discipline is not yet usable.}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(hIOptional. Called under the **tty->ldisc_sem** and **tty->termios_rwsem**.h](hOptional. Called under the }(hj=hhhNhNubj0)}(h**tty->ldisc_sem**h]htty->ldisc_sem}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj=ubh and }(hj=hhhNhNubj0)}(h**tty->termios_rwsem**h]htty->termios_rwsem}(hj >hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj=ubh.}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(hThis routine notifies the **tty** driver that input buffers for the line discipline are close to full, and it should somehow signal that no more characters should be sent to the **tty**.h](hThis routine notifies the }(hj%>hhhNhNubj0)}(h**tty**h]htty}(hj->hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj%>ubh driver that input buffers for the line discipline are close to full, and it should somehow signal that no more characters should be sent to the }(hj%>hhhNhNubj0)}(h**tty**h]htty}(hj?>hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj%>ubh.}(hj%>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(hNSerialization including with **unthrottle\(\)** is the job of the ldisc layer.h](hSerialization including with }(hjX>hhhNhNubj0)}(h**unthrottle\(\)**h]hunthrottle()}(hj`>hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjX>ubh is the job of the ldisc layer.}(hjX>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(hYOptional: Always invoke via tty_throttle_safe(). Called under the **tty->termios_rwsem**.h](hBOptional: Always invoke via tty_throttle_safe(). Called under the }(hjy>hhhNhNubj0)}(h**tty->termios_rwsem**h]htty->termios_rwsem}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjy>ubh.}(hjy>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhKhj8ubh)}(hThis routine notifies the **tty** driver that it should signal that characters can now be sent to the **tty** without fear of overrunning the input buffers of the line disciplines.h](hThis routine notifies the }(hj>hhhNhNubj0)}(h**tty**h]htty}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj>ubhE driver that it should signal that characters can now be sent to the }(hj>hhhNhNubj0)}(h**tty**h]htty}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj>ubhG without fear of overrunning the input buffers of the line disciplines.}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubh)}(hVOptional. Always invoke via tty_unthrottle(). Called under the **tty->termios_rwsem**.h](h?Optional. Always invoke via tty_unthrottle(). Called under the }(hj>hhhNhNubj0)}(h**tty->termios_rwsem**h]htty->termios_rwsem}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj>ubh.}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubh)}(heThis routine notifies the **tty** driver that it should stop outputting characters to the tty device.h](hThis routine notifies the }(hj>hhhNhNubj0)}(h**tty**h]htty}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj>ubhD driver that it should stop outputting characters to the tty device.}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubh)}(hJCalled with **tty->flow.lock** held. Serialized with **start\(\)** method.h](h Called with }(hj?hhhNhNubj0)}(h**tty->flow.lock**h]htty->flow.lock}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj?ubh held. Serialized with }(hj?hhhNhNubj0)}(h **start\(\)**h]h start()}(hj)?hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj?ubh method.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM hj8ubh)}(h'Optional. Always invoke via stop_tty().h]h'Optional. Always invoke via stop_tty().}(hjB?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM hj8ubh)}(hbThis routine notifies the **tty** driver that it resumed sending characters to the **tty** device.h](hThis routine notifies the }(hjQ?hhhNhNubj0)}(h**tty**h]htty}(hjY?hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjQ?ubh2 driver that it resumed sending characters to the }(hjQ?hhhNhNubj0)}(h**tty**h]htty}(hjk?hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjQ?ubh device.}(hjQ?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubh)}(hCCalled with **tty->flow.lock** held. Serialized with stop() method.h](h Called with }(hj?hhhNhNubj0)}(h**tty->flow.lock**h]htty->flow.lock}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj?ubh% held. Serialized with stop() method.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubh)}(h(Optional. Always invoke via start_tty().h]h(Optional. Always invoke via start_tty().}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubh)}(hSThis routine notifies the **tty** driver that it should hang up the **tty** device.h](hThis routine notifies the }(hj?hhhNhNubj0)}(h**tty**h]htty}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj?ubh# driver that it should hang up the }(hj?hhhNhNubj0)}(h**tty**h]htty}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj?ubh device.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubh)}(h$Optional. Called with tty lock held.h]h$Optional. Called with tty lock held.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubh)}(hThis optional routine requests the **tty** driver to turn on or off BREAK status on the RS-232 port. If **state** is -1, then the BREAK status should be turned on; if **state** is 0, then BREAK should be turned off.h](h#This optional routine requests the }(hj?hhhNhNubj0)}(h**tty**h]htty}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj?ubh> driver to turn on or off BREAK status on the RS-232 port. If }(hj?hhhNhNubj0)}(h **state**h]hstate}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj?ubh6 is -1, then the BREAK status should be turned on; if }(hj?hhhNhNubj0)}(h **state**h]hstate}(hj"@hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj?ubh' is 0, then BREAK should be turned off.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubh)}(hIf this routine is implemented, the high-level tty driver will handle the following ioctls: ``TCSBRK``, ``TCSBRKP``, ``TIOCSBRK``, ``TIOCCBRK``.h](h\If this routine is implemented, the high-level tty driver will handle the following ioctls: }(hj;@hhhNhNubj;)}(h ``TCSBRK``h]hTCSBRK}(hjC@hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj;@ubh, }(hj;@hhhNhNubj;)}(h ``TCSBRKP``h]hTCSBRKP}(hjU@hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj;@ubh, }hj;@sbj;)}(h ``TIOCSBRK``h]hTIOCSBRK}(hjg@hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj;@ubh, }hj;@sbj;)}(h ``TIOCCBRK``h]hTIOCCBRK}(hjy@hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj;@ubh.}(hj;@hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM"hj8ubh)}(hIf the driver sets ``TTY_DRIVER_HARDWARE_BREAK`` in tty_alloc_driver(), then the interface will also be called with actual times and the hardware is expected to do the delay work itself. 0 and -1 are still used for on/off.h](hIf the driver sets }(hj@hhhNhNubj;)}(h``TTY_DRIVER_HARDWARE_BREAK``h]hTTY_DRIVER_HARDWARE_BREAK}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj@ubh in tty_alloc_driver(), then the interface will also be called with actual times and the hardware is expected to do the delay work itself. 0 and -1 are still used for on/off.}(hj@hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM%hj8ubh)}(hDOptional: Required for ``TCSBRK``/``BRKP``/etc. handling. May sleep.h](hOptional: Required for }(hj@hhhNhNubj;)}(h ``TCSBRK``h]hTCSBRK}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj@ubh/}(hj@hhhNhNubj;)}(h``BRKP``h]hBRKP}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj@ubh/etc. handling. May sleep.}(hj@hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM*hj8ubh)}(hzThis routine discards device private output buffer. Invoked on close, hangup, to implement ``TCOFLUSH`` ioctl and similar.h](h[This routine discards device private output buffer. Invoked on close, hangup, to implement }(hj@hhhNhNubj;)}(h ``TCOFLUSH``h]hTCOFLUSH}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj@ubh ioctl and similar.}(hj@hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM-hj8ubh)}(hOptional: if not provided, it is assumed there is no queue on the device. Do not call this function directly, call tty_driver_flush_buffer().h]hOptional: if not provided, it is assumed there is no queue on the device. Do not call this function directly, call tty_driver_flush_buffer().}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM0hj8ubh)}(hThis routine waits until the device has written out all of the characters in its transmitter FIFO. Or until **timeout** (in jiffies) is reached.h](hlThis routine waits until the device has written out all of the characters in its transmitter FIFO. Or until }(hjAhhhNhNubj0)}(h **timeout**h]htimeout}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjAubh (in jiffies) is reached.}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM5hj8ubh)}(hOptional: If not provided, the device is assumed to have no FIFO. Usually correct to invoke via tty_wait_until_sent(). May sleep.h]hOptional: If not provided, the device is assumed to have no FIFO. Usually correct to invoke via tty_wait_until_sent(). May sleep.}(hj7AhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM9hj8ubh)}(h_This routine is used to send a high-priority XON/XOFF character (**ch**) to the **tty** device.h](hAThis routine is used to send a high-priority XON/XOFF character (}(hjFAhhhNhNubj0)}(h**ch**h]hch}(hjNAhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjFAubh ) to the }(hjFAhhhNhNubj0)}(h**tty**h]htty}(hj`AhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjFAubh device.}(hjFAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM=hj8ubh)}(hOptional: If not provided, then the **write** method is called under the **tty->atomic_write_lock** to keep it serialized with the ldisc.h](h$Optional: If not provided, then the }(hjyAhhhNhNubj0)}(h **write**h]hwrite}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjyAubh method is called under the }(hjyAhhhNhNubj0)}(h**tty->atomic_write_lock**h]htty->atomic_write_lock}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjyAubh& to keep it serialized with the ldisc.}(hjyAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM@hj8ubh)}(hMThis routine is used to obtain the modem status bits from the **tty** driver.h](h>This routine is used to obtain the modem status bits from the }(hjAhhhNhNubj0)}(h**tty**h]htty}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjAubh driver.}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMDhj8ubh)}(hOptional: If not provided, then ``ENOTTY`` is returned from the ``TIOCMGET`` ioctl. Do not call this function directly, call tty_tiocmget().h](h Optional: If not provided, then }(hjAhhhNhNubj;)}(h ``ENOTTY``h]hENOTTY}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjAubh is returned from the }(hjAhhhNhNubj;)}(h ``TIOCMGET``h]hTIOCMGET}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjAubh@ ioctl. Do not call this function directly, call tty_tiocmget().}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMGhj8ubh)}(hThis routine is used to set the modem status bits to the **tty** driver. First, **clear** bits should be cleared, then **set** bits set.h](h9This routine is used to set the modem status bits to the }(hjBhhhNhNubj0)}(h**tty**h]htty}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjBubh driver. First, }(hjBhhhNhNubj0)}(h **clear**h]hclear}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjBubh bits should be cleared, then }(hjBhhhNhNubj0)}(h**set**h]hset}(hj,BhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjBubh bits set.}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMKhj8ubh)}(hOptional: If not provided, then ``ENOTTY`` is returned from the ``TIOCMSET`` ioctl. Do not call this function directly, call tty_tiocmset().h](h Optional: If not provided, then }(hjEBhhhNhNubj;)}(h ``ENOTTY``h]hENOTTY}(hjMBhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjEBubh is returned from the }(hjEBhhhNhNubj;)}(h ``TIOCMSET``h]hTIOCMSET}(hj_BhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjEBubh@ ioctl. Do not call this function directly, call tty_tiocmset().}(hjEBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMNhj8ubh)}(h`Called when a termios request is issued which changes the requested terminal geometry to **ws**.h](hYCalled when a termios request is issued which changes the requested terminal geometry to }(hjxBhhhNhNubj0)}(h**ws**h]hws}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjxBubh.}(hjxBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMRhj8ubh)}(hX3Optional: the default action is to update the termios structure without error. This is usually the correct behaviour. Drivers should not force errors here if they are not resizable objects (e.g. a serial line). See tty_do_resize() if you need to wrap the standard method in your own logic -- the usual case.h]hX3Optional: the default action is to update the termios structure without error. This is usually the correct behaviour. Drivers should not force errors here if they are not resizable objects (e.g. a serial line). See tty_do_resize() if you need to wrap the standard method in your own logic -- the usual case.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMUhj8ubh)}(hrCalled when the **tty** device receives a ``TIOCGICOUNT`` ioctl. Passed a kernel structure **icount** to complete.h](hCalled when the }(hjBhhhNhNubj0)}(h**tty**h]htty}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjBubh device receives a }(hjBhhhNhNubj;)}(h``TIOCGICOUNT``h]h TIOCGICOUNT}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjBubh" ioctl. Passed a kernel structure }(hjBhhhNhNubj0)}(h **icount**h]hicount}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjBubh to complete.}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM\hj8ubh)}(hIOptional: called only if provided, otherwise ``ENOTTY`` will be returned.h](h-Optional: called only if provided, otherwise }(hjBhhhNhNubj;)}(h ``ENOTTY``h]hENOTTY}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjBubh will be returned.}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM_hj8ubh)}(hCalled when the **tty** device receives a ``TIOCGSERIAL`` ioctl. Passed a kernel structure **p** (:c:type:`struct serial_struct `) to complete.h](hCalled when the }(hjChhhNhNubj0)}(h**tty**h]htty}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjCubh device receives a }(hjChhhNhNubj;)}(h``TIOCGSERIAL``h]h TIOCGSERIAL}(hj(ChhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjCubh" ioctl. Passed a kernel structure }(hjChhhNhNubj0)}(h**p**h]hp}(hj:ChhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjCubh (}(hjChhhNhNubh)}(h.:c:type:`struct serial_struct `h]j;)}(hjNCh]hstruct serial_struct}(hjPChhhNhNubah}(h]h ](j6 jc-typeeh"]h$]h&]uh1j:hjLCubah}(h]h ]h"]h$]h&]refdocjB refdomainjreftypetype refexplicitrefwarnjOjH jK serial_structuh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMbhjCubh) to complete.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjkChMbhj8ubh)}(hOptional: called only if provided, otherwise ``ENOTTY`` will be returned. Do not call this function directly, call tty_tiocgserial().h](h-Optional: called only if provided, otherwise }(hjvChhhNhNubj;)}(h ``ENOTTY``h]hENOTTY}(hj~ChhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjvCubhN will be returned. Do not call this function directly, call tty_tiocgserial().}(hjvChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMehj8ubh)}(hCalled when the **tty** device receives a ``TIOCSSERIAL`` ioctl. Passed a kernel structure **p** (:c:type:`struct serial_struct `) to set the values from.h](hCalled when the }(hjChhhNhNubj0)}(h**tty**h]htty}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjCubh device receives a }(hjChhhNhNubj;)}(h``TIOCSSERIAL``h]h TIOCSSERIAL}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjCubh" ioctl. Passed a kernel structure }(hjChhhNhNubj0)}(h**p**h]hp}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjCubh (}(hjChhhNhNubh)}(h.:c:type:`struct serial_struct `h]j;)}(hjCh]hstruct serial_struct}(hjChhhNhNubah}(h]h ](j6 jc-typeeh"]h$]h&]uh1j:hjCubah}(h]h ]h"]h$]h&]refdocjB refdomainjreftypetype refexplicitrefwarnjOjH jK serial_structuh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMihjCubh) to set the values from.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjChMihj8ubh)}(hOptional: called only if provided, otherwise ``ENOTTY`` will be returned. Do not call this function directly, call tty_tiocsserial().h](h-Optional: called only if provided, otherwise }(hjChhhNhNubj;)}(h ``ENOTTY``h]hENOTTY}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjCubhN will be returned. Do not call this function directly, call tty_tiocsserial().}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMlhj8ubh)}(hCalled when the **tty** device file descriptor receives a fdinfo request from VFS (to show in /proc//fdinfo/). **m** should be filled with information.h](hCalled when the }(hj DhhhNhNubj0)}(h**tty**h]htty}(hj(DhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj Dubh] device file descriptor receives a fdinfo request from VFS (to show in /proc//fdinfo/). }(hj DhhhNhNubj0)}(h**m**h]hm}(hj:DhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj Dubh# should be filled with information.}(hj DhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMphj8ubh)}(hOptional: called only if provided, otherwise nothing is written to **m**. Do not call this function directly, call tty_show_fdinfo().h](hCOptional: called only if provided, otherwise nothing is written to }(hjSDhhhNhNubj0)}(h**m**h]hm}(hj[DhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjSDubh=. Do not call this function directly, call tty_show_fdinfo().}(hjSDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMthj8ubh)}(hkgdboc support (Documentation/process/debugging/kgdb.rst). This routine is called to initialize the HW for later use by calling **poll_get_char** or **poll_put_char**.h](hkgdboc support (Documentation/process/debugging/kgdb.rst). This routine is called to initialize the HW for later use by calling }(hjtDhhhNhNubj0)}(h**poll_get_char**h]h poll_get_char}(hj|DhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjtDubh or }(hjtDhhhNhNubj0)}(h**poll_put_char**h]h poll_put_char}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjtDubh.}(hjtDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMxhj8ubh)}(hMOptional: called only if provided, otherwise skipped as a non-polling driver.h]hMOptional: called only if provided, otherwise skipped as a non-polling driver.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhM|hj8ubh)}(hwkgdboc support (see **poll_init**). **driver** should read a character from a tty identified by **line** and return it.h](hkgdboc support (see }(hjDhhhNhNubj0)}(h **poll_init**h]h poll_init}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjDubh). }(hjDhhhNhNubj0)}(h **driver**h]hdriver}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjDubh2 should read a character from a tty identified by }(hjDhhhNhNubj0)}(h**line**h]hline}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjDubh and return it.}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubh)}(h0Optional: called only if **poll_init** provided.h](hOptional: called only if }(hjDhhhNhNubj0)}(h **poll_init**h]h poll_init}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjDubh provided.}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubh)}(hmkgdboc support (see **poll_init**). **driver** should write character **ch** to a tty identified by **line**.h](hkgdboc support (see }(hjEhhhNhNubj0)}(h **poll_init**h]h poll_init}(hj$EhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjEubh). }(hjEhhhNhNubj0)}(h **driver**h]hdriver}(hj6EhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjEubh should write character }(hjEhhhNhNubj0)}(h**ch**h]hch}(hjHEhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjEubh to a tty identified by }(hjEhhhNhNubj0)}(h**line**h]hline}(hjZEhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjEubh.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubh)}(h0Optional: called only if **poll_init** provided.h](hOptional: called only if }(hjsEhhhNhNubj0)}(h **poll_init**h]h poll_init}(hj{EhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjsEubh provided.}(hjsEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubh)}(hDriver **driver** (cast to :c:type:`struct tty_driver `) can show additional info in /proc/tty/driver/. It is enough to fill in the information into **m**.h](hDriver }(hjEhhhNhNubj0)}(h **driver**h]hdriver}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjEubh (cast to }(hjEhhhNhNubh)}(h(:c:type:`struct tty_driver `h]j;)}(hjEh]hstruct tty_driver}(hjEhhhNhNubah}(h]h ](j6 jc-typeeh"]h$]h&]uh1j:hjEubah}(h]h ]h"]h$]h&]refdocjB refdomainjreftypetype refexplicitrefwarnjOjH jK tty_driveruh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhjEubhk) can show additional info in /proc/tty/driver/. It is enough to fill in the information into }(hjEhhhNhNubj0)}(h**m**h]hm}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j/hjEubh.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjEhMhj8ubh)}(hDOptional: called only if provided, otherwise no /proc entry created.h]hDOptional: called only if provided, otherwise no /proc entry created.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj8ubeh}(h]h ]h"]h$]h&]uh1j hj8hKshj-hhubh)}(hThis structure defines the interface between the low-level tty driver and the tty routines. These routines can be defined. Unless noted otherwise, they are optional, and can be filled in with a ``NULL`` pointer.h](hThis structure defines the interface between the low-level tty driver and the tty routines. These routines can be defined. Unless noted otherwise, they are optional, and can be filled in with a }(hjEhhhNhNubj;)}(h``NULL``h]hNULL}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hjEubh pointer.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/driver-api/tty/tty_driver:128: ./include/linux/tty_driver.hhMhj-hhubeh}(h]jah ]h"]tty operations referenceah$]h&]uh1hhhhhhhhK|j Kubeh}(h]tty-driver-and-tty-operationsah ]h"]tty driver and tty operationsah$]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_handlerjRFerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}(tty driver reference]jatty driver flags]jNaregistering devices]j alinking devices to ports]jatty operations reference]jaurefids}nameids}(j,Fj)Fjjj jj j!j&jOjjnj&jj-jj$Fju nametypes}(j,Fjj j j&jj&j-j$Fuh}(j)Fhjhjjjjjjjjj!jjjjOj j, j1 jjjnj"j jj(j-jjjjjWj\jjj!j!jj&j&j&jj-j'.j-.hhjjjIj@jhj_jjjjjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j`FKsRparse_messages]transform_messages] transformerN include_log] decorationNhhub.