裝置頻率縮放

簡介

該框架為任意裝置上的動態電壓和頻率切換(Dynamic Voltage and Frequency Switching)提供了標準的核心介面。

它透過類似於 cpufreq 子系統的 sysfs 檔案暴露了頻率調節控制。

對於可以測量當前使用情況的裝置,其頻率可以由調頻器(governors)自動調整。

API

裝置驅動需要初始化一個 devfreq_profile 並呼叫 devfreq_add_device() 函式來建立一個 devfreq 例項。

struct devfreq_dev_status

devfreq 使用者裝置提供給調頻器的資料。表示效能統計資訊。

定義:

struct devfreq_dev_status {
    unsigned long total_time;
    unsigned long busy_time;
    unsigned long current_frequency;
    void *private_data;
};

成員

total_time

devfreq_dev_status 例項所代表的總時間

busy_time

裝置在總時間中工作的時長。

current_frequency

當前工作頻率。

private_data

devfreq 框架未指定的一個條目。裝置和特定調頻器可以透過 private_data 擁有自己的協議。然而,由於這是調頻器特有的,使用它的調頻器將只與瞭解它的裝置相容。

struct devfreq_dev_profile

devfreq 的使用者裝置配置檔案

定義:

struct devfreq_dev_profile {
    unsigned long initial_freq;
    unsigned int polling_ms;
    enum devfreq_timer timer;
    int (*target)(struct device *dev, unsigned long *freq, u32 flags);
    int (*get_dev_status)(struct device *dev, struct devfreq_dev_status *stat);
    int (*get_cur_freq)(struct device *dev, unsigned long *freq);
    void (*exit)(struct device *dev);
    unsigned long *freq_table;
    unsigned int max_state;
    bool is_cooling_device;
};

成員

initial_freq

呼叫 devfreq_add_device() 時的工作頻率。

polling_ms

輪詢間隔,單位為毫秒。0 表示停用輪詢。

timer

定時器型別可以是可延遲定時器或延遲定時器。

target

裝置應將其工作頻率設定為 freq 或略高於 freq 的值。如果 freq 高於任何可操作頻率,則設定為最大值。在返回之前,目標函式應將 freq 設定為當前頻率。“flags”引數的可能值已在上面透過“DEVFREQ_FLAG_*”宏進行解釋。

get_dev_status

裝置應向 devfreq 提供當前的效能狀態。建議調頻器不要直接使用此項。相反,建議調頻器結合 devfreq.last_status 使用 devfreq_update_stats()。

get_cur_freq

裝置應提供其當前的工作頻率。

exit

一個可選的回撥函式,當 devfreq 因錯誤或呼叫 devfreq_remove_device() 而移除 devfreq 物件時被呼叫。如果使用者已在通知頭註冊了 devfreq->nb,則此時應登出它。

freq_table

可選的頻率列表,用於支援統計,且 freq_table 必須按升序生成。

max_state

freq_table 的大小。

is_cooling_device

一個不言自明的布林值,賦予裝置冷卻效果屬性。

struct devfreq_stats

devfreq 裝置行為統計

定義:

struct devfreq_stats {
    unsigned int total_trans;
    unsigned int *trans_table;
    u64 *time_in_state;
    u64 last_update;
};

成員

total_trans

devfreq 轉換次數。

trans_table

devfreq 轉換統計。

time_in_state

devfreq 狀態統計。

last_update

統計資訊上次更新的時間。

struct devfreq

裝置 devfreq 結構

定義:

struct devfreq {
    struct list_head node;
    struct mutex lock;
    struct device dev;
    struct devfreq_dev_profile *profile;
    const struct devfreq_governor *governor;
    struct opp_table *opp_table;
    struct notifier_block nb;
    struct delayed_work work;
    unsigned long *freq_table;
    unsigned int max_state;
    unsigned long previous_freq;
    struct devfreq_dev_status last_status;
    void *data;
    void *governor_data;
    struct dev_pm_qos_request user_min_freq_req;
    struct dev_pm_qos_request user_max_freq_req;
    unsigned long scaling_min_freq;
    unsigned long scaling_max_freq;
    bool stop_polling;
    unsigned long suspend_freq;
    unsigned long resume_freq;
    atomic_t suspend_count;
    struct devfreq_stats stats;
    struct srcu_notifier_head transition_notifier_list;
    struct thermal_cooling_device *cdev;
    struct notifier_block nb_min;
    struct notifier_block nb_max;
};

成員

node

列表節點 - 包含已註冊的 devfreq 裝置。

lock

用於保護 devfreq 訪問的互斥鎖。

dev

由 devfreq 類註冊的裝置。dev.parent 是使用 devfreq 的裝置。

profile

裝置特定的 devfreq 配置檔案

governor

根據使用情況選擇頻率的方法。

opp_table

對 dev.parent 的 OPP 表的引用(如果存在)。

nb

用於通知 devfreq 物件重新評估可操作頻率的通知塊。devfreq 使用者可以使用 devfreq.nb 註冊到相應的通知器呼叫鏈。

work

用於負載監控的延遲工作。

freq_table

devfreq 驅動使用的當前頻率表。

max_state

頻率表中存在的條目數量。

previous_freq

先前配置的頻率值。

last_status

devfreq 使用者裝置資訊,效能統計

data

devfreq 驅動傳遞給調頻器的資料,調頻器不應修改它。

governor_data

調頻器的私有資料,devfreq 核心不觸及它。

user_min_freq_req

使用者(透過 sysfs)發出的 PM QoS 最小頻率請求

user_max_freq_req

使用者(透過 sysfs)發出的 PM QoS 最大頻率請求

scaling_min_freq

限制 OPP 介面請求的最小頻率

scaling_max_freq

限制 OPP 介面請求的最大頻率

stop_polling

裝置的 devfreq 輪詢狀態。

suspend_freq

裝置在掛起階段設定的頻率。

resume_freq

裝置在恢復階段設定的頻率。

suspend_count

裝置的掛起請求計數器。

stats

devfreq 裝置行為統計

transition_notifier_list

DEVFREQ_TRANSITION_NOTIFIER 通知器的列表頭。

cdev

如果 devfreq 具有冷卻屬性,則為冷卻裝置指標。

nb_min

DEV_PM_QOS_MIN_FREQUENCY 的通知塊。

nb_max

DEV_PM_QOS_MAX_FREQUENCY 的通知塊。

描述

該結構儲存給定裝置的 devfreq 資訊。

請注意,當調頻器訪問 struct devfreq 的函式條目時(struct devfreq_governor 中定義的回撥上下文除外),調頻器應使用 struct devfreq 中的 struct mutex 鎖來保護其訪問。調頻器也可以使用此互斥鎖來保護其在 void *data 中的私有資料。

struct devfreq_simple_ondemand_data

傳遞給 struct devfreq 和 devfreq_add_device 的 void *data

定義:

struct devfreq_simple_ondemand_data {
    unsigned int upthreshold;
    unsigned int downdifferential;
};

成員

upthreshold

如果負載超過此值,頻率會跳升。指定 0 以使用預設值。有效值範圍為 0 到 100。

downdifferential

如果負載低於 upthreshold - downdifferential,調頻器可能會考慮降低頻率。指定 0 以使用預設值。有效值範圍為 0 到 100。必須滿足 downdifferential < upthreshold。

描述

如果傳遞給調頻器的 devfreq_simple_ondemand_data 指標為 NULL,調頻器將使用預設值。

struct devfreq_passive_data

傳遞給 struct devfreq 和 devfreq_add_device 的 void *data

定義:

struct devfreq_passive_data {
    struct devfreq *parent;
    int (*get_target_freq)(struct devfreq *this, unsigned long *freq);
    enum devfreq_parent_dev_type parent_type;
    struct devfreq *this;
    struct notifier_block nb;
    struct list_head cpu_data_list;
};

成員

parent

父裝置的 devfreq 例項。

get_target_freq

可選回撥,返回使用被動調頻器的裝置所需的執行頻率。當被動調頻器需要透過父 devfreq 裝置的(除被動調頻器之外的)其他調頻器所設定的新頻率來決定下一個頻率時,會呼叫此函式。如果 devfreq 裝置有特定的方法來決定下一個頻率,則應使用此回撥。

parent_type

裝置的父型別。

this

本裝置的 devfreq 例項。

nb

用於 DEVFREQ_TRANSITION_NOTIFIER 或 CPUFREQ_TRANSITION_NOTIFIER 列表的通知塊。

cpu_data_list

所有 cpufreq_policy 的 CPU 頻率資料列表。

描述

devfreq_passive_data 必須設定父裝置的 devfreq 例項以及除被動調頻器之外的其他調頻器。但是,不需要初始化 'this' 和 'nb' 欄位,因為 devfreq 核心會處理它們。

struct devfreq_event_dev

devfreq-event 裝置

定義:

struct devfreq_event_dev {
    struct list_head node;
    struct device dev;
    struct mutex lock;
    u32 enable_count;
    const struct devfreq_event_desc *desc;
};

成員

node

包含已註冊的 devfreq-event 裝置。

dev

由 devfreq-event 類註冊的裝置。dev.parent 是使用 devfreq-event 的裝置。

lock

用於保護 devfreq-event 訪問的互斥鎖。

enable_count

enable 函式被呼叫的次數。

desc

devfreq-event 裝置的描述。

描述

該結構包含 devfreq-event 裝置資訊。

struct devfreq_event_data

devfreq-event 資料

定義:

struct devfreq_event_data {
    unsigned long load_count;
    unsigned long total_count;
};

成員

load_count

devfreq-event 裝置在給定週期內的負載計數。

total_count

devfreq-event 裝置在給定週期內的總計數。每個計數可能表示一個時鐘週期、一個時間單位(納秒/微秒/等)或裝置驅動程式希望的任何內容。通常,利用率是 load_count / total_count。

描述

該結構包含 devfreq-event 裝置在輪詢週期內的資料。

struct devfreq_event_ops

devfreq-event 裝置的操作

定義:

struct devfreq_event_ops {
    int (*enable)(struct devfreq_event_dev *edev);
    int (*disable)(struct devfreq_event_dev *edev);
    int (*reset)(struct devfreq_event_dev *edev);
    int (*set_event)(struct devfreq_event_dev *edev);
    int (*get_event)(struct devfreq_event_dev *edev, struct devfreq_event_data *edata);
};

成員

enable

啟用 devfreq-event 裝置。

disable

停用 devfreq-event 裝置。

reset

重置 devfreq-event 裝置的所有設定。

set_event

為 devfreq-event 裝置設定特定的事件型別。

get_event

獲取具有特定事件型別的 devfreq-event 裝置的結果。

描述

該結構包含可由 devfreq-event 裝置驅動程式實現的 devfreq-event 裝置操作。

struct devfreq_event_desc

devfreq-event 裝置的描述符

定義:

struct devfreq_event_desc {
    const char *name;
    u32 event_type;
    void *driver_data;
    const struct devfreq_event_ops *ops;
};

成員

name

devfreq-event 裝置的名稱。

event_type

由驅動程式確定和使用的事件型別

driver_data

devfreq-event 驅動程式的私有資料。

ops

控制 devfreq-event 裝置的操作。

描述

每個 devfreq-event 裝置都由這個結構描述。該結構包含 devfreq-event 裝置的各種資料。event_type 描述了將在暫存器中計數的內容。它可能選擇計數,例如,讀取請求、寫入資料(位元組)等。支援的完整型別列表位於特定標頭檔案中:include/dt-bindings/pmu/。

void devfreq_get_freq_range(struct devfreq *devfreq, unsigned long *min_freq, unsigned long *max_freq)

獲取當前頻率範圍

引數

struct devfreq *devfreq

devfreq 例項

unsigned long *min_freq

最小頻率

unsigned long *max_freq

最大頻率

描述

這考慮了所有約束。

int devfreq_update_status(struct devfreq *devfreq, unsigned long freq)

更新 devfreq 行為統計

引數

struct devfreq *devfreq

devfreq 例項

unsigned long freq

更新目標頻率

int devfreq_update_target(struct devfreq *devfreq, unsigned long freq)

在最終階段重新評估裝置並配置頻率。

引數

struct devfreq *devfreq

devfreq 例項。

unsigned long freq

父裝置的新頻率。此引數僅用於使用被動調頻器的 devfreq 裝置。

注意

在呼叫 devfreq_update_target 之前鎖定 devfreq->lock。該函式

應該只由 update_devfreq() 和 devfreq 調頻器使用。

int update_devfreq(struct devfreq *devfreq)

重新評估裝置並配置頻率。

引數

struct devfreq *devfreq

devfreq 例項。

注意

在呼叫 update_devfreq 之前鎖定 devfreq->lock

此函式是為調頻器匯出的。

void devfreq_monitor_start(struct devfreq *devfreq)

啟動 devfreq 例項的負載監控

引數

struct devfreq *devfreq

devfreq 例項。

描述

啟動 devfreq 裝置負載監控的輔助函式。預設情況下,可延遲定時器用於負載監控。但使用者可以使用 devfreq_dev_profile 中的“timer”型別更改此行為。在將裝置新增到 devfreq 框架時,devfreq 調頻器會響應 DEVFREQ_GOV_START 事件呼叫此函式。

void devfreq_monitor_stop(struct devfreq *devfreq)

停止 devfreq 例項的負載監控

引數

struct devfreq *devfreq

devfreq 例項。

描述

停止 devfreq 裝置負載監控的輔助函式。當裝置從 devfreq 框架中移除時,調頻器會響應 DEVFREQ_GOV_STOP 事件呼叫此函式。

void devfreq_monitor_suspend(struct devfreq *devfreq)

掛起 devfreq 例項的負載監控

引數

struct devfreq *devfreq

devfreq 例項。

描述

掛起 devfreq 裝置負載監控的輔助函式。當輪詢間隔設定為零時,調頻器會響應 DEVFREQ_GOV_SUSPEND 事件呼叫此函式。

注意

儘管此函式與 devfreq_monitor_stop() 相同,但為了提供收集轉換統計資訊的鉤子,有意將其分開。

void devfreq_monitor_resume(struct devfreq *devfreq)

恢復 devfreq 例項的負載監控

引數

struct devfreq *devfreq

devfreq 例項。

描述

恢復 devfreq 裝置負載監控的輔助函式。當輪詢間隔設定為非零時,調頻器會響應 DEVFREQ_GOV_RESUME 事件呼叫此函式。

void devfreq_update_interval(struct devfreq *devfreq, unsigned int *delay)

更新裝置 devfreq 監控間隔

引數

struct devfreq *devfreq

devfreq 例項。

unsigned int *delay

要設定的新輪詢間隔。

描述

設定新的負載監控輪詢間隔的輔助函式。調頻器會響應 DEVFREQ_GOV_UPDATE_INTERVAL 事件呼叫此函式。

struct devfreq *devfreq_add_device(struct device *dev, struct devfreq_dev_profile *profile, const char *governor_name, void *data)

為裝置新增 devfreq 功能

引數

struct device *dev

要新增 devfreq 功能的裝置。

struct devfreq_dev_profile *profile

執行 devfreq 的裝置特定配置檔案。

const char *governor_name

選擇頻率的策略名稱。

void *data

devfreq 驅動傳遞給調頻器的資料,調頻器不應修改它。

int devfreq_remove_device(struct devfreq *devfreq)

從裝置中移除 devfreq 功能。

引數

struct devfreq *devfreq

要移除的 devfreq 例項

描述

devfreq_add_device() 相反。

struct devfreq *devm_devfreq_add_device(struct device *dev, struct devfreq_dev_profile *profile, const char *governor_name, void *data)

資源管理的 devfreq_add_device()

引數

struct device *dev

要新增 devfreq 功能的裝置。

struct devfreq_dev_profile *profile

執行 devfreq 的裝置特定配置檔案。

const char *governor_name

選擇頻率的策略名稱。

void *data

devfreq 驅動傳遞給調頻器的資料,調頻器不應修改它。

描述

此函式使用裝置資源管理自動管理 devfreq 裝置的記憶體,並簡化 devfreq 裝置記憶體的釋放操作。

void devm_devfreq_remove_device(struct device *dev, struct devfreq *devfreq)

資源管理的 devfreq_remove_device()

引數

struct device *dev

從中移除 devfreq 功能的裝置。

struct devfreq *devfreq

要移除的 devfreq 例項

int devfreq_suspend_device(struct devfreq *devfreq)

掛起裝置的 devfreq。

引數

struct devfreq *devfreq

要掛起的 devfreq 例項

描述

此函式旨在由持有 devfreq 的裝置驅動程式的 pm 回撥(例如,runtime_suspend、suspend)呼叫。

int devfreq_resume_device(struct devfreq *devfreq)

恢復裝置的 devfreq。

引數

struct devfreq *devfreq

要恢復的 devfreq 例項

描述

此函式旨在由持有 devfreq 的裝置驅動程式的 pm 回撥(例如,runtime_resume、resume)呼叫。

int devfreq_add_governor(struct devfreq_governor *governor)

新增 devfreq 調頻器

引數

struct devfreq_governor *governor

要新增的 devfreq 調頻器

int devm_devfreq_add_governor(struct device *dev, struct devfreq_governor *governor)

新增 devfreq 調頻器

引數

struct device *dev

新增 devfreq 調頻器的裝置

struct devfreq_governor *governor

要新增的 devfreq 調頻器

描述

這是 devfreq_add_governor() 的資源管理變體。

int devfreq_remove_governor(struct devfreq_governor *governor)

從裝置中移除 devfreq 功能。

引數

struct devfreq_governor *governor

要移除的 devfreq 調頻器

獲取目標回撥函式給定頻率值的合適 OPP 的輔助函式。

引數

struct device *dev

devfreq 使用者裝置。(devfreq 的父級)

unsigned long *freq

傳遞給目標函式的頻率

u32 flags

devfreq 框架傳遞的標誌。

描述

呼叫者在使用返回的 OPP 後,需要呼叫 dev_pm_opp_put()。

int devfreq_register_opp_notifier(struct device *dev, struct devfreq *devfreq)

在 OPP 可用性發生任何變化時通知 devfreq 的輔助函式。

引數

struct device *dev

devfreq 使用者裝置。(devfreq 的父級)

struct devfreq *devfreq

devfreq 物件。

int devfreq_unregister_opp_notifier(struct device *dev, struct devfreq *devfreq)

停止在 OPP 可用性發生任何變化時通知 devfreq 的輔助函式。

引數

struct device *dev

devfreq 使用者裝置。(devfreq 的父級)

struct devfreq *devfreq

devfreq 物件。

描述

在 devfreq_dev_profile 的 exit() 回撥中,如果使用了 devfreq_recommended_opp,則必須包含此項。

int devm_devfreq_register_opp_notifier(struct device *dev, struct devfreq *devfreq)

資源管理的 devfreq_register_opp_notifier()

引數

struct device *dev

devfreq 使用者裝置。(devfreq 的父級)

struct devfreq *devfreq

devfreq 物件。

void devm_devfreq_unregister_opp_notifier(struct device *dev, struct devfreq *devfreq)

資源管理的 devfreq_unregister_opp_notifier()

引數

struct device *dev

devfreq 使用者裝置。(devfreq 的父級)

struct devfreq *devfreq

devfreq 物件。

int devfreq_register_notifier(struct devfreq *devfreq, struct notifier_block *nb, unsigned int list)

向 devfreq 註冊驅動程式

引數

struct devfreq *devfreq

devfreq 物件。

struct notifier_block *nb

要註冊的通知塊。

unsigned int list

DEVFREQ_TRANSITION_NOTIFIER。

int devm_devfreq_register_notifier(struct device *dev, struct devfreq *devfreq, struct notifier_block *nb, unsigned int list)

引數

struct device *dev

devfreq 使用者裝置。(devfreq 的父級)

struct devfreq *devfreq

devfreq 物件。

struct notifier_block *nb

要登出的通知塊。

unsigned int list

DEVFREQ_TRANSITION_NOTIFIER。

描述

void devm_devfreq_unregister_notifier(struct device *dev, struct devfreq *devfreq, struct notifier_block *nb, unsigned int list)

引數

struct device *dev

devfreq 使用者裝置。(devfreq 的父級)

struct devfreq *devfreq

devfreq 物件。

struct notifier_block *nb

要登出的通知塊。

unsigned int list

DEVFREQ_TRANSITION_NOTIFIER。

描述

  • 資源管理的 devfreq_unregister_notifier()

int devfreq_event_enable_edev(struct devfreq_event_dev *edev)

啟用 devfreq-event 裝置並增加 devfreq-event 裝置的 enable_count。

引數

struct devfreq_event_dev *edev

devfreq-event 裝置

描述

請注意,此函式會增加 enable_count 並啟用 devfreq-event 裝置。devfreq 裝置在使用 devfreq-event 裝置之前應先啟用它。

int devfreq_event_disable_edev(struct devfreq_event_dev *edev)

停用 devfreq-event 裝置並減少 devfreq-event 裝置的 enable_count。

引數

struct devfreq_event_dev *edev

devfreq-event 裝置

描述

請注意,此函式會減少 enable_count 並停用 devfreq-event 裝置。devfreq-event 裝置停用後,devfreq 裝置無法對其進行 get/set/reset 操作。

bool devfreq_event_is_enabled(struct devfreq_event_dev *edev)

檢查 devfreq-event 裝置是否已啟用。

引數

struct devfreq_event_dev *edev

devfreq-event 裝置

描述

請注意,此函式檢查 devfreq-event 裝置是否已啟用。如果返回 true,則 devfreq-event 裝置已啟用。如果返回 false,則 devfreq-event 裝置已停用。

int devfreq_event_set_event(struct devfreq_event_dev *edev)

設定 devfreq-event 裝置事件以啟動。

引數

struct devfreq_event_dev *edev

devfreq-event 裝置

描述

請注意,此函式將事件設定到 devfreq-event 裝置以啟動,從而獲取可能是各種事件型別的事件資料。

int devfreq_event_get_event(struct devfreq_event_dev *edev, struct devfreq_event_data *edata)

從 devfreq-event 裝置獲取 {load|total}_count。

引數

struct devfreq_event_dev *edev

devfreq-event 裝置

struct devfreq_event_data *edata

devfreq-event 裝置的計算資料

描述

請注意,此函式在停止 devfreq-event 裝置的整個序列程序後,從 devfreq-event 裝置獲取計算出的事件資料。

int devfreq_event_reset_event(struct devfreq_event_dev *edev)

重置 devfreq-event 裝置的所有操作。

引數

struct devfreq_event_dev *edev

devfreq-event 裝置

描述

請注意,此函式停止 devfreq-event 裝置的所有操作,並重置當前事件資料,使 devfreq-event 裝置進入初始狀態。

struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(struct device *dev, const char *phandle_name, int index)

從裝置樹獲取 devfreq-event 裝置。

引數

struct device *dev

指向給定裝置的指標

const char *phandle_name

包含 phandle 值的屬性名稱

int index

devfreq-event 裝置列表中的索引

描述

請注意,此函式返回 devfreq-event 裝置的指標。

int devfreq_event_get_edev_count(struct device *dev, const char *phandle_name)

獲取 devfreq-event 裝置的數量

引數

struct device *dev

指向給定裝置的指標

const char *phandle_name

包含 phandle 值的屬性名稱

描述

請注意,此函式返回 devfreq-event 裝置的數量。

struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev, struct devfreq_event_desc *desc)

新增新的 devfreq-event 裝置。

引數

struct device *dev

擁有正在建立的 devfreq-event 裝置的裝置

struct devfreq_event_desc *desc

devfreq-event 裝置的描述符,其中包含 devfreq-event 裝置的基本資料。

描述

請注意,此函式將新的 devfreq-event 裝置新增到 devfreq-event 類列表,並註冊 devfreq-event 裝置的裝置。

int devfreq_event_remove_edev(struct devfreq_event_dev *edev)

移除已註冊的 devfreq-event 裝置。

引數

struct devfreq_event_dev *edev

devfreq-event 裝置

描述

請注意,此函式移除已註冊的 devfreq-event 裝置。

struct devfreq_event_dev *devm_devfreq_event_add_edev(struct device *dev, struct devfreq_event_desc *desc)

資源管理的 devfreq_event_add_edev()

引數

struct device *dev

擁有正在建立的 devfreq-event 裝置的裝置

struct devfreq_event_desc *desc

devfreq-event 裝置的描述符,其中包含 devfreq-event 裝置的基本資料。

描述

請注意,此函式使用裝置資源管理自動管理 devfreq-event 裝置的記憶體,並簡化 devfreq-event 裝置記憶體的釋放操作。

void devm_devfreq_event_remove_edev(struct device *dev, struct devfreq_event_dev *edev)

資源管理的 devfreq_event_remove_edev()

引數

struct device *dev

擁有正在建立的 devfreq-event 裝置的裝置

struct devfreq_event_dev *edev

devfreq-event 裝置

描述

請注意,此函式使用裝置資源管理自動管理 devfreq-event 裝置的記憶體。