复位控制器 API

引言

复位控制器是控制多个外围设备复位信号的中央单元。复位控制器 API 分为两部分:消费者驱动程序接口 (API 参考),允许外围设备驱动程序请求控制其复位输入信号;以及复位控制器驱动程序接口 (API 参考),由复位控制器设备的驱动程序使用,以注册其复位控制,从而将其提供给消费者。

虽然一些复位控制器硬件单元也实现了系统重启功能,但重启处理程序不在复位控制器 API 的范围之内。

词汇表

复位控制器 API 使用以下术语,具有特定的含义

复位线

物理复位线,将复位信号从复位控制器硬件单元传送到外围模块。

复位控制

确定一个或多个复位线状态的控制方法。最常见的是复位控制器寄存器空间中的单个位,它可以直接控制复位线的物理状态,或者自动清除,并且可用于在复位线上触发预定的脉冲。在更复杂的复位控制中,单个触发操作可以在多个复位线上启动精心定时的脉冲序列。

复位控制器

一个硬件模块,提供多个复位控制以控制多个复位线。

复位消费者

外围模块或外部 IC,通过复位线上的信号将其置于复位状态。

消费者驱动程序接口

该接口提供了一个类似于内核时钟框架的 API。消费者驱动程序使用 get 和 put 操作来获取和释放复位控制。提供了用于置位和解除置位受控复位线、触发复位脉冲或查询复位线状态的函数。

请求复位控制时,消费者可以使用复位输入的符号名称,这些名称由内核映射到现有复位控制器设备上的实际复位控制。

当复位控制器框架未被使用时,会提供此 API 的存根版本,以最大程度地减少使用 ifdef 的需要。

共享和独占复位

复位控制器 API 提供引用计数解除置位和置位或直接的独占控制。共享和独占复位控制之间的区别在请求复位控制时做出,要么通过 devm_reset_control_get_shared(),要么通过 devm_reset_control_get_exclusive()。此选择决定了使用复位控制进行的 API 调用的行为。

共享复位的行为类似于内核时钟框架中的时钟。它们提供引用计数的解除置位,其中只有第一次解除置位(将解除置位引用计数增加 1)和最后一次置位(将解除置位引用计数减少回零)对复位线产生物理影响。

另一方面,独占复位保证直接控制。也就是说,置位会导致立即置位复位线,而解除置位会导致立即解除置位复位线。

置位和解除置位

消费者驱动程序使用 reset_control_assert()reset_control_deassert() 函数来置位和解除置位复位线。对于共享复位控制,对这两个函数的调用必须保持平衡。

请注意,由于多个消费者可能正在使用共享复位控制,因此不能保证在共享复位控制上调用 reset_control_assert() 实际上会导致复位线被置位。使用共享复位控制的消费者驱动程序应假定复位线可能始终保持解除置位状态。API 仅保证只要任何消费者请求解除置位,复位线就不能被置位。

触发

消费者驱动程序使用 reset_control_reset() 在自解除置位的复位控制上触发复位脉冲。通常,这些复位不能在多个消费者之间共享,因为从任何消费者驱动程序请求脉冲都会重置所有连接的外围设备。

复位控制器 API 允许请求自解除置位的复位控制作为共享的,但对于这些复位控制,只有第一个触发请求会导致在复位线上发出实际脉冲。除非所有消费者都调用 reset_control_rearm(),否则对该函数的所有进一步调用都没有效果。对于共享复位控制,对这两个函数的调用必须保持平衡。这允许仅在驱动程序被探测或恢复之前在任何时间点需要初始复位的设备共享脉冲复位线。

查询

只有一些复位控制器支持通过 reset_control_status() 查询复位线的当前状态。如果支持,则如果给定的复位线被置位,则此函数返回一个正的非零值。reset_control_status() 函数不接受 复位控制数组 句柄作为其输入参数。

可选复位

通常,外围设备在某些平台上需要复位线,但在其他平台上则不需要。为此,可以使用 devm_reset_control_get_optional_exclusive()devm_reset_control_get_optional_shared() 将复位控制请求为可选的。当设备树中未指定请求的复位控制时,这些函数将返回 NULL 指针,而不是错误。将 NULL 指针传递给 reset_control 函数会导致它们静默返回,而不会出现错误。

复位控制数组

一些驱动程序需要以不特定的顺序置位一堆复位线。devm_reset_control_array_get() 返回一个不透明的复位控制句柄,该句柄可用于同时置位、解除置位或触发所有指定的复位控制。复位控制 API 不保证其中各个控制的处理顺序。

复位控制器驱动程序接口

复位控制器模块的驱动程序提供了置位或解除置位复位信号、在复位线上触发复位脉冲或查询其当前状态所必需的功能。所有功能都是可选的。

初始化

驱动程序填充一个 struct reset_controller_dev,并在其探测函数中使用 reset_controller_register() 注册它。实际功能通过 struct reset_control_ops 在回调函数中实现。

API 参考

复位控制器 API 在此分为两部分进行文档说明:复位消费者 API复位控制器驱动程序 API

复位消费者 API

复位消费者可以使用不透明的复位控制句柄来控制复位线,该句柄可以从 devm_reset_control_get_exclusive()devm_reset_control_get_shared() 获取。获得复位控制后,消费者可以调用 reset_control_assert()reset_control_deassert(),使用 reset_control_reset() 触发复位脉冲,或者使用 reset_control_status() 查询复位线状态。

struct reset_control_bulk_data

用于批量复位控制操作的数据。

定义:

struct reset_control_bulk_data {
    const char                      *id;
    struct reset_control            *rstc;
};

成员

id

复位控制消费者 ID

rstc

用于存储相关复位控制的 struct reset_control *

描述

复位 API 提供了一系列 reset_control_bulk_*() API 调用,方便需要多个复位控制的消费者。此结构用于管理这些调用的数据。

enum reset_control_flags

可以传递给 reset_control_get 函数以确定复位控制类型的标志。这些值不能进行 OR 运算。

常量

RESET_CONTROL_EXCLUSIVE

独占,已获取,

RESET_CONTROL_EXCLUSIVE_DEASSERTED

独占,已获取,已取消断言

RESET_CONTROL_EXCLUSIVE_RELEASED

独占,已释放,

RESET_CONTROL_SHARED

共享

RESET_CONTROL_SHARED_DEASSERTED

共享,已取消断言

RESET_CONTROL_OPTIONAL_EXCLUSIVE

可选,独占,已获取

RESET_CONTROL_OPTIONAL_EXCLUSIVE_DEASSERTED

可选,独占,已获取,已取消断言

RESET_CONTROL_OPTIONAL_EXCLUSIVE_RELEASED

可选,独占,已释放

RESET_CONTROL_OPTIONAL_SHARED

可选,共享

RESET_CONTROL_OPTIONAL_SHARED_DEASSERTED

可选,共享,已取消断言

struct reset_control *reset_control_get_exclusive(struct device *dev, const char *id)

查找并获取对复位控制器的独占引用。

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

返回 struct reset_control 或包含 errno 的 IS_ERR() 条件。如果针对同一个 reset_control 多次调用此函数,它将返回 -EBUSY。

有关复位控制的共享引用的详细信息,请参见 reset_control_get_shared()

id 名称的使用是可选的。

int reset_control_bulk_get_exclusive(struct device *dev, int num_rstcs, struct reset_control_bulk_data *rstcs)

查找并获取对多个复位控制器的独占引用。

参数

struct device *dev

要由控制器复位的设备

int num_rstcs

rstcs 数组中的条目数

struct reset_control_bulk_data *rstcs

设置了复位线名称的 struct reset_control_bulk_data 数组

描述

使用指向独占复位控制的指针填充 rstcs 数组并返回 0,或返回包含 errno 的 IS_ERR() 条件。

struct reset_control *reset_control_get_exclusive_released(struct device *dev, const char *id)

查找并获取对复位控制器的临时独占引用。

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

返回 struct reset_control 或包含 errno 的 IS_ERR() 条件。由此函数返回的复位控制必须先通过 reset_control_acquire() 获取,然后才能使用,并且之后应通过 reset_control_release() 释放。

id 名称的使用是可选的。

int reset_control_bulk_get_exclusive_released(struct device *dev, int num_rstcs, struct reset_control_bulk_data *rstcs)

查找并获取对多个复位控制器的临时独占引用。

参数

struct device *dev

要由控制器复位的设备

int num_rstcs

rstcs 数组中的条目数

struct reset_control_bulk_data *rstcs

设置了复位线名称的 struct reset_control_bulk_data 数组

描述

使用指向独占复位控制的指针填充 rstcs 数组并返回 0,或返回包含 errno 的 IS_ERR() 条件。由此函数返回的复位控制必须先通过 reset_control_bulk_acquire() 获取,然后才能使用,并且之后应通过 reset_control_bulk_release() 释放。

int reset_control_bulk_get_optional_exclusive_released(struct device *dev, int num_rstcs, struct reset_control_bulk_data *rstcs)

查找并获取对多个复位控制器的可选临时独占引用。

参数

struct device *dev

要由控制器复位的设备

int num_rstcs

rstcs 数组中的条目数

struct reset_control_bulk_data *rstcs

设置了复位线名称的 struct reset_control_bulk_data 数组

描述

reset_control_bulk_get_exclusive_released() 的可选变体。如果在设备树中未指定请求的复位,此函数将返回 0 而不是错误,并且将缺失的 rtsc 设置为 NULL。

有关更多信息,请参见 reset_control_bulk_get_exclusive_released()

struct reset_control *reset_control_get_shared(struct device *dev, const char *id)

查找并获取对复位控制器的共享引用。

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

返回 struct reset_control 或包含 errno 的 IS_ERR() 条件。此函数旨在与硬件块之间共享的复位控制一起使用。

当复位控制共享时,reset_control_assert/deassert 的行为会更改,复位核心将跟踪 deassert_count,并且仅在调用 reset_control_assert 的次数与调用 reset_control_deassert 的次数相等后才(重新)断言复位。另请参阅有关 reset_control_assert 文档中有关共享复位控制的备注。

在共享复位控制上,不允许在未先调用 reset_control_deassert 的情况下调用 reset_control_assert。也不允许在共享复位控制上调用 reset_control_reset。

id 名称的使用是可选的。

int reset_control_bulk_get_shared(struct device *dev, int num_rstcs, struct reset_control_bulk_data *rstcs)

查找并获取多个复位控制器的共享引用。

参数

struct device *dev

要由控制器复位的设备

int num_rstcs

rstcs 数组中的条目数

struct reset_control_bulk_data *rstcs

设置了复位线名称的 struct reset_control_bulk_data 数组

描述

用指向共享复位控制的指针填充 rstcs 数组,并返回 0;或者返回包含 errno 的 IS_ERR() 条件。

struct reset_control *reset_control_get_optional_exclusive(struct device *dev, const char *id)

reset_control_get_exclusive() 的可选版本

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

reset_control_get_exclusive() 的可选变体。如果设备树中未指定请求的复位,则此函数返回 NULL 而不是错误。

有关详细信息,请参见 reset_control_get_exclusive()

int reset_control_bulk_get_optional_exclusive(struct device *dev, int num_rstcs, struct reset_control_bulk_data *rstcs)

reset_control_bulk_get_exclusive() 的可选版本

参数

struct device *dev

要由控制器复位的设备

int num_rstcs

rstcs 数组中的条目数

struct reset_control_bulk_data *rstcs

设置了复位线名称的 struct reset_control_bulk_data 数组

描述

reset_control_bulk_get_exclusive() 的可选变体。如果设备树中未指定任何请求的复位,则此函数会将它们设置为 NULL 而不是返回错误。

有关详细信息,请参见 reset_control_bulk_get_exclusive()

struct reset_control *reset_control_get_optional_shared(struct device *dev, const char *id)

reset_control_get_shared() 的可选版本

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

reset_control_get_shared() 的可选变体。如果设备树中未指定请求的复位,则此函数返回 NULL 而不是错误。

有关详细信息,请参见 reset_control_get_shared()

int reset_control_bulk_get_optional_shared(struct device *dev, int num_rstcs, struct reset_control_bulk_data *rstcs)

reset_control_bulk_get_shared() 的可选版本

参数

struct device *dev

要由控制器复位的设备

int num_rstcs

rstcs 数组中的条目数

struct reset_control_bulk_data *rstcs

设置了复位线名称的 struct reset_control_bulk_data 数组

描述

reset_control_bulk_get_shared() 的可选变体。如果设备树中未指定请求的复位,则此函数会将它们设置为 NULL 而不是返回错误。

有关详细信息,请参见 reset_control_bulk_get_shared()

struct reset_control *of_reset_control_get_exclusive(struct device_node *node, const char *id)

查找并获取对复位控制器的独占引用。

参数

struct device_node *node

要由控制器复位的设备

const char *id

复位线名称

描述

返回一个 struct reset_control 或包含 errno 的 IS_ERR() 条件。

id 名称的使用是可选的。

struct reset_control *of_reset_control_get_optional_exclusive(struct device_node *node, const char *id)

查找并获取对复位控制器的可选独占引用。

参数

struct device_node *node

要由控制器复位的设备

const char *id

复位线名称

描述

of_reset_control_get_exclusive() 的可选变体。如果设备树中未指定请求的复位,则此函数返回 NULL 而不是错误。

返回一个 struct reset_control 或包含 errno 的 IS_ERR() 条件。

id 名称的使用是可选的。

struct reset_control *of_reset_control_get_shared(struct device_node *node, const char *id)

查找并获取对复位控制器的共享引用。

参数

struct device_node *node

要由控制器复位的设备

const char *id

复位线名称

描述

当复位控制共享时,reset_control_assert/deassert 的行为会更改,复位核心将跟踪 deassert_count,并且仅在调用 reset_control_assert 的次数与调用 reset_control_deassert 的次数相等后才(重新)断言复位。另请参阅有关 reset_control_assert 文档中有关共享复位控制的备注。

不允许在共享复位控制器上调用 reset_control_assert,而没有先调用 reset_control_deassert。也不允许在共享复位控制器上调用 reset_control_reset。返回一个 struct reset_control 或包含 errno 的 IS_ERR() 条件。

id 名称的使用是可选的。

struct reset_control *of_reset_control_get_exclusive_by_index(struct device_node *node, int index)

通过索引查找并获取对复位控制器的独占引用。

参数

struct device_node *node

要由控制器复位的设备

int index

复位控制器的索引

描述

这用于以任何顺序为设备或电源域执行一系列复位。返回一个 struct reset_control 或包含 errno 的 IS_ERR() 条件。

struct reset_control *of_reset_control_get_shared_by_index(struct device_node *node, int index)

通过索引查找并获取对复位控制器的共享引用。

参数

struct device_node *node

要由控制器复位的设备

int index

复位控制器的索引

描述

当复位控制共享时,reset_control_assert/deassert 的行为会更改,复位核心将跟踪 deassert_count,并且仅在调用 reset_control_assert 的次数与调用 reset_control_deassert 的次数相等后才(重新)断言复位。另请参阅有关 reset_control_assert 文档中有关共享复位控制的备注。

不允许在共享复位控制器上调用 reset_control_assert,而没有先调用 reset_control_deassert。也不允许在共享复位控制器上调用 reset_control_reset。返回一个 struct reset_control 或包含 errno 的 IS_ERR() 条件。

这用于以任何顺序为设备或电源域执行一系列复位。返回一个 struct reset_control 或包含 errno 的 IS_ERR() 条件。

struct reset_control *devm_reset_control_get_exclusive(struct device *dev, const char *id)

资源管理的 reset_control_get_exclusive()

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

托管的 reset_control_get_exclusive()。对于从此函数返回的复位控制器,将在驱动程序分离时自动调用 reset_control_put()

有关详细信息,请参见 reset_control_get_exclusive()

struct reset_control *devm_reset_control_get_exclusive_deasserted(struct device *dev, const char *id)

资源管理 reset_control_get_exclusive() + reset_control_deassert()

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

托管的 reset_control_get_exclusive() + reset_control_deassert()。对于从此函数返回的复位控制器,reset_control_assert() + reset_control_put() 将在驱动程序分离时自动调用。

有关详细信息,请参见 reset_control_get_exclusive()

int devm_reset_control_bulk_get_exclusive(struct device *dev, int num_rstcs, struct reset_control_bulk_data *rstcs)

资源管理 reset_control_bulk_get_exclusive()

参数

struct device *dev

要由控制器复位的设备

int num_rstcs

rstcs 数组中的条目数

struct reset_control_bulk_data *rstcs

设置了复位线名称的 struct reset_control_bulk_data 数组

描述

托管的 reset_control_bulk_get_exclusive()。对于从此函数返回的复位控制器,reset_control_put() 将在驱动程序分离时自动调用。

有关详细信息,请参见 reset_control_bulk_get_exclusive()

struct reset_control *devm_reset_control_get_exclusive_released(struct device *dev, const char *id)

资源管理 reset_control_get_exclusive_released()

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

托管的 reset_control_get_exclusive_released()。对于从此函数返回的复位控制器,reset_control_put() 将在驱动程序分离时自动调用。

有关更多信息,请参见 reset_control_get_exclusive_released()

int devm_reset_control_bulk_get_exclusive_released(struct device *dev, int num_rstcs, struct reset_control_bulk_data *rstcs)

资源管理 reset_control_bulk_get_exclusive_released()

参数

struct device *dev

要由控制器复位的设备

int num_rstcs

rstcs 数组中的条目数

struct reset_control_bulk_data *rstcs

设置了复位线名称的 struct reset_control_bulk_data 数组

描述

托管的 reset_control_bulk_get_exclusive_released()。对于从此函数返回的复位控制器,reset_control_put() 将在驱动程序分离时自动调用。

有关更多信息,请参见 reset_control_bulk_get_exclusive_released()

struct reset_control *devm_reset_control_get_optional_exclusive_released(struct device *dev, const char *id)

资源管理 reset_control_get_optional_exclusive_released()

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

reset_control_get_exclusive_released() 的托管和可选变体。对于从此函数返回的复位控制器,reset_control_put() 将在驱动程序分离时自动调用。

有关更多信息,请参见 reset_control_get_exclusive_released()

int devm_reset_control_bulk_get_optional_exclusive_released(struct device *dev, int num_rstcs, struct reset_control_bulk_data *rstcs)

资源管理 reset_control_bulk_optional_get_exclusive_released()

参数

struct device *dev

要由控制器复位的设备

int num_rstcs

rstcs 数组中的条目数

struct reset_control_bulk_data *rstcs

设置了复位线名称的 struct reset_control_bulk_data 数组

描述

托管的 reset_control_bulk_optional_get_exclusive_released()。对于从此函数返回的复位控制器,reset_control_put() 将在驱动程序分离时自动调用。

有关更多信息,请参见 reset_control_bulk_optional_get_exclusive_released()。

struct reset_control *devm_reset_control_get_shared(struct device *dev, const char *id)

资源管理 reset_control_get_shared()

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

托管的 reset_control_get_shared()。对于从此函数返回的复位控制器,reset_control_put() 将在驱动程序分离时自动调用。 有关更多信息,请参见 reset_control_get_shared()

struct reset_control *devm_reset_control_get_shared_deasserted(struct device *dev, const char *id)

资源管理 reset_control_get_shared() + reset_control_deassert()

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

托管的 reset_control_get_shared() + reset_control_deassert()。对于从此函数返回的复位控制器,将在驱动程序分离时自动调用 reset_control_assert() + reset_control_put()

有关更多信息,请参见 devm_reset_control_get_shared()

int devm_reset_control_bulk_get_shared(struct device *dev, int num_rstcs, struct reset_control_bulk_data *rstcs)

资源管理 reset_control_bulk_get_shared()

参数

struct device *dev

要由控制器复位的设备

int num_rstcs

rstcs 数组中的条目数

struct reset_control_bulk_data *rstcs

设置了复位线名称的 struct reset_control_bulk_data 数组

描述

托管的 reset_control_bulk_get_shared()。对于从此函数返回的复位控制器,将在驱动程序分离时自动调用 reset_control_put()

有关详细信息,请参见 reset_control_bulk_get_shared()

int devm_reset_control_bulk_get_shared_deasserted(struct device *dev, int num_rstcs, struct reset_control_bulk_data *rstcs)

资源管理 reset_control_bulk_get_shared() + reset_control_bulk_deassert()

参数

struct device *dev

要由控制器复位的设备

int num_rstcs

rstcs 数组中的条目数

struct reset_control_bulk_data *rstcs

设置了复位线名称的 struct reset_control_bulk_data 数组

描述

托管的 reset_control_bulk_get_shared() + reset_control_bulk_deassert()。对于从此函数返回的复位控制器,将在驱动程序分离时自动调用 reset_control_bulk_assert() + reset_control_bulk_put()。

有关更多信息,请参见 devm_reset_control_bulk_get_shared()

struct reset_control *devm_reset_control_get_optional_exclusive(struct device *dev, const char *id)

资源管理 reset_control_get_optional_exclusive()

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

托管的 reset_control_get_optional_exclusive()。对于从此函数返回的复位控制器,将在驱动程序分离时自动调用 reset_control_put()

有关更多信息,请参见 reset_control_get_optional_exclusive()

struct reset_control *devm_reset_control_get_optional_exclusive_deasserted(struct device *dev, const char *id)

资源管理 reset_control_get_optional_exclusive() + reset_control_deassert()

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

托管的 reset_control_get_optional_exclusive() + reset_control_deassert()。对于从此函数返回的复位控制器,将在驱动程序分离时自动调用 reset_control_assert() + reset_control_put()

有关更多信息,请参见 devm_reset_control_get_optional_exclusive()

int devm_reset_control_bulk_get_optional_exclusive(struct device *dev, int num_rstcs, struct reset_control_bulk_data *rstcs)

资源管理 reset_control_bulk_get_optional_exclusive()

参数

struct device *dev

要由控制器复位的设备

int num_rstcs

rstcs 数组中的条目数

struct reset_control_bulk_data *rstcs

设置了复位线名称的 struct reset_control_bulk_data 数组

描述

托管的 reset_control_bulk_get_optional_exclusive()。对于从此函数返回的复位控制器,将在驱动程序分离时自动调用 reset_control_put()

有关更多信息,请参见 reset_control_bulk_get_optional_exclusive()

struct reset_control *devm_reset_control_get_optional_shared(struct device *dev, const char *id)

资源管理 reset_control_get_optional_shared()

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

托管的 reset_control_get_optional_shared()。对于从此函数返回的复位控制器,将在驱动程序分离时自动调用 reset_control_put()

更多信息请参考 reset_control_get_optional_shared()

struct reset_control *devm_reset_control_get_optional_shared_deasserted(struct device *dev, const char *id)

资源管理型的 reset_control_get_optional_shared() + reset_control_deassert()

参数

struct device *dev

要由控制器复位的设备

const char *id

复位线名称

描述

托管的 reset_control_get_optional_shared() + reset_control_deassert()。对于从此函数返回的复位控制器,驱动程序分离时会自动调用 reset_control_assert() + reset_control_put()

更多信息请参考 devm_reset_control_get_optional_shared()

int devm_reset_control_bulk_get_optional_shared(struct device *dev, int num_rstcs, struct reset_control_bulk_data *rstcs)

资源管理型的 reset_control_bulk_get_optional_shared()

参数

struct device *dev

要由控制器复位的设备

int num_rstcs

rstcs 数组中的条目数

struct reset_control_bulk_data *rstcs

设置了复位线名称的 struct reset_control_bulk_data 数组

描述

托管的 reset_control_bulk_get_optional_shared()。对于从此函数返回的复位控制器,驱动程序分离时会自动调用 reset_control_put()

更多信息请参考 reset_control_bulk_get_optional_shared()

struct reset_control *devm_reset_control_get_exclusive_by_index(struct device *dev, int index)

资源管理的 reset_control_get_exclusive()

参数

struct device *dev

要由控制器复位的设备

int index

复位控制器的索引

描述

托管的 reset_control_get_exclusive()。对于从此函数返回的复位控制器,将在驱动程序分离时自动调用 reset_control_put()

有关详细信息,请参见 reset_control_get_exclusive()

struct reset_control *devm_reset_control_get_shared_by_index(struct device *dev, int index)

资源管理型的 reset_control_get_shared

参数

struct device *dev

要由控制器复位的设备

int index

复位控制器的索引

描述

托管的 reset_control_get_shared()。对于从此函数返回的复位控制器,reset_control_put() 将在驱动程序分离时自动调用。 有关更多信息,请参见 reset_control_get_shared()

int reset_control_reset(struct reset_control *rstc)

重置受控设备

参数

struct reset_control *rstc

复位控制器

描述

在共享复位线上,实际的复位脉冲仅在 reset_control 实例的生命周期内触发一次:对于除第一个调用者之外的所有调用者,这都是空操作。当使用了 reset_control_reset 时,使用者不得在共享复位线上使用 reset_control_(de)assert。

如果 rstc 为 NULL,则表示是可选的复位,该函数将只返回 0。

int reset_control_rearm(struct reset_control *rstc)

允许重新触发共享复位线”

参数

struct reset_control *rstc

复位控制器

描述

在共享复位线上,实际的复位脉冲仅在 reset_control 实例的生命周期内触发一次,除非使用此调用。

对此函数的调用必须与对 reset_control_reset 的调用相平衡,如果 triggered_count 低于 0,则会抛出警告。

当使用了 reset_control_reset 或 reset_control_rearm 时,使用者不得在共享复位线上使用 reset_control_(de)assert。

如果 rstc 为 NULL,该函数将只返回 0。

int reset_control_assert(struct reset_control *rstc)

置位复位线

参数

struct reset_control *rstc

复位控制器

描述

在独占复位控制器上调用此函数可保证复位将被置位。当在共享复位控制器上调用时,只要其他用户保持复位,该线路仍可能被取消置位。

对于共享复位控制,驱动程序不能期望硬件的寄存器和内部状态被重置,但必须做好这种情况发生的准备。当使用了 reset_control_(de)assert 时,使用者不得在共享复位线上使用 reset_control_reset。

如果 rstc 为 NULL,则表示是可选的复位,该函数将只返回 0。

int reset_control_deassert(struct reset_control *rstc)

取消置位复位线

参数

struct reset_control *rstc

复位控制器

描述

调用此函数后,保证复位被取消置位。当使用了 reset_control_(de)assert 时,使用者不得在共享复位线上使用 reset_control_reset。

如果 rstc 为 NULL,则表示是可选的复位,该函数将只返回 0。

int reset_control_status(struct reset_control *rstc)

如果不支持,则返回负的 errno;如果复位线被置位,则返回正值;如果复位线未被置位或 desc 为 NULL(可选复位),则返回零。

参数

struct reset_control *rstc

复位控制器

int reset_control_acquire(struct reset_control *rstc)

获取复位控制以供独占使用

参数

struct reset_control *rstc

复位控制

描述

这用于显式获取复位控制以供独占使用。请注意,默认情况下,独占复位请求为已获取状态。为了让第二个使用者能够控制复位,第一个使用者必须先释放它。通常,实现此目的最简单的方法是调用 reset_control_get_exclusive_released() 来获取复位控制的实例。默认情况下,此类复位控制不会被获取。

使用共享访问独占复位的消费者需要遵循特定的协议才能协同工作。在消费者更改复位之前,他们必须使用 reset_control_acquire() 获取独占访问权。在完成复位操作后,他们必须通过调用 reset_control_release() 释放独占访问权。只要有其他消费者尚未释放复位,消费者就不会被授予对复位的独占访问权。

另请参阅:reset_control_release()

void reset_control_release(struct reset_control *rstc)

释放对复位控制的独占访问权

参数

struct reset_control *rstc

复位控制

描述

释放先前通过调用 reset_control_acquire() 获取的对复位控制的独占访问权。在消费者调用此函数之前,其他消费者不会被授予独占访问权。

另请参阅:reset_control_acquire()

void reset_control_put(struct reset_control *rstc)

释放复位控制器

参数

struct reset_control *rstc

复位控制器

int of_reset_control_get_count(struct device_node *node)

计算设备可用的复位数量

参数

struct device_node *node

包含 ‘resets’ 的设备节点。

描述

成功时返回正的复位计数,失败或计数为零时返回错误编号。

struct reset_control *of_reset_control_array_get(struct device_node *np, enum reset_control_flags flags)

使用设备节点获取复位控制列表。

参数

struct device_node *np

请求复位控制数组的设备的设备节点

enum reset_control_flags flags

复位控制是否共享、可选、已获取

描述

成功时返回指向已分配的 reset_control 的指针,失败时返回错误

struct reset_control *devm_reset_control_array_get(struct device *dev, enum reset_control_flags flags)

资源管理的复位控制数组获取

参数

struct device *dev

请求复位控制列表的设备

enum reset_control_flags flags

复位控制是否共享、可选、已获取

描述

复位控制数组 API 适用于只需要断言或取消断言的复位列表,而对顺序没有任何要求。

成功时返回指向已分配的 reset_control 的指针,失败时返回错误

int reset_control_get_count(struct device *dev)

计算设备可用的复位数量

参数

struct device *dev

要返回其复位数量的设备

描述

成功时返回正的复位计数,失败或计数为零时返回错误编号。

复位控制器驱动程序 API

复位控制器驱动程序应该在一个静态常量结构 reset_control_ops 中实现必要的功能,分配并填充一个结构 reset_controller_dev,并使用 devm_reset_controller_register() 注册它。

struct reset_control_ops

复位控制器驱动程序回调

定义:

struct reset_control_ops {
    int (*reset)(struct reset_controller_dev *rcdev, unsigned long id);
    int (*assert)(struct reset_controller_dev *rcdev, unsigned long id);
    int (*deassert)(struct reset_controller_dev *rcdev, unsigned long id);
    int (*status)(struct reset_controller_dev *rcdev, unsigned long id);
};

成员

reset

对于自取消断言复位,执行复位设备的所有必要操作

assert

如果支持,手动断言复位线

deassert

如果支持,手动取消断言复位线

status

如果支持,返回复位线的状态

struct reset_control_lookup

表示单个查找条目

定义:

struct reset_control_lookup {
    struct list_head list;
    const char *provider;
    unsigned int index;
    const char *dev_id;
    const char *con_id;
};

成员

list

所有复位查找条目的内部列表

provider

控制此复位线的复位控制器设备的名称

index

复位控制器设备中复位控制器的 ID

dev_id

与此复位线关联的设备的名称

con_id

复位线的名称(可以为 NULL)

struct reset_controller_dev

可能提供多个复位控制的复位控制器实体

定义:

struct reset_controller_dev {
    const struct reset_control_ops *ops;
    struct module *owner;
    struct list_head list;
    struct list_head reset_control_head;
    struct device *dev;
    struct device_node *of_node;
    const struct of_phandle_args *of_args;
    int of_reset_n_cells;
    int (*of_xlate)(struct reset_controller_dev *rcdev, const struct of_phandle_args *reset_spec);
    unsigned int nr_resets;
};

成员

ops

指向设备特定 struct reset_control_ops 的指针

owner

复位控制器驱动程序的内核模块

list

复位控制器设备的内部列表

reset_control_head

请求的复位控制的内部列表的头

dev

相应的驱动程序模型设备结构

of_node

作为 phandle 目标的相应设备树节点

of_args

对于 reset-gpios 控制器:包含 of_node 和 GPIO 编号的相应 phandle 参数,与 of_node 互补;应该存在此项或 of_node

of_reset_n_cells

复位线说明符中的单元格数

of_xlate

转换函数,用于将设备树中找到的说明符转换为给复位控制操作的 ID,默认为 of_reset_simple_xlate()

nr_resets

此复位控制器设备中的复位控制数

int of_reset_simple_xlate(struct reset_controller_dev *rcdev, const struct of_phandle_args *reset_spec)

将 reset_spec 转换为复位线编号

参数

struct reset_controller_dev *rcdev

指向复位控制器设备的指针

const struct of_phandle_args *reset_spec

在设备树中找到的复位线说明符

描述

如果未在 reset_controller_dev 中设置 of_xlate,则默认使用此静态转换函数。它对于所有具有 1:1 映射的复位控制器非常有用,在这些控制器中,复位线可以通过数字进行索引而没有间隔。

int reset_controller_register(struct reset_controller_dev *rcdev)

注册一个复位控制器设备

参数

struct reset_controller_dev *rcdev

指向已初始化的复位控制器设备的指针

void reset_controller_unregister(struct reset_controller_dev *rcdev)

注销一个复位控制器设备

参数

struct reset_controller_dev *rcdev

指向复位控制器设备的指针

int devm_reset_controller_register(struct device *dev, struct reset_controller_dev *rcdev)

资源管理的 reset_controller_register()

参数

struct device *dev

正在注册此复位控制器的设备

struct reset_controller_dev *rcdev

指向已初始化的复位控制器设备的指针

描述

托管的 reset_controller_register()。对于由此函数注册的复位控制器,在驱动程序分离时会自动调用 reset_controller_unregister()。有关更多信息,请参见 reset_controller_register()

void reset_controller_add_lookup(struct reset_control_lookup *lookup, unsigned int num_entries)

注册一组查找条目

参数

struct reset_control_lookup *lookup

复位查找条目数组

unsigned int num_entries

查找数组中的条目数