[bootlin/training-materials updates] master: kernel: remove deprecated input_polled_dev subsystem (58e6bc3d)
Alexandre Belloni
alexandre.belloni at bootlin.com
Wed Nov 18 23:40:37 CET 2020
Repository : https://github.com/bootlin/training-materials
On branch : master
Link : https://github.com/bootlin/training-materials/commit/58e6bc3d1c3de8bb324348d17e59f43e53b52585
>---------------------------------------------------------------
commit 58e6bc3d1c3de8bb324348d17e59f43e53b52585
Author: Alexandre Belloni <alexandre.belloni at bootlin.com>
Date: Wed Nov 18 23:40:37 2020 +0100
kernel: remove deprecated input_polled_dev subsystem
Signed-off-by: Alexandre Belloni <alexandre.belloni at bootlin.com>
>---------------------------------------------------------------
58e6bc3d1c3de8bb324348d17e59f43e53b52585
labs/kernel-i2c-input-interface/device-pointers.c | 2 +-
.../input-device-attributes.c | 1 -
.../input-notification.c | 8 +-
.../kernel-i2c-input-interface.tex | 33 +-
slides/kernel-input/input-subsystem-diagram.dia | 733 +++++++++++----------
slides/kernel-input/kernel-input.tex | 50 +-
6 files changed, 396 insertions(+), 431 deletions(-)
diff --git a/labs/kernel-i2c-input-interface/device-pointers.c b/labs/kernel-i2c-input-interface/device-pointers.c
index 46f0d9d7..658c0a7b 100644
--- a/labs/kernel-i2c-input-interface/device-pointers.c
+++ b/labs/kernel-i2c-input-interface/device-pointers.c
@@ -1,2 +1,2 @@
nunchuk->i2c_client = client;
-polled_input->private = nunchuk;
+input_set_drvdata(input, nunchuk);
diff --git a/labs/kernel-i2c-input-interface/input-device-attributes.c b/labs/kernel-i2c-input-interface/input-device-attributes.c
index 87257c08..8dea4e1e 100644
--- a/labs/kernel-i2c-input-interface/input-device-attributes.c
+++ b/labs/kernel-i2c-input-interface/input-device-attributes.c
@@ -1,4 +1,3 @@
-input = polled_input->input;
input->name = "Wii Nunchuk";
input->id.bustype = BUS_I2C;
diff --git a/labs/kernel-i2c-input-interface/input-notification.c b/labs/kernel-i2c-input-interface/input-notification.c
index e11de43f..ffcccfa6 100644
--- a/labs/kernel-i2c-input-interface/input-notification.c
+++ b/labs/kernel-i2c-input-interface/input-notification.c
@@ -1,5 +1,3 @@
-input_event(polled_input->input,
- EV_KEY, BTN_Z, zpressed);
-input_event(polled_input->input,
- EV_KEY, BTN_C, cpressed);
-input_sync(polled_input->input);
+input_event(input, EV_KEY, BTN_Z, zpressed);
+input_event(input, EV_KEY, BTN_C, cpressed);
+input_sync(input);
diff --git a/labs/kernel-i2c-input-interface/kernel-i2c-input-interface.tex b/labs/kernel-i2c-input-interface/kernel-i2c-input-interface.tex
index ba9ddf5e..ee2f463b 100644
--- a/labs/kernel-i2c-input-interface/kernel-i2c-input-interface.tex
+++ b/labs/kernel-i2c-input-interface/kernel-i2c-input-interface.tex
@@ -20,10 +20,10 @@ its state has changed. Therefore, the only way to access device data
and detect changes is to regularly poll its registers, using the input
polling API described in the lectures.
-Rebuild your kernel with static support for polled input device
-(\kconfigval{CONFIG_INPUT_POLLDEV}{y}) and for event interface
-(\kconfig{CONFIG_INPUT_EVDEV}) support. With the default configuration,
-these features are available as modules, which is less convenient.
+Rebuild your kernel with static support event interface
+(\kconfig{CONFIG_INPUT_EVDEV}) support. With the default
+configuration, this feature is available as a module, which is less
+convenient.
Update and reboot your kernel.
@@ -33,19 +33,14 @@ The first thing to do is to add an input device to the system. Here are
the steps to do it:
\begin{itemize}
-\item Declare a pointer to an \ksym{input_polled_dev} structure in the
- \code{probe} routine. You can call it \code{polled_input}.
+\item Declare a pointer to an \ksym{input_dev} structure in the
+ \code{probe} routine. You can call it \code{input}.
You can't use a global variable because your driver needs to be
able to support multiple devices.
\item Allocate such a structure in the same function, using the
- \kfunc{devm_input_allocate_polled_device} function.
-\item Also declare a pointer to an \ksym{input_dev} structure. You can
- call it \code{input}. We won't need to allocate it, because it
- is already part of the \ksym{input_polled_dev} structure,
- and allocated at the same time.
- We will use this as a shortcut to keep the code simple.
+ \kfunc{devm_input_allocate_device} function.
\item Still in the \code{probe()} function, add the input device to
- the system by calling \kfunc{input_register_polled_device};
+ the system by calling \kfunc{input_register_device};
\end{itemize}
At this stage, first make sure that your module compiles well (add
@@ -73,7 +68,7 @@ and registered in the \code{probe()} routine.
Fortunately, in our case, there's nothing to do, as everything
was allocated with \code{devm_} functions. Even the unregistration
-of the \ksym{input_polled_dev} structure is automated.
+of the \ksym{input_dev} structure is automated.
Recompile your module, and load it and remove it multiple times, to
make sure that everything is properly registered and automatically
@@ -104,10 +99,10 @@ It's time to implement the routine which will poll the nunchuk registers
at a regular interval.
Create a \code{nunchuk_poll()} function with the right prototype (find
-it by looking at the definition of the \ksym{input_polled_dev} structure.
+it by looking at the definition of the \ksym{input_setup_polling} function.)
In this function, you will have to read the nunchuk registers. However,
-as you can see, the prototype of the \code{poll()} routine doesn't
+as you can see, the prototype of the \code{poll_fn()} routine doesn't
carry any information about the \ksym{i2c_client} structure you will
need to communicate with the device. That's normal as the input
subsystem is generic, and can't be bound to any specific bus.
@@ -162,7 +157,7 @@ don't want to enable a device with incomplete information or when it is
not completely yet (there could be race conditions).
So, back to the \code{nunchuk_poll()} function, you will first need to
-retrieve the I2C physical device from the \ksym{input_polled_dev}
+retrieve the I2C physical device from the \ksym{input_dev}
structure. That's where you will use your private \code{nunchuk}
structure.
@@ -176,8 +171,8 @@ reading registers fails, you can use a \code{return;} statement instead
of \code{return value;}}.
At the end of the polling routine, the last thing to do is post the events
-and notify the \code{input} core. Assuming that \code{polled_input} is the
-name of the \code{input_polled_dev} parameter of your polling routine:
+and notify the \code{input} core. Assuming that \code{input} is the
+name of the \code{input_dev} parameter of your polling routine:
\sourcecode{labs/kernel-i2c-input-interface/input-notification.c}
diff --git a/slides/kernel-input/input-subsystem-diagram.dia b/slides/kernel-input/input-subsystem-diagram.dia
index a083cbca..6f990e7f 100644
--- a/slides/kernel-input/input-subsystem-diagram.dia
+++ b/slides/kernel-input/input-subsystem-diagram.dia
@@ -78,80 +78,10 @@
<dia:int val="1"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="1" to="O16" connection="1"/>
- </dia:connections>
- </dia:object>
- <dia:object type="Standard - ZigZagLine" version="1" id="O1">
- <dia:attribute name="obj_pos">
- <dia:point val="22.25,19"/>
- </dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="22.2,18.95;25.55,20.1"/>
- </dia:attribute>
- <dia:attribute name="orth_points">
- <dia:point val="22.25,19"/>
- <dia:point val="22.25,19.4"/>
- <dia:point val="25.5,19.4"/>
- <dia:point val="25.5,20.05"/>
- </dia:attribute>
- <dia:attribute name="orth_orient">
- <dia:enum val="1"/>
- <dia:enum val="0"/>
- <dia:enum val="1"/>
- </dia:attribute>
- <dia:attribute name="autorouting">
- <dia:boolean val="false"/>
- </dia:attribute>
- <dia:connections>
- <dia:connection handle="0" to="O5" connection="6"/>
- <dia:connection handle="1" to="O14" connection="1"/>
- </dia:connections>
- </dia:object>
- <dia:object type="Standard - ZigZagLine" version="1" id="O2">
- <dia:attribute name="obj_pos">
- <dia:point val="22.25,19"/>
- </dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="19.45,18.95;22.3,20.1"/>
- </dia:attribute>
- <dia:attribute name="orth_points">
- <dia:point val="22.25,19"/>
- <dia:point val="22.25,19.4"/>
- <dia:point val="19.5,19.4"/>
- <dia:point val="19.5,20.05"/>
- </dia:attribute>
- <dia:attribute name="orth_orient">
- <dia:enum val="1"/>
- <dia:enum val="0"/>
- <dia:enum val="1"/>
- </dia:attribute>
- <dia:attribute name="autorouting">
- <dia:boolean val="false"/>
- </dia:attribute>
- <dia:connections>
- <dia:connection handle="0" to="O5" connection="6"/>
- <dia:connection handle="1" to="O12" connection="1"/>
- </dia:connections>
- </dia:object>
- <dia:object type="Standard - Line" version="0" id="O3">
- <dia:attribute name="obj_pos">
- <dia:point val="22.25,16.05"/>
- </dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="22.2,16;22.3,17.05"/>
- </dia:attribute>
- <dia:attribute name="conn_endpoints">
- <dia:point val="22.25,16.05"/>
- <dia:point val="22.25,17"/>
- </dia:attribute>
- <dia:attribute name="numcp">
- <dia:int val="1"/>
- </dia:attribute>
- <dia:connections>
- <dia:connection handle="1" to="O5" connection="1"/>
+ <dia:connection handle="1" to="O7" connection="1"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Box" version="0" id="O4">
+ <dia:object type="Standard - Box" version="0" id="O1">
<dia:attribute name="obj_pos">
<dia:point val="22,0"/>
</dia:attribute>
@@ -180,36 +110,7 @@
<dia:boolean val="true"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Box" version="0" id="O5">
- <dia:attribute name="obj_pos">
- <dia:point val="18,17"/>
- </dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="17.95,16.95;26.55,19.05"/>
- </dia:attribute>
- <dia:attribute name="elem_corner">
- <dia:point val="18,17"/>
- </dia:attribute>
- <dia:attribute name="elem_width">
- <dia:real val="8.5"/>
- </dia:attribute>
- <dia:attribute name="elem_height">
- <dia:real val="2"/>
- </dia:attribute>
- <dia:attribute name="border_width">
- <dia:real val="0.10000000149011612"/>
- </dia:attribute>
- <dia:attribute name="border_color">
- <dia:color val="#a32804"/>
- </dia:attribute>
- <dia:attribute name="inner_color">
- <dia:color val="#ffd192"/>
- </dia:attribute>
- <dia:attribute name="show_background">
- <dia:boolean val="true"/>
- </dia:attribute>
- </dia:object>
- <dia:object type="Standard - Line" version="0" id="O6">
+ <dia:object type="Standard - Line" version="0" id="O2">
<dia:attribute name="obj_pos">
<dia:point val="10,3"/>
</dia:attribute>
@@ -224,7 +125,7 @@
<dia:int val="1"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Box" version="0" id="O7">
+ <dia:object type="Standard - Box" version="0" id="O3">
<dia:attribute name="obj_pos">
<dia:point val="17.5,10.87"/>
</dia:attribute>
@@ -253,7 +154,7 @@
<dia:boolean val="true"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Box" version="0" id="O8">
+ <dia:object type="Standard - Box" version="0" id="O4">
<dia:attribute name="obj_pos">
<dia:point val="17.5,4.05"/>
</dia:attribute>
@@ -282,12 +183,12 @@
<dia:boolean val="true"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O9">
+ <dia:object type="Standard - Text" version="1" id="O5">
<dia:attribute name="obj_pos">
<dia:point val="26,1"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="22.7675,0.64125;29.2325,1.35875"/>
+ <dia:rectangle val="23.0175,0.531841;28.9825,1.46816"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -301,7 +202,7 @@
<dia:real val="0.80000000000000004"/>
</dia:attribute>
<dia:attribute name="pos">
- <dia:point val="26,1.22125"/>
+ <dia:point val="26,1.2704"/>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#000000"/>
@@ -315,15 +216,15 @@
<dia:enum val="2"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O4" connection="8"/>
+ <dia:connection handle="0" to="O1" connection="8"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O10">
+ <dia:object type="Standard - Text" version="1" id="O6">
<dia:attribute name="obj_pos">
<dia:point val="26,5.05"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="23.0512,4.69125;28.9488,5.40875"/>
+ <dia:rectangle val="23.235,4.58184;28.765,5.51816"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -337,176 +238,7 @@
<dia:real val="0.80000000000000004"/>
</dia:attribute>
<dia:attribute name="pos">
- <dia:point val="26,5.27125"/>
- </dia:attribute>
- <dia:attribute name="color">
- <dia:color val="#000000"/>
- </dia:attribute>
- <dia:attribute name="alignment">
- <dia:enum val="1"/>
- </dia:attribute>
- </dia:composite>
- </dia:attribute>
- <dia:attribute name="valign">
- <dia:enum val="2"/>
- </dia:attribute>
- <dia:connections>
- <dia:connection handle="0" to="O8" connection="8"/>
- </dia:connections>
- </dia:object>
- <dia:object type="Standard - Text" version="1" id="O11">
- <dia:attribute name="obj_pos">
- <dia:point val="22.25,18"/>
- </dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="20.6163,17.2413;23.8837,18.7587"/>
- </dia:attribute>
- <dia:attribute name="text">
- <dia:composite type="text">
- <dia:attribute name="string">
- <dia:string>#polled input
-subsystem#</dia:string>
- </dia:attribute>
- <dia:attribute name="font">
- <dia:font family="Latin Modern Sans" style="0" name="Courier"/>
- </dia:attribute>
- <dia:attribute name="height">
- <dia:real val="0.80000000000000004"/>
- </dia:attribute>
- <dia:attribute name="pos">
- <dia:point val="22.25,17.8212"/>
- </dia:attribute>
- <dia:attribute name="color">
- <dia:color val="#000000"/>
- </dia:attribute>
- <dia:attribute name="alignment">
- <dia:enum val="1"/>
- </dia:attribute>
- </dia:composite>
- </dia:attribute>
- <dia:attribute name="valign">
- <dia:enum val="2"/>
- </dia:attribute>
- <dia:connections>
- <dia:connection handle="0" to="O5" connection="8"/>
- </dia:connections>
- </dia:object>
- <dia:object type="Standard - Box" version="0" id="O12">
- <dia:attribute name="obj_pos">
- <dia:point val="17,20.05"/>
- </dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="16.95,20;22.05,22.1"/>
- </dia:attribute>
- <dia:attribute name="elem_corner">
- <dia:point val="17,20.05"/>
- </dia:attribute>
- <dia:attribute name="elem_width">
- <dia:real val="5"/>
- </dia:attribute>
- <dia:attribute name="elem_height">
- <dia:real val="2"/>
- </dia:attribute>
- <dia:attribute name="border_width">
- <dia:real val="0.10000000149011612"/>
- </dia:attribute>
- <dia:attribute name="border_color">
- <dia:color val="#2f004a"/>
- </dia:attribute>
- <dia:attribute name="inner_color">
- <dia:color val="#efb9ff"/>
- </dia:attribute>
- <dia:attribute name="show_background">
- <dia:boolean val="true"/>
- </dia:attribute>
- </dia:object>
- <dia:object type="Standard - Text" version="1" id="O13">
- <dia:attribute name="obj_pos">
- <dia:point val="19.5,21.05"/>
- </dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="17.8663,20.2912;21.1337,21.8087"/>
- </dia:attribute>
- <dia:attribute name="text">
- <dia:composite type="text">
- <dia:attribute name="string">
- <dia:string>#polled input
-driver 1#</dia:string>
- </dia:attribute>
- <dia:attribute name="font">
- <dia:font family="Latin Modern Sans" style="0" name="Courier"/>
- </dia:attribute>
- <dia:attribute name="height">
- <dia:real val="0.80000000000000004"/>
- </dia:attribute>
- <dia:attribute name="pos">
- <dia:point val="19.5,20.8712"/>
- </dia:attribute>
- <dia:attribute name="color">
- <dia:color val="#000000"/>
- </dia:attribute>
- <dia:attribute name="alignment">
- <dia:enum val="1"/>
- </dia:attribute>
- </dia:composite>
- </dia:attribute>
- <dia:attribute name="valign">
- <dia:enum val="2"/>
- </dia:attribute>
- <dia:connections>
- <dia:connection handle="0" to="O12" connection="8"/>
- </dia:connections>
- </dia:object>
- <dia:object type="Standard - Box" version="0" id="O14">
- <dia:attribute name="obj_pos">
- <dia:point val="23,20.05"/>
- </dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="22.95,20;28.05,22.1"/>
- </dia:attribute>
- <dia:attribute name="elem_corner">
- <dia:point val="23,20.05"/>
- </dia:attribute>
- <dia:attribute name="elem_width">
- <dia:real val="5"/>
- </dia:attribute>
- <dia:attribute name="elem_height">
- <dia:real val="2"/>
- </dia:attribute>
- <dia:attribute name="border_width">
- <dia:real val="0.10000000149011612"/>
- </dia:attribute>
- <dia:attribute name="border_color">
- <dia:color val="#2f004a"/>
- </dia:attribute>
- <dia:attribute name="inner_color">
- <dia:color val="#efb9ff"/>
- </dia:attribute>
- <dia:attribute name="show_background">
- <dia:boolean val="true"/>
- </dia:attribute>
- </dia:object>
- <dia:object type="Standard - Text" version="1" id="O15">
- <dia:attribute name="obj_pos">
- <dia:point val="25.5,21.05"/>
- </dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="23.8663,20.2912;27.1337,21.8087"/>
- </dia:attribute>
- <dia:attribute name="text">
- <dia:composite type="text">
- <dia:attribute name="string">
- <dia:string>#polled input
-driver 2#</dia:string>
- </dia:attribute>
- <dia:attribute name="font">
- <dia:font family="Latin Modern Sans" style="0" name="Courier"/>
- </dia:attribute>
- <dia:attribute name="height">
- <dia:real val="0.80000000000000004"/>
- </dia:attribute>
- <dia:attribute name="pos">
- <dia:point val="25.5,20.8712"/>
+ <dia:point val="26,5.3204"/>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#000000"/>
@@ -520,10 +252,10 @@ driver 2#</dia:string>
<dia:enum val="2"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O14" connection="8"/>
+ <dia:connection handle="0" to="O4" connection="8"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Box" version="0" id="O16">
+ <dia:object type="Standard - Box" version="0" id="O7">
<dia:attribute name="obj_pos">
<dia:point val="29,20"/>
</dia:attribute>
@@ -552,18 +284,18 @@ driver 2#</dia:string>
<dia:boolean val="true"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O17">
+ <dia:object type="Standard - Text" version="1" id="O8">
<dia:attribute name="obj_pos">
<dia:point val="31.5,21"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="30.4163,20.2413;32.5838,21.7587"/>
+ <dia:rectangle val="30.4375,20.0967;32.5859,21.9033"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
<dia:attribute name="string">
<dia:string>#input
-driver A#</dia:string>
+driver C#</dia:string>
</dia:attribute>
<dia:attribute name="font">
<dia:font family="Latin Modern Sans" style="0" name="Courier"/>
@@ -572,7 +304,7 @@ driver A#</dia:string>
<dia:real val="0.80000000000000004"/>
</dia:attribute>
<dia:attribute name="pos">
- <dia:point val="31.5,20.8212"/>
+ <dia:point val="31.5,20.8587"/>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#000000"/>
@@ -586,15 +318,15 @@ driver A#</dia:string>
<dia:enum val="2"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O16" connection="8"/>
+ <dia:connection handle="0" to="O7" connection="8"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O18">
+ <dia:object type="Standard - Text" version="1" id="O9">
<dia:attribute name="obj_pos">
<dia:point val="38.8969,2.6"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="38.8969,2.02;42.1294,2.7375"/>
+ <dia:rectangle val="38.8969,1.86144;41.7519,2.79776"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -622,12 +354,12 @@ driver A#</dia:string>
<dia:enum val="3"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O19">
+ <dia:object type="Standard - Text" version="1" id="O10">
<dia:attribute name="obj_pos">
<dia:point val="40.1969,3.85"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="40.1969,3.27;42.0444,3.9875"/>
+ <dia:rectangle val="40.1969,3.11144;41.9144,4.04776"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -655,7 +387,7 @@ driver A#</dia:string>
<dia:enum val="3"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Line" version="0" id="O20">
+ <dia:object type="Standard - Line" version="0" id="O11">
<dia:attribute name="obj_pos">
<dia:point val="26,2"/>
</dia:attribute>
@@ -679,11 +411,11 @@ driver A#</dia:string>
<dia:real val="0.5"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O4" connection="6"/>
- <dia:connection handle="1" to="O8" connection="1"/>
+ <dia:connection handle="0" to="O1" connection="6"/>
+ <dia:connection handle="1" to="O4" connection="1"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Line" version="0" id="O21">
+ <dia:object type="Standard - Line" version="0" id="O12">
<dia:attribute name="obj_pos">
<dia:point val="26,9.19"/>
</dia:attribute>
@@ -707,11 +439,11 @@ driver A#</dia:string>
<dia:real val="0.5"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O22" connection="6"/>
- <dia:connection handle="1" to="O7" connection="1"/>
+ <dia:connection handle="0" to="O13" connection="6"/>
+ <dia:connection handle="1" to="O3" connection="1"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Box" version="0" id="O22">
+ <dia:object type="Standard - Box" version="0" id="O13">
<dia:attribute name="obj_pos">
<dia:point val="17.5,7.19"/>
</dia:attribute>
@@ -740,12 +472,12 @@ driver A#</dia:string>
<dia:boolean val="true"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O23">
+ <dia:object type="Standard - Text" version="1" id="O14">
<dia:attribute name="obj_pos">
<dia:point val="26,8.19"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="23.1225,7.83125;28.8775,8.54875"/>
+ <dia:rectangle val="23.24,7.72184;28.76,8.65816"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -759,7 +491,7 @@ driver A#</dia:string>
<dia:real val="0.80000000000000004"/>
</dia:attribute>
<dia:attribute name="pos">
- <dia:point val="26,8.41125"/>
+ <dia:point val="26,8.4604"/>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#000000"/>
@@ -773,10 +505,10 @@ driver A#</dia:string>
<dia:enum val="2"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O22" connection="8"/>
+ <dia:connection handle="0" to="O13" connection="8"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Line" version="0" id="O24">
+ <dia:object type="Standard - Line" version="0" id="O15">
<dia:attribute name="obj_pos">
<dia:point val="26,6.05"/>
</dia:attribute>
@@ -800,16 +532,16 @@ driver A#</dia:string>
<dia:real val="0.5"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O8" connection="6"/>
- <dia:connection handle="1" to="O22" connection="8"/>
+ <dia:connection handle="0" to="O4" connection="6"/>
+ <dia:connection handle="1" to="O13" connection="8"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O25">
+ <dia:object type="Standard - Text" version="1" id="O16">
<dia:attribute name="obj_pos">
<dia:point val="26,13.435"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="24.3313,12.6763;27.6687,14.1938"/>
+ <dia:rectangle val="24.505,12.5771;27.495,14.2929"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -824,7 +556,7 @@ subsystem#</dia:string>
<dia:real val="0.80000000000000004"/>
</dia:attribute>
<dia:attribute name="pos">
- <dia:point val="26,13.2563"/>
+ <dia:point val="26,13.3028"/>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#000000"/>
@@ -838,51 +570,15 @@ subsystem#</dia:string>
<dia:enum val="2"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O7" connection="8"/>
- </dia:connections>
- </dia:object>
- <dia:object type="Standard - Text" version="1" id="O26">
- <dia:attribute name="obj_pos">
- <dia:point val="25.5,21.05"/>
- </dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="25.5,20.47;25.5,21.1875"/>
- </dia:attribute>
- <dia:attribute name="text">
- <dia:composite type="text">
- <dia:attribute name="string">
- <dia:string>##</dia:string>
- </dia:attribute>
- <dia:attribute name="font">
- <dia:font family="Latin Modern Sans" style="0" name="Courier"/>
- </dia:attribute>
- <dia:attribute name="height">
- <dia:real val="0.80000000000000004"/>
- </dia:attribute>
- <dia:attribute name="pos">
- <dia:point val="25.5,21.05"/>
- </dia:attribute>
- <dia:attribute name="color">
- <dia:color val="#000000"/>
- </dia:attribute>
- <dia:attribute name="alignment">
- <dia:enum val="0"/>
- </dia:attribute>
- </dia:composite>
- </dia:attribute>
- <dia:attribute name="valign">
- <dia:enum val="3"/>
- </dia:attribute>
- <dia:connections>
- <dia:connection handle="0" to="O14" connection="8"/>
+ <dia:connection handle="0" to="O3" connection="8"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O27">
+ <dia:object type="Standard - Text" version="1" id="O17">
<dia:attribute name="obj_pos">
<dia:point val="31.5,21"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="31.5,20.42;31.5,21.1375"/>
+ <dia:rectangle val="31.5,20.2614;31.5,21.1978"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -910,15 +606,15 @@ subsystem#</dia:string>
<dia:enum val="3"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O16" connection="8"/>
+ <dia:connection handle="0" to="O7" connection="8"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O28">
+ <dia:object type="Standard - Text" version="1" id="O18">
<dia:attribute name="obj_pos">
<dia:point val="26,13.27"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="26,12.69;26,13.4075"/>
+ <dia:rectangle val="26,12.5314;26,13.4678"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -946,7 +642,7 @@ subsystem#</dia:string>
<dia:enum val="3"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Line" version="0" id="O29">
+ <dia:object type="Standard - Line" version="0" id="O19">
<dia:attribute name="obj_pos">
<dia:point val="17.5,13.435"/>
</dia:attribute>
@@ -970,16 +666,16 @@ subsystem#</dia:string>
<dia:enum val="1"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O7" connection="3"/>
- <dia:connection handle="1" to="O7" connection="4"/>
+ <dia:connection handle="0" to="O3" connection="3"/>
+ <dia:connection handle="1" to="O3" connection="4"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O30">
+ <dia:object type="Standard - Text" version="1" id="O20">
<dia:attribute name="obj_pos">
<dia:point val="26,11.785"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="23.815,11.205;28.185,11.9225"/>
+ <dia:rectangle val="23.9713,11.0464;28.0288,11.9828"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -1007,12 +703,12 @@ subsystem#</dia:string>
<dia:enum val="3"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O31">
+ <dia:object type="Standard - Text" version="1" id="O21">
<dia:attribute name="obj_pos">
<dia:point val="26,15.47"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="24.2425,14.89;27.7575,15.6075"/>
+ <dia:rectangle val="24.3212,14.7314;27.6788,15.6678"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -1040,12 +736,12 @@ subsystem#</dia:string>
<dia:enum val="3"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O32">
+ <dia:object type="Standard - Text" version="1" id="O22">
<dia:attribute name="obj_pos">
<dia:point val="26,15.37"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="26,14.79;26,15.5075"/>
+ <dia:rectangle val="26,14.6314;26,15.5678"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -1073,12 +769,12 @@ subsystem#</dia:string>
<dia:enum val="3"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O33">
+ <dia:object type="Standard - Text" version="1" id="O23">
<dia:attribute name="obj_pos">
<dia:point val="26,15.47"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="26,14.89;26,15.6075"/>
+ <dia:rectangle val="26,14.7314;26,15.6678"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -1106,12 +802,12 @@ subsystem#</dia:string>
<dia:enum val="3"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O34">
+ <dia:object type="Standard - Text" version="1" id="O24">
<dia:attribute name="obj_pos">
<dia:point val="26,13.02"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="26,12.44;26,13.1575"/>
+ <dia:rectangle val="26,12.2814;26,13.2178"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -1139,12 +835,12 @@ subsystem#</dia:string>
<dia:enum val="3"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O35">
+ <dia:object type="Standard - Text" version="1" id="O25">
<dia:attribute name="obj_pos">
<dia:point val="31.1112,20.789"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="31.1112,20.209;31.1112,20.9265"/>
+ <dia:rectangle val="31.1112,20.0504;31.1112,20.9868"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
@@ -1172,5 +868,312 @@ subsystem#</dia:string>
<dia:enum val="3"/>
</dia:attribute>
</dia:object>
+ <dia:object type="Standard - Line" version="0" id="O26">
+ <dia:attribute name="obj_pos">
+ <dia:point val="20.5,16"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="20.45,15.95;20.55,20.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="20.5,16"/>
+ <dia:point val="20.5,20"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="1" to="O27" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Box" version="0" id="O27">
+ <dia:attribute name="obj_pos">
+ <dia:point val="18,20"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="17.95,19.95;23.05,22.05"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="18,20"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="5"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.10000000149011612"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#2f004a"/>
+ </dia:attribute>
+ <dia:attribute name="inner_color">
+ <dia:color val="#efb9ff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O28">
+ <dia:attribute name="obj_pos">
+ <dia:point val="20.5,21"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="19.4288,20.1318;21.5712,21.8682"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#input
+driver A#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="Latin Modern Sans" style="0" name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="20.5,20.8704"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O27" connection="8"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O29">
+ <dia:attribute name="obj_pos">
+ <dia:point val="20.5,21"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="20.5,20.2614;20.5,21.1978"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>##</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="Latin Modern Sans" style="0" name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="20.5,21"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="3"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O27" connection="8"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O30">
+ <dia:attribute name="obj_pos">
+ <dia:point val="20.1112,20.789"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="20.1112,20.0504;20.1112,20.9868"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>##</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="Latin Modern Sans" style="0" name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="20.1112,20.789"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="3"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O31">
+ <dia:attribute name="obj_pos">
+ <dia:point val="26,16"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="25.95,15.95;26.05,20.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="26,16"/>
+ <dia:point val="26,20"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O3" connection="6"/>
+ <dia:connection handle="1" to="O32" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Box" version="0" id="O32">
+ <dia:attribute name="obj_pos">
+ <dia:point val="23.5,20"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="23.45,19.95;28.55,22.05"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="23.5,20"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="5"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.10000000149011612"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#2f004a"/>
+ </dia:attribute>
+ <dia:attribute name="inner_color">
+ <dia:color val="#efb9ff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O33">
+ <dia:attribute name="obj_pos">
+ <dia:point val="26,21"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="24.9288,20.0967;27.0947,21.9033"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#input
+driver B#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="Latin Modern Sans" style="0" name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="26,20.8587"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O32" connection="8"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O34">
+ <dia:attribute name="obj_pos">
+ <dia:point val="26,21"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="26,20.2614;26,21.1978"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>##</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="Latin Modern Sans" style="0" name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="26,21"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="3"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O32" connection="8"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O35">
+ <dia:attribute name="obj_pos">
+ <dia:point val="25.6112,20.789"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="25.6112,20.0504;25.6112,20.9868"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>##</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="Latin Modern Sans" style="0" name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="25.6112,20.789"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="3"/>
+ </dia:attribute>
+ </dia:object>
</dia:layer>
</dia:diagram>
diff --git a/slides/kernel-input/kernel-input.tex b/slides/kernel-input/kernel-input.tex
index 3d1aa1b1..92b7789c 100644
--- a/slides/kernel-input/kernel-input.tex
+++ b/slides/kernel-input/kernel-input.tex
@@ -150,50 +150,20 @@ static void usb_mouse_irq(struct urb *urb)
\end{block}
\end{frame}
-\begin{frame}[fragile]{Polled input subclass}
+\begin{frame}[fragile]{Polling input devices}
\begin{itemize}
- \item The input subsystem provides a subclass supporting simple input
+ \item The input subsystem provides an API to support simple input
devices that {\em do not raise interrupts} but have to be {\em
periodically scanned or polled} to detect changes in their
state.
- \item A {\em polled input device} is described by a
- \kstruct{input_polled_dev} structure:
- \begin{block}{}
- \begin{minted}[fontsize=\footnotesize]{c}
-struct input_polled_dev {
- void *private;
- void (*open)(struct input_polled_dev *dev);
- void (*close)(struct input_polled_dev *dev);
- void (*poll)(struct input_polled_dev *dev);
- unsigned int poll_interval; /* msec */
- unsigned int poll_interval_max; /* msec */
- unsigned int poll_interval_min; /* msec */
- struct input_dev *input;
-/* private: */
- struct delayed_work work;
-}
- \end{minted}
- \end{block}
- \end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{Polled input subsystem API}
- \begin{itemize}
- \item Allocating the \kstruct{input_polled_dev} structure is
- done using \kfunc{devm_input_allocate_polled_device}
- \item Among the handlers of the \kstruct{input_polled_dev} only the
- \code{poll()} method is mandatory, this function polls the device
- and posts input events.
- \item The fields \code{id}, \code{name}, \code{evbit} and \code{keybit} of
- the \kstruct{input} structure must be initialized too.
- \item If none of the \code{poll_interval} fields are filled then the
- default poll interval is 500ms.
- \item The device registration/unregistration is done with:
- \begin{itemize}
- \item \code{input_register_polled_device(struct input_polled_dev *dev)}.
- \item Unregistration is automatic after using
- \kfunc{devm_input_allocate_polled_device}!
- \end{itemize}
+ \item Setting up polling is done using \kfunc{input_setup_polling}:
+ \code{int input_setup_polling(struct input_dev *dev, void (*poll_fn)(struct input_dev *dev));}
+ \item \code{poll_fn} is the function that will be called
+ periodically.
+ \item The polling interval can be set using
+ \kfunc{input_set_poll_interval} or
+ \kfunc{input_set_min_poll_interval} and
+ \kfunc{input_set_max_poll_interval}
\end{itemize}
\end{frame}
More information about the training-materials-updates
mailing list