mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 0/9] docs/zh_CN: align translation paths and update guides
@ 2026-10-27 10:25 Dongliang Mu
  2026-10-27 10:25 ` [PATCH 1/9] docs/zh_CN: update admin-guide/index.rst translation Dongliang Mu
                   ` (8 more replies)
  0 siblings, 9 replies; 13+ messages in thread
From: Dongliang Mu @ 2026-10-27 10:25 UTC (permalink / raw)
  To: Alex Shi, Yanteng Si
  Cc: Jonathan Corbet, Shuah Khan, Randy Dunlap, linux-doc, linux-kernel

Some Chinese translations remain at older paths after their English
sources moved. Align the affected files with the matching English RST
paths and update their index entries. Remove two stale :Original: fields
that point to unrelated English documents.

The series moves the GDB debugging, magic-number, GFS2, and XFRM
translations. It also replaces legacy video4linux text with media
administrator and V4L2 driver API RST pages, and refreshes selected
guides and indexes to track newer English commits.

Dongliang Mu (9):
  docs/zh_CN: update admin-guide/index.rst translation
  docs/zh_CN: update admin-guide/README.rst translation
  docs/zh_CN: add media administrator guide translations
  docs/zh_CN: reorganize process debugging guides
  docs/zh_CN: update magic-number to match upstream
  docs/zh_CN: reorganize media driver API translations
  docs/zh_CN: move GFS2 translations into filesystems/gfs2
  docs/zh_CN: update networking/xfrm/xfrm_proc.rst translation
  docs/zh_CN: remove stale Original fields from SCSI and IPE
    translations

 .../translations/zh_CN/admin-guide/README.rst |  89 +-
 .../translations/zh_CN/admin-guide/index.rst  |  12 +-
 .../zh_CN/admin-guide/media/index.rst         |  54 +
 .../zh_CN/admin-guide/media/omap3isp.rst      |  95 ++
 .../zh_CN/admin-guide/media/v4l-drivers.rst   |  44 +
 .../translations/zh_CN/dev-tools/index.rst    |  37 +-
 .../translations/zh_CN/driver-api/index.rst   | 232 +++--
 .../zh_CN/driver-api/media/index.rst          |  52 +
 .../zh_CN/driver-api/media/v4l2-core.rst      |  36 +
 .../zh_CN/driver-api/media/v4l2-dev.rst       | 286 ++++++
 .../zh_CN/driver-api/media/v4l2-device.rst    | 127 +++
 .../zh_CN/driver-api/media/v4l2-event.rst     | 124 +++
 .../zh_CN/driver-api/media/v4l2-fh.rst        | 123 +++
 .../zh_CN/driver-api/media/v4l2-intro.rst     |  75 ++
 .../zh_CN/driver-api/media/v4l2-subdev.rst    | 491 +++++++++
 .../{gfs2-glocks.rst => gfs2/glocks.rst}      |   4 +-
 .../filesystems/{gfs2.rst => gfs2/index.rst}  |  18 +-
 .../{gfs2-uevents.rst => gfs2/uevents.rst}    |   4 +-
 .../translations/zh_CN/filesystems/index.rst  | 112 +-
 .../translations/zh_CN/networking/index.rst   | 238 +++--
 .../zh_CN/networking/xfrm/index.rst           |  20 +
 .../zh_CN/networking/{ => xfrm}/xfrm_proc.rst |   4 +-
 .../zh_CN/process/applying-patches.rst        |   2 +
 .../debugging}/gdb-kernel-debugging.rst       |  15 +-
 .../zh_CN/process/debugging/index.rst         |  62 ++
 .../translations/zh_CN/process/index.rst      | 111 +-
 .../translations/zh_CN/scsi/wd719x.rst        |   2 -
 .../translations/zh_CN/security/ipe.rst       |   2 -
 .../translations/zh_CN/staging/index.rst      |   6 +-
 .../{process => staging}/magic-number.rst     |  35 +-
 .../zh_CN/video4linux/omap3isp.txt            | 277 -----
 .../zh_CN/video4linux/v4l2-framework.txt      | 958 ------------------
 32 files changed, 2134 insertions(+), 1613 deletions(-)
 create mode 100644 Documentation/translations/zh_CN/admin-guide/media/index.rst
 create mode 100644 Documentation/translations/zh_CN/admin-guide/media/omap3isp.rst
 create mode 100644 Documentation/translations/zh_CN/admin-guide/media/v4l-drivers.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/index.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-core.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-dev.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-device.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-event.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-fh.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-intro.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-subdev.rst
 rename Documentation/translations/zh_CN/filesystems/{gfs2-glocks.rst => gfs2/glocks.rst} (99%)
 rename Documentation/translations/zh_CN/filesystems/{gfs2.rst => gfs2/index.rst} (93%)
 rename Documentation/translations/zh_CN/filesystems/{gfs2-uevents.rst => gfs2/uevents.rst} (97%)
 create mode 100644 Documentation/translations/zh_CN/networking/xfrm/index.rst
 rename Documentation/translations/zh_CN/networking/{ => xfrm}/xfrm_proc.rst (96%)
 rename Documentation/translations/zh_CN/{dev-tools => process/debugging}/gdb-kernel-debugging.rst (93%)
 create mode 100644 Documentation/translations/zh_CN/process/debugging/index.rst
 rename Documentation/translations/zh_CN/{process => staging}/magic-number.rst (58%)
 delete mode 100644 Documentation/translations/zh_CN/video4linux/omap3isp.txt
 delete mode 100644 Documentation/translations/zh_CN/video4linux/v4l2-framework.txt

-- 
2.51.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 1/9] docs/zh_CN: update admin-guide/index.rst translation
  2026-10-27 10:25 [PATCH 0/9] docs/zh_CN: align translation paths and update guides Dongliang Mu
@ 2026-10-27 10:25 ` Dongliang Mu
  2026-10-27 10:25 ` [PATCH 2/9] docs/zh_CN: update admin-guide/README.rst translation Dongliang Mu
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Dongliang Mu @ 2026-10-27 10:25 UTC (permalink / raw)
  To: Alex Shi, Yanteng Si
  Cc: Jonathan Corbet, Shuah Khan, Randy Dunlap, linux-doc, linux-kernel

update Documentation/admin-guide/index.rst Chinese translation

Move the already translated tainted-kernels, media, and unicode entries
from the Todolist into their respective sections.

Update the translation through commit f0efd29aa60c
("doc: Add CPU Isolation documentation")

Signed-off-by: Dongliang Mu <dzm91@hust.edu.cn>
---
 .../translations/zh_CN/admin-guide/index.rst         | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/Documentation/translations/zh_CN/admin-guide/index.rst b/Documentation/translations/zh_CN/admin-guide/index.rst
index bd01cf6474c8..23443eb66124 100644
--- a/Documentation/translations/zh_CN/admin-guide/index.rst
+++ b/Documentation/translations/zh_CN/admin-guide/index.rst
@@ -1,7 +1,6 @@
 .. SPDX-License-Identifier: GPL-2.0
 .. include:: ../disclaimer-zh_CN.rst
 
-:Original: Documentation/admin-guide/index.rst
 
 :翻译:
 
@@ -10,6 +9,7 @@
  朱岩 Yan Zhu <zhuyan2015@qq.com>
 
 
+==========================
 Linux 内核用户和管理员指南
 ==========================
 
@@ -86,6 +86,7 @@ Todolist:
    reporting-regressions
    bug-hunting
    bug-bisect
+   tainted-kernels
    init
    clearing-warn-once
    lockup-watchdogs
@@ -95,7 +96,6 @@ Todolist:
 
 *   quickly-build-trimmed-linux
 *   verify-bugs-and-bisect-regressions
-*   tainted-kernels
 *   ramoops
 *   dynamic-debug-howto
 *   kdump/index
@@ -122,6 +122,7 @@ Todolist:
 
 *   cgroup-v2
 *   cgroup-v1/index
+*   cpu-isolation
 *   namespaces/index
 *   pm/index
 *   syscall-user-dispatch
@@ -170,6 +171,8 @@ Todolist:
 .. toctree::
    :maxdepth: 1
 
+   media/index
+
 Todolist:
 
 *   acpi/index
@@ -183,7 +186,6 @@ Todolist:
 *   hw_random
 *   laptops/index
 *   lcd-panel-cgram
-*   media/index
 *   nvme-multipath
 *   parport
 *   pnp
@@ -220,11 +222,11 @@ Todolist:
 .. toctree::
    :maxdepth: 1
 
+   unicode
+
 Todolist:
 
-*   highuid
 *   ldm
-*   unicode
 
 .. only::  subproject and html
 
-- 
2.51.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 2/9] docs/zh_CN: update admin-guide/README.rst translation
  2026-10-27 10:25 [PATCH 0/9] docs/zh_CN: align translation paths and update guides Dongliang Mu
  2026-10-27 10:25 ` [PATCH 1/9] docs/zh_CN: update admin-guide/index.rst translation Dongliang Mu
@ 2026-10-27 10:25 ` Dongliang Mu
  2026-10-27 11:37   ` Weijie Yuan
  2026-10-27 10:25 ` [PATCH 3/9] docs/zh_CN: add media administrator guide translations Dongliang Mu
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 13+ messages in thread
From: Dongliang Mu @ 2026-10-27 10:25 UTC (permalink / raw)
  To: Alex Shi, Yanteng Si
  Cc: Jonathan Corbet, Shuah Khan, Randy Dunlap, linux-doc, linux-kernel

update Documentation/admin-guide/README.rst Chinese translation

Refresh the kernel installation guidance and correct the defconfig and
LSMOD descriptions. Add a label to the translated applying-patches guide
so the README can link to it.

Update the translation through commit 8913632998fc
("Documentation: Fix typos and grammatical errors")

Signed-off-by: Dongliang Mu <dzm91@hust.edu.cn>
---
 .../translations/zh_CN/admin-guide/README.rst | 89 +++++++++++--------
 .../zh_CN/process/applying-patches.rst        |  2 +
 2 files changed, 53 insertions(+), 38 deletions(-)

diff --git a/Documentation/translations/zh_CN/admin-guide/README.rst b/Documentation/translations/zh_CN/admin-guide/README.rst
index ee6dd3782f4a..050f671f8acb 100644
--- a/Documentation/translations/zh_CN/admin-guide/README.rst
+++ b/Documentation/translations/zh_CN/admin-guide/README.rst
@@ -1,11 +1,12 @@
 .. include:: ../disclaimer-zh_CN.rst
 
-:Original: Documentation/admin-guide/README.rst
 
 :译者:
 
  吴想成 Wu XiangCheng <bobwxc@email.cn>
 
+.. _readme_zh:
+
 Linux内核6.x版本 <http://kernel.org/>
 =========================================
 
@@ -30,7 +31,7 @@ Linux内核6.x版本 <http://kernel.org/>
 
   虽然Linux最初是为32位的x86 PC机(386或更高版本)开发的,但今天它也能运行在
   (至少)Compaq Alpha AXP、Sun SPARC与UltraSPARC、Motorola 68000、PowerPC、
-  PowerPC64、ARM、Hitachi SuperH、Cell、IBM S/390、MIPS、HP PA-RISC、Intel 
+  PowerPC64、ARM、Hitachi SuperH、Cell、IBM S/390、MIPS、HP PA-RISC、Intel
   IA-64、DEC VAX、AMD x86-64 Xtensa和ARC架构上。
 
   Linux很容易移植到大多数通用的32位或64位体系架构,只要它们有一个分页内存管理
@@ -42,15 +43,12 @@ Linux内核6.x版本 <http://kernel.org/>
 
 文档
 -----
-因特网上和书籍上都有大量的电子文档,既有Linux专属文档,也有与一般UNIX问题相关
-的文档。我建议在任何Linux FTP站点上查找LDP(Linux文档项目)书籍的文档子目录。
-本自述文件并不是关于系统的文档:有更好的可用资源。
 
- - 因特网上和书籍上都有大量的(电子)文档,既有Linux专属文档,也有与普通
-   UNIX问题相关的文档。我建议在任何有LDP(Linux文档项目)书籍的Linux FTP
-   站点上查找文档子目录。本自述文件并不是关于系统的文档:有更好的可用资源。
+ - 因特网上有大量电子文档,书籍中也有丰富资料,既包括 Linux 专属内容,也包括
+   一般 UNIX 问题。在任何 Linux FTP 站点的文档子目录中,都可以查找
+   LDP(Linux 文档项目)的书籍。本 README 并非系统使用手册;另有更好的资料。
 
- - 文档/子目录中有各种自述文件:例如,这些文件通常包含一些特定驱动程序的
+ - ``Documentation/`` 子目录中有各种 README 文件:它们通常包含特定驱动程序的
    内核安装说明。请阅读
    :ref:`Documentation/process/changes.rst <changes>` 文件,它包含了升级内核
    可能会导致的问题的相关信息。
@@ -82,8 +80,8 @@ Linux内核6.x版本 <http://kernel.org/>
    直接应用于基本的6.x内核。例如,如果您的基本内核是6.0,并且希望应用6.0.3
    补丁,则不应先应用6.0.1和6.0.2的补丁。类似地,如果您运行的是6.0.2内核,
    并且希望跳转到6.0.3,那么在应用6.0.3补丁之前,必须首先撤销6.0.2补丁
-   (即patch -R)。更多关于这方面的内容,请阅读
-   Documentation/translations/zh_CN/process/applying-patches.rst 。
+   (即 ``patch -R``)。有关这方面的更多内容,请参阅
+   :ref:`Documentation/translations/zh_CN/process/applying-patches.rst <zh_applying_patches>`。
 
    或者,脚本 patch-kernel 可以用来自动化这个过程。它能确定当前内核版本并
    应用找到的所有补丁::
@@ -154,13 +152,14 @@ Linux内核6.x版本 <http://kernel.org/>
      "make olddefconfig"
                         类似上一个,但不询问直接将新选项设置为默认值。
 
-     "make defconfig"   根据体系架构,使用arch/$arch/defconfig或
-                        arch/$arch/configs/${PLATFORM}_defconfig中的
-                        默认选项值创建./.config文件。
+     "make defconfig"   根据体系架构,使用
+                        arch/$ARCH/configs/defconfig 或
+                        arch/$ARCH/configs/${PLATFORM}_defconfig 中的
+                        默认选项值创建 ./.config 文件。
 
      "make ${PLATFORM}_defconfig"
-                        使用arch/$arch/configs/${PLATFORM}_defconfig中
-                        的默认选项值创建一个./.config文件。
+                        使用 arch/$ARCH/configs/${PLATFORM}_defconfig 中
+                        的默认选项值创建一个 ./.config 文件。
                         用“make help”来获取您体系架构中所有可用平台的列表。
 
      "make allyesconfig"
@@ -180,7 +179,7 @@ Linux内核6.x版本 <http://kernel.org/>
                            已加载的模块不需要的任何模块选项。
 
                            要为另一台计算机创建localmodconfig,请将该计算机
-                           的lsmod存储到一个文件中,并将其作为lsmod参数传入。
+                           的 lsmod 输出存储到文件中,并通过 LSMOD 参数传入。
 
                            此外,通过在参数LMC_KEEP中指定模块的路径,可以将
                            模块保留在某些文件夹或kconfig文件中。
@@ -216,10 +215,10 @@ Linux内核6.x版本 <http://kernel.org/>
       这种情况下,数学仿真永远不会被使用。内核会稍微大一点,但不管
       是否有数学协处理器,都可以在不同的机器上工作。
 
-    - “kernel hacking”配置细节通常会导致更大或更慢的内核(或两者
-      兼而有之),甚至可以通过配置一些例程来主动尝试破坏坏代码以发现
-      内核问题,从而降低内核的稳定性(kmalloc())。因此,您可能应该
-      用于研究“开发”、“实验”或“调试”特性相关问题。
+    - “kernel hacking”配置选项细节通常会使内核体积更大、运行更慢,或者
+      两者兼有。某些选项还会让例程主动触发有问题的代码,以发现内核问题
+      (例如 ``kmalloc()``),从而降低内核的稳定性。因此,对于“开发”、
+      “实验”或“调试”功能,通常应回答 ``n``。
 
 编译内核
 ---------
@@ -227,8 +226,9 @@ Linux内核6.x版本 <http://kernel.org/>
  - 确保您至少有gcc 8.1可用。
    有关更多信息,请参阅 :ref:`Documentation/process/changes.rst <changes>` 。
 
- - 执行 ``make`` 来创建压缩内核映像。如果您安装了lilo以适配内核makefile,
-   那么也可以进行 ``make install`` ,但是您可能需要先检查特定的lilo设置。
+ - 执行 ``make`` 来创建压缩内核映像。如果安装了 LILO,或发行版提供了内核
+   安装程序可以识别的安装脚本,也可以执行 ``make install``。多数常见发行版
+   都提供这样的脚本;请先检查发行版的安装方式。
 
    实际安装必须以root身份执行,但任何正常构建都不需要。
    无须徒然使用root身份。
@@ -244,7 +244,8 @@ Linux内核6.x版本 <http://kernel.org/>
 
      make V=1 all
 
-   如需构建系统也给出内个目标重建的愿意,请使用 ``V=2`` 。默认为 ``V=0`` 。
+   若还需要构建系统说明每个目标重新构建的原因,请使用 ``V=2``。
+   默认值为 ``V=0``。
 
  - 准备一个备份内核以防出错。对于开发版本尤其如此,因为每个新版本都包含
    尚未调试的新代码。也要确保保留与该内核对应的模块的备份。如果要安装
@@ -257,23 +258,35 @@ Linux内核6.x版本 <http://kernel.org/>
  - 为了引导新内核,您需要将内核映像(例如编译后的
    .../linux/arch/x86/boot/bzImage)复制到常规可引导内核的位置。
 
- - 不再支持在没有LILO等启动装载程序帮助的情况下直接从软盘引导内核。
+ - 在 BIOS(非 EFI)系统上,已不再支持不借助 LILO 或 GRUB 等引导加载程序,
+   直接从存储设备启动内核。在 UEFI/EFI 系统上,可以使用 EFISTUB,让主板
+   直接启动内核。不过,对于现代工作站和台式机,通常建议使用引导加载程序,
+   因为安装多个内核或启用安全启动时可能遇到困难。有关 EFISTUB 的详情,
+   请参阅 ``Documentation/admin-guide/efi-stub.rst``。
+
+ - 请注意,LILO(LInux LOader)自 2016 年起就不再积极开发。它曾经非常流行,
+   因此仍常见于文档。常见的替代方案包括 GRUB2、rEFInd、Syslinux、
+   systemd-boot 和 EFISTUB。由于多种原因,不建议使用已经停止积极开发的软件。
+
+ - 您的发行版很可能提供了安装脚本,这时运行 ``make install`` 就足够了。
+   如果没有,则需要确认所用的引导加载程序并查阅其文档,或配置 EFI。
+
+旧版 LILO 操作说明
+------------------
 
-   如果从硬盘引导Linux,很可能使用LILO,它使用/etc/lilo.conf文件中
-   指定的内核映像文件。内核映像文件通常是/vmlinuz、/boot/vmlinuz、
-   /bzImage或/boot/bzImage。使用新内核前,请保存旧映像的副本,并复制
-   新映像覆盖旧映像。然后您【必须重新运行LILO】来更新加载映射!否则,
-   将无法启动新的内核映像。
+ - 如果使用 LILO,内核映像在 ``/etc/lilo.conf`` 中指定。映像文件通常是
+   ``/vmlinuz``、``/boot/vmlinuz``、``/bzImage`` 或 ``/boot/bzImage``。
+   要使用新内核,请先保存旧映像的副本,再用新映像覆盖旧映像。然后
+   **必须重新运行 LILO** 来更新加载映射!否则将无法启动新内核映像。
 
-   重新安装LILO通常需要运行/sbin/LILO。您可能希望编辑/etc/lilo.conf
-   文件为旧内核映像指定一个条目(例如/vmlinux.old)防止新的不能正常
-   工作。有关更多信息,请参阅LILO文档。
+ - 重新安装 LILO 通常只需运行 ``/sbin/lilo``。可以编辑 ``/etc/lilo.conf``,
+   为旧内核映像(例如 ``/vmlinux.old``)保留一个条目,以防新内核无法工作。
+   更多信息请参阅 LILO 文档。
 
-   重新安装LILO之后,您应该就已经准备好了。关闭系统,重新启动,尽情
-   享受吧!
+ - 重新安装 LILO 后就可以关闭系统、重新启动并使用新内核了。
 
-   如果需要更改内核映像中的默认根设备、视频模式等,请在适当的地方使用
-   启动装载程序的引导选项。无需重新编译内核即可更改这些参数。
+ - 如果需要更改内核映像中的默认根设备、视频模式等,请在适当情况下使用
+   引导加载程序的启动选项。无须为更改这些参数而重新编译内核。
 
  - 使用新内核重新启动并享受它吧。
 
@@ -287,5 +300,5 @@ Documentation/translations/zh_CN/admin-guide/reporting-issues.rst 。
 Documentation/translations/zh_CN/admin-guide/bug-hunting.rst 。
 
 更多用GDB调试内核的信息,请参阅:
-Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst
+Documentation/translations/zh_CN/process/debugging/gdb-kernel-debugging.rst
 和 Documentation/process/debugging/kgdb.rst 。
diff --git a/Documentation/translations/zh_CN/process/applying-patches.rst b/Documentation/translations/zh_CN/process/applying-patches.rst
index c056b241b0cd..fb76a0b69f5c 100644
--- a/Documentation/translations/zh_CN/process/applying-patches.rst
+++ b/Documentation/translations/zh_CN/process/applying-patches.rst
@@ -8,6 +8,8 @@
 
  袁维杰 Weijie Yuan <wy@wyuan.org>
 
+.. _zh_applying_patches:
+
 将补丁应用到 Linux 内核
 +++++++++++++++++++++++
 
-- 
2.51.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 3/9] docs/zh_CN: add media administrator guide translations
  2026-10-27 10:25 [PATCH 0/9] docs/zh_CN: align translation paths and update guides Dongliang Mu
  2026-10-27 10:25 ` [PATCH 1/9] docs/zh_CN: update admin-guide/index.rst translation Dongliang Mu
  2026-10-27 10:25 ` [PATCH 2/9] docs/zh_CN: update admin-guide/README.rst translation Dongliang Mu
@ 2026-10-27 10:25 ` Dongliang Mu
  2026-10-27 10:25 ` [PATCH 4/9] docs/zh_CN: reorganize process debugging guides Dongliang Mu
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Dongliang Mu @ 2026-10-27 10:25 UTC (permalink / raw)
  To: Alex Shi, Yanteng Si
  Cc: Jonathan Corbet, Shuah Khan, Randy Dunlap, linux-doc, linux-kernel

Translate the media administrator guide and V4L driver index. Move the
OMAP3 ISP translation from video4linux to its current location and
update it for the English source.

Update the translation through commit 3cd9b7011519
("Documentation: add documentation of AMD isp 4 driver")

Signed-off-by: Dongliang Mu <dzm91@hust.edu.cn>
---
 .../zh_CN/admin-guide/media/index.rst         |  54 ++++
 .../zh_CN/admin-guide/media/omap3isp.rst      |  95 ++++++
 .../zh_CN/admin-guide/media/v4l-drivers.rst   |  44 +++
 .../zh_CN/video4linux/omap3isp.txt            | 277 ------------------
 4 files changed, 193 insertions(+), 277 deletions(-)
 create mode 100644 Documentation/translations/zh_CN/admin-guide/media/index.rst
 create mode 100644 Documentation/translations/zh_CN/admin-guide/media/omap3isp.rst
 create mode 100644 Documentation/translations/zh_CN/admin-guide/media/v4l-drivers.rst
 delete mode 100644 Documentation/translations/zh_CN/video4linux/omap3isp.txt

diff --git a/Documentation/translations/zh_CN/admin-guide/media/index.rst b/Documentation/translations/zh_CN/admin-guide/media/index.rst
new file mode 100644
index 000000000000..80bd1fec7ceb
--- /dev/null
+++ b/Documentation/translations/zh_CN/admin-guide/media/index.rst
@@ -0,0 +1,54 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../../disclaimer-zh_CN.rst
+.. include:: <isonum.txt>
+
+
+========================
+媒体子系统管理和用户指南
+========================
+
+本节介绍媒体子系统及其支持的驱动程序的使用方法。
+
+另请参阅:
+
+``Documentation/userspace-api/media/index.rst``
+
+  - 介绍媒体设备使用的用户空间 API。
+
+``Documentation/driver-api/media/index.rst``
+
+  - 介绍媒体设备使用的驱动开发信息及内核 API。
+
+``Documentation/process/debugging/media_specific_debugging_guide.rst``
+
+  - 介绍调试媒体子系统驱动程序所需的基本工具和方法。
+
+.. toctree::
+   :caption: 目录
+   :maxdepth: 2
+   :numbered:
+
+   v4l-drivers
+
+Todolist:
+
+* intro
+* building
+* remote-controller
+* cec
+* dvb
+* cardlist
+* dvb-drivers
+
+**Copyright** |copy| 1999-2020 : LinuxTV Developers
+
+::
+
+  本文档是自由软件;您可以按照自由软件基金会发布的 GNU 通用公共许可证
+  第 2 版,或(由您选择)任何后续版本的条款重新分发和/或修改本文档。
+
+  发布本文档是希望它能够发挥作用,但不提供任何担保;甚至不提供有关
+  适销性或特定用途适用性的默示担保。详情请参阅 GNU 通用公共许可证。
+
+  更多详情请参阅源代码目录中的 COPYING 文件。
diff --git a/Documentation/translations/zh_CN/admin-guide/media/omap3isp.rst b/Documentation/translations/zh_CN/admin-guide/media/omap3isp.rst
new file mode 100644
index 000000000000..6d9c16bdb5ef
--- /dev/null
+++ b/Documentation/translations/zh_CN/admin-guide/media/omap3isp.rst
@@ -0,0 +1,95 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../../disclaimer-zh_CN.rst
+.. include:: <isonum.txt>
+
+:翻译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+:校译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+OMAP 3 图像信号处理器 (ISP) 驱动
+================================
+
+Copyright |copy| 2010 Nokia Corporation
+
+Copyright |copy| 2009 Texas Instruments, Inc.
+
+联系人:Laurent Pinchart <laurent.pinchart@ideasonboard.com>、
+Sakari Ailus <sakari.ailus@iki.fi>、David Cohen <dacohen@gmail.com>
+
+
+简介
+----
+
+本文档介绍位于 ``drivers/media/platform/ti/omap3isp`` 的德州仪器
+OMAP 3 图像信号处理器(ISP)驱动。原始驱动由德州仪器编写,此后在
+诺基亚经过两次重写。
+
+该驱动已成功用于以下 OMAP 3 版本:
+
+- 3430
+- 3530
+- 3630
+
+该驱动实现 V4L2、媒体控制器和 v4l2_subdev 接口,并支持内核中使用
+v4l2_subdev 接口的传感器、镜头及闪光灯驱动。
+
+
+拆分为子设备
+------------
+
+OMAP 3 ISP 被拆分为多个 V4L2 子设备。ISP 内部每个模块均由一个子设备
+表示,每个子设备都向用户空间提供 V4L2 子设备接口。
+
+- OMAP3 ISP CCP2
+- OMAP3 ISP CSI2a
+- OMAP3 ISP CCDC
+- OMAP3 ISP preview
+- OMAP3 ISP resizer
+- OMAP3 ISP AEWB
+- OMAP3 ISP AF
+- OMAP3 ISP histogram
+
+ISP 中每条可能的连接都由媒体控制器接口中的一条连接表示。示例程序参见 [#]_。
+
+
+控制 OMAP 3 ISP
+---------------
+
+通常,对 OMAP 3 ISP 所做的设置会在下一帧开始时生效:传感器的垂直消隐期间,
+模块进入空闲状态,此时应用这些设置。在内存到内存的运行模式下,处理管线每次
+运行一帧,设置在两帧之间应用。
+
+除 CSI-2 及可能的 CCP2 接收器外,ISP 中所有模块都要求接收完整的帧。
+因此,传感器绝不能向 ISP 发送不完整的帧。
+
+至少在 3430 上,某些 ISP 模块的自动空闲功能存在问题。仅当 ``omap3isp``
+模块参数 ``autoidle`` 非零时,才会在 3630 上启用自动空闲功能。
+
+
+技术参考手册(TRM)及其他文档
+--------------------------------
+
+OMAP 3430 TRM:
+<URL:http://focus.ti.com/pdfs/wtbu/OMAP34xx_ES3.1.x_PUBLIC_TRM_vZM.zip>
+引用日期:2011-03-05。
+
+OMAP 35xx TRM:
+<URL:http://www.ti.com/litv/pdf/spruf98o> 引用日期:2011-03-05。
+
+OMAP 3630 TRM:
+<URL:http://focus.ti.com/pdfs/wtbu/OMAP36xx_ES1.x_PUBLIC_TRM_vQ.zip>
+引用日期:2011-03-05。
+
+DM 3730 TRM:
+<URL:http://www.ti.com/litv/pdf/sprugn4h> 引用日期:2011-03-06。
+
+
+参考资料
+--------
+
+.. [#] http://git.ideasonboard.org/?p=media-ctl.git;a=summary
diff --git a/Documentation/translations/zh_CN/admin-guide/media/v4l-drivers.rst b/Documentation/translations/zh_CN/admin-guide/media/v4l-drivers.rst
new file mode 100644
index 000000000000..579ba0d2da81
--- /dev/null
+++ b/Documentation/translations/zh_CN/admin-guide/media/v4l-drivers.rst
@@ -0,0 +1,44 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../../disclaimer-zh_CN.rst
+
+.. _uapi-v4l-drivers-zh:
+
+==============================
+Video4Linux (V4L) 驱动专用文档
+==============================
+
+.. toctree::
+   :maxdepth: 2
+
+   omap3isp
+
+Todolist:
+
+* amdisp4-1
+* bttv
+* c3-isp
+* cafe_ccic
+* cx88
+* fimc
+* imx
+* imx7
+* ipu3
+* ipu6-isys
+* ivtv
+* mali-c55
+* mgb4
+* philips
+* qcom_camss
+* raspberrypi-pisp-be
+* rcar-fdp1
+* rkcif
+* rkisp1
+* raspberrypi-rp1-cfe
+* saa7134
+* si470x
+* si4713
+* si476x
+* vimc
+* visl
+* vivid
diff --git a/Documentation/translations/zh_CN/video4linux/omap3isp.txt b/Documentation/translations/zh_CN/video4linux/omap3isp.txt
deleted file mode 100644
index 75e481985630..000000000000
--- a/Documentation/translations/zh_CN/video4linux/omap3isp.txt
+++ /dev/null
@@ -1,277 +0,0 @@
-Chinese translated version of Documentation/admin-guide/media/omap3isp.rst
-
-If you have any comment or update to the content, please contact the
-original document maintainer directly.  However, if you have a problem
-communicating in English you can also ask the Chinese maintainer for
-help.  Contact the Chinese maintainer if this translation is outdated
-or if there is a problem with the translation.
-
-Maintainer: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-	  Sakari Ailus <sakari.ailus@iki.fi>
-	  David Cohen <dacohen@gmail.com>
-Chinese maintainer: Fu Wei <tekkamanninja@gmail.com>
----------------------------------------------------------------------
-Documentation/admin-guide/media/omap3isp.rst 的中文翻译
-
-如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
-交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
-译存在问题,请联系中文版维护者。
-英文版维护者: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-	  Sakari Ailus <sakari.ailus@iki.fi>
-	  David Cohen <dacohen@gmail.com>
-中文版维护者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
-中文版翻译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
-中文版校译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
-
-
-以下为正文
----------------------------------------------------------------------
-OMAP 3 图像信号处理器 (ISP) 驱动
-
-Copyright (C) 2010 Nokia Corporation
-Copyright (C) 2009 Texas Instruments, Inc.
-
-联系人: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-	  Sakari Ailus <sakari.ailus@iki.fi>
-	  David Cohen <dacohen@gmail.com>
-
-
-介绍
-===
-
-本文档介绍了由 drivers/media/video/omap3isp 加载的德州仪器
-(TI)OMAP 3 图像信号处理器 (ISP) 驱动。原始驱动由德州仪器(TI)
-编写,但此后由诺基亚重写了两次。
-
-驱动已在以下 OMAP 3 系列的芯片中成功使用:
-
-	3430
-	3530
-	3630
-
-驱动实现了 V4L2、媒体控制器和 v4l2_subdev 接口。支持内核中使用
-v4l2_subdev 接口的传感器、镜头和闪光灯驱动。
-
-
-拆分为子设备
-==========
-
-OMAP 3 ISP 被拆分为 V4L2 子设备,ISP中的每个模块都由一个子设备
-来表示。每个子设备向用户空间提供一个 V4L2 子设备接口。
-
-	OMAP3 ISP CCP2
-	OMAP3 ISP CSI2a
-	OMAP3 ISP CCDC
-	OMAP3 ISP preview
-	OMAP3 ISP resizer
-	OMAP3 ISP AEWB
-	OMAP3 ISP AF
-	OMAP3 ISP histogram
-
-ISP 中每个可能的连接都通过一个链接嵌入到媒体控制器接口中。详见例程 [2]。
-
-
-控制 OMAP 3 ISP
-==============
-
-通常,对 OMAP 3 ISP 的配置会在下一帧起始时生效。在传感器垂直消隐期间,
-模块变为空闲时完成配置。在内存到内存的操作中,视频管道一次处理一帧。
-应用配置应在帧间完成。
-
-ISP 中的所有模块,除 CSI-2 和 (可能存在的)CCP2 接收器外,都必须
-接收完整的帧数据。因此,传感器必须保证从不发送部分帧数据给ISP。
-
-Autoidle(自动空闲)功能至少在 3430 的 ISP 模块中确实存在一些问题。
-当 omap3isp 模块参数 autoidle 非零时,autoidle(自动空闲)功能
-仅在 3630 中启用了。
-
-
-事件机制
-======
-
-OMAP 3 ISP 驱动在 CCDC 和统计(AEWB、AF 和 直方图)子设备中支持
-V4L2 事件机制接口。
-
-CCDC 子设备通过 HS_VS 中断,处理 V4L2_EVENT_FRAME_SYNC 类型
-事件,用于告知帧起始。早期版本的驱动则使用 V4L2_EVENT_OMAP3ISP_HS_VS。
-当在 CCDC 模块中接收到起始帧的第一行时,会准确地触发事件。这个事件
-可以在 CCDC 子设备中“订阅”。
-
-(当使用并行接口时,必须注意正确地配置 VS 信号极性。而当使用串行接收时
-这个会自动校正。)
-
-每个统计子设备都可以产生事件。每当一个统计缓冲区可由用户空间应用程序
-通过 VIDIOC_OMAP3ISP_STAT_REQ IOCTL 操作获取时,就会产生一个
-事件。当前存在以下事件:
-
-	V4L2_EVENT_OMAP3ISP_AEWB
-	V4L2_EVENT_OMAP3ISP_AF
-	V4L2_EVENT_OMAP3ISP_HIST
-
-这些 ioctl 的事件数据类型为 struct omap3isp_stat_event_status
-结构体。如果出现计算错误的统计,也同样会产生一个事件,但没有相关的统计
-数据缓冲区。这种情况下 omap3isp_stat_event_status.buf_err 会被
-设置为非零值。
-
-
-私有 IOCTL
-==========
-
-OMAP 3 ISP 驱动支持标准的 V4L2 IOCTL 以及可能存在且实用的控制。但
-ISP 提供的许多功能都不在标准 IOCTL 之列,例如 gamma(伽马)表和统计
-数据采集配置等。
-
-通常,会有一个私有 ioctl 用于配置每个包含硬件依赖功能的模块。
-
-支持以下私有 IOCTL:
-
-	VIDIOC_OMAP3ISP_CCDC_CFG
-	VIDIOC_OMAP3ISP_PRV_CFG
-	VIDIOC_OMAP3ISP_AEWB_CFG
-	VIDIOC_OMAP3ISP_HIST_CFG
-	VIDIOC_OMAP3ISP_AF_CFG
-	VIDIOC_OMAP3ISP_STAT_REQ
-	VIDIOC_OMAP3ISP_STAT_EN
-
-在 include/linux/omap3isp.h 中描述了这些 ioctl 使用的参数结构体。
-与特定 ISP 模块相关的 ISP 自身的详细功能在技术参考手册 (TRMs)中有
-描述,详见文档结尾。
-
-虽然在不使用任何私有 IOCTL 的情况下使用 ISP 驱动是可能的,但这样无法
-获得最佳的图像质量。AEWB、AF 和 直方图(译者注:一般用于自动曝光和增益
-控制,以及图像均衡等)模块无法在未使用适当的私有 IOCTL 配置的情况下使用。
-
-
-CCDC 和 preview(预览)模块 IOCTL
-===============================
-
-VIDIOC_OMAP3ISP_CCDC_CFG 和 VIDIOC_OMAP3ISP_PRV_CFG IOCTL
-被分别用于配置、启用和禁用 CCDC 和 preview(预览)模块的功能。在它们
-所控制的模块中,两个 IOCTL 控制多种功能。VIDIOC_OMAP3ISP_CCDC_CFG IOCTL
-接受一个指向 omap3isp_ccdc_update_config 结构体的指针作为它的参数。
-同样的,VIDIOC_OMAP3ISP_PRV_CFG 接受一个指向 omap3isp_prev_update_config
-结构体的指针。以上两个结构体定义位于 [1]。
-
-这些结构体中的 update 域标识是否针对指定的功能更新配置,而 flag 域
-则标识是启用还是禁用此功能。
-
-update 和 flag 位接受以下掩码值。CCDC 和 preview(预览)模块的
-每个单独功能都与一个 flag 关联(禁用或启用;在结构体中 flag 域的
-一部分)和一个指向功能配置数据的指针。
-
-对于 VIDIOC_OMAP3ISP_CCDC_CFG,下面列出了 update 和 flag 域
-中的有效值。 这些值可能会在同一个 IOCTL 调用中配置多个功能。
-
-        OMAP3ISP_CCDC_ALAW
-        OMAP3ISP_CCDC_LPF
-        OMAP3ISP_CCDC_BLCLAMP
-        OMAP3ISP_CCDC_BCOMP
-        OMAP3ISP_CCDC_FPC
-        OMAP3ISP_CCDC_CULL
-        OMAP3ISP_CCDC_CONFIG_LSC
-        OMAP3ISP_CCDC_TBL_LSC
-
-针对 VIDIOC_OMAP3ISP_PRV_CFG 的相应值如下:
-
-        OMAP3ISP_PREV_LUMAENH
-        OMAP3ISP_PREV_INVALAW
-        OMAP3ISP_PREV_HRZ_MED
-        OMAP3ISP_PREV_CFA
-        OMAP3ISP_PREV_CHROMA_SUPP
-        OMAP3ISP_PREV_WB
-        OMAP3ISP_PREV_BLKADJ
-        OMAP3ISP_PREV_RGB2RGB
-        OMAP3ISP_PREV_COLOR_CONV
-        OMAP3ISP_PREV_YC_LIMIT
-        OMAP3ISP_PREV_DEFECT_COR
-        OMAP3ISP_PREV_GAMMABYPASS
-        OMAP3ISP_PREV_DRK_FRM_CAPTURE
-        OMAP3ISP_PREV_DRK_FRM_SUBTRACT
-        OMAP3ISP_PREV_LENS_SHADING
-        OMAP3ISP_PREV_NF
-        OMAP3ISP_PREV_GAMMA
-
-在启用某个功能的时候,相关的配置数据指针不可为 NULL。在禁用某个功能时,
-配置数据指针会被忽略。
-
-
-统计模块 IOCTL
-=============
-
-统计子设备相较于其他子设备提供了更多动态配置选项。在图像处理流水线处于
-工作状态时,它们可以被启用、禁用和重配。
-
-统计模块总是从 CCDC 中获取输入的图像数据(由于直方图内存读取未实现)。
-统计数据可由用户通过统计子设备节点使用私有 IOCTL 获取。
-
-AEWB、AF 和 直方图子设备提供的私有 IOCTL 极大程度上反应了 ISP 硬件
-提供的寄存器级接口。有些方面纯粹和驱动程序的实现相关,这些将在下面讨论。
-
-VIDIOC_OMAP3ISP_STAT_EN
------------------------
-
-这个私有 IOCTL 启用/禁用 一个统计模块。如果这个申请在视频流启动前完成,
-它将在视频流水线开始工作时生效。如果视频流水线已经处于工作状态了,它将在
-CCDC 变为空闲时生效。
-
-VIDIOC_OMAP3ISP_AEWB_CFG, VIDIOC_OMAP3ISP_HIST_CFG and VIDIOC_OMAP3ISP_AF_CFG
------------------------------------------------------------------------------
-
-这些 IOCTL 用于配置模块。它们要求用户应用程序对硬件有深入的认识。对
-大多数域的解释可以在 OMAP 的 TRM 中找到。以下两个域对于以上所有的
-私有 IOCTL 配置都很常见,由于他们没有在 TRM 中提及,故需要对其有
-更好的认识。
-
-omap3isp_[h3a_af/h3a_aewb/hist]_config.buf_size:
-
-模块在内部处理自身缓冲。对模块数据输出所必需的缓存大小依赖于已申请的配置。
-虽然驱动支持在视频流工作时重新配置,但对于所需缓存量大于模块启用时内部
-所分配数量的情况,则不支持重新配置。在这种情况下将返回 -EBUSY。为了避免
-此类状况,无论是禁用/重配/启用模块,还是第一次配置时申请必须的缓存大小,
-都应在模块禁用的情况下进行。
-
-内部缓冲分配的大小需综合考虑所申请配置的最小缓存量以及 buf_size 域中
-所设的值。如果 buf_size 域在[minimum(最小值), maximum(最大值)]
-缓冲大小范围之外,则应该将其调整到其范围中。驱动则会选择最大值。正确的
-buf_size 值将回写到用户应用程序中。
-
-omap3isp_[h3a_af/h3a_aewb/hist]_config.config_counter:
-
-由于配置并未在申请之后同步生效,驱动必须提供一个跟踪这类信息的方法,
-以提供更准确的数据。在一个配置被申请之后,返回到用户空间应用程序的
-config_counter 是一个与其配置相关的唯一值。当用户应用程序接收到
-一个缓冲可用或一个新的缓冲申请事件时,这个 config_counter 用于
-一个缓冲数据和一个配置的匹配。
-
-VIDIOC_OMAP3ISP_STAT_REQ
-------------------------
-
-将内部缓冲队列中最早的数据发送到用户空间,然后丢弃此缓冲区。
-omap3isp_stat_data.frame_number 域与视频缓冲的 field_count
-域相匹配。
-
-
-技术参考手册 (TRMs) 和其他文档
-==========================
-
-OMAP 3430 TRM:
-<URL:http://focus.ti.com/pdfs/wtbu/OMAP34xx_ES3.1.x_PUBLIC_TRM_vZM.zip>
-参考于 2011-03-05.
-
-OMAP 35xx TRM:
-<URL:http://www.ti.com/litv/pdf/spruf98o> 参考于 2011-03-05.
-
-OMAP 3630 TRM:
-<URL:http://focus.ti.com/pdfs/wtbu/OMAP36xx_ES1.x_PUBLIC_TRM_vQ.zip>
-参考于 2011-03-05.
-
-DM 3730 TRM:
-<URL:http://www.ti.com/litv/pdf/sprugn4h> 参考于 2011-03-06.
-
-
-参考资料
-=======
-
-[1] include/linux/omap3isp.h
-
-[2] http://git.ideasonboard.org/?p=media-ctl.git;a=summary
-- 
2.51.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 4/9] docs/zh_CN: reorganize process debugging guides
  2026-10-27 10:25 [PATCH 0/9] docs/zh_CN: align translation paths and update guides Dongliang Mu
                   ` (2 preceding siblings ...)
  2026-10-27 10:25 ` [PATCH 3/9] docs/zh_CN: add media administrator guide translations Dongliang Mu
@ 2026-10-27 10:25 ` Dongliang Mu
  2026-10-27 10:25 ` [PATCH 5/9] docs/zh_CN: update magic-number to match upstream Dongliang Mu
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Dongliang Mu @ 2026-10-27 10:25 UTC (permalink / raw)
  To: Alex Shi, Yanteng Si
  Cc: Jonathan Corbet, Shuah Khan, Randy Dunlap, linux-doc, linux-kernel

Move the GDB debugging translation into process/debugging. Update the
process and development tools indexes to match the current English
structure.

Synchronize the process index with upstream revision a03ef333fbd6.

Signed-off-by: Dongliang Mu <dzm91@hust.edu.cn>
---
 .../translations/zh_CN/dev-tools/index.rst    |  37 +++---
 .../debugging}/gdb-kernel-debugging.rst       |  15 ++-
 .../zh_CN/process/debugging/index.rst         |  62 ++++++++++
 .../translations/zh_CN/process/index.rst      | 111 +++++++++++-------
 4 files changed, 160 insertions(+), 65 deletions(-)
 rename Documentation/translations/zh_CN/{dev-tools => process/debugging}/gdb-kernel-debugging.rst (93%)
 create mode 100644 Documentation/translations/zh_CN/process/debugging/index.rst

diff --git a/Documentation/translations/zh_CN/dev-tools/index.rst b/Documentation/translations/zh_CN/dev-tools/index.rst
index 7b37194217b0..f5cf2621b6e3 100644
--- a/Documentation/translations/zh_CN/dev-tools/index.rst
+++ b/Documentation/translations/zh_CN/dev-tools/index.rst
@@ -1,18 +1,16 @@
 .. include:: ../disclaimer-zh_CN.rst
 
-:Original: Documentation/dev-tools/index.rst
 :Translator: 赵军奎 Bernard Zhao <bernard@vivo.com>
 
 ============
 内核开发工具
 ============
 
-本文档是有关内核开发工具文档的合集。
-目前这些文档已经整理在一起,不需要再花费额外的精力。
-欢迎任何补丁。
+本文档收集了用于内核开发的工具文档。目前这些文档只是汇集在一起,尚未充分整理成一份连贯的指南;欢迎提交补丁!
 
-有关测试专用工具的简要概述,参见
-Documentation/translations/zh_CN/dev-tools/testing-overview.rst
+测试工具的简要概述见 ``Documentation/dev-tools/testing-overview.rst``。
+
+调试专用工具见 ``Documentation/process/debugging/index.rst``。
 
 .. toctree::
    :caption: 目录
@@ -21,21 +19,26 @@ Documentation/translations/zh_CN/dev-tools/testing-overview.rst
    testing-overview
    sparse
    kcov
-   kcsan
-   kmsan
    gcov
    kasan
+   kmsan
    ubsan
    kmemleak
-   gdb-kernel-debugging
+   kcsan
 
 Todolist:
 
- - checkpatch
- - coccinelle
- - kfence
- - kgdb
- - kselftest
- - kunit/index
- - ktap
- - checkuapi
+* checkpatch
+* clang-format
+* coccinelle
+* context-analysis
+* lkmm/index
+* kfence
+* kselftest
+* kunit/index
+* ktap
+* checkuapi
+* gpio-sloppy-logic-analyzer
+* autofdo
+* propeller
+* container
diff --git a/Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst b/Documentation/translations/zh_CN/process/debugging/gdb-kernel-debugging.rst
similarity index 93%
rename from Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst
rename to Documentation/translations/zh_CN/process/debugging/gdb-kernel-debugging.rst
index 0b382a32b3fe..f5010c144dcb 100644
--- a/Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst
+++ b/Documentation/translations/zh_CN/process/debugging/gdb-kernel-debugging.rst
@@ -1,8 +1,7 @@
 .. highlight:: none
 
-.. include:: ../disclaimer-zh_CN.rst
+.. include:: ../../disclaimer-zh_CN.rst
 
-:Original: Documentation/process/debugging/gdb-kernel-debugging.rst
 :Translator: 高超 gao chao <gaochao49@huawei.com>
 
 通过gdb调试内核和模块
@@ -34,7 +33,7 @@ Kgdb内核调试器、QEMU等虚拟机管理程序或基于JTAG的硬件接口
   但这通常仅在不依赖内核模块时才有效。有关此模式的更多详细信息,请参阅QEMU文档。
   在这种情况下,如果架构支持KASLR,应该在禁用CONFIG_RANDOMIZE_BASE的情况下构建内核。
 
-- 构建gdb脚本(适用于内核v5.1版本及以上)
+- 构建gdb脚本(内核 v5.1 及以上版本需要此步骤)::
 
     make scripts_gdb
 
@@ -78,7 +77,7 @@ Kgdb内核调试器、QEMU等虚拟机管理程序或基于JTAG的硬件接口
     ...
     loading @0xffffffffa0000000: /home/user/linux/build/drivers/ata/ata_generic.ko
 
-- 对一些尚未加载的模块中的函数函数设置断点,例如::
+- 对尚未加载的模块中的函数设置断点,例如::
 
     (gdb) b btrfs_init_sysfs
     Function "btrfs_init_sysfs" not defined.
@@ -165,3 +164,11 @@ Kgdb内核调试器、QEMU等虚拟机管理程序或基于JTAG的硬件接口
 
 可以通过“help <command-name>”或“help function <function-name>”命令
 获取指定命令或指定调试功能的更多详细信息。
+
+调试 GDB 脚本
+-------------
+
+GDB 默认不会显示完整的 Python 回溯,这会使调试 GDB 脚本比必要的更困难。
+使用以下命令可输出 Python 环境的完整回溯::
+
+ (gdb) set python print-stack full
diff --git a/Documentation/translations/zh_CN/process/debugging/index.rst b/Documentation/translations/zh_CN/process/debugging/index.rst
new file mode 100644
index 000000000000..b0a121f7a91e
--- /dev/null
+++ b/Documentation/translations/zh_CN/process/debugging/index.rst
@@ -0,0 +1,62 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../../disclaimer-zh_CN.rst
+
+
+========================
+Linux 内核开发者调试指南
+========================
+
+通用指南
+--------
+
+.. toctree::
+   :maxdepth: 1
+
+   gdb-kernel-debugging
+
+待译文档:
+
+* driver_development_debugging_guide
+* kgdb
+* userspace_debugging_guide
+
+针对特定子系统的指南
+--------------------
+
+待译文档:
+
+* media_specific_debugging_guide
+
+一般调试建议
+============
+
+根据遇到的问题,可以使用不同的工具追踪问题,甚至判断问题是否确实存在。
+
+首先要弄清楚需要调试哪一类问题。不同的问题可能需要不同的方法和工具。
+
+是否只能有限地访问系统?
+------------------------
+
+如果只能有限地访问机器,或者无法停止正在运行的程序,调试能力就取决于发行版内核
+内置的调试支持。有关这种情况下可用工具的简要介绍,请参阅
+``Documentation/process/debugging/userspace_debugging_guide.rst``。多数情况下,
+可以查看 ``/boot`` 目录中的内核配置文件,确认内核提供了哪些调试支持。
+
+是否拥有系统的 root 权限?
+--------------------------
+
+如果能够轻松地更换模块或安装新内核,可用的调试手段就多得多。详情请参阅
+``Documentation/process/debugging/driver_development_debugging_guide.rst``。
+
+时间因素是否相关?
+------------------
+
+需要判断问题是稳定复现的(即相同输入总会得到相同的错误结果),还是偶发的。
+如果问题偶发,就可能受到时间因素影响。如果插入延迟会改变问题的表现,那么时间
+因素很可能起了作用。
+
+当时间因素会影响结果时,使用简单的 ``printk()`` 调试可能不起作用。可以改用
+``trace_printk()``,将消息写入跟踪文件,而不是内核日志。
+
+**Copyright** ©2024 : Collabora
diff --git a/Documentation/translations/zh_CN/process/index.rst b/Documentation/translations/zh_CN/process/index.rst
index 3a36ca7d9333..9d775eaae742 100644
--- a/Documentation/translations/zh_CN/process/index.rst
+++ b/Documentation/translations/zh_CN/process/index.rst
@@ -5,94 +5,117 @@
 
 .. include:: ../disclaimer-zh_CN.rst
 
-:Original: Documentation/process/index.rst
-
 :翻译:
 
  Alex Shi <alex.shi@linux.alibaba.com>
 
+.. _process_index_zh:
+
 ========================
 与Linux 内核社区一起工作
 ========================
 
-你想成为Linux内核开发人员吗?欢迎之至!在学习许多关于内核的技术知识的同时,
-了解我们社区的工作方式也很重要。阅读这些文档可以让您以更轻松的、麻烦更少的
-方式将更改合并到内核。
+你想成为 Linux 内核开发者吗?欢迎!除了要学习大量内核技术知识,了解社区的工作方式
+也很重要。阅读这些文档可以帮助你更顺利地将改动合入内核。
 
-以下是每位开发人员都应阅读的基本指南:
+内核开发流程简介
+----------------
+
+请先阅读这些文档:理解其中的内容有助于你加入内核社区。
 
 .. toctree::
    :maxdepth: 1
 
-   license-rules
    howto
-   code-of-conduct
-   code-of-conduct-interpretation
    development-process
    submitting-patches
-   programming-language
-   coding-style
-   maintainer-pgp-guide
-   email-clients
-   kernel-enforcement-statement
-   kernel-driver-statement
-
-TODOLIST:
+   submit-checklist
 
-* handling-regressions
-* maintainer-handbooks
+内核开发者的工具和技术指南
+--------------------------
 
-安全方面, 请阅读:
+内核开发者应当熟悉以下资料。
 
 .. toctree::
    :maxdepth: 1
 
-   embargoed-hardware-issues
-   cve
-   security-bugs
+   programming-language
+   coding-style
+   maintainer-pgp-guide
+   email-clients
+   applying-patches
+   volatile-considered-harmful
 
-TODOLIST:
+Todolist:
 
-* handling-regressions
+* changes
+* backporting
+* adding-syscalls
+* botching-up-ioctls
 
-其它大多数开发人员感兴趣的社区指南:
+政策指南与开发者声明
+--------------------
 
+这些是内核社区及其他相关领域努力遵守的规则。
 
 .. toctree::
    :maxdepth: 1
 
+   license-rules
+   code-of-conduct
+   code-of-conduct-interpretation
+   kernel-enforcement-statement
+   kernel-driver-statement
    stable-api-nonsense
-   management-style
    stable-kernel-rules
-   submit-checklist
+   management-style
    researcher-guidelines
 
-TODOLIST:
+Todolist:
 
-* changes
-* kernel-docs
-* deprecated
-* maintainers
 * contribution-maturity-model
+* generated-content
+* coding-assistants
+* conclave
 
+处理缺陷
+--------
 
-这些是一些总体性技术指南,由于不大好分类而放在这里:
+缺陷不可避免,妥善处理很重要。以下文档提供一般的调试建议,并介绍
+如何处理两类特殊缺陷——回归问题和安全问题。
 
 .. toctree::
    :maxdepth: 1
 
-   magic-number
-   applying-patches
-   volatile-considered-harmful
-   ../arch/riscv/patch-acceptance
-   ../core-api/unaligned-memory-access
+   debugging/index
+   security-bugs
+   cve
+   embargoed-hardware-issues
 
-TODOLIST:
+Todolist:
 
-* backporting
-* adding-syscalls
-* botching-up-ioctls
-* clang-format
+* handling-regressions
+* threat-model
+
+维护者信息
+----------
+
+这些文档介绍如何找到能够接受你提交的补丁的人。
+
+Todolist:
+
+* maintainer-handbooks
+* maintainers
+
+其他资料
+--------
+
+以下社区指南也与大多数开发者有关。
+
+Todolist:
+
+* kernel-docs
+* deprecated
 
 .. only::  subproject and html
 
-- 
2.51.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 5/9] docs/zh_CN: update magic-number to match upstream
  2026-10-27 10:25 [PATCH 0/9] docs/zh_CN: align translation paths and update guides Dongliang Mu
                   ` (3 preceding siblings ...)
  2026-10-27 10:25 ` [PATCH 4/9] docs/zh_CN: reorganize process debugging guides Dongliang Mu
@ 2026-10-27 10:25 ` Dongliang Mu
  2026-10-27 10:25 ` [PATCH 6/9] docs/zh_CN: reorganize media driver API translations Dongliang Mu
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Dongliang Mu @ 2026-10-27 10:25 UTC (permalink / raw)
  To: Alex Shi, Yanteng Si
  Cc: Jonathan Corbet, Shuah Khan, Randy Dunlap, linux-doc, linux-kernel

Update the Chinese magic-number guide to match its English source.
Move it from process to staging and update the staging index.

Synchronize the translation with upstream revision dd8d4bc28ad7.

Signed-off-by: Dongliang Mu <dzm91@hust.edu.cn>
---
 .../translations/zh_CN/staging/index.rst      |  6 ++--
 .../{process => staging}/magic-number.rst     | 35 +++++++++----------
 2 files changed, 19 insertions(+), 22 deletions(-)
 rename Documentation/translations/zh_CN/{process => staging}/magic-number.rst (58%)

diff --git a/Documentation/translations/zh_CN/staging/index.rst b/Documentation/translations/zh_CN/staging/index.rst
index 6d68fabce175..896734ade5eb 100644
--- a/Documentation/translations/zh_CN/staging/index.rst
+++ b/Documentation/translations/zh_CN/staging/index.rst
@@ -1,8 +1,6 @@
 .. SPDX-License-Identifier: GPL-2.0
 .. include:: ../disclaimer-zh_CN.rst
 
-:Original: Documentation/staging/index.rst
-
 :翻译:
 
  李睿 Rui Li <me@lirui.org>
@@ -13,14 +11,14 @@
 .. toctree::
    :maxdepth: 2
 
+   magic-number
    speculation
    xz
 
-TODOList:
+Todolist:
 
 * crc32
 * lzo
 * remoteproc
 * rpmsg
 * static-keys
-* tee
diff --git a/Documentation/translations/zh_CN/process/magic-number.rst b/Documentation/translations/zh_CN/staging/magic-number.rst
similarity index 58%
rename from Documentation/translations/zh_CN/process/magic-number.rst
rename to Documentation/translations/zh_CN/staging/magic-number.rst
index 05ee75cf4346..2cb46a6e343b 100644
--- a/Documentation/translations/zh_CN/process/magic-number.rst
+++ b/Documentation/translations/zh_CN/staging/magic-number.rst
@@ -1,7 +1,5 @@
 .. include:: ../disclaimer-zh_CN.rst
 
-:Original: Documentation/staging/magic-number.rst
-
 :翻译:
 
  贾威威 Jia Wei Wei <harryxiyou@gmail.com>
@@ -10,16 +8,18 @@
 
  司延腾 Yanteng Si <siyanteng@loongson.cn>
 
+.. _magicnumbers_zh:
+
 Linux 魔术数
 ============
 
-这个文件是有关当前使用的魔术值注册表。当你给一个结构体添加了一个魔术值,你也
-应该把这个魔术值添加到这个文件,因为我们最好把用于各种结构体的魔术值统一起来。
+本文档登记当前使用的魔术数。给结构体添加魔术数时,也应将其登记在这里,
+因为不同结构体使用的魔术数最好互不相同。
 
-使用魔术值来保护内核数据结构是一个 **非常好的主意** 。这就允许你在运行时检
-查一个结构体(a)是否已经被攻击,或者(b)你已经给一个例程传递了一个错误的结构
-体。最后一种情况特别地有用---特别是当你通过一个空指针指向结构体的时候。例如,
-tty源码经常通过特定驱动使用这种方法用来反复地排列特定方面的结构体。
+用魔术数保护内核数据结构是一个 **非常好的主意**。这样可以在运行时检查:
+(a)结构体是否被意外覆盖,或(b)是否向函数传入了错误的结构体。后一种情况
+尤其常见于通过 ``void *`` 指针传递结构体指针时。例如,tty 代码经常这样
+在驱动专用结构体和线路规程专用结构体之间传递指针。
 
 使用魔术值的方法是在结构体的开头声明它们,如下::
 
@@ -28,30 +28,29 @@ tty源码经常通过特定驱动使用这种方法用来反复地排列特定
         	...
         };
 
-当你以后给内核添加增强功能的时候,请遵守这条规则!这样就会节省数不清的调试
-时间,特别是一些古怪的情况,例如,数组超出范围并且覆盖写了超出部分。利用这
-个规则,这些情况可以被快速地,安全地检测到这些案例。
+今后扩展内核时,请遵循这一做法!它能节省大量调试时间,尤其是在数组越界并
+覆盖后续结构体等难以排查的情况下。使用魔术数可以快速、安全地发现这些问题。
 
 变更日志::
 
 					Theodore Ts'o
 					31 Mar 94
 
-  给当前的Linux 2.1.55添加魔术表。
+  此魔术数表已更新至 Linux 2.1.55。
 
 					Michael Chastain
 					<mailto:mec@shout.net>
 					22 Sep 1997
 
-  现在应该最新的Linux 2.1.112.因为在特性冻结期间,不能在2.2.x前改变任
-  何东西。这些条目被数域所排序。
+  此表现在应已更新至 Linux 2.1.112。由于目前处于功能冻结期,在 2.2.x
+  发布前不太可能再发生变化。条目按数值字段排序。
 
 					Krzysztof G.Baranowski
 					<mailto: kgb@knm.org.pl>
 					29 Jul 1998
 
-  更新魔术表到Linux 2.5.45。刚好越过特性冻结,但是有可能还会有一些新的魔
-  术值在2.6.x之前融入到内核中。
+  将魔术数表更新至 Linux 2.5.45。虽然刚进入功能冻结期,2.6.x 发布前
+  仍可能有新的魔术数进入内核。
 
 					Petr Baudis
 					<pasky@ucw.cz>
@@ -66,10 +65,10 @@ tty源码经常通过特定驱动使用这种方法用来反复地排列特定
 ===================== ================ ======================== ==========================================
 魔术数名              数字             结构                     文件
 ===================== ================ ======================== ==========================================
-PG_MAGIC              'P'              pg_{read,write}_hdr      ``include/linux/pg.h``
+PG_MAGIC              'P'              pg_{read,write}_hdr      ``include/uapi/linux/pg.h``
 APM_BIOS_MAGIC        0x4101           apm_user                 ``arch/x86/kernel/apm_32.c``
 FASYNC_MAGIC          0x4601           fasync_struct            ``include/linux/fs.h``
-SLIP_MAGIC            0x5302           slip                     ``drivers/net/slip.h``
+SLIP_MAGIC            0x5302           slip                     ``drivers/net/slip/slip.h``
 KV_MAGIC              0x5f4b565f       kernel_vars_s            ``arch/mips/include/asm/sn/klkernvars.h``
 CODA_MAGIC            0xC0DAC0DA       coda_file_info           ``fs/coda/coda_fs_i.h``
 CCB_MAGIC             0xf2691ad2       ccb                      ``drivers/scsi/ncr53c8xx.c``
-- 
2.51.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 6/9] docs/zh_CN: reorganize media driver API translations
  2026-10-27 10:25 [PATCH 0/9] docs/zh_CN: align translation paths and update guides Dongliang Mu
                   ` (4 preceding siblings ...)
  2026-10-27 10:25 ` [PATCH 5/9] docs/zh_CN: update magic-number to match upstream Dongliang Mu
@ 2026-10-27 10:25 ` Dongliang Mu
  2026-10-27 10:25 ` [PATCH 7/9] docs/zh_CN: move GFS2 translations into filesystems/gfs2 Dongliang Mu
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Dongliang Mu @ 2026-10-27 10:25 UTC (permalink / raw)
  To: Alex Shi, Yanteng Si
  Cc: Jonathan Corbet, Shuah Khan, Randy Dunlap, linux-doc, linux-kernel

Split the legacy V4L2 framework translation into the current media
driver API pages and update the driver API index to link them.

Signed-off-by: Dongliang Mu <dzm91@hust.edu.cn>
---
 .../translations/zh_CN/driver-api/index.rst   | 232 +++--
 .../zh_CN/driver-api/media/index.rst          |  52 +
 .../zh_CN/driver-api/media/v4l2-core.rst      |  36 +
 .../zh_CN/driver-api/media/v4l2-dev.rst       | 286 ++++++
 .../zh_CN/driver-api/media/v4l2-device.rst    | 127 +++
 .../zh_CN/driver-api/media/v4l2-event.rst     | 124 +++
 .../zh_CN/driver-api/media/v4l2-fh.rst        | 123 +++
 .../zh_CN/driver-api/media/v4l2-intro.rst     |  75 ++
 .../zh_CN/driver-api/media/v4l2-subdev.rst    | 491 +++++++++
 .../zh_CN/video4linux/v4l2-framework.txt      | 958 ------------------
 10 files changed, 1448 insertions(+), 1056 deletions(-)
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/index.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-core.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-dev.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-device.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-event.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-fh.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-intro.rst
 create mode 100644 Documentation/translations/zh_CN/driver-api/media/v4l2-subdev.rst
 delete mode 100644 Documentation/translations/zh_CN/video4linux/v4l2-framework.txt

diff --git a/Documentation/translations/zh_CN/driver-api/index.rst b/Documentation/translations/zh_CN/driver-api/index.rst
index 4050a2fb51c6..ed25f0a11b01 100644
--- a/Documentation/translations/zh_CN/driver-api/index.rst
+++ b/Documentation/translations/zh_CN/driver-api/index.rst
@@ -2,8 +2,6 @@
 
 .. include:: ../disclaimer-zh_CN.rst
 
-:Original: Documentation/driver-api/index.rst
-
 :翻译:
 
  司延腾 Yanteng Si <siyanteng@loongson.cn>
@@ -17,109 +15,147 @@ Linux驱动实现者的API指南
 内核提供了各种各样的接口来支持设备驱动的开发。这份文档只是对其中一些接口进行了
 一定程度的整理——希望随着时间的推移,它能变得更好!可用的小节可以在下面看到。
 
+驱动程序作者的一般信息
+======================
+
+本节收录的文档,在设备驱动开发过程中大多会有用处。
+
+Todolist:
+
+* basics
+* driver-model/index
+* device_link
+* infrastructure
+* ioctl
+* pm/index
+
+实用的支持库
+============
+
+本节收录的文档,在设备驱动开发过程中大多会有用处。
+
 .. toctree::
-   :caption: 目录列表
-   :maxdepth: 2
+   :maxdepth: 1
 
-   gpio/index
    io_ordering
+
+Todolist:
+
+* early-userspace/index
+* connector
+* device-io
+* devfreq
+* dma-buf
+* component
+* io-mapping
+* uio-howto
+* vfio-mediated-device
+* vfio
+* vfio-pci-device-specific-driver-acceptance
+
+总线级文档
+==========
+
+Todolist:
+
+* auxiliary_bus
+* cxl/index
+* eisa
+* firewire
+* i3c/index
+* isa
+* men-chameleon-bus
+* pci/index
+* rapidio/index
+* slimbus
+* usb/index
+* virtio/index
+* vme
+* w1
+* xillybus
+
+特定子系统的 API
+================
+
+.. toctree::
+   :maxdepth: 1
+
+   gpio/index
+   media/index
    phy/index
 
 Todolist:
 
-*   driver-model/index
-*   basics
-*   infrastructure
-*   ioctl
-*   early-userspace/index
-*   pm/index
-*   clk
-*   device-io
-*   dma-buf
-*   device_link
-*   component
-*   message-based
-*   infiniband
-*   aperture
-*   frame-buffer
-*   regulator
-*   reset
-*   iio/index
-*   input
-*   usb/index
-*   firewire
-*   pci/index
-*   cxl/index
-*   spi
-*   i2c
-*   ipmb
-*   ipmi
-*   i3c/index
-*   interconnect
-*   devfreq
-*   hsi
-*   edac
-*   scsi
-*   libata
-*   target
-*   mailbox
-*   mtdnand
-*   miscellaneous
-*   mei/index
-*   mtd/index
-*   mmc/index
-*   nvdimm/index
-*   w1
-*   rapidio/index
-*   s390-drivers
-*   vme
-*   80211/index
-*   uio-howto
-*   firmware/index
-*   pin-control
-*   md/index
-*   media/index
-*   misc_devices
-*   nfc/index
-*   dmaengine/index
-*   slimbus
-*   soundwire/index
-*   thermal/index
-*   fpga/index
-*   acpi/index
-*   auxiliary_bus
-*   backlight/lp855x-driver.rst
-*   connector
-*   console
-*   dcdbas
-*   eisa
-*   isa
-*   isapnp
-*   io-mapping
-*   generic-counter
-*   memory-devices/index
-*   men-chameleon-bus
-*   ntb
-*   nvmem
-*   parport-lowlevel
-*   pps
-*   ptp
-*   pwm
-*   pldmfw/index
-*   rfkill
-*   serial/index
-*   sm501
-*   surface_aggregator/index
-*   switchtec
-*   sync_file
-*   tty/index
-*   vfio-mediated-device
-*   vfio
-*   vfio-pci-device-specific-driver-acceptance
-*   xilinx/index
-*   xillybus
-*   zorro
-*   hte/index
+* 80211/index
+* acpi/index
+* backlight/lp855x-driver.rst
+* clk
+* coco/index
+* console
+* crypto/index
+* dmaengine/index
+* dpll
+* edac
+* extcon
+* firmware/index
+* fpga/index
+* frame-buffer
+* aperture
+* generic-counter
+* generic_pt
+* hsi
+* hte/index
+* hw-recoverable-errors
+* i2c
+* iio/index
+* infiniband
+* input
+* interconnect
+* ipmb
+* ipmi
+* issei/index
+* libata
+* mailbox
+* md/index
+* mei/index
+* memory-devices/index
+* message-based
+* misc_devices
+* miscellaneous
+* mmc/index
+* mtd/index
+* mtdnand
+* nfc/index
+* ntb
+* nvdimm/index
+* nvmem
+* parport-lowlevel
+* pin-control
+* pldmfw/index
+* pps
+* ptp
+* pwm
+* pwrseq
+* regulator
+* reset
+* rfkill
+* s390-drivers
+* scsi
+* serial/index
+* sm501
+* soundwire/index
+* spi
+* surface_aggregator/index
+* switchtec
+* sync_file
+* target
+* tee
+* thermal/index
+* tty/index
+* wbrf
+* wmi
+* xilinx/index
+* zorro
 
 .. only::  subproject and html
 
diff --git a/Documentation/translations/zh_CN/driver-api/media/index.rst b/Documentation/translations/zh_CN/driver-api/media/index.rst
new file mode 100644
index 000000000000..a5645a14f1bd
--- /dev/null
+++ b/Documentation/translations/zh_CN/driver-api/media/index.rst
@@ -0,0 +1,52 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../../disclaimer-zh_CN.rst
+.. include:: <isonum.txt>
+
+
+======================
+媒体子系统内核内部 API
+======================
+
+本节介绍媒体子系统及其支持的驱动程序的使用方法。
+
+另请参阅:
+
+``Documentation/admin-guide/media/index.rst``
+
+  - 介绍媒体子系统及其支持的驱动程序的使用方法。
+
+``Documentation/userspace-api/media/index.rst``
+
+  - 介绍媒体设备的用户空间 API。
+
+.. toctree::
+   :caption: 目录
+   :maxdepth: 5
+   :numbered:
+
+   v4l2-core
+
+Todolist:
+
+* maintainer-entry-profile
+* media-committers
+* dtv-core
+* rc-core
+* mc-core
+* cec-core
+* tx-rx
+* camera-sensor
+* drivers/index
+
+**Copyright** |copy| 2009-2020 : LinuxTV Developers
+
+::
+
+  本文档是自由软件;您可以按照自由软件基金会发布的 GNU 通用公共许可证
+  第 2 版,或(由您选择)任何后续版本的条款重新分发和/或修改本文档。
+
+  发布本文档是希望它能够发挥作用,但不提供任何担保;甚至不提供有关
+  适销性或特定用途适用性的默示担保。详情请参阅 GNU 通用公共许可证。
+
+  更多详情请参阅源代码目录中的 COPYING 文件。
diff --git a/Documentation/translations/zh_CN/driver-api/media/v4l2-core.rst b/Documentation/translations/zh_CN/driver-api/media/v4l2-core.rst
new file mode 100644
index 000000000000..9e7414a51dd5
--- /dev/null
+++ b/Documentation/translations/zh_CN/driver-api/media/v4l2-core.rst
@@ -0,0 +1,36 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../../disclaimer-zh_CN.rst
+
+
+Video4Linux 设备
+----------------
+
+.. toctree::
+   :maxdepth: 1
+
+   v4l2-intro
+   v4l2-dev
+   v4l2-device
+   v4l2-fh
+   v4l2-subdev
+   v4l2-event
+
+Todolist:
+
+* v4l2-controls
+* v4l2-videobuf2
+* v4l2-dv-timings
+* v4l2-flash-led-class
+* v4l2-mc
+* v4l2-mediabus
+* v4l2-mem2mem
+* v4l2-async
+* v4l2-fwnode
+* v4l2-cci
+* v4l2-rect
+* v4l2-tuner
+* v4l2-common
+* v4l2-tveeprom
+* v4l2-jpeg
+* v4l2-isp
diff --git a/Documentation/translations/zh_CN/driver-api/media/v4l2-dev.rst b/Documentation/translations/zh_CN/driver-api/media/v4l2-dev.rst
new file mode 100644
index 000000000000..805a7e197a68
--- /dev/null
+++ b/Documentation/translations/zh_CN/driver-api/media/v4l2-dev.rst
@@ -0,0 +1,286 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../../disclaimer-zh_CN.rst
+
+:翻译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+:校译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+视频设备的内部表示
+==================
+
+在 /dev 目录下的实际设备节点根据 video_device 结构体(v4l2-dev.h)
+创建。此结构体既可以动态分配也可以嵌入到一个更大的结构体中。
+
+动态分配方法如下::
+
+	struct video_device *vdev = video_device_alloc();
+
+	if (vdev == NULL)
+		return -ENOMEM;
+
+	vdev->release = video_device_release;
+
+如果将其嵌入到一个大结构体中,则必须自己实现 release()回调。 ::
+
+	struct video_device *vdev = &my_vdev->vdev;
+
+	vdev->release = my_vdev_release;
+
+release()回调必须被设置,且在最后一个 video_device 用户退出之后
+被调用。
+
+默认的 video_device_release()回调只是调用 kfree 来释放之前分配的
+内存。
+
+如果 ``video_device`` 嵌入在其他结构体中,而且释放时无须执行操作,
+可以使用空实现 ``video_device_release_empty()``。
+
+你应该设置这些域:
+
+- v4l2_dev: 设置为 v4l2_device 父设备。
+
+- name: 设置为唯一的描述性设备名。
+
+- vfl_dir: 采集设备设为 ``VFL_DIR_RX``(值为 0,通常已是默认值);
+  输出设备设为 ``VFL_DIR_TX``;内存到内存的编解码设备设为
+  ``VFL_DIR_M2M``。
+
+- fops: 设置为已有的 v4l2_file_operations 结构体。
+
+- ioctl_ops: 如果你使用v4l2_ioctl_ops 来简化 ioctl 的维护
+  (强烈建议使用,且将来可能变为强制性的!),然后设置你自己的
+  v4l2_ioctl_ops 结构体。``vfl_type`` 和 ``vfl_dir`` 会用来禁用
+  与设备类型或方向不符的操作,例如在非 VBI 节点上禁用 VBI 操作,
+  在采集设备上禁用输出操作。这样,VBI 和视频节点就可以共用一份
+  ``v4l2_ioctl_ops`` 结构体。
+
+- lock: 如果你要在驱动中实现所有的锁操作,则设为 NULL 。否则
+  就要设置一个指向 struct mutex 结构体的指针,这个锁将
+  在 unlocked_ioctl 文件操作被调用前由内核获得,并在调用返回后
+  释放。详见下一节。
+
+- queue: 指向与该设备节点关联的 ``vb2_queue``。如果 ``queue`` 和
+  ``queue->lock`` 都非 ``NULL``,缓冲区队列相关的 ioctl 将使用
+  ``queue->lock``,而非上述 ``video_device`` 锁。这些操作包括
+  ``VIDIOC_REQBUFS``、``CREATE_BUFS``、``QBUF``、``DQBUF``、
+  ``QUERYBUF``、``PREPARE_BUF``、``STREAMON`` 和 ``STREAMOFF``。
+  这样 videobuf2 队列无需等待其他 ioctl。辅助函数也通过该队列指针
+  检查文件句柄是否有权操作队列。
+
+- prio: 跟踪优先级,用于实现 ``VIDIOC_G_PRIORITY`` 和
+  ``VIDIOC_S_PRIORITY``。如果
+  设置为 NULL,则会使用 v4l2_device 中的 v4l2_prio_state 结构体。
+  如果要对每个设备节点(组)实现独立的优先级,可以将其指向自己
+  实现的 v4l2_prio_state 结构体。
+
+- dev_parent: 仅在使用 NULL 作为父设备结构体参数注册 v4l2_device 时
+  设置此参数。只有在一个硬件设备包含多个 PCI 设备,共享同一个
+  v4l2_device 核心时才会发生。
+
+  cx88 驱动就是一个例子:一个 v4l2_device 结构体核心,被一个裸的
+  视频 PCI 设备(cx8800)和一个 MPEG PCI 设备(cx8802)共用。由于
+  v4l2_device 无法与特定的 PCI 设备关联,所以没有设置父设备。但当
+  video_device 配置后,就知道使用哪个父 PCI 设备了,此时应将
+  ``dev_parent`` 设为正确的 PCI 设备。
+
+如果你使用 v4l2_ioctl_ops,则应该在 v4l2_file_operations 结构体中
+设置 .unlocked_ioctl 指向 video_ioctl2。
+
+某些情况下你要告诉核心:你在 v4l2_ioctl_ops 指定的某个函数应被忽略。
+你可以在 video_register_device 被调用前通过以下函数标记这些 ioctl::
+
+    void v4l2_disable_ioctl(struct video_device *vdev, unsigned int cmd);
+
+基于外部因素(例如某个板卡已被使用),在不创建新结构体的情况下,你想
+要关闭 v4l2_ioctl_ops 中某个特性往往需要这个机制。
+
+v4l2_file_operations 结构体是 file_operations 的一个子集。其主要
+区别在于:因 inode 参数从未被使用,它将被忽略。
+
+如果需要与媒体框架整合,你必须通过调用 media_entity_pads_init() 初始化
+嵌入在 video_device 结构体中的 media_entity(entity 域)结构体::
+
+	struct media_pad *pad = &my_vdev->pad;
+	int err;
+
+	err = media_entity_pads_init(&vdev->entity, 1, pad);
+
+pads 数组必须预先初始化。没有必要手动设置 media_entity 的 type 和
+name 域。
+
+当视频设备被打开或关闭时,对 entity 的引用将被自动获取或释放。
+
+ioctl 与锁
+----------
+
+V4L 核心提供可选的锁服务。``video_device`` 的 ``lock`` 字段指向
+一个互斥锁;设置后,``unlocked_ioctl`` 会用它串行化所有 ioctl。
+
+使用 videobuf2 框架时,还可以设置 ``video_device->queue->lock``。
+设置后,缓冲区队列 ioctl 使用这个锁,而非 ``video_device->lock``;
+队列 ioctl 的完整列表见前文。对于某些驱动,尤其是 USB 驱动,设置控制项
+等命令可能耗时较长。使用独立的队列锁,可以避免摄像头正在调整曝光时
+``VIDIOC_DQBUF`` 被这些命令阻塞。
+
+也可以把两个锁指针都设为 ``NULL``,由驱动自行实现全部锁定。
+使用 videobuf2 时,``queue->lock`` 必须指向用于串行化队列 ioctl
+的锁。这样,在 ``VIDIOC_DQBUF`` 等待缓冲区到来时,可以先释放该锁,
+然后重新获取。
+
+热插拔设备断开时,应先取得 ``video_device`` 的锁,再调用
+``v4l2_device_disconnect()``。若还使用了 ``queue->lock``,则须
+先锁定 ``queue->lock``,再锁定 ``video_device->lock``。这能保证
+调用断开函数时没有 ioctl 正在执行。
+
+video_device注册
+----------------
+
+接下来你需要注册视频设备:这会为你创建一个字符设备。 ::
+
+	err = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
+	if (err) {
+		video_device_release(vdev); /* or kfree(my_vdev); */
+		return err;
+	}
+
+如果 v4l2_device 父设备的 mdev 域为非 NULL 值,视频设备实体将自动
+注册为媒体设备。
+
+注册哪种设备是根据类型(type)参数。存在以下类型:
+
+* ``VFL_TYPE_VIDEO``:视频输入/输出设备,节点名为 ``/dev/videoX``。
+* ``VFL_TYPE_VBI``:垂直消隐数据设备,例如隐藏式字幕和图文电视,
+  节点名为 ``/dev/vbiX``。
+* ``VFL_TYPE_RADIO``:广播调谐器,节点名为 ``/dev/radioX``。
+* ``VFL_TYPE_SUBDEV``:V4L2 子设备,节点名为 ``/dev/v4l-subdevX``。
+* ``VFL_TYPE_SDR``:软件定义无线电调谐器,节点名为 ``/dev/swradioX``。
+* ``VFL_TYPE_TOUCH``:触摸传感器,节点名为 ``/dev/v4l-touchX``。
+
+最后一个参数让你确定一个所控制设备的设备节点号数量(例如 videoX 中的 X)。
+通常你可以传入-1,让 v4l2 框架自己选择第一个空闲的编号。但是有时用户
+需要选择一个特定的节点号。驱动允许用户通过驱动模块参数选择一个特定的
+设备节点号是很普遍的。这个编号将会传递给这个函数,且 video_register_device
+将会试图选择这个设备节点号。如果这个编号被占用,下一个空闲的设备节点
+编号将被选中,并向内核日志中发送一个警告信息。
+
+另一个使用场景是当驱动创建多个设备时。这种情况下,对不同的视频设备在
+编号上使用不同的范围是很有用的。例如,视频捕获设备从 0 开始,视频
+输出设备从 16 开始。所以你可以使用最后一个参数来指定设备节点号最小值,
+而 v4l2 框架会试图选择第一个的空闲编号(等于或大于你提供的编号)。
+如果失败,则会选择第一个空闲的编号。
+
+由于这种情况下,你会忽略无法选择特定设备节点号的警告,则可调用
+video_register_device_no_warn() 函数避免警告信息的产生。
+
+只要设备节点被创建,一些属性也会同时创建。在 /sys/class/video4linux
+目录中你会找到这些设备。例如进入其中的 video0 目录,你会看到
+``name``、``dev_debug`` 和 ``index`` 属性。``name`` 属性值就是
+video_device 结构体中的 ``name`` 域;``dev_debug`` 可用来启用
+核心调试,详见下一节。
+
+‘index’属性值就是设备节点的索引值:每次调用 video_register_device(),
+索引值都递增 1 。第一个视频设备节点总是从索引值 0 开始。
+
+用户可以设置 udev 规则,利用索引属性生成花哨的设备名(例如:用‘mpegX’
+代表 MPEG 视频捕获设备节点)。
+
+在设备成功注册后,就可以使用这些域:
+
+- vfl_type: 传递给 video_register_device 的设备类型。
+- minor: 已指派的次设备号。
+- num: 设备节点编号 (例如 videoX 中的 X)。
+- index: 设备索引号。
+
+如果注册失败,你必须调用 video_device_release() 来释放已分配的
+video_device 结构体;如果 video_device 是嵌入在自己创建的结构体中,
+你也必须释放它。vdev->release() 回调不会在注册失败之后被调用,
+你也不应试图在注册失败后注销设备。
+
+视频设备调试
+------------
+
+每个视频、VBI、广播或软件定义无线电设备都在
+``/sys/class/video4linux/<devX>/`` 下具有 ``dev_debug`` 属性。
+它是一个位掩码,可启用文件操作日志:
+
+* ``0x01``:记录 ioctl 名称和错误码;仅在同时设置 ``0x08`` 时
+  记录 ``VIDIOC_(D)QBUF``。
+* ``0x02``:记录 ioctl 名称、参数和错误码;
+  ``VIDIOC_(D)QBUF`` 同样需要 ``0x08``。
+* ``0x04``:记录 ``open``、``release``、``read``、``write``、
+  ``mmap`` 和 ``get_unmapped_area`` 文件操作;``read`` 和
+  ``write`` 还需要 ``0x08``。
+* ``0x08``:记录 ``read``、``write``、``VIDIOC_QBUF`` 和
+  ``VIDIOC_DQBUF``。
+* ``0x10``:记录 ``poll`` 操作。
+* ``0x20``:记录控制操作中的错误和消息。
+
+
+video_device 注销
+-----------------
+
+当视频设备节点已被移除,不论是卸载驱动还是USB设备断开,你都应注销
+它们::
+
+	video_unregister_device(vdev);
+
+这个操作将从 sysfs 中移除设备节点(导致 udev 将其从 /dev 中移除)。
+
+video_unregister_device() 返回之后,就无法完成打开操作。尽管如此,
+USB 设备的情况则不同,某些应用程序可能依然打开着其中一个已注销设备
+节点。所以在注销之后,所有文件操作(当然除了 release )也应返回错误值。
+
+当最后一个视频设备节点的用户退出,则 vdev->release() 回调会被调用,
+并且你可以做最后的清理操作。
+
+不要忘记清理与视频设备相关的媒体入口(如果被初始化过):
+
+	media_entity_cleanup(&vdev->entity);
+
+这可以在 release 回调中完成。
+
+
+video_device 辅助函数
+---------------------
+
+一些有用的辅助函数如下:
+
+- file/video_device 私有数据
+
+你可以用以下函数在 video_device 结构体中设置/获取驱动私有数据::
+
+    void *video_get_drvdata(struct video_device *vdev);
+    void video_set_drvdata(struct video_device *vdev, void *data);
+
+注意:在调用 video_register_device() 前执行 video_set_drvdata()
+是安全的。
+
+而以下函数::
+
+    struct video_device *video_devdata(struct file *file);
+
+返回 file 结构体中关联的 video_device 指针。
+
+video_drvdata 辅助函数结合了 video_get_drvdata 和 video_devdata
+的功能::
+
+    void *video_drvdata(struct file *file);
+
+你可以使用如下代码从 video_device 结构体中获取 v4l2_device 结构体
+指针::
+
+    struct v4l2_device *v4l2_dev = vdev->v4l2_dev;
+
+- 设备节点名
+
+video_device 设备节点在内核中的名称可以通过以下函数获得 ::
+
+    const char *video_device_node_name(struct video_device *vdev);
+
+这个名字被用户空间工具(例如 udev)作为提示信息使用。应尽可能使用
+此功能,而非访问 video_device->num 和 video_device->minor 域。
diff --git a/Documentation/translations/zh_CN/driver-api/media/v4l2-device.rst b/Documentation/translations/zh_CN/driver-api/media/v4l2-device.rst
new file mode 100644
index 000000000000..8c808d81c558
--- /dev/null
+++ b/Documentation/translations/zh_CN/driver-api/media/v4l2-device.rst
@@ -0,0 +1,127 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../../disclaimer-zh_CN.rst
+
+:翻译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+:校译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+V4L2 设备实例
+------------------
+
+每个设备实例都通过 v4l2_device (v4l2-device.h)结构体来表示。
+简单设备可以仅分配这个结构体,但在大多数情况下,都会将这个结构体
+嵌入到一个更大的结构体中。
+
+你必须注册这个设备实例::
+
+        v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev);
+
+注册操作将会初始化 v4l2_device 结构体。如果 dev->driver_data 域
+为 NULL,就将其指向 v4l2_dev。
+
+需要与媒体框架整合的驱动必须手动设置 dev->driver_data,指向包含
+v4l2_device 结构体实例的驱动特定设备结构体。这可以在注册 V4L2 设备
+实例前通过 dev_set_drvdata() 函数完成。同时必须设置 v4l2_device
+结构体的 mdev 域,指向适当的初始化并注册过的 media_device 实例。
+
+如果 v4l2_dev->name 为空,则它将被设置为从 dev 中衍生出的值(为了
+更加精确,形式为驱动名后跟 bus_id)。如果你在调用 v4l2_device_register
+前已经设置好了,则不会被修改。如果 dev 为 NULL,则你*必须*在调用
+v4l2_device_register 前设置 v4l2_dev->name。
+
+你可以基于驱动名和驱动的全局 atomic_t 类型的实例编号,通过
+v4l2_device_set_name() 设置 name。这样会生成类似 ivtv0、ivtv1 等
+名字。若驱动名以数字结尾,则会在编号和驱动名间插入一个破折号,如:
+cx18-0、cx18-1 等。此函数返回实例编号。
+
+第一个 “dev” 参数通常是一个指向 pci_dev、usb_interface 或
+platform_device 的指针。很少使其为 NULL,除非是一个ISA设备或者
+当一个设备创建了多个 PCI 设备,使得 v4l2_dev 无法与一个特定的父设备
+关联。
+
+你也可以提供一个 notify() 回调,使子设备可以调用它实现事件通知。
+是否需要设置取决于子设备。子设备支持的任何通知都必须在
+``include/media/subdevice.h`` 头文件中定义。
+
+注销 v4l2_device 使用如下函数::
+
+        v4l2_device_unregister(struct v4l2_device *v4l2_dev);
+
+如果 dev->driver_data 域指向 v4l2_dev,将会被重置为 NULL。注销同时
+会自动从设备中注销所有子设备。
+
+如果你有一个热插拔设备(如USB设备),则当断开发生时,父设备将无效。
+由于 v4l2_device 有一个指向父设备的指针必须被清除,同时标志父设备
+已消失,所以必须调用以下函数::
+
+        v4l2_device_disconnect(struct v4l2_device *v4l2_dev);
+
+这个函数并*不*注销子设备,因此你依然要调用 v4l2_device_unregister()
+函数。如果你的驱动并非热插拔的,就没有必要调用 v4l2_device_disconnect()。
+
+有时你需要遍历所有被特定驱动注册的设备。这通常发生在多个设备驱动使用
+同一个硬件的情况下。如:ivtvfb 驱动是一个使用 ivtv 硬件的帧缓冲驱动,
+同时 alsa 驱动也使用此硬件。
+
+你可以使用如下例程遍历所有注册的设备::
+
+    static int callback(struct device *dev, void *p)
+    {
+        struct v4l2_device *v4l2_dev = dev_get_drvdata(dev);
+
+        /* 测试这个设备是否已经初始化 */
+        if (v4l2_dev == NULL)
+                return 0;
+        ...
+        return 0;
+    }
+
+    int iterate(void *p)
+    {
+        struct device_driver *drv;
+        int err;
+
+        /* 在PCI 总线上查找ivtv驱动。
+           pci_bus_type是全局的. 对于USB总线使用usb_bus_type。 */
+        drv = driver_find("ivtv", &pci_bus_type);
+        /* 遍历所有的ivtv设备实例 */
+        err = driver_for_each_device(drv, NULL, p, callback);
+        put_driver(drv);
+        return err;
+    }
+
+有时你需要一个设备实例的运行计数。这个通常用于映射一个设备实例到一个
+模块选择数组的索引。
+
+推荐方法如下::
+
+    static atomic_t drv_instance = ATOMIC_INIT(0);
+
+    static int drv_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
+    {
+        ...
+        state->instance = atomic_inc_return(&drv_instance) - 1;
+    }
+
+如果你有多个设备节点,对于热插拔设备,知道何时注销 v4l2_device 结构体
+就比较困难。为此 v4l2_device 有引用计数支持。当调用 video_register_device
+时增加引用计数,而设备节点释放时减小引用计数。当引用计数为零,则
+v4l2_device 的release() 回调将被执行。你就可以在此时做最后的清理工作。
+
+如果创建了其他设备节点(比如 ALSA),则你可以通过以下函数手动增减
+引用计数::
+
+    void v4l2_device_get(struct v4l2_device *v4l2_dev);
+
+或: ::
+
+    int v4l2_device_put(struct v4l2_device *v4l2_dev);
+
+由于引用计数初始化为 1 ,你也需要在 disconnect() 回调(对于 USB 设备)中
+调用 v4l2_device_put,或者 remove() 回调(例如对于 PCI 设备),否则
+引用计数将永远不会为 0 。
diff --git a/Documentation/translations/zh_CN/driver-api/media/v4l2-event.rst b/Documentation/translations/zh_CN/driver-api/media/v4l2-event.rst
new file mode 100644
index 000000000000..d1d46a0fc732
--- /dev/null
+++ b/Documentation/translations/zh_CN/driver-api/media/v4l2-event.rst
@@ -0,0 +1,124 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../../disclaimer-zh_CN.rst
+
+:翻译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+:校译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+V4L2 事件
+-------------
+
+V4L2 事件机制提供了一个通用的方法将事件传递到用户空间。驱动必须使用
+v4l2_fh 才能支持 V4L2 事件机制。
+
+
+事件按文件句柄订阅。事件由 ``type`` 和可选的 ``id`` 指定;``id``
+可以标识某个 V4L2 对象,例如一个控制项。未使用时 ``id`` 为 0。
+因此,``(type, id)`` 这一对值唯一标识一个事件。
+
+``v4l2_fh`` 的 ``subscribed`` 字段保存已订阅事件的列表。每次订阅
+都会向该列表添加一个 ``v4l2_subscribed_event`` 结构体。每个结构体
+末尾都有一个 ``v4l2_kevent`` 环形缓冲区,其大小由调用
+``v4l2_event_subscribe()`` 的一方指定,用于保存驱动产生的事件。
+
+每组 ``(type, id)`` 都有自己的环形缓冲区。因此,驱动在短时间内产生
+大量同类事件时,不会覆盖其他类型的事件。如果同类事件数量超过缓冲区
+容量,最早的事件会被丢弃,新事件则加入队列。
+
+``v4l2_kevent`` 结构体还连接到 ``v4l2_fh`` 的 ``available`` 列表,
+以便 ``VIDIOC_DQEVENT`` 确定先取出哪个事件。如果订阅关联到特定对象,
+例如 V4L2 控制项,该对象也需要知道订阅者。此时可以通过 ``node``
+字段,将 ``v4l2_subscribed_event`` 连接到对象的内部列表。
+
+总之,``v4l2_fh`` 分别维护已订阅事件和可取事件两个列表;每个
+``v4l2_subscribed_event`` 都有存放该类待处理事件的环形缓冲区;若订阅
+关联到特定对象,对象也维护自己的订阅者列表。
+
+此外,v4l2_subscribed_event 结构体内部有可供驱动设置的 merge() 和
+replace() 回调,这些回调会在新事件产生且没有多余空间的时候被调用。
+replace() 回调让你可以将早期事件的净荷替换为新事件的净荷,将早期
+净荷的相关数据合并到替换进来的新净荷中。当该类型的事件仅分配了一个
+kevent 结构体时,它将被调用。merge() 回调让你可以合并最早的事件净荷
+到在它之后的那个事件净荷中。当该类型的事件分配了两个或更多 kevent
+结构体时,它将被调用。
+
+这种方法不会有状态信息丢失,只会导致中间步骤信息丢失。
+
+
+关于 replace/merge 回调的一个不错的例子在 v4l2-event.c 中:用于
+控制事件的 ctrls_replace() 和 ctrls_merge() 回调。
+
+注意:这些回调可以在中断上下文中调用,所以它们必须尽快完成并退出。
+
+有用的函数:
+
+void v4l2_event_queue(struct video_device \*vdev, const struct v4l2_event \*ev)
+
+  将事件加入视频设备的队列。驱动仅负责填充 type 和 data 域。
+  其他域由 V4L2 填充。
+
+订阅事件
+~~~~~~~~
+
+int v4l2_event_subscribe(struct v4l2_fh \*fh,
+			 struct v4l2_event_subscription \*sub, unsigned elems,
+			 const struct v4l2_subscribed_event_ops \*ops)
+
+  video_device->ioctl_ops->vidioc_subscribe_event 必须检测驱动能
+  产生特定 id 的事件。然后调用 v4l2_event_subscribe() 来订阅该事件。
+
+  elems 参数是该事件的队列大小。若为 0,V4L2 框架将会(根据事件类型)
+  填充默认值。
+
+  ops 参数允许驱动指定一系列回调:
+
+  * add:     当添加一个新监听者时调用(重复订阅同一个事件,此回调
+      仅被执行一次)。
+  * del:     当一个监听者停止监听时调用。
+  * replace: 用“新”事件替换“旧”事件。
+  * merge:   将“旧”事件合并到“新”事件中。
+
+  这四个调用都是可选的,如果不想指定任何回调,则 ops 可为 NULL。
+
+取消订阅事件
+~~~~~~~~~~~~
+
+int v4l2_event_unsubscribe(struct v4l2_fh \*fh,
+			   struct v4l2_event_subscription \*sub)
+
+  v4l2_ioctl_ops 结构体中的 vidioc_unsubscribe_event 回调函数。
+  驱动程序可以直接使用 v4l2_event_unsubscribe() 实现退订事件过程。
+
+  特殊的 V4L2_EVENT_ALL 类型,可用于退订所有事件。驱动可能在特殊
+  情况下需要做此操作。
+
+检查是否有待处理事件
+~~~~~~~~~~~~~~~~~~~~
+
+int v4l2_event_pending(struct v4l2_fh \*fh)
+
+  返回未决事件的数量。有助于实现轮询(poll)操作。
+
+事件的工作方式
+~~~~~~~~~~~~~~
+
+事件通过 poll 系统调用传递到用户空间。驱动可用
+v4l2_fh->wait (wait_queue_head_t 类型)作为参数调用 poll_wait()。
+
+事件分为标准事件和私有事件。新的标准事件必须使用可用的最小事件类型
+编号。驱动必须从各自类别的起始编号开始分配事件。类型的编号起始为
+V4L2_EVENT_PRIVATE_START + n * 1000 ,其中 n 为可用最小编号。每个
+类型中的第一个事件类型编号是为以后的使用保留的,所以第一个可用事件
+类型编号是‘class base + 1’。
+
+V4L2 事件机制的使用实例可以在 OMAP3 ISP 驱动
+``drivers/media/platform/ti/omap3isp`` 中找到。
+
+子设备可以通过 ``V4L2_DEVICE_NOTIFY_EVENT`` 直接向 ``v4l2_device``
+的通知函数发送事件。这样,桥接驱动就可以将发送事件的子设备映射到需要
+获知该事件的相关视频节点。
diff --git a/Documentation/translations/zh_CN/driver-api/media/v4l2-fh.rst b/Documentation/translations/zh_CN/driver-api/media/v4l2-fh.rst
new file mode 100644
index 000000000000..1a2faf642602
--- /dev/null
+++ b/Documentation/translations/zh_CN/driver-api/media/v4l2-fh.rst
@@ -0,0 +1,123 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../../disclaimer-zh_CN.rst
+
+:翻译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+:校译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+V4L2 文件句柄
+--------------
+
+``v4l2_fh`` 结构体用于保存 V4L2 框架使用的文件句柄专属数据。
+所有驱动都必须使用它。
+
+驱动在 ``open()`` 文件操作中分配 ``v4l2_fh``,通常将其嵌入到
+更大的驱动专用结构体中。必须调用 ``v4l2_fh_init()`` 初始化,
+再调用 ``v4l2_fh_add()`` 将其加入视频设备。后者会设置
+``file->private_data``,使文件对象关联到该 ``v4l2_fh``。
+
+驱动在 ``release()`` 文件操作中释放 ``v4l2_fh``。释放内存前,
+必须依次调用 ``v4l2_fh_del()`` 从视频设备中移除它,并调用
+``v4l2_fh_exit()`` 清理。
+
+驱动不应直接访问 ``file->private_data``,而应通过
+``file_to_v4l2_fh()`` 获取文件关联的 ``v4l2_fh``。
+驱动还可以通过 ``container_of`` 宏取得自己的文件句柄结构体。例如::
+
+    struct my_fh {
+        int blah;
+        struct v4l2_fh fh;
+    };
+
+    ...
+
+    int my_open(struct file *file)
+    {
+        struct my_fh *my_fh;
+        struct video_device *vfd;
+        int ret;
+
+        ...
+
+        my_fh = kzalloc_obj(*my_fh);
+
+        ...
+
+        v4l2_fh_init(&my_fh->fh, vfd);
+
+        ...
+
+        v4l2_fh_add(&my_fh->fh, file);
+        return 0;
+    }
+
+    int my_release(struct file *file)
+    {
+        struct v4l2_fh *fh = file_to_v4l2_fh(file);
+        struct my_fh *my_fh = container_of(fh, struct my_fh, fh);
+
+        ...
+        v4l2_fh_del(&my_fh->fh, file);
+        v4l2_fh_exit(&my_fh->fh);
+        kfree(my_fh);
+        return 0;
+    }
+
+以下是 v4l2_fh 函数使用的简介:
+
+void v4l2_fh_init(struct v4l2_fh \*fh, struct video_device \*vdev)
+
+  初始化文件句柄。这*必须*在驱动的 v4l2_file_operations->open()
+  函数中执行。
+
+void v4l2_fh_add(struct v4l2_fh \*fh, struct file \*filp)
+
+  添加一个 v4l2_fh 到 video_device 文件句柄列表。一旦文件句柄
+  初始化完成就必须调用。
+
+void v4l2_fh_del(struct v4l2_fh \*fh, struct file \*filp)
+
+  解除文件句柄与 video_device 的关联。之后才可以调用文件句柄的
+  清理函数。
+
+void v4l2_fh_exit(struct v4l2_fh \*fh)
+
+  清理文件句柄。清理完成后,驱动才可以释放 ``v4l2_fh`` 占用的内存。
+
+struct v4l2_fh \*file_to_v4l2_fh(struct file \*filp)
+
+  取得与 ``file`` 对象关联的 ``v4l2_fh`` 实例。
+
+
+如果 v4l2_fh 不是嵌入在其他结构体中的,则可以用这些辅助函数:
+
+int v4l2_fh_open(struct file \*filp)
+
+  分配一个 v4l2_fh 结构体空间,初始化并将其添加到 file 结构体相关的
+  video_device 结构体中。
+
+int v4l2_fh_release(struct file \*filp)
+
+  从 file 结构体相关的 video_device 结构体中删除 v4l2_fh ,清理
+  v4l2_fh 并释放空间。
+
+这两个函数可以插入到 v4l2_file_operations 的 open() 和 release()
+操作中。
+
+
+某些驱动需要在第一个文件句柄打开和最后一个文件句柄关闭的时候做些
+工作。所以加入了两个辅助函数以检查 v4l2_fh 结构体是否是相关设备
+节点打开的唯一文件句柄。
+
+int v4l2_fh_is_singular(struct v4l2_fh \*fh)
+
+  如果此文件句柄是唯一打开的文件句柄,则返回 1 ,否则返回 0 。
+
+int v4l2_fh_is_singular_file(struct file \*filp)
+
+  功能相同,但通过 filp->private_data 调用 v4l2_fh_is_singular。
diff --git a/Documentation/translations/zh_CN/driver-api/media/v4l2-intro.rst b/Documentation/translations/zh_CN/driver-api/media/v4l2-intro.rst
new file mode 100644
index 000000000000..d530450c3062
--- /dev/null
+++ b/Documentation/translations/zh_CN/driver-api/media/v4l2-intro.rst
@@ -0,0 +1,75 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../../disclaimer-zh_CN.rst
+
+:翻译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+:校译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+介绍
+----
+
+大部分现代 V4L2 设备由多个 IC 组成,在 /dev 下导出多个设备节点,
+并同时创建非 V4L2 设备(如 DVB、ALSA、FB、I2C 和红外输入设备)。
+由于这种硬件的复杂性,V4L2 驱动也变得非常复杂。
+
+尤其是 V4L2 必须支持 IC 实现音视频的多路复用和编解码,这就更增加了其
+复杂性。通常这些 IC 通过一个或多个 I2C 总线连接到主桥驱动器,但也可
+使用其他总线。这些设备称为“子设备”。
+
+长期以来,这个框架仅限于通过 video_device 结构体创建 V4L 设备节点,
+并使用 video_buf 处理视频缓冲(注:本文不讨论 video_buf 框架)。
+
+这意味着所有驱动必须自己设置设备实例并连接到子设备。其中一部分要正确地
+完成是比较复杂的,使得许多驱动都没有正确地实现。
+
+由于框架的缺失,有很多通用代码都不可重复利用。
+
+因此,这个框架构建所有驱动都需要的基本结构块,而统一的框架将使通用代码
+创建成实用函数并在所有驱动中共享变得更加容易。
+
+可以参考 ``samples/v4l/`` 中的 ``v4l2-pci-skeleton.c``。它是一个
+PCI 采集卡驱动的框架示例,展示了如何使用 V4L2 驱动框架,也可以作为
+实际 PCI 视频采集驱动的模板。
+
+
+驱动结构
+--------
+
+所有 V4L2 驱动都有如下结构:
+
+1) 每个设备实例的结构体--包含其设备状态。
+
+2) 初始化和控制子设备的方法(如果有)。
+
+3) 创建 V4L2 设备节点 (/dev/videoX、/dev/vbiX 和 /dev/radioX)
+   并跟踪设备节点的特定数据。
+
+4) 特定文件句柄结构体--包含每个文件句柄的数据。
+
+5) 视频缓冲处理。
+
+以下是它们的粗略关系图::
+
+    device instances(设备实例)
+      |
+      +-sub-device instances(子设备实例)
+      |
+      \-V4L2 device nodes(V4L2 设备节点)
+          |
+          \-filehandle instances(文件句柄实例)
+
+
+框架结构
+--------
+
+该框架非常类似驱动结构:它有一个 v4l2_device 结构用于保存设备
+实例的数据;一个 v4l2_subdev 结构体代表子设备实例;video_device
+结构体保存 V4L2 设备节点的数据;v4l2_fh 结构体跟踪文件句柄实例。
+
+V4L2 框架也可与媒体框架整合(可选的)。如果驱动设置了 v4l2_device
+结构体的 mdev 域,子设备和视频节点的入口将自动出现在媒体框架中。
diff --git a/Documentation/translations/zh_CN/driver-api/media/v4l2-subdev.rst b/Documentation/translations/zh_CN/driver-api/media/v4l2-subdev.rst
new file mode 100644
index 000000000000..407828c0cab5
--- /dev/null
+++ b/Documentation/translations/zh_CN/driver-api/media/v4l2-subdev.rst
@@ -0,0 +1,491 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../../disclaimer-zh_CN.rst
+
+:翻译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+:校译:
+
+ 傅炜 Fu Wei <tekkamanninja@gmail.com>
+
+V4L2 子设备
+-----------------
+
+许多驱动需要与子设备通信。这些设备可以完成各种任务,但通常它们负责
+音视频复用和编解码。如网络摄像头的子设备通常是传感器和摄像头控制器。
+
+这些一般为 I2C 接口设备,但并不一定都是。为了给驱动提供调用子设备的
+统一接口,v4l2_subdev 结构体(v4l2-subdev.h)产生了。
+
+每个子设备驱动都必须有一个 v4l2_subdev 结构体。这个结构体可以单独
+代表一个简单的子设备,也可以嵌入到一个更大的结构体中,与更多设备状态
+信息保存在一起。通常有一个下级设备结构体(比如:i2c_client)包含了
+内核创建的设备数据。建议使用 v4l2_set_subdevdata() 将这个结构体的
+指针保存在 v4l2_subdev 的私有数据域(dev_priv)中。这使得通过 v4l2_subdev
+找到实际的低层总线特定设备数据变得容易。
+
+你同时需要一个从低层结构体获取 v4l2_subdev 指针的方法。对于常用的
+i2c_client 结构体,i2c_set_clientdata() 函数可用于保存一个 v4l2_subdev
+指针;对于其他总线你可能需要使用其他相关函数。
+
+桥驱动中也应保存每个子设备的私有数据,比如一个指向特定桥的各设备私有
+数据的指针。为此 v4l2_subdev 结构体提供主机私有数据域(host_priv),
+并可通过 v4l2_get_subdev_hostdata() 和 v4l2_set_subdev_hostdata()
+访问。
+
+从总线桥驱动的视角,驱动加载子设备模块并以某种方式获得 v4l2_subdev
+结构体指针。对于 i2c 总线设备相对简单:调用 i2c_get_clientdata()。
+对于其他总线也需要做类似的操作。针对 I2C 总线上的子设备辅助函数帮你
+完成了大部分复杂的工作。
+
+每个 v4l2_subdev 都包含子设备驱动需要实现的函数指针(如果对此设备
+不适用,可为NULL)。由于子设备可完成许多不同的工作,而在一个庞大的
+函数指针结构体中通常仅有少数有用的函数实现其功能肯定不合适。所以,
+函数指针根据其实现的功能被分类,每一类都有自己的函数指针结构体。
+
+顶层函数指针结构体包含了指向各类函数指针结构体的指针,如果子设备驱动
+不支持该类函数中的任何一个功能,则指向该类结构体的指针为NULL。
+
+这些结构体定义如下::
+
+    struct v4l2_subdev_core_ops {
+        int (*log_status)(struct v4l2_subdev *sd);
+        int (*init)(struct v4l2_subdev *sd, u32 val);
+        ...
+    };
+
+    struct v4l2_subdev_tuner_ops {
+        ...
+    };
+
+    struct v4l2_subdev_audio_ops {
+        ...
+    };
+
+    struct v4l2_subdev_video_ops {
+        ...
+    };
+
+    struct v4l2_subdev_pad_ops {
+        ...
+    };
+
+    struct v4l2_subdev_ops {
+        const struct v4l2_subdev_core_ops  *core;
+        const struct v4l2_subdev_tuner_ops *tuner;
+        const struct v4l2_subdev_audio_ops *audio;
+        const struct v4l2_subdev_video_ops *video;
+        const struct v4l2_subdev_pad_ops *pad;
+    };
+
+其中 core(核心)函数集通常可用于所有子设备,其他类别的实现依赖于
+子设备。如视频设备可能不支持音频操作函数,反之亦然。
+
+这样的设置在限制了函数指针数量的同时,还使增加新的操作函数和分类
+变得较为容易。
+
+子设备驱动可使用如下函数初始化 v4l2_subdev 结构体::
+
+        v4l2_subdev_init(sd, &ops);
+
+然后,你必须用一个唯一的名字初始化 subdev->name,并初始化模块的
+owner 域。若使用 i2c 辅助函数,这些都会帮你处理好。
+
+若需同媒体框架整合,且实体具有 pad,你必须调用
+media_entity_pads_init() 初始化 v4l2_subdev 结构体中的
+media_entity 结构体(entity 域)::
+
+        struct media_pad *pads = &my_sd->pads;
+        int err;
+
+        err = media_entity_pads_init(&sd->entity, npads, pads);
+
+pads 数组必须预先初始化。无须手动设置 media_entity 的 function 和
+name 域,但如有必要,revision 域必须初始化。
+
+当子设备节点(如有)被打开或关闭时,对 entity 的引用将被自动获取或释放。
+
+在子设备被销毁之前,不要忘记清理 media_entity 结构体::
+
+        media_entity_cleanup(&sd->entity);
+
+如果子设备驱动实现了接收端 pad,可以在 ``v4l2_subdev_pad_ops`` 中
+设置 ``link_validate``,提供自己的链接验证函数。管道中每条链接都会
+调用接收端的这一操作;驱动仍须验证子设备与视频节点之间的格式配置。
+
+如果 link_validate 操作没有设置,默认的 v4l2_subdev_link_validate_default()
+函数将会被调用。这个函数保证宽、高和媒体总线像素格式在链接的收发两端
+都一致。子设备驱动除了它们自己的检测外,也可以自由使用这个函数以执行
+上面提到的检查。
+
+子设备注册
+~~~~~~~~~~
+
+目前有两种向 V4L2 核心注册子设备的方法。传统方式由桥接驱动注册,适用于
+桥接驱动掌握所连接子设备的完整信息,并且知道何时注册它们的情况,例如
+SoC 或复杂 PCI(e) 板卡内的视频处理单元、USB 摄像头或 SoC 所连接的
+传感器。另一种方式是异步注册:例如在设备树系统中,I2C 设备节点中的
+子设备信息可以独立于桥接设备出现。两种方式只影响探测过程;运行时桥接
+设备与子设备的交互方式相同。
+
+同步注册子设备
+^^^^^^^^^^^^^^
+
+同步注册时,设备(桥接)驱动须向 ``v4l2_device`` 注册
+``v4l2_subdev``::
+
+        int err = v4l2_device_register_subdev(v4l2_dev, sd);
+
+如果子设备模块在它注册前消失,这个操作可能失败。在这个函数成功返回后,
+subdev->dev 域就指向了 v4l2_device。
+
+如果 v4l2_device 父设备的 mdev 域为非 NULL 值,则子设备实体将被自动
+注册为媒体设备。
+
+注销子设备则可用如下函数::
+
+        v4l2_device_unregister_subdev(sd);
+
+此后,子设备模块就可卸载,且 sd->dev == NULL。
+
+.. _media-registering-async-subdevs-zh:
+
+异步注册子设备
+^^^^^^^^^^^^^^
+
+异步注册时,子设备的探测可以独立于桥接驱动启动。子设备驱动须确认探测
+所需条件均已满足,例如主时钟可用;条件不满足时可返回
+``-EPROBE_DEFER``,请求稍后重新探测。条件满足后,调用
+``v4l2_async_register_subdev()`` 注册;调用
+``v4l2_async_unregister_subdev()`` 注销。异步注册的子设备保存在
+全局列表中,等待桥接驱动匹配。
+
+在调用 ``v4l2_async_register_subdev()`` 之前,驱动必须完成子设备的
+全部初始化,包括启用运行时电源管理,因为注册完成后子设备立即可被访问。
+
+异步子设备通知器
+^^^^^^^^^^^^^^^^
+
+桥接驱动须调用 ``v4l2_async_nf_register()`` 注册通知器,并调用
+``v4l2_async_nf_unregister()`` 注销。释放已注销通知器的内存前,还须
+调用 ``v4l2_async_nf_cleanup()`` 清理。注册前,应先调用
+``v4l2_async_nf_init()`` 初始化通知器,再为桥接设备建立所需的异步
+连接描述符列表。可通过 ``v4l2_async_nf_add_fwnode()``、
+``v4l2_async_nf_add_fwnode_remote()`` 和 ``v4l2_async_nf_add_i2c()``
+添加连接。
+
+异步连接描述符表示驱动尚未完成探测的外部子设备连接。当对应子设备可用时,
+可以据此建立媒体数据链接或辅助链接。一个子设备可能对应一个或多个异步连接;
+添加描述符时还不知道最终匹配结果。系统会在发现匹配的子设备时逐个绑定连接。
+
+子设备的异步通知器
+^^^^^^^^^^^^^^^^^^
+
+异步注册的子设备驱动也可以注册通知器。流程与桥接驱动相似,但应改用
+``v4l2_async_subdev_nf_init()`` 初始化。子设备通知器只有在 V4L2 设备
+可用时才能完成绑定;也就是说,必须存在经由异步子设备和通知器通向某个
+非子设备通知器的路径。
+
+摄像头传感器驱动的异步注册辅助函数
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+``v4l2_async_register_subdev_sensor()`` 帮助传感器驱动注册自身的
+异步连接,同时注册通知器,并为固件中发现的镜头和闪光灯设备注册异步连接。
+调用 ``v4l2_async_unregister_subdev()`` 注销子设备时,也会注销并清理
+该通知器。
+
+异步子设备通知器示例
+^^^^^^^^^^^^^^^^^^^^
+
+添加函数分配的异步连接描述符类型为 ``v4l2_async_connection``,
+通常嵌入在驱动专用结构体中,并且必须是该结构体的第一个成员。例如::
+
+    struct my_async_connection {
+        struct v4l2_async_connection asc;
+        ...
+    };
+
+    struct my_async_connection *my_asc;
+    struct fwnode_handle *ep;
+
+    ...
+
+    my_asc = v4l2_async_nf_add_fwnode_remote(&notifier, ep,
+                                              struct my_async_connection);
+    fwnode_handle_put(ep);
+
+    if (IS_ERR(my_asc))
+        return PTR_ERR(my_asc);
+
+异步子设备通知器回调
+^^^^^^^^^^^^^^^^^^^^
+
+V4L2 核心用连接描述符匹配异步注册的子设备。匹配时调用通知器的
+``.bound()`` 回调;所有连接绑定后调用 ``.complete()``;连接从系统
+移除时调用 ``.unbind()``。这三个回调都是可选的。
+
+驱动可以在包含 ``v4l2_async_connection`` 的专用结构体中保存数据。
+若释放结构体时需对这些数据做特殊处理,应实现通知器的
+``.destroy()`` 回调。框架会在释放连接描述符前调用它。
+
+调用子设备操作
+~~~~~~~~~~~~~~
+
+``v4l2_subdev`` 是通用结构体,不包含底层硬件的专有信息。例如,一个驱动
+可以同时包含通过 I2C 总线和 GPIO 引脚控制的子设备。这种区别只在配置设备
+时有影响;子设备注册后,调用者无须再区分它们。
+
+注册子设备后,可通过以下方式直接调用其操作函数::
+
+        err = sd->ops->core->g_std(sd, &norm);
+
+但使用如下宏会比较容易且合适::
+
+        err = v4l2_subdev_call(sd, core, g_std, &norm);
+
+这个宏将会做 NULL 指针检查,如果 subdev 为 NULL,则返回-ENODEV;如果
+subdev->core 或 subdev->core->g_std 为 NULL,则返回 -ENOIOCTLCMD;
+否则将返回 subdev->ops->core->g_std ops 调用的实际结果。
+
+有时也可能同时调用所有或一系列子设备的某个操作函数::
+
+        v4l2_device_call_all(v4l2_dev, 0, core, g_std, &norm);
+
+任何不支持此操作的子设备都会被跳过,并忽略错误返回值。但如果你需要
+检查出错码,则可使用如下函数::
+
+        err = v4l2_device_call_until_err(v4l2_dev, 0, core, g_std, &norm);
+
+除 -ENOIOCTLCMD 外的任何错误都会跳出循环并返回错误值。如果(除 -ENOIOCTLCMD
+外)没有错误发生,则返回 0。
+
+对于以上两个函数的第二个参数为组 ID。如果为 0,则所有子设备都会执行
+这个操作。如果为非 0 值,则只有那些组 ID 匹配的子设备才会执行此操作。
+在桥驱动注册一个子设备前,可以设置 sd->grp_id 为任何期望值(默认值为
+0)。这个值属于桥驱动,且子设备驱动将不会修改和使用它。
+
+组 ID 赋予了桥驱动更多对于如何调用回调的控制。例如,电路板上有多个
+音频芯片,每个都有改变音量的能力。但当用户想要改变音量的时候,通常
+只有一个会被实际使用。你可以对这样的子设备设置组 ID 为(例如 AUDIO_CONTROLLER)
+并在调用 v4l2_device_call_all() 时指定它为组 ID 值。这就保证了只有
+需要的子设备才会执行这个回调。
+
+如果子设备需要通知它的 v4l2_device 父设备一个事件,可以调用
+v4l2_subdev_notify(sd, notification, arg)。这个宏检查是否有一个
+notify() 回调被注册,如果没有,返回 -ENODEV。否则返回 notify() 调用
+结果。
+
+V4L2 子设备用户空间API
+----------------------
+
+传统上,桥接驱动向用户空间提供一个或多个视频节点,并在响应视频节点
+操作时,通过 ``v4l2_subdev_ops`` 控制子设备,以隐藏底层硬件的复杂性。
+复杂设备可能需要比视频节点提供的更细粒度的控制。实现媒体控制器 API
+的桥接驱动可以选择让用户空间直接访问子设备操作。
+
+可以在 /dev 中创建名为 v4l-subdevX 设备节点,以通过其直接访问子设备。
+如果子设备支持用户空间直接配置,必须在注册前设置 V4L2_SUBDEV_FL_HAS_DEVNODE
+标志。
+
+注册子设备之后, v4l2_device 驱动会通过调用 v4l2_device_register_subdev_nodes()
+函数为所有已注册并设置了 V4L2_SUBDEV_FL_HAS_DEVNODE 的子设备创建
+设备节点。这些设备节点会在子设备注销时自动删除。
+
+这些设备节点处理 V4L2 API 的一个子集。
+
+``VIDIOC_QUERYCTRL``、
+``VIDIOC_QUERYMENU``、
+``VIDIOC_G_CTRL``、
+``VIDIOC_S_CTRL``、
+``VIDIOC_G_EXT_CTRLS``、
+``VIDIOC_S_EXT_CTRLS`` 和
+``VIDIOC_TRY_EXT_CTRLS``:
+
+        这些控制 ioctl 与 V4L2 中定义的一致。它们的行为相同,唯一的
+        不同是它们只处理子设备的控制实现。根据驱动程序,这些控制也
+        可以通过一个(或多个) V4L2 设备节点访问。
+
+``VIDIOC_DQEVENT``、
+``VIDIOC_SUBSCRIBE_EVENT`` 和
+``VIDIOC_UNSUBSCRIBE_EVENT``:
+
+        这些事件 ioctl 与 V4L2 中定义的一致。它们的行为相同,唯一的
+        不同是它们只处理子设备产生的事件。根据驱动程序,这些事件也
+        可以通过一个(或多个) V4L2 设备节点上报。
+
+        要使用事件通知的子设备驱动,须在注册子设备前设置
+        ``v4l2_subdev`` 的 ``V4L2_SUBDEV_FL_HAS_EVENTS`` 标志。
+        注册完成后,可以像通常一样通过子设备节点将事件入队。
+
+        为正确支持事件机制,poll() 文件操作也应被实现。
+
+私有 ioctls
+
+        不在以上列表中的所有 ioctls 会通过 core::ioctl 操作直接传递
+        给子设备驱动。
+
+只读子设备用户空间 API
+----------------------
+
+通过 ``v4l2_subdev_ops`` 直接调用内核 API 来控制所连接子设备的桥接驱动,
+通常不希望用户空间通过子设备节点修改同一组参数,因此一般不会注册节点。
+但有时允许用户空间通过只读 API 查看当前配置很有用:应用可以检查子设备,
+却不能改变其参数。
+
+例如计算摄影应用需要了解传感器在每种输出分辨率下的跳行、像素合并、裁剪
+和缩放配置。桥接驱动可以为此通过只读接口开放子设备操作。
+
+对于设置了 ``V4L2_SUBDEV_FL_HAS_DEVNODE`` 的全部已注册子设备,
+``v4l2_device`` 驱动可调用
+``v4l2_device_register_ro_subdev_nodes()`` 创建只读设备节点。
+这些节点对以下 ioctl 的访问受到限制:
+
+* ``VIDIOC_SUBDEV_S_FMT``、``VIDIOC_SUBDEV_S_CROP`` 和
+  ``VIDIOC_SUBDEV_S_SELECTION``:只有操作 ``V4L2_SUBDEV_FORMAT_TRY``
+  格式及选区矩形时才允许调用。
+* ``VIDIOC_SUBDEV_S_FRAME_INTERVAL``、``VIDIOC_SUBDEV_S_DV_TIMINGS``
+  和 ``VIDIOC_SUBDEV_S_STD``:不允许调用。
+
+如果 ioctl 不被允许,或者要修改的格式设为
+``V4L2_SUBDEV_FORMAT_ACTIVE``,核心会返回负错误码,并将 ``errno``
+设为 ``-EPERM``。
+
+
+I2C 子设备驱动
+--------------
+
+由于这些驱动很常见,内核提供了专用辅助函数(``v4l2-common.h``),让这些
+设备的使用更加容易。
+
+添加 v4l2_subdev 支持的推荐方法是让 I2C 驱动将 v4l2_subdev 结构体
+嵌入到为每个 I2C 设备实例创建的状态结构体中。而最简单的设备没有状态
+结构体,此时可以直接创建一个 v4l2_subdev 结构体。
+
+一个典型的状态结构体如下所示(‘chipname’用芯片名代替)::
+
+    struct chipname_state {
+        struct v4l2_subdev sd;
+        ...  /* 附加的状态域*/
+    };
+
+初始化 v4l2_subdev 结构体的方法如下::
+
+        v4l2_i2c_subdev_init(&state->sd, client, subdev_ops);
+
+这个函数将填充 v4l2_subdev 结构体中的所有域,并保证 v4l2_subdev 和
+i2c_client 都指向彼此。
+
+同时,你也应该为从 v4l2_subdev 指针找到 chipname_state 结构体指针
+添加一个辅助内联函数。 ::
+
+    static inline struct chipname_state *to_state(struct v4l2_subdev *sd)
+    {
+        return container_of(sd, struct chipname_state, sd);
+    }
+
+使用以下函数可以通过 v4l2_subdev 结构体指针获得 i2c_client 结构体
+指针::
+
+        struct i2c_client *client = v4l2_get_subdevdata(sd);
+
+而以下函数则相反,通过 i2c_client 结构体指针获得 v4l2_subdev 结构体
+指针::
+
+        struct v4l2_subdev *sd = i2c_get_clientdata(client);
+
+调用 ``remove()`` 回调时,必须调用
+``v4l2_device_unregister_subdev(sd)``。此操作会从桥接驱动中注销
+子设备;即使子设备从未注册,调用此函数也是安全的。
+
+必须这样做的原因是:当桥驱动注销 i2c 适配器时,remove()回调函数
+会被那个适配器上的 i2c 设备调用。此后,相应的 v4l2_subdev 结构体
+就不再有效,所以必须先注销它们。在 ``remove()`` 回调中调用
+v4l2_device_unregister_subdev(sd),可以保证执行总是正确的。
+
+
+桥接驱动还可以使用一些辅助函数::
+
+    struct v4l2_subdev *sd = v4l2_i2c_new_subdev(v4l2_dev, adapter,
+               "module_foo", "chipid", 0x36, NULL);
+
+这个函数会加载给定的模块(如果没有模块需要加载,可以为 NULL),
+并用给定的 i2c 适配器结构体指针(i2c_adapter)和 器件地址(chip/address)
+作为参数调用 i2c_new_client_device()。如果一切顺利,就会向 v4l2_device
+注册子设备。
+
+你也可以利用 v4l2_i2c_new_subdev()的最后一个参数,传递一个可能的
+I2C 地址数组,让函数自动探测。这些探测地址只有在前一个参数为 0 的
+情况下使用。非零参数意味着你知道准确的 i2c 地址,所以此时无须进行
+探测。
+
+如果出错,两个函数都返回 NULL。
+
+注意:传递给 v4l2_i2c_new_subdev()的 chipid 通常与模块名一致。
+它允许你指定一个芯片的变体,比如“saa7114”或“saa7115”。一般通过
+i2c 驱动自动探测。chipid 的使用是在今后需要深入了解的事情。这个与
+i2c 驱动不同,较容易混淆。要知道支持哪些芯片变体,你可以查阅 i2c
+驱动代码的 i2c_device_id 表,上面列出了所有可能支持的芯片。
+
+还有一个辅助函数:``v4l2_i2c_new_subdev_board()`` 接收
+``i2c_board_info`` 结构体,将其传给 I2C 驱动,代替原先单独传递的
+``irq``、``platform_data`` 和 ``addr`` 参数。
+
+如果子设备支持核心操作 ``s_config``,则在子设备设置完成后,以
+``irq`` 和 ``platform_data`` 为参数调用该操作。
+``v4l2_i2c_new_subdev()`` 会在内部调用
+``v4l2_i2c_new_subdev_board()``,并用 ``client_type`` 和 ``addr``
+填充 ``i2c_board_info``。
+
+集中管理的子设备活动状态
+------------------------
+
+传统上,V4L2 子设备驱动自行维护活动配置的内部状态。例如,驱动可以为每个
+pad 保存一个 ``v4l2_mbus_framefmt``,并以类似方式保存裁剪和合成矩形。
+
+除活动配置外,V4L2 核心还为每个子设备文件句柄管理一个
+``v4l2_subdev_state``,用于保存尝试配置(try configuration)。
+
+为简化子设备驱动,V4L2 子设备 API 现在可选用由核心集中管理的活动配置,
+以 ``v4l2_subdev_state`` 表示。活动状态实例保存在子设备自身的
+``v4l2_subdev`` 结构体中;核心还为每个打开的文件句柄分配尝试状态,
+以保存该文件句柄对应的尝试配置。
+
+驱动可以选择使用这种状态管理方式:在注册子设备之前调用
+``v4l2_subdev_init_finalize()`` 初始化状态,并在注销子设备之前调用
+``v4l2_subdev_cleanup()`` 释放资源。核心会为每个打开的文件句柄自动
+分配并初始化尝试状态,关闭文件句柄时将其释放。
+
+同时使用活动格式和尝试格式的子设备操作,通过 ``state`` 参数取得正确
+的状态。调用者须用 ``v4l2_subdev_lock_state()`` 和
+``v4l2_subdev_unlock_state()`` 加锁与解锁;也可以通过
+``v4l2_subdev_call_state_active()`` 宏调用操作,由它处理活动状态。
+
+没有接收 ``state`` 参数的操作隐式作用于子设备的活动状态。驱动可调用
+``v4l2_subdev_lock_and_get_active_state()`` 独占访问,并同样通过
+``v4l2_subdev_unlock_state()`` 释放。驱动绝不能绕开这些辅助函数,
+直接访问 ``v4l2_subdev`` 或文件句柄中保存的状态。
+
+V4L2 核心会向子设备操作传入正确的尝试状态或活动状态,但许多旧驱动通过
+``v4l2_subdev_call()`` 调用操作时传入 ``NULL`` 状态。对于让核心管理
+活动状态的子设备驱动,这会造成问题,因为它们需要收到适当的状态参数。
+为便于逐步转换,``v4l2_subdev_call()`` 增加了一层包装:遇到 ``NULL``
+时,它通过 ``v4l2_subdev_lock_and_get_active_state()`` 获取并锁定
+被调用方的活动状态,并在调用结束后解锁。
+
+完整的子设备状态实际上由 ``v4l2_subdev_state``、子设备控制项和驱动
+内部状态三部分组成。将来这些部分应合并;目前可以共享一个锁来协调它们。
+``v4l2_ctrl_handler`` 已通过 ``lock`` 指针支持这种方式。驱动可在调用
+``v4l2_subdev_init_finalize()`` 前设置::
+
+    sd->ctrl_handler->lock = &priv->mutex;
+    sd->state_lock = &priv->mutex;
+
+这样,控制项和状态就共用驱动的私有互斥锁。
+
+多路流、复用媒体 pad 和内部路由
+-------------------------------
+
+子设备驱动可以设置 ``V4L2_SUBDEV_FL_STREAMS`` 标志,并实现由核心
+管理的活动状态、路由和按流配置,以支持复用流。
diff --git a/Documentation/translations/zh_CN/video4linux/v4l2-framework.txt b/Documentation/translations/zh_CN/video4linux/v4l2-framework.txt
deleted file mode 100644
index 05414579efac..000000000000
--- a/Documentation/translations/zh_CN/video4linux/v4l2-framework.txt
+++ /dev/null
@@ -1,958 +0,0 @@
-Chinese translated version of Documentation/driver-api/media/index.rst
-
-If you have any comment or update to the content, please contact the
-original document maintainer directly.  However, if you have a problem
-communicating in English you can also ask the Chinese maintainer for
-help.  Contact the Chinese maintainer if this translation is outdated
-or if there is a problem with the translation.
-
-Maintainer: Mauro Carvalho Chehab <mchehab@kernel.org>
-Chinese maintainer: Fu Wei <tekkamanninja@gmail.com>
----------------------------------------------------------------------
-Documentation/driver-api/media/index.rst 的中文翻译
-
-如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
-交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
-译存在问题,请联系中文版维护者。
-英文版维护者: Mauro Carvalho Chehab <mchehab@kernel.org>
-中文版维护者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
-中文版翻译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
-中文版校译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
-
-
-以下为正文
----------------------------------------------------------------------
-V4L2 驱动框架概览
-==============
-
-本文档描述 V4L2 框架所提供的各种结构和它们之间的关系。
-
-
-介绍
-----
-
-大部分现代 V4L2 设备由多个 IC 组成,在 /dev 下导出多个设备节点,
-并同时创建非 V4L2 设备(如 DVB、ALSA、FB、I2C 和红外输入设备)。
-由于这种硬件的复杂性,V4L2 驱动也变得非常复杂。
-
-尤其是 V4L2 必须支持 IC 实现音视频的多路复用和编解码,这就更增加了其
-复杂性。通常这些 IC 通过一个或多个 I2C 总线连接到主桥驱动器,但也可
-使用其他总线。这些设备称为“子设备”。
-
-长期以来,这个框架仅限于通过 video_device 结构体创建 V4L 设备节点,
-并使用 video_buf 处理视频缓冲(注:本文不讨论 video_buf 框架)。
-
-这意味着所有驱动必须自己设置设备实例并连接到子设备。其中一部分要正确地
-完成是比较复杂的,使得许多驱动都没有正确地实现。
-
-由于框架的缺失,有很多通用代码都不可重复利用。
-
-因此,这个框架构建所有驱动都需要的基本结构块,而统一的框架将使通用代码
-创建成实用函数并在所有驱动中共享变得更加容易。
-
-
-驱动结构
--------
-
-所有 V4L2 驱动都有如下结构:
-
-1) 每个设备实例的结构体--包含其设备状态。
-
-2) 初始化和控制子设备的方法(如果有)。
-
-3) 创建 V4L2 设备节点 (/dev/videoX、/dev/vbiX 和 /dev/radioX)
-   并跟踪设备节点的特定数据。
-
-4) 特定文件句柄结构体--包含每个文件句柄的数据。
-
-5) 视频缓冲处理。
-
-以下是它们的初略关系图:
-
-    device instances(设备实例)
-      |
-      +-sub-device instances(子设备实例)
-      |
-      \-V4L2 device nodes(V4L2 设备节点)
-	  |
-	  \-filehandle instances(文件句柄实例)
-
-
-框架结构
--------
-
-该框架非常类似驱动结构:它有一个 v4l2_device 结构用于保存设备
-实例的数据;一个 v4l2_subdev 结构体代表子设备实例;video_device
-结构体保存 V4L2 设备节点的数据;将来 v4l2_fh 结构体将跟踪文件句柄
-实例(暂未尚未实现)。
-
-V4L2 框架也可与媒体框架整合(可选的)。如果驱动设置了 v4l2_device
-结构体的 mdev 域,子设备和视频节点的入口将自动出现在媒体框架中。
-
-
-v4l2_device 结构体
-----------------
-
-每个设备实例都通过 v4l2_device (v4l2-device.h)结构体来表示。
-简单设备可以仅分配这个结构体,但在大多数情况下,都会将这个结构体
-嵌入到一个更大的结构体中。
-
-你必须注册这个设备实例:
-
-	v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev);
-
-注册操作将会初始化 v4l2_device 结构体。如果 dev->driver_data 域
-为 NULL,就将其指向 v4l2_dev。
-
-需要与媒体框架整合的驱动必须手动设置 dev->driver_data,指向包含
-v4l2_device 结构体实例的驱动特定设备结构体。这可以在注册 V4L2 设备
-实例前通过 dev_set_drvdata() 函数完成。同时必须设置 v4l2_device
-结构体的 mdev 域,指向适当的初始化并注册过的 media_device 实例。
-
-如果 v4l2_dev->name 为空,则它将被设置为从 dev 中衍生出的值(为了
-更加精确,形式为驱动名后跟 bus_id)。如果你在调用 v4l2_device_register
-前已经设置好了,则不会被修改。如果 dev 为 NULL,则你*必须*在调用
-v4l2_device_register 前设置 v4l2_dev->name。
-
-你可以基于驱动名和驱动的全局 atomic_t 类型的实例编号,通过
-v4l2_device_set_name() 设置 name。这样会生成类似 ivtv0、ivtv1 等
-名字。若驱动名以数字结尾,则会在编号和驱动名间插入一个破折号,如:
-cx18-0、cx18-1 等。此函数返回实例编号。
-
-第一个 “dev” 参数通常是一个指向 pci_dev、usb_interface 或
-platform_device 的指针。很少使其为 NULL,除非是一个ISA设备或者
-当一个设备创建了多个 PCI 设备,使得 v4l2_dev 无法与一个特定的父设备
-关联。
-
-你也可以提供一个 notify() 回调,使子设备可以调用它实现事件通知。
-但这个设置与子设备相关。子设备支持的任何通知必须在
-include/media/<subdevice>.h 中定义一个消息头。
-
-注销 v4l2_device 使用如下函数:
-
-	v4l2_device_unregister(struct v4l2_device *v4l2_dev);
-
-如果 dev->driver_data 域指向 v4l2_dev,将会被重置为 NULL。注销同时
-会自动从设备中注销所有子设备。
-
-如果你有一个热插拔设备(如USB设备),则当断开发生时,父设备将无效。
-由于 v4l2_device 有一个指向父设备的指针必须被清除,同时标志父设备
-已消失,所以必须调用以下函数:
-
-	v4l2_device_disconnect(struct v4l2_device *v4l2_dev);
-
-这个函数并*不*注销子设备,因此你依然要调用 v4l2_device_unregister()
-函数。如果你的驱动器并非热插拔的,就没有必要调用 v4l2_device_disconnect()。
-
-有时你需要遍历所有被特定驱动注册的设备。这通常发生在多个设备驱动使用
-同一个硬件的情况下。如:ivtvfb 驱动是一个使用 ivtv 硬件的帧缓冲驱动,
-同时 alsa 驱动也使用此硬件。
-
-你可以使用如下例程遍历所有注册的设备:
-
-static int callback(struct device *dev, void *p)
-{
-	struct v4l2_device *v4l2_dev = dev_get_drvdata(dev);
-
-	/* 测试这个设备是否已经初始化 */
-	if (v4l2_dev == NULL)
-		return 0;
-	...
-	return 0;
-}
-
-int iterate(void *p)
-{
-	struct device_driver *drv;
-	int err;
-
-	/* 在PCI 总线上查找ivtv驱动。
-	   pci_bus_type是全局的. 对于USB总线使用usb_bus_type。 */
-	drv = driver_find("ivtv", &pci_bus_type);
-	/* 遍历所有的ivtv设备实例 */
-	err = driver_for_each_device(drv, NULL, p, callback);
-	put_driver(drv);
-	return err;
-}
-
-有时你需要一个设备实例的运行计数。这个通常用于映射一个设备实例到一个
-模块选择数组的索引。
-
-推荐方法如下:
-
-static atomic_t drv_instance = ATOMIC_INIT(0);
-
-static int drv_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
-{
-	...
-	state->instance = atomic_inc_return(&drv_instance) - 1;
-}
-
-如果你有多个设备节点,对于热插拔设备,知道何时注销 v4l2_device 结构体
-就比较困难。为此 v4l2_device 有引用计数支持。当调用 video_register_device
-时增加引用计数,而设备节点释放时减小引用计数。当引用计数为零,则
-v4l2_device 的release() 回调将被执行。你就可以在此时做最后的清理工作。
-
-如果创建了其他设备节点(比如 ALSA),则你可以通过以下函数手动增减
-引用计数:
-
-void v4l2_device_get(struct v4l2_device *v4l2_dev);
-
-或:
-
-int v4l2_device_put(struct v4l2_device *v4l2_dev);
-
-由于引用技术初始化为 1 ,你也需要在 disconnect() 回调(对于 USB 设备)中
-调用 v4l2_device_put,或者 remove() 回调(例如对于 PCI 设备),否则
-引用计数将永远不会为 0 。
-
-v4l2_subdev结构体
-------------------
-
-许多驱动需要与子设备通信。这些设备可以完成各种任务,但通常他们负责
-音视频复用和编解码。如网络摄像头的子设备通常是传感器和摄像头控制器。
-
-这些一般为 I2C 接口设备,但并不一定都是。为了给驱动提供调用子设备的
-统一接口,v4l2_subdev 结构体(v4l2-subdev.h)产生了。
-
-每个子设备驱动都必须有一个 v4l2_subdev 结构体。这个结构体可以单独
-代表一个简单的子设备,也可以嵌入到一个更大的结构体中,与更多设备状态
-信息保存在一起。通常有一个下级设备结构体(比如:i2c_client)包含了
-内核创建的设备数据。建议使用 v4l2_set_subdevdata() 将这个结构体的
-指针保存在 v4l2_subdev 的私有数据域(dev_priv)中。这使得通过 v4l2_subdev
-找到实际的低层总线特定设备数据变得容易。
-
-你同时需要一个从低层结构体获取 v4l2_subdev 指针的方法。对于常用的
-i2c_client 结构体,i2c_set_clientdata() 函数可用于保存一个 v4l2_subdev
-指针;对于其他总线你可能需要使用其他相关函数。
-
-桥驱动中也应保存每个子设备的私有数据,比如一个指向特定桥的各设备私有
-数据的指针。为此 v4l2_subdev 结构体提供主机私有数据域(host_priv),
-并可通过 v4l2_get_subdev_hostdata() 和 v4l2_set_subdev_hostdata()
-访问。
-
-从总线桥驱动的视角,驱动加载子设备模块并以某种方式获得 v4l2_subdev
-结构体指针。对于 i2c 总线设备相对简单:调用 i2c_get_clientdata()。
-对于其他总线也需要做类似的操作。针对 I2C 总线上的子设备辅助函数帮你
-完成了大部分复杂的工作。
-
-每个 v4l2_subdev 都包含子设备驱动需要实现的函数指针(如果对此设备
-不适用,可为NULL)。由于子设备可完成许多不同的工作,而在一个庞大的
-函数指针结构体中通常仅有少数有用的函数实现其功能肯定不合适。所以,
-函数指针根据其实现的功能被分类,每一类都有自己的函数指针结构体。
-
-顶层函数指针结构体包含了指向各类函数指针结构体的指针,如果子设备驱动
-不支持该类函数中的任何一个功能,则指向该类结构体的指针为NULL。
-
-这些结构体定义如下:
-
-struct v4l2_subdev_core_ops {
-	int (*log_status)(struct v4l2_subdev *sd);
-	int (*init)(struct v4l2_subdev *sd, u32 val);
-	...
-};
-
-struct v4l2_subdev_tuner_ops {
-	...
-};
-
-struct v4l2_subdev_audio_ops {
-	...
-};
-
-struct v4l2_subdev_video_ops {
-	...
-};
-
-struct v4l2_subdev_pad_ops {
-	...
-};
-
-struct v4l2_subdev_ops {
-	const struct v4l2_subdev_core_ops  *core;
-	const struct v4l2_subdev_tuner_ops *tuner;
-	const struct v4l2_subdev_audio_ops *audio;
-	const struct v4l2_subdev_video_ops *video;
-	const struct v4l2_subdev_pad_ops *video;
-};
-
-其中 core(核心)函数集通常可用于所有子设备,其他类别的实现依赖于
-子设备。如视频设备可能不支持音频操作函数,反之亦然。
-
-这样的设置在限制了函数指针数量的同时,还使增加新的操作函数和分类
-变得较为容易。
-
-子设备驱动可使用如下函数初始化 v4l2_subdev 结构体:
-
-	v4l2_subdev_init(sd, &ops);
-
-然后,你必须用一个唯一的名字初始化 subdev->name,并初始化模块的
-owner 域。若使用 i2c 辅助函数,这些都会帮你处理好。
-
-若需同媒体框架整合,你必须调用 media_entity_pads_init() 初始化 v4l2_subdev
-结构体中的 media_entity 结构体(entity 域):
-
-	struct media_pad *pads = &my_sd->pads;
-	int err;
-
-	err = media_entity_pads_init(&sd->entity, npads, pads);
-
-pads 数组必须预先初始化。无须手动设置 media_entity 的 type 和
-name 域,但如有必要,revision 域必须初始化。
-
-当(任何)子设备节点被打开/关闭,对 entity 的引用将被自动获取/释放。
-
-在子设备被注销之后,不要忘记清理 media_entity 结构体:
-
-	media_entity_cleanup(&sd->entity);
-
-如果子设备驱动趋向于处理视频并整合进了媒体框架,必须使用 v4l2_subdev_pad_ops
-替代 v4l2_subdev_video_ops 实现格式相关的功能。
-
-这种情况下,子设备驱动应该设置 link_validate 域,以提供它自身的链接
-验证函数。链接验证函数应对管道(两端链接的都是 V4L2 子设备)中的每个
-链接调用。驱动还要负责验证子设备和视频节点间格式配置的正确性。
-
-如果 link_validate 操作没有设置,默认的 v4l2_subdev_link_validate_default()
-函数将会被调用。这个函数保证宽、高和媒体总线像素格式在链接的收发两端
-都一致。子设备驱动除了它们自己的检测外,也可以自由使用这个函数以执行
-上面提到的检查。
-
-设备(桥)驱动程序必须向 v4l2_device 注册 v4l2_subdev:
-
-	int err = v4l2_device_register_subdev(v4l2_dev, sd);
-
-如果子设备模块在它注册前消失,这个操作可能失败。在这个函数成功返回后,
-subdev->dev 域就指向了 v4l2_device。
-
-如果 v4l2_device 父设备的 mdev 域为非 NULL 值,则子设备实体将被自动
-注册为媒体设备。
-
-注销子设备则可用如下函数:
-
-	v4l2_device_unregister_subdev(sd);
-
-此后,子设备模块就可卸载,且 sd->dev == NULL。
-
-注册之设备后,可通过以下方式直接调用其操作函数:
-
-	err = sd->ops->core->g_std(sd, &norm);
-
-但使用如下宏会比较容易且合适:
-
-	err = v4l2_subdev_call(sd, core, g_std, &norm);
-
-这个宏将会做 NULL 指针检查,如果 subdev 为 NULL,则返回-ENODEV;如果
-subdev->core 或 subdev->core->g_std 为 NULL,则返回 -ENOIOCTLCMD;
-否则将返回 subdev->ops->core->g_std ops 调用的实际结果。
-
-有时也可能同时调用所有或一系列子设备的某个操作函数:
-
-	v4l2_device_call_all(v4l2_dev, 0, core, g_std, &norm);
-
-任何不支持此操作的子设备都会被跳过,并忽略错误返回值。但如果你需要
-检查出错码,则可使用如下函数:
-
-	err = v4l2_device_call_until_err(v4l2_dev, 0, core, g_std, &norm);
-
-除 -ENOIOCTLCMD 外的任何错误都会跳出循环并返回错误值。如果(除 -ENOIOCTLCMD
-外)没有错误发生,则返回 0。
-
-对于以上两个函数的第二个参数为组 ID。如果为 0,则所有子设备都会执行
-这个操作。如果为非 0 值,则只有那些组 ID 匹配的子设备才会执行此操作。
-在桥驱动注册一个子设备前,可以设置 sd->grp_id 为任何期望值(默认值为
-0)。这个值属于桥驱动,且子设备驱动将不会修改和使用它。
-
-组 ID 赋予了桥驱动更多对于如何调用回调的控制。例如,电路板上有多个
-音频芯片,每个都有改变音量的能力。但当用户想要改变音量的时候,通常
-只有一个会被实际使用。你可以对这样的子设备设置组 ID 为(例如 AUDIO_CONTROLLER)
-并在调用 v4l2_device_call_all() 时指定它为组 ID 值。这就保证了只有
-需要的子设备才会执行这个回调。
-
-如果子设备需要通知它的 v4l2_device 父设备一个事件,可以调用
-v4l2_subdev_notify(sd, notification, arg)。这个宏检查是否有一个
-notify() 回调被注册,如果没有,返回 -ENODEV。否则返回 notify() 调用
-结果。
-
-使用 v4l2_subdev 的好处在于它是一个通用结构体,且不包含任何底层硬件
-信息。所有驱动可以包含多个 I2C 总线的子设备,但也有子设备是通过 GPIO
-控制。这个区别仅在配置设备时有关系,一旦子设备注册完成,对于 v4l2
-子系统来说就完全透明了。
-
-
-V4L2 子设备用户空间API
---------------------
-
-除了通过 v4l2_subdev_ops 结构导出的内核 API,V4L2 子设备也可以直接
-通过用户空间应用程序来控制。
-
-可以在 /dev 中创建名为 v4l-subdevX 设备节点,以通过其直接访问子设备。
-如果子设备支持用户空间直接配置,必须在注册前设置 V4L2_SUBDEV_FL_HAS_DEVNODE
-标志。
-
-注册子设备之后, v4l2_device 驱动会通过调用 v4l2_device_register_subdev_nodes()
-函数为所有已注册并设置了 V4L2_SUBDEV_FL_HAS_DEVNODE 的子设备创建
-设备节点。这些设备节点会在子设备注销时自动删除。
-
-这些设备节点处理 V4L2 API 的一个子集。
-
-VIDIOC_QUERYCTRL
-VIDIOC_QUERYMENU
-VIDIOC_G_CTRL
-VIDIOC_S_CTRL
-VIDIOC_G_EXT_CTRLS
-VIDIOC_S_EXT_CTRLS
-VIDIOC_TRY_EXT_CTRLS
-
-	这些 ioctls 控制与 V4L2 中定义的一致。他们行为相同,唯一的
-	不同是他们只处理子设备的控制实现。根据驱动程序,这些控制也
-	可以通过一个(或多个) V4L2 设备节点访问。
-
-VIDIOC_DQEVENT
-VIDIOC_SUBSCRIBE_EVENT
-VIDIOC_UNSUBSCRIBE_EVENT
-
-	这些  ioctls 事件与 V4L2 中定义的一致。他们行为相同,唯一的
-	不同是他们只处理子设备产生的事件。根据驱动程序,这些事件也
-	可以通过一个(或多个) V4L2 设备节点上报。
-
-	要使用事件通知的子设备驱动,在注册子设备前必须在 v4l2_subdev::flags
-	中设置 V4L2_SUBDEV_USES_EVENTS 并在 v4l2_subdev::nevents
-	中初始化事件队列深度。注册完成后,事件会在 v4l2_subdev::devnode
-	设备节点中像通常一样被排队。
-
-	为正确支持事件机制,poll() 文件操作也应被实现。
-
-私有 ioctls
-
-	不在以上列表中的所有 ioctls 会通过 core::ioctl 操作直接传递
-	给子设备驱动。
-
-
-I2C 子设备驱动
--------------
-
-由于这些驱动很常见,所以内特提供了特定的辅助函数(v4l2-common.h)让这些
-设备的使用更加容易。
-
-添加 v4l2_subdev 支持的推荐方法是让 I2C 驱动将 v4l2_subdev 结构体
-嵌入到为每个 I2C 设备实例创建的状态结构体中。而最简单的设备没有状态
-结构体,此时可以直接创建一个 v4l2_subdev 结构体。
-
-一个典型的状态结构体如下所示(‘chipname’用芯片名代替):
-
-struct chipname_state {
-	struct v4l2_subdev sd;
-	...  /* 附加的状态域*/
-};
-
-初始化 v4l2_subdev 结构体的方法如下:
-
-	v4l2_i2c_subdev_init(&state->sd, client, subdev_ops);
-
-这个函数将填充 v4l2_subdev 结构体中的所有域,并保证 v4l2_subdev 和
-i2c_client 都指向彼此。
-
-同时,你也应该为从 v4l2_subdev 指针找到 chipname_state 结构体指针
-添加一个辅助内联函数。
-
-static inline struct chipname_state *to_state(struct v4l2_subdev *sd)
-{
-	return container_of(sd, struct chipname_state, sd);
-}
-
-使用以下函数可以通过 v4l2_subdev 结构体指针获得 i2c_client 结构体
-指针:
-
-	struct i2c_client *client = v4l2_get_subdevdata(sd);
-
-而以下函数则相反,通过 i2c_client 结构体指针获得 v4l2_subdev 结构体
-指针:
-
-	struct v4l2_subdev *sd = i2c_get_clientdata(client);
-
-当 remove()函数被调用前,必须保证先调用 v4l2_device_unregister_subdev(sd)。
-此操作将会从桥驱动中注销子设备。即使子设备没有注册,调用此函数也是
-安全的。
-
-必须这样做的原因是:当桥驱动注销 i2c 适配器时,remove()回调函数
-会被那个适配器上的 i2c 设备调用。此后,相应的 v4l2_subdev 结构体
-就不存在了,所有它们必须先被注销。在 remove()回调函数中调用
-v4l2_device_unregister_subdev(sd),可以保证执行总是正确的。
-
-
-桥驱动也有一些辅组函数可用:
-
-struct v4l2_subdev *sd = v4l2_i2c_new_subdev(v4l2_dev, adapter,
-	       "module_foo", "chipid", 0x36, NULL);
-
-这个函数会加载给定的模块(如果没有模块需要加载,可以为 NULL),
-并用给定的 i2c 适配器结构体指针(i2c_adapter)和 器件地址(chip/address)
-作为参数调用 i2c_new_client_device()。如果一切顺利,则就在 v4l2_device
-中注册了子设备。
-
-你也可以利用 v4l2_i2c_new_subdev()的最后一个参数,传递一个可能的
-I2C 地址数组,让函数自动探测。这些探测地址只有在前一个参数为 0 的
-情况下使用。非零参数意味着你知道准确的 i2c 地址,所以此时无须进行
-探测。
-
-如果出错,两个函数都返回 NULL。
-
-注意:传递给 v4l2_i2c_new_subdev()的 chipid 通常与模块名一致。
-它允许你指定一个芯片的变体,比如“saa7114”或“saa7115”。一般通过
-i2c 驱动自动探测。chipid 的使用是在今后需要深入了解的事情。这个与
-i2c 驱动不同,较容易混淆。要知道支持哪些芯片变体,你可以查阅 i2c
-驱动代码的 i2c_device_id 表,上面列出了所有可能支持的芯片。
-
-还有两个辅助函数:
-
-v4l2_i2c_new_subdev_cfg:这个函数添加新的 irq 和 platform_data
-参数,并有‘addr’和‘probed_addrs’参数:如果 addr 非零,则被使用
-(不探测变体),否则 probed_addrs 中的地址将用于自动探测。
-
-例如:以下代码将会探测地址(0x10):
-
-struct v4l2_subdev *sd = v4l2_i2c_new_subdev_cfg(v4l2_dev, adapter,
-	       "module_foo", "chipid", 0, NULL, 0, I2C_ADDRS(0x10));
-
-v4l2_i2c_new_subdev_board 使用一个 i2c_board_info 结构体,将其
-替代 irq、platform_data 和 add r参数传递给 i2c 驱动。
-
-如果子设备支持 s_config 核心操作,这个操作会在子设备配置好之后以 irq 和
-platform_data 为参数调用。早期的 v4l2_i2c_new_(probed_)subdev 函数
-同样也会调用 s_config,但仅在 irq 为 0 且 platform_data 为 NULL 时。
-
-video_device结构体
------------------
-
-在 /dev 目录下的实际设备节点根据 video_device 结构体(v4l2-dev.h)
-创建。此结构体既可以动态分配也可以嵌入到一个更大的结构体中。
-
-动态分配方法如下:
-
-	struct video_device *vdev = video_device_alloc();
-
-	if (vdev == NULL)
-		return -ENOMEM;
-
-	vdev->release = video_device_release;
-
-如果将其嵌入到一个大结构体中,则必须自己实现 release()回调。
-
-	struct video_device *vdev = &my_vdev->vdev;
-
-	vdev->release = my_vdev_release;
-
-release()回调必须被设置,且在最后一个 video_device 用户退出之后
-被调用。
-
-默认的 video_device_release()回调只是调用 kfree 来释放之前分配的
-内存。
-
-你应该设置这些域:
-
-- v4l2_dev: 设置为 v4l2_device 父设备。
-
-- name: 设置为唯一的描述性设备名。
-
-- fops: 设置为已有的 v4l2_file_operations 结构体。
-
-- ioctl_ops: 如果你使用v4l2_ioctl_ops 来简化 ioctl 的维护
-  (强烈建议使用,且将来可能变为强制性的!),然后设置你自己的
-  v4l2_ioctl_ops 结构体.
-
-- lock: 如果你要在驱动中实现所有的锁操作,则设为 NULL 。否则
-  就要设置一个指向 struct mutex_lock 结构体的指针,这个锁将
-  在 unlocked_ioctl 文件操作被调用前由内核获得,并在调用返回后
-  释放。详见下一节。
-
-- prio: 保持对优先级的跟踪。用于实现 VIDIOC_G/S_PRIORITY。如果
-  设置为 NULL,则会使用 v4l2_device 中的 v4l2_prio_state 结构体。
-  如果要对每个设备节点(组)实现独立的优先级,可以将其指向自己
-  实现的 v4l2_prio_state 结构体。
-
-- parent: 仅在使用 NULL 作为父设备结构体参数注册 v4l2_device 时
-  设置此参数。只有在一个硬件设备包含多一个 PCI 设备,共享同一个
-  v4l2_device 核心时才会发生。
-
-  cx88 驱动就是一个例子:一个 v4l2_device 结构体核心,被一个裸的
-  视频 PCI 设备(cx8800)和一个 MPEG PCI 设备(cx8802)共用。由于
-  v4l2_device 无法与特定的 PCI 设备关联,所有没有设置父设备。但当
-  video_device 配置后,就知道使用哪个父 PCI 设备了。
-
-如果你使用 v4l2_ioctl_ops,则应该在 v4l2_file_operations 结构体中
-设置 .unlocked_ioctl 指向 video_ioctl2。
-
-请勿使用 .ioctl!它已被废弃,今后将消失。
-
-某些情况下你要告诉核心:你在 v4l2_ioctl_ops 指定的某个函数应被忽略。
-你可以在 video_device_register 被调用前通过以下函数标记这个 ioctls。
-
-void v4l2_disable_ioctl(struct video_device *vdev, unsigned int cmd);
-
-基于外部因素(例如某个板卡已被使用),在不创建新结构体的情况下,你想
-要关闭 v4l2_ioctl_ops 中某个特性往往需要这个机制。
-
-v4l2_file_operations 结构体是 file_operations 的一个子集。其主要
-区别在于:因 inode 参数从未被使用,它将被忽略。
-
-如果需要与媒体框架整合,你必须通过调用 media_entity_pads_init() 初始化
-嵌入在 video_device 结构体中的 media_entity(entity 域)结构体:
-
-	struct media_pad *pad = &my_vdev->pad;
-	int err;
-
-	err = media_entity_pads_init(&vdev->entity, 1, pad);
-
-pads 数组必须预先初始化。没有必要手动设置 media_entity 的 type 和
-name 域。
-
-当(任何)子设备节点被打开/关闭,对 entity 的引用将被自动获取/释放。
-
-v4l2_file_operations 与锁
---------------------------
-
-你可以在 video_device 结构体中设置一个指向 mutex_lock 的指针。通常
-这既可是一个顶层互斥锁也可为设备节点自身的互斥锁。默认情况下,此锁
-用于 unlocked_ioctl,但为了使用 ioctls 你通过以下函数可禁用锁定:
-
-	void v4l2_disable_ioctl_locking(struct video_device *vdev, unsigned int cmd);
-
-例如: v4l2_disable_ioctl_locking(vdev, VIDIOC_DQBUF);
-
-你必须在注册 video_device 前调用这个函数。
-
-特别是对于 USB 驱动程序,某些命令(如设置控制)需要很长的时间,可能
-需要自行为缓冲区队列的 ioctls 实现锁定。
-
-如果你需要更细粒度的锁,你必须设置 mutex_lock 为 NULL,并完全自己实现
-锁机制。
-
-这完全由驱动开发者决定使用何种方法。然而,如果你的驱动存在长延时操作
-(例如,改变 USB 摄像头的曝光时间可能需要较长时间),而你又想让用户
-在等待长延时操作完成期间做其他的事,则你最好自己实现锁机制。
-
-如果指定一个锁,则所有 ioctl 操作将在这个锁的作用下串行执行。如果你
-使用 videobuf,则必须将同一个锁传递给 videobuf 队列初始化函数;如
-videobuf 必须等待一帧的到达,则可临时解锁并在这之后重新上锁。如果驱动
-也在代码执行期间等待,则可做同样的工作(临时解锁,再上锁)让其他进程
-可以在第一个进程阻塞时访问设备节点。
-
-在使用 videobuf2 的情况下,必须实现 wait_prepare 和 wait_finish 回调
-在适当的时候解锁/加锁。进一步来说,如果你在 video_device 结构体中使用
-锁,则必须在 wait_prepare 和 wait_finish 中对这个互斥锁进行解锁/加锁。
-
-热插拔的断开实现也必须在调用 v4l2_device_disconnect 前获得锁。
-
-video_device注册
----------------
-
-接下来你需要注册视频设备:这会为你创建一个字符设备。
-
-	err = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
-	if (err) {
-		video_device_release(vdev); /* or kfree(my_vdev); */
-		return err;
-	}
-
-如果 v4l2_device 父设备的 mdev 域为非 NULL 值,视频设备实体将自动
-注册为媒体设备。
-
-注册哪种设备是根据类型(type)参数。存在以下类型:
-
-VFL_TYPE_VIDEO: 用于视频输入/输出设备的 videoX
-VFL_TYPE_VBI: 用于垂直消隐数据的 vbiX (例如,隐藏式字幕,图文电视)
-VFL_TYPE_RADIO: 用于广播调谐器的 radioX
-
-最后一个参数让你确定一个所控制设备的设备节点号数量(例如 videoX 中的 X)。
-通常你可以传入-1,让 v4l2 框架自己选择第一个空闲的编号。但是有时用户
-需要选择一个特定的节点号。驱动允许用户通过驱动模块参数选择一个特定的
-设备节点号是很普遍的。这个编号将会传递给这个函数,且 video_register_device
-将会试图选择这个设备节点号。如果这个编号被占用,下一个空闲的设备节点
-编号将被选中,并向内核日志中发送一个警告信息。
-
-另一个使用场景是当驱动创建多个设备时。这种情况下,对不同的视频设备在
-编号上使用不同的范围是很有用的。例如,视频捕获设备从 0 开始,视频
-输出设备从 16 开始。所以你可以使用最后一个参数来指定设备节点号最小值,
-而 v4l2 框架会试图选择第一个的空闲编号(等于或大于你提供的编号)。
-如果失败,则它会就选择第一个空闲的编号。
-
-由于这种情况下,你会忽略无法选择特定设备节点号的警告,则可调用
-video_register_device_no_warn() 函数避免警告信息的产生。
-
-只要设备节点被创建,一些属性也会同时创建。在 /sys/class/video4linux
-目录中你会找到这些设备。例如进入其中的 video0 目录,你会看到‘name’和
-‘index’属性。‘name’属性值就是 video_device 结构体中的‘name’域。
-
-‘index’属性值就是设备节点的索引值:每次调用 video_register_device(),
-索引值都递增 1 。第一个视频设备节点总是从索引值 0 开始。
-
-用户可以设置 udev 规则,利用索引属性生成花哨的设备名(例如:用‘mpegX’
-代表 MPEG 视频捕获设备节点)。
-
-在设备成功注册后,就可以使用这些域:
-
-- vfl_type: 传递给 video_register_device 的设备类型。
-- minor: 已指派的次设备号。
-- num: 设备节点编号 (例如 videoX 中的 X)。
-- index: 设备索引号。
-
-如果注册失败,你必须调用 video_device_release() 来释放已分配的
-video_device 结构体;如果 video_device 是嵌入在自己创建的结构体中,
-你也必须释放它。vdev->release() 回调不会在注册失败之后被调用,
-你也不应试图在注册失败后注销设备。
-
-
-video_device 注销
-----------------
-
-当视频设备节点已被移除,不论是卸载驱动还是USB设备断开,你都应注销
-它们:
-
-	video_unregister_device(vdev);
-
-这个操作将从 sysfs 中移除设备节点(导致 udev 将其从 /dev 中移除)。
-
-video_unregister_device() 返回之后,就无法完成打开操作。尽管如此,
-USB 设备的情况则不同,某些应用程序可能依然打开着其中一个已注销设备
-节点。所以在注销之后,所有文件操作(当然除了 release )也应返回错误值。
-
-当最后一个视频设备节点的用户退出,则 vdev->release() 回调会被调用,
-并且你可以做最后的清理操作。
-
-不要忘记清理与视频设备相关的媒体入口(如果被初始化过):
-
-	media_entity_cleanup(&vdev->entity);
-
-这可以在 release 回调中完成。
-
-
-video_device 辅助函数
----------------------
-
-一些有用的辅助函数如下:
-
-- file/video_device 私有数据
-
-你可以用以下函数在 video_device 结构体中设置/获取驱动私有数据:
-
-void *video_get_drvdata(struct video_device *vdev);
-void video_set_drvdata(struct video_device *vdev, void *data);
-
-注意:在调用 video_register_device() 前执行 video_set_drvdata()
-是安全的。
-
-而以下函数:
-
-struct video_device *video_devdata(struct file *file);
-
-返回 file 结构体中拥有的的 video_device 指针。
-
-video_drvdata 辅助函数结合了 video_get_drvdata 和 video_devdata
-的功能:
-
-void *video_drvdata(struct file *file);
-
-你可以使用如下代码从 video_device 结构体中获取 v4l2_device 结构体
-指针:
-
-struct v4l2_device *v4l2_dev = vdev->v4l2_dev;
-
-- 设备节点名
-
-video_device 设备节点在内核中的名称可以通过以下函数获得
-
-const char *video_device_node_name(struct video_device *vdev);
-
-这个名字被用户空间工具(例如 udev)作为提示信息使用。应尽可能使用
-此功能,而非访问 video_device::num 和 video_device::minor 域。
-
-
-v4l2_fh 结构体
--------------
-
-v4l2_fh 结构体提供一个保存用于 V4L2 框架的文件句柄特定数据的简单方法。
-如果 video_device 标志,新驱动
-必须使用 v4l2_fh 结构体,因为它也用于实现优先级处理(VIDIOC_G/S_PRIORITY)。
-
-v4l2_fh 结构体作为驱动自身文件句柄结构体的一部分被分配,且驱动在
-其打开函数中将 file->private_data 指向它。
-
-在许多情况下,v4l2_fh 结构体会嵌入到一个更大的结构体中。这钟情况下,
-应该在 open() 中调用 v4l2_fh_init+v4l2_fh_add,并在 release() 中
-调用 v4l2_fh_del+v4l2_fh_exit。
-
-驱动可以通过使用 container_of 宏提取他们自己的文件句柄结构体。例如:
-
-struct my_fh {
-	int blah;
-	struct v4l2_fh fh;
-};
-
-...
-
-int my_open(struct file *file)
-{
-	struct my_fh *my_fh;
-	struct video_device *vfd;
-	int ret;
-
-	...
-
-	my_fh = kzalloc_obj(*my_fh);
-
-	...
-
-	v4l2_fh_init(&my_fh->fh, vfd);
-
-	...
-
-	v4l2_fh_add(&my_fh->fh, file);
-	return 0;
-}
-
-int my_release(struct file *file)
-{
-	struct v4l2_fh *fh = file_to_v4l2_fh(file);
-	struct my_fh *my_fh = container_of(fh, struct my_fh, fh);
-
-	...
-	v4l2_fh_del(&my_fh->fh, file);
-	v4l2_fh_exit(&my_fh->fh);
-	kfree(my_fh);
-	return 0;
-}
-
-以下是 v4l2_fh 函数使用的简介:
-
-void v4l2_fh_init(struct v4l2_fh *fh, struct video_device *vdev)
-
-  初始化文件句柄。这*必须*在驱动的 v4l2_file_operations->open()
-  函数中执行。
-
-void v4l2_fh_add(struct v4l2_fh *fh, struct file *filp)
-
-  添加一个 v4l2_fh 到 video_device 文件句柄列表。一旦文件句柄
-  初始化完成就必须调用。
-
-void v4l2_fh_del(struct v4l2_fh *fh, struct file *filp)
-
-  从 video_device() 中解除文件句柄的关联。文件句柄的退出函数也
-  将被调用。
-
-void v4l2_fh_exit(struct v4l2_fh *fh)
-
-  清理文件句柄。在清理完 v4l2_fh 后,相关内存会被释放。
-
-
-如果 v4l2_fh 不是嵌入在其他结构体中的,则可以用这些辅助函数:
-
-int v4l2_fh_open(struct file *filp)
-
-  分配一个 v4l2_fh 结构体空间,初始化并将其添加到 file 结构体相关的
-  video_device 结构体中。
-
-int v4l2_fh_release(struct file *filp)
-
-  从 file 结构体相关的 video_device 结构体中删除 v4l2_fh ,清理
-  v4l2_fh 并释放空间。
-
-这两个函数可以插入到 v4l2_file_operation 的 open() 和 release()
-操作中。
-
-
-某些驱动需要在第一个文件句柄打开和最后一个文件句柄关闭的时候做些
-工作。所以加入了两个辅助函数以检查 v4l2_fh 结构体是否是相关设备
-节点打开的唯一文件句柄。
-
-int v4l2_fh_is_singular(struct v4l2_fh *fh)
-
-  如果此文件句柄是唯一打开的文件句柄,则返回 1 ,否则返回 0 。
-
-int v4l2_fh_is_singular_file(struct file *filp)
-
-  功能相同,但通过 filp->private_data 调用 v4l2_fh_is_singular。
-
-
-V4L2 事件机制
------------
-
-V4L2 事件机制提供了一个通用的方法将事件传递到用户空间。驱动必须使用
-v4l2_fh 才能支持 V4L2 事件机制。
-
-
-事件通过一个类型和选择 ID 来定义。ID 对应一个 V4L2 对象,例如
-一个控制 ID。如果未使用,则 ID 为 0。
-
-当用户订阅一个事件,驱动会为此分配一些 kevent 结构体。所以每个
-事件组(类型、ID)都会有自己的一套 kevent 结构体。这保证了如果
-一个驱动短时间内产生了许多同类事件,不会覆盖其他类型的事件。
-
-但如果你收到的事件数量大于同类事件 kevent 的保存数量,则最早的
-事件将被丢弃,并加入新事件。
-
-此外,v4l2_subscribed_event 结构体内部有可供驱动设置的 merge() 和
-replace() 回调,这些回调会在新事件产生且没有多余空间的时候被调用。
-replace() 回调让你可以将早期事件的净荷替换为新事件的净荷,将早期
-净荷的相关数据合并到替换进来的新净荷中。当该类型的事件仅分配了一个
-kevent 结构体时,它将被调用。merge() 回调让你可以合并最早的事件净荷
-到在它之后的那个事件净荷中。当该类型的事件分配了两个或更多 kevent
-结构体时,它将被调用。
-
-这种方法不会有状态信息丢失,只会导致中间步骤信息丢失。
-
-
-关于 replace/merge 回调的一个不错的例子在 v4l2-event.c 中:用于
-控制事件的 ctrls_replace() 和 ctrls_merge() 回调。
-
-注意:这些回调可以在中断上下文中调用,所以它们必须尽快完成并退出。
-
-有用的函数:
-
-void v4l2_event_queue(struct video_device *vdev, const struct v4l2_event *ev)
-
-  将事件加入视频设备的队列。驱动仅负责填充 type 和 data 域。
-  其他域由 V4L2 填充。
-
-int v4l2_event_subscribe(struct v4l2_fh *fh,
-			 struct v4l2_event_subscription *sub, unsigned elems,
-			 const struct v4l2_subscribed_event_ops *ops)
-
-  video_device->ioctl_ops->vidioc_subscribe_event 必须检测驱动能
-  产生特定 id 的事件。然后调用 v4l2_event_subscribe() 来订阅该事件。
-
-  elems 参数是该事件的队列大小。若为 0,V4L2 框架将会(根据事件类型)
-  填充默认值。
-
-  ops 参数允许驱动指定一系列回调:
-  * add:     当添加一个新监听者时调用(重复订阅同一个事件,此回调
-             仅被执行一次)。
-  * del:     当一个监听者停止监听时调用。
-  * replace: 用‘新’事件替换‘早期‘事件。
-  * merge:   将‘早期‘事件合并到‘新’事件中。
-  这四个调用都是可选的,如果不想指定任何回调,则 ops 可为 NULL。
-
-int v4l2_event_unsubscribe(struct v4l2_fh *fh,
-			   struct v4l2_event_subscription *sub)
-
-  v4l2_ioctl_ops 结构体中的 vidioc_unsubscribe_event 回调函数。
-  驱动程序可以直接使用 v4l2_event_unsubscribe() 实现退订事件过程。
-
-  特殊的 V4L2_EVENT_ALL 类型,可用于退订所有事件。驱动可能在特殊
-  情况下需要做此操作。
-
-int v4l2_event_pending(struct v4l2_fh *fh)
-
-  返回未决事件的数量。有助于实现轮询(poll)操作。
-
-事件通过 poll 系统调用传递到用户空间。驱动可用
-v4l2_fh->wait (wait_queue_head_t 类型)作为参数调用 poll_wait()。
-
-事件分为标准事件和私有事件。新的标准事件必须使用可用的最小事件类型
-编号。驱动必须从他们本类型的编号起始处分配事件。类型的编号起始为
-V4L2_EVENT_PRIVATE_START + n * 1000 ,其中 n 为可用最小编号。每个
-类型中的第一个事件类型编号是为以后的使用保留的,所以第一个可用事件
-类型编号是‘class base + 1’。
-
-V4L2 事件机制的使用实例可以在 OMAP3 ISP 的驱动
-(drivers/media/video/omap3isp)中找到。
-- 
2.51.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 7/9] docs/zh_CN: move GFS2 translations into filesystems/gfs2
  2026-10-27 10:25 [PATCH 0/9] docs/zh_CN: align translation paths and update guides Dongliang Mu
                   ` (5 preceding siblings ...)
  2026-10-27 10:25 ` [PATCH 6/9] docs/zh_CN: reorganize media driver API translations Dongliang Mu
@ 2026-10-27 10:25 ` Dongliang Mu
  2026-10-27 10:25 ` [PATCH 8/9] docs/zh_CN: update networking/xfrm/xfrm_proc.rst translation Dongliang Mu
  2026-10-27 10:25 ` [PATCH 9/9] docs/zh_CN: remove stale Original fields from SCSI and IPE translations Dongliang Mu
  8 siblings, 0 replies; 13+ messages in thread
From: Dongliang Mu @ 2026-10-27 10:25 UTC (permalink / raw)
  To: Alex Shi, Yanteng Si
  Cc: Jonathan Corbet, Shuah Khan, Randy Dunlap, linux-doc, linux-kernel

Move the GFS2 overview, glock, and uevent translations into the GFS2
directory. Update the filesystem index and add the GFS2 chapter index.

Signed-off-by: Dongliang Mu <dzm91@hust.edu.cn>
---
 .../{gfs2-glocks.rst => gfs2/glocks.rst}      |   4 +-
 .../filesystems/{gfs2.rst => gfs2/index.rst}  |  18 ++-
 .../{gfs2-uevents.rst => gfs2/uevents.rst}    |   4 +-
 .../translations/zh_CN/filesystems/index.rst  | 112 ++++++++++++++++--
 4 files changed, 116 insertions(+), 22 deletions(-)
 rename Documentation/translations/zh_CN/filesystems/{gfs2-glocks.rst => gfs2/glocks.rst} (99%)
 rename Documentation/translations/zh_CN/filesystems/{gfs2.rst => gfs2/index.rst} (93%)
 rename Documentation/translations/zh_CN/filesystems/{gfs2-uevents.rst => gfs2/uevents.rst} (97%)

diff --git a/Documentation/translations/zh_CN/filesystems/gfs2-glocks.rst b/Documentation/translations/zh_CN/filesystems/gfs2/glocks.rst
similarity index 99%
rename from Documentation/translations/zh_CN/filesystems/gfs2-glocks.rst
rename to Documentation/translations/zh_CN/filesystems/gfs2/glocks.rst
index abfd2f2f94e9..a73444759a27 100644
--- a/Documentation/translations/zh_CN/filesystems/gfs2-glocks.rst
+++ b/Documentation/translations/zh_CN/filesystems/gfs2/glocks.rst
@@ -1,8 +1,6 @@
 .. SPDX-License-Identifier: GPL-2.0
 
-.. include:: ../disclaimer-zh_CN.rst
-
-:Original: Documentation/filesystems/gfs2-glocks.rst
+.. include:: ../../disclaimer-zh_CN.rst
 
 :翻译:
 
diff --git a/Documentation/translations/zh_CN/filesystems/gfs2.rst b/Documentation/translations/zh_CN/filesystems/gfs2/index.rst
similarity index 93%
rename from Documentation/translations/zh_CN/filesystems/gfs2.rst
rename to Documentation/translations/zh_CN/filesystems/gfs2/index.rst
index ffa62b12b019..af6c10af2fca 100644
--- a/Documentation/translations/zh_CN/filesystems/gfs2.rst
+++ b/Documentation/translations/zh_CN/filesystems/gfs2/index.rst
@@ -1,8 +1,6 @@
 .. SPDX-License-Identifier: GPL-2.0
 
-.. include:: ../disclaimer-zh_CN.rst
-
-:Original: Documentation/filesystems/gfs2.rst
+.. include:: ../../disclaimer-zh_CN.rst
 
 :翻译:
 
@@ -16,6 +14,9 @@
 全局文件系统 2 (Global File System 2)
 =====================================
 
+概述
+====
+
 GFS2 是一个集群文件系统。它允许一组计算机同时使用在它们之间共享的块设备(通
 过 FC、iSCSI、NBD 等)。GFS2 像本地文件系统一样读写块设备,但也使用一个锁
 模块来让计算机协调它们的 I/O 操作,从而维护文件系统的一致性。GFS2 的出色特
@@ -33,7 +34,7 @@ GFS2 使用可互换的节点间锁定机制,当前支持的机制有:
 
 lock_dlm 依赖于在上述 URL 中找到的用户空间集群管理系统。
 
-若要将 GFS2 用作本地文件系统,则不需要外部集群系统,只需::
+若要将 GFS2 用作本地文件系统,则不需要外部集群系统,只需::
 
   $ mkfs -t gfs2 -p lock_nolock -j 1 /dev/block_device
   $ mount -t gfs2 /dev/block_device /dir
@@ -55,3 +56,12 @@ GFS2 在磁盘格式上与早期版本的 GFS 不兼容,但它已相当接近
   gfs2_convert		用于将 gfs 文件系统原地转换为 GFS2
   mkfs.gfs2		用于创建文件系统
   ============          =============================================
+
+实现说明
+========
+
+.. toctree::
+   :maxdepth: 1
+
+   glocks
+   uevents
diff --git a/Documentation/translations/zh_CN/filesystems/gfs2-uevents.rst b/Documentation/translations/zh_CN/filesystems/gfs2/uevents.rst
similarity index 97%
rename from Documentation/translations/zh_CN/filesystems/gfs2-uevents.rst
rename to Documentation/translations/zh_CN/filesystems/gfs2/uevents.rst
index 3975c4544118..a60f9fdae6bc 100644
--- a/Documentation/translations/zh_CN/filesystems/gfs2-uevents.rst
+++ b/Documentation/translations/zh_CN/filesystems/gfs2/uevents.rst
@@ -1,8 +1,6 @@
 .. SPDX-License-Identifier: GPL-2.0
 
-.. include:: ../disclaimer-zh_CN.rst
-
-:Original: Documentation/filesystems/gfs2-uevents.rst
+.. include:: ../../disclaimer-zh_CN.rst
 
 :翻译:
 
diff --git a/Documentation/translations/zh_CN/filesystems/index.rst b/Documentation/translations/zh_CN/filesystems/index.rst
index fcc79ff9fdad..5e198707c16b 100644
--- a/Documentation/translations/zh_CN/filesystems/index.rst
+++ b/Documentation/translations/zh_CN/filesystems/index.rst
@@ -2,7 +2,6 @@
 
 .. include:: ../disclaimer-zh_CN.rst
 
-:Original: :ref:`Documentation/filesystems/index.rst <filesystems_index>`
 :Translator: Wang Wenhu <wenhu.wang@vivo.com>
 
 .. _cn_filesystems_index:
@@ -11,34 +10,123 @@
 Linux Kernel中的文件系统
 ========================
 
-这份正在开发的手册或许在未来某个辉煌的日子里以易懂的形式将Linux虚拟\
-文件系统(VFS)层以及基于其上的各种文件系统如何工作呈现给大家。当前\
-可以看到下面的内容。
+这份仍在编写中的手册,希望有一天能全面介绍 Linux 虚拟文件系统(VFS)层及其下层
+文件系统的工作方式。目前已有的内容如下。
 
 核心 VFS 文档
 =============
 
-有关 VFS 层本身以及其算法工作方式的文档,请参阅这些手册。
+这些手册介绍 VFS 层本身及其算法的工作方式。
 
 .. toctree::
-   :maxdepth: 1
+   :maxdepth: 2
 
    dnotify
 
+Todolist:
+
+* vfs
+* path-lookup
+* api-summary
+* splice
+* locking
+* directory-locking
+* devpts
+* fiemap
+* files
+* locks
+* mmap_prepare
+* multigrain-ts
+* mount_api
+* quota
+* seq_file
+* sharedsubtree
+* idmappings
+* iomap/index
+* automount-support
+* caching/index
+* porting
+* adding-new-filesystems
+
+文件系统支持层
+==============
+
+这些文档介绍供文件系统实现使用的文件系统层支持代码。
+
+Todolist:
+
+* buffer
+* journalling
+* fscrypt
+* fsverity
+* netfs_library
+
 文件系统
 ========
 
-文件系统实现文档。
+这些文档介绍各个文件系统的实现。
 
 .. toctree::
    :maxdepth: 2
 
-   virtiofs
    debugfs
+   gfs2/index
+   inotify
    tmpfs
    ubifs
    ubifs-authentication
-   gfs2
-   gfs2-uevents
-   gfs2-glocks
-   inotify
+   virtiofs
+
+Todolist:
+
+* 9p
+* adfs
+* affs
+* afs
+* autofs
+* autofs-mount-control
+* befs
+* bfs
+* btrfs
+* ceph
+* coda
+* configfs
+* cramfs
+* dax
+* dlmfs
+* ecryptfs
+* efivarfs
+* erofs
+* ext2
+* ext3
+* ext4/index
+* f2fs
+* failfs
+* hfs
+* hfsplus
+* hpfs
+* fuse/index
+* isofs
+* nilfs2
+* nfs/index
+* ntfs
+* ntfs3
+* ocfs2
+* ocfs2-online-filecheck
+* omfs
+* orangefs
+* overlayfs
+* proc
+* qnx6
+* ramfs-rootfs-initramfs
+* relay
+* resctrl
+* romfs
+* smb/index
+* spufs/index
+* squashfs
+* sysfs
+* udf
+* vfat
+* xfs/index
+* zonefs
-- 
2.51.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 8/9] docs/zh_CN: update networking/xfrm/xfrm_proc.rst translation
  2026-10-27 10:25 [PATCH 0/9] docs/zh_CN: align translation paths and update guides Dongliang Mu
                   ` (6 preceding siblings ...)
  2026-10-27 10:25 ` [PATCH 7/9] docs/zh_CN: move GFS2 translations into filesystems/gfs2 Dongliang Mu
@ 2026-10-27 10:25 ` Dongliang Mu
  2026-10-27 10:25 ` [PATCH 9/9] docs/zh_CN: remove stale Original fields from SCSI and IPE translations Dongliang Mu
  8 siblings, 0 replies; 13+ messages in thread
From: Dongliang Mu @ 2026-10-27 10:25 UTC (permalink / raw)
  To: Alex Shi, Yanteng Si
  Cc: Jonathan Corbet, Shuah Khan, Randy Dunlap, linux-doc, linux-kernel

Move the XFRM proc translation to its current upstream location and
adjust the disclaimer include. Add an XFRM chapter index and update
the networking index to follow the English layout.

Track the English xfrm_proc.rst through commit 03e23b18c720
("net: Move XFRM documentation into its own subdirectory").

Signed-off-by: Dongliang Mu <dzm91@hust.edu.cn>
---
 .../translations/zh_CN/networking/index.rst   | 238 +++++++++---------
 .../zh_CN/networking/xfrm/index.rst           |  20 ++
 .../zh_CN/networking/{ => xfrm}/xfrm_proc.rst |   4 +-
 3 files changed, 138 insertions(+), 124 deletions(-)
 create mode 100644 Documentation/translations/zh_CN/networking/xfrm/index.rst
 rename Documentation/translations/zh_CN/networking/{ => xfrm}/xfrm_proc.rst (96%)

diff --git a/Documentation/translations/zh_CN/networking/index.rst b/Documentation/translations/zh_CN/networking/index.rst
index bf22d22b64db..9f28240d6b14 100644
--- a/Documentation/translations/zh_CN/networking/index.rst
+++ b/Documentation/translations/zh_CN/networking/index.rst
@@ -2,8 +2,6 @@
 
 .. include:: ../disclaimer-zh_CN.rst
 
-:Original: Documentation/networking/index.rst
-
 :翻译:
 
  王亚鑫 Wang Yaxin <wang.yaxin@zte.com.cn>
@@ -13,142 +11,140 @@
 网络
 ====
 
-有关网络设备(netdev)开发过程的详细指南,请参考::ref:`netdev-FAQ`
+有关网络设备(netdev)开发流程的具体指南,请参阅 :ref:`netdev-FAQ`。
 
 目录:
 
 .. toctree::
-   :maxdepth: 1
+   :maxdepth: 2
 
    msg_zerocopy
+   alias
    driver
+   generic-hdlc
    ipv6
+   mptcp-sysctl
    napi
-   secid
-   vxlan
    netif-msg
-   xfrm_proc
    netmem
-   alias
-   mptcp-sysctl
-   generic-hdlc
+   secid
    sriov
    team
    timestamping
+   vxlan
+   xfrm/index
 
 Todolist:
 
-*   af_xdp
-*   bareudp
-*   batman-adv
-*   can
-*   can_ucan_protocol
-*   device_drivers/index
-*   diagnostic/index
-*   dsa/index
-*   devlink/index
-*   ethtool-netlink
-*   ieee802154
-*   iso15765-2
-*   j1939
-*   kapi
-*   failover
-*   net_dim
-*   net_failover
-*   page_pool
-*   phy
-*   sfp-phylink
-*   bridge
-*   snmp_counter
-*   checksum-offloads
-*   segmentation-offloads
-*   scaling
-*   tls
-*   tls-offload
-*   tls-handshake
-*   nfc
-*   6lowpan
-*   6pack
-*   arcnet-hardware
-*   arcnet
-*   atm
-*   ax25
-*   bonding
-*   cdc_mbim
-*   dccp
-*   dctcp
-*   devmem
-*   dns_resolver
-*   eql
-*   fib_trie
-*   filter
-*   generic_netlink
-*   netlink_spec/index
-*   gen_stats
-*   gtp
-*   ila
-*   ioam6-sysctl
-*   ip_dynaddr
-*   ipsec
-*   ip-sysctl
-*   ipvlan
-*   ipvs-sysctl
-*   kcm
-*   l2tp
-*   lapb-module
-*   mac80211-injection
-*   mctp
-*   mpls-sysctl
-*   mptcp
-*   multiqueue
-*   multi-pf-netdev
-*   net_cachelines/index
-*   netconsole
-*   netdev-features
-*   netdevices
-*   netfilter-sysctl
-*   nexthop-group-resilient
-*   nf_conntrack-sysctl
-*   nf_flowtable
-*   oa-tc6-framework
-*   openvswitch
-*   operstates
-*   packet_mmap
-*   phonet
-*   phy-link-topology
-*   pktgen
-*   plip
-*   ppp_generic
-*   proc_net_tcp
-*   pse-pd/index
-*   radiotap-headers
-*   rds
-*   regulatory
-*   representors
-*   rxrpc
-*   sctp
-*   seg6-sysctl
-*   smc-sysctl
-*   statistics
-*   strparser
-*   switchdev
-*   sysfs-tagging
-*   tc-actions-env-rules
-*   tc-queue-filters
-*   tcp_ao
-*   tcp-thin
-*   tipc
-*   tproxy
-*   tuntap
-*   udplite
-*   vrf
-*   x25
-*   x25-iface
-*   xfrm_device
-*   xfrm_sync
-*   xfrm_sysctl
-*   xdp-rx-metadata
-*   xsk-tx-metadata
+* af_xdp
+* bareudp
+* batman-adv
+* can
+* can_ucan_protocol
+* device_drivers/index
+* diagnostic/index
+* dsa/index
+* devlink/index
+* ethtool-netlink
+* ieee802154
+* iso15765-2
+* j1939
+* kapi
+* failover
+* net_dim
+* net_failover
+* page_pool
+* phy
+* sfp-phylink
+* bridge
+* snmp_counter
+* checksum-offloads
+* segmentation-offloads
+* scaling
+* tls
+* tls-offload
+* tls-handshake
+* nfc
+* 6lowpan
+* arcnet-hardware
+* arcnet
+* atm
+* bonding
+* cdc_mbim
+* dctcp
+* devmem
+* dns_resolver
+* eql
+* fib_trie
+* filter
+* generic_netlink
+* ../netlink/specs/index
+* gen_stats
+* gtp
+* ila
+* ioam6-sysctl
+* iou-zcrx
+* ip_dynaddr
+* ipsec
+* ip-sysctl
+* ipvlan
+* ipvs-sysctl
+* kcm
+* l2tp
+* lapb-module
+* mac80211-injection
+* mctp
+* mpls-sysctl
+* mptcp
+* multiqueue
+* multi-pf-netdev
+* net_cachelines/index
+* netconsole
+* netdev-features
+* netdevices
+* netfilter-sysctl
+* nexthop-group-resilient
+* nf_conntrack-sysctl
+* nf_flowtable
+* oa-tc6-framework
+* openvswitch
+* operstates
+* packet_mmap
+* phonet
+* phy-link-topology
+* phy-port
+* pktgen
+* plip
+* ppp_generic
+* proc_net_tcp
+* pse-pd/index
+* psp
+* radiotap-headers
+* rds
+* regulatory
+* representors
+* rxrpc
+* sctp
+* seg6-sysctl
+* skbuff
+* smc-sysctl
+* statistics
+* strparser
+* switchdev
+* sysfs-tagging
+* tc-actions-env-rules
+* tc-queue-filters
+* tcp_ao
+* tcp-thin
+* tipc
+* tproxy
+* tuntap
+* udplite
+* vrf
+* x25
+* x25-iface
+* xdp-rx-metadata
+* xsk-tx-metadata
 
 .. only::  subproject and html
 
diff --git a/Documentation/translations/zh_CN/networking/xfrm/index.rst b/Documentation/translations/zh_CN/networking/xfrm/index.rst
new file mode 100644
index 000000000000..b366c908eb25
--- /dev/null
+++ b/Documentation/translations/zh_CN/networking/xfrm/index.rst
@@ -0,0 +1,20 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. include:: ../../disclaimer-zh_CN.rst
+
+
+=========
+XFRM 框架
+=========
+
+.. toctree::
+   :maxdepth: 2
+
+   xfrm_proc
+
+Todolist:
+
+* xfrm_device
+* xfrm_migrate_state
+* xfrm_sync
+* xfrm_sysctl
diff --git a/Documentation/translations/zh_CN/networking/xfrm_proc.rst b/Documentation/translations/zh_CN/networking/xfrm/xfrm_proc.rst
similarity index 96%
rename from Documentation/translations/zh_CN/networking/xfrm_proc.rst
rename to Documentation/translations/zh_CN/networking/xfrm/xfrm_proc.rst
index a2ae86c44707..eb4ece66df49 100644
--- a/Documentation/translations/zh_CN/networking/xfrm_proc.rst
+++ b/Documentation/translations/zh_CN/networking/xfrm/xfrm_proc.rst
@@ -1,8 +1,6 @@
 .. SPDX-License-Identifier: GPL-2.0
 
-.. include:: ../disclaimer-zh_CN.rst
-
-:Original: Documentation/networking/xfrm_proc.rst
+.. include:: ../../disclaimer-zh_CN.rst
 
 :翻译:
 
-- 
2.51.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 9/9] docs/zh_CN: remove stale Original fields from SCSI and IPE translations
  2026-10-27 10:25 [PATCH 0/9] docs/zh_CN: align translation paths and update guides Dongliang Mu
                   ` (7 preceding siblings ...)
  2026-10-27 10:25 ` [PATCH 8/9] docs/zh_CN: update networking/xfrm/xfrm_proc.rst translation Dongliang Mu
@ 2026-10-27 10:25 ` Dongliang Mu
  8 siblings, 0 replies; 13+ messages in thread
From: Dongliang Mu @ 2026-10-27 10:25 UTC (permalink / raw)
  To: Alex Shi, Yanteng Si
  Cc: Jonathan Corbet, Shuah Khan, Randy Dunlap, linux-doc, linux-kernel

Remove the stale Original fields from the WD719x and IPE
translations. Both English sources use the same relative paths
under Documentation.

Signed-off-by: Dongliang Mu <dzm91@hust.edu.cn>
---
 Documentation/translations/zh_CN/scsi/wd719x.rst  | 2 --
 Documentation/translations/zh_CN/security/ipe.rst | 2 --
 2 files changed, 4 deletions(-)

diff --git a/Documentation/translations/zh_CN/scsi/wd719x.rst b/Documentation/translations/zh_CN/scsi/wd719x.rst
index 79757c42032b..f56eef04fd00 100644
--- a/Documentation/translations/zh_CN/scsi/wd719x.rst
+++ b/Documentation/translations/zh_CN/scsi/wd719x.rst
@@ -1,8 +1,6 @@
 .. SPDX-License-Identifier: GPL-2.0
 .. include:: ../disclaimer-zh_CN.rst
 
-:Original: Documentation/scsi/libsas.rst
-
 :翻译:
 
  张钰杰 Yujie Zhang <yjzhang@leap-io-kernel.com>
diff --git a/Documentation/translations/zh_CN/security/ipe.rst b/Documentation/translations/zh_CN/security/ipe.rst
index 55968f0c7ae3..51065bbc53a1 100644
--- a/Documentation/translations/zh_CN/security/ipe.rst
+++ b/Documentation/translations/zh_CN/security/ipe.rst
@@ -1,8 +1,6 @@
 .. SPDX-License-Identifier: GPL-2.0
 .. include:: ../disclaimer-zh_CN.rst
 
-:Original: Documentation/security/sak.rst
-
 :翻译:
  赵硕 Shuo Zhao <zhaoshuo@cqsoftware.com.cn>
 
-- 
2.51.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/9] docs/zh_CN: update admin-guide/README.rst translation
  2026-10-27 10:25 ` [PATCH 2/9] docs/zh_CN: update admin-guide/README.rst translation Dongliang Mu
@ 2026-10-27 11:37   ` Weijie Yuan
  2026-10-27 12:11     ` Dongliang Mu
  0 siblings, 1 reply; 13+ messages in thread
From: Weijie Yuan @ 2026-10-27 11:37 UTC (permalink / raw)
  To: Dongliang Mu
  Cc: Alex Shi, Yanteng Si, Jonathan Corbet, Shuah Khan, Randy Dunlap,
	linux-doc, linux-kernel, Jiandong Qiu

Dongliang Mu <dzm91@hust.edu.cn> writes:

> update Documentation/admin-guide/README.rst Chinese translation
> 
> Refresh the kernel installation guidance and correct the defconfig and
> LSMOD descriptions. Add a label to the translated applying-patches guide
> so the README can link to it.
> 
> Update the translation through commit 8913632998fc
> ("Documentation: Fix typos and grammatical errors")
> 
> Signed-off-by: Dongliang Mu <dzm91@hust.edu.cn>
> ---
>  .../translations/zh_CN/admin-guide/README.rst | 89 +++++++++++--------
>  .../zh_CN/process/applying-patches.rst        |  2 +
>  2 files changed, 53 insertions(+), 38 deletions(-)
> 
> diff --git a/Documentation/translations/zh_CN/admin-guide/README.rst b/Documentation/translations/zh_CN/admin-guide/README.rst
> index ee6dd3782f4a..050f671f8acb 100644
> --- a/Documentation/translations/zh_CN/admin-guide/README.rst
> +++ b/Documentation/translations/zh_CN/admin-guide/README.rst
> @@ -1,11 +1,12 @@
>  .. include:: ../disclaimer-zh_CN.rst
>  
> -:Original: Documentation/admin-guide/README.rst
>  
>  :译者:
>  
>   吴想成 Wu XiangCheng <bobwxc@email.cn>
>  
> +.. _readme_zh:
> +

Hi Dongliang, good evening ;-)

I remember that Jon emphasized that top-level labels should not be
added in this thread:

  https://lore.kernel.org/linux-doc/87tsqytxrn.fsf@trenco.lwn.net/

And I remembered that my patch (apply-patches.rst) was rendered
correctly just using a plain path. (so I didn't add that label)
But I'll check it again now.

Also, v3 of this series is pending, if I remember correctly. In general
I think it's not bad. So feel free to take a look when having spare
time.

v3: https://lore.kernel.org/linux-doc/20260706151358.2103703-1-qiujiandong1998@gmail.com/

Therefore +cc Jiandong.

Thanks!

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/9] docs/zh_CN: update admin-guide/README.rst translation
  2026-10-27 11:37   ` Weijie Yuan
@ 2026-10-27 12:11     ` Dongliang Mu
  2026-10-27 16:16       ` Weijie Yuan
  0 siblings, 1 reply; 13+ messages in thread
From: Dongliang Mu @ 2026-10-27 12:11 UTC (permalink / raw)
  To: Weijie Yuan
  Cc: Alex Shi, Yanteng Si, Jonathan Corbet, Shuah Khan, Randy Dunlap,
	linux-doc, linux-kernel, Jiandong Qiu


On 10/27/26 7:37 PM, Weijie Yuan wrote:
> Dongliang Mu <dzm91@hust.edu.cn> writes:
>
>> update Documentation/admin-guide/README.rst Chinese translation
>>
>> Refresh the kernel installation guidance and correct the defconfig and
>> LSMOD descriptions. Add a label to the translated applying-patches guide
>> so the README can link to it.
>>
>> Update the translation through commit 8913632998fc
>> ("Documentation: Fix typos and grammatical errors")
>>
>> Signed-off-by: Dongliang Mu <dzm91@hust.edu.cn>
>> ---
>>   .../translations/zh_CN/admin-guide/README.rst | 89 +++++++++++--------
>>   .../zh_CN/process/applying-patches.rst        |  2 +
>>   2 files changed, 53 insertions(+), 38 deletions(-)
>>
>> diff --git a/Documentation/translations/zh_CN/admin-guide/README.rst b/Documentation/translations/zh_CN/admin-guide/README.rst
>> index ee6dd3782f4a..050f671f8acb 100644
>> --- a/Documentation/translations/zh_CN/admin-guide/README.rst
>> +++ b/Documentation/translations/zh_CN/admin-guide/README.rst
>> @@ -1,11 +1,12 @@
>>   .. include:: ../disclaimer-zh_CN.rst
>>   
>> -:Original: Documentation/admin-guide/README.rst
>>   
>>   :译者:
>>   
>>    吴想成 Wu XiangCheng <bobwxc@email.cn>
>>   
>> +.. _readme_zh:
>> +
> Hi Dongliang, good evening ;-)
>
> I remember that Jon emphasized that top-level labels should not be
> added in this thread:
>
>    https://lore.kernel.org/linux-doc/87tsqytxrn.fsf@trenco.lwn.net/
>
> And I remembered that my patch (apply-patches.rst) was rendered
> correctly just using a plain path. (so I didn't add that label)
> But I'll check it again now.


It seems useless. I will test this removal, if it works I would remove 
this top level in v2 patch.


> Also, v3 of this series is pending, if I remember correctly. In general
> I think it's not bad. So feel free to take a look when having spare
> time.
>
> v3: https://lore.kernel.org/linux-doc/20260706151358.2103703-1-qiujiandong1998@gmail.com/
I will review this patchset today or tomorrmow.
> Therefore +cc Jiandong.
>
> Thanks!


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/9] docs/zh_CN: update admin-guide/README.rst translation
  2026-10-27 12:11     ` Dongliang Mu
@ 2026-10-27 16:16       ` Weijie Yuan
  0 siblings, 0 replies; 13+ messages in thread
From: Weijie Yuan @ 2026-10-27 16:16 UTC (permalink / raw)
  To: Dongliang Mu
  Cc: Alex Shi, Yanteng Si, Jonathan Corbet, Shuah Khan, Randy Dunlap,
	linux-doc, linux-kernel, Jiandong Qiu

Dongliang Mu <dzm91@hust.edu.cn> writes:

> On 10/27/26 7:37 PM, Weijie Yuan wrote:
> > Dongliang Mu <dzm91@hust.edu.cn> writes:
> > 
> > > update Documentation/admin-guide/README.rst Chinese translation
> > > 
> > > Refresh the kernel installation guidance and correct the defconfig and
> > > LSMOD descriptions. Add a label to the translated applying-patches guide
> > > so the README can link to it.
> > > 
> > > Update the translation through commit 8913632998fc
> > > ("Documentation: Fix typos and grammatical errors")
> > > 
> > > Signed-off-by: Dongliang Mu <dzm91@hust.edu.cn>
> > > ---
> > >   .../translations/zh_CN/admin-guide/README.rst | 89 +++++++++++--------
> > >   .../zh_CN/process/applying-patches.rst        |  2 +
> > >   2 files changed, 53 insertions(+), 38 deletions(-)
> > > 
> > > diff --git a/Documentation/translations/zh_CN/admin-guide/README.rst b/Documentation/translations/zh_CN/admin-guide/README.rst
> > > index ee6dd3782f4a..050f671f8acb 100644
> > > --- a/Documentation/translations/zh_CN/admin-guide/README.rst
> > > +++ b/Documentation/translations/zh_CN/admin-guide/README.rst
> > > @@ -1,11 +1,12 @@
> > >   .. include:: ../disclaimer-zh_CN.rst
> > > -:Original: Documentation/admin-guide/README.rst
> > >   :译者:
> > >    吴想成 Wu XiangCheng <bobwxc@email.cn>
> > > +.. _readme_zh:
> > > +
> > Hi Dongliang, good evening ;-)
> > 
> > I remember that Jon emphasized that top-level labels should not be
> > added in this thread:
> > 
> >    https://lore.kernel.org/linux-doc/87tsqytxrn.fsf@trenco.lwn.net/
> > 
> > And I remembered that my patch (apply-patches.rst) was rendered
> > correctly just using a plain path. (so I didn't add that label)
> > But I'll check it again now.
> 
> 
> It seems useless. I will test this removal, if it works I would remove this
> top level in v2 patch.

Checked with sphinx-build 9.1.0, rendered correctly on f857ff5bf007
(docs/translations/pt_BR: admin-guide: add efi-stub.rst, 2026-10-15)

> > Also, v3 of this series is pending, if I remember correctly. In general
> > I think it's not bad. So feel free to take a look when having spare
> > time.
> > 
> > v3: https://lore.kernel.org/linux-doc/20260706151358.2103703-1-qiujiandong1998@gmail.com/
> 
> I will review this patchset today or tomorrmow.

Thanks for your review!




^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2026-10-27 16:16 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-27 10:25 [PATCH 0/9] docs/zh_CN: align translation paths and update guides Dongliang Mu
2026-10-27 10:25 ` [PATCH 1/9] docs/zh_CN: update admin-guide/index.rst translation Dongliang Mu
2026-10-27 10:25 ` [PATCH 2/9] docs/zh_CN: update admin-guide/README.rst translation Dongliang Mu
2026-10-27 11:37   ` Weijie Yuan
2026-10-27 12:11     ` Dongliang Mu
2026-10-27 16:16       ` Weijie Yuan
2026-10-27 10:25 ` [PATCH 3/9] docs/zh_CN: add media administrator guide translations Dongliang Mu
2026-10-27 10:25 ` [PATCH 4/9] docs/zh_CN: reorganize process debugging guides Dongliang Mu
2026-10-27 10:25 ` [PATCH 5/9] docs/zh_CN: update magic-number to match upstream Dongliang Mu
2026-10-27 10:25 ` [PATCH 6/9] docs/zh_CN: reorganize media driver API translations Dongliang Mu
2026-10-27 10:25 ` [PATCH 7/9] docs/zh_CN: move GFS2 translations into filesystems/gfs2 Dongliang Mu
2026-10-27 10:25 ` [PATCH 8/9] docs/zh_CN: update networking/xfrm/xfrm_proc.rst translation Dongliang Mu
2026-10-27 10:25 ` [PATCH 9/9] docs/zh_CN: remove stale Original fields from SCSI and IPE translations Dongliang Mu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®