时钟框架

时钟框架定义了编程接口,以支持系统时钟树的软件管理。该框架广泛应用于片上系统(SOC)平台,以支持电源管理和可能需要自定义时钟速率的各种设备。请注意,这些“时钟”与计时或实时时钟(rtc)无关,它们都有单独的框架。这些struct clock实例可用于管理例如96 MHz信号,该信号用于将位移进和移出外设或总线,或者触发系统硬件中的同步状态机转换。

电源管理由显式软件时钟门控支持:未使用的时钟被禁用,因此系统不会浪费功率来改变不活跃使用的晶体管的状态。在某些系统上,这可能是由硬件时钟门控支持的,其中时钟是门控的,而不是在软件中禁用。有电源但没有时钟的芯片部分可能能够保持它们的最后状态。这种低功耗状态通常被称为保持模式。这种模式仍然会产生漏电流,特别是对于更精细的电路几何形状,但对于CMOS电路,功率主要用于时钟状态变化。

电源感知驱动程序只有在其管理的设备处于活跃使用状态时才启用时钟。此外,系统睡眠状态通常根据哪些时钟域处于活动状态而有所不同:虽然“待机”状态可能允许从几个活动域唤醒,但“mem”(挂起到ram)状态可能需要更大规模地关闭来自更高速度锁相环和振荡器的时钟,从而限制了可能的唤醒事件源的数量。驱动程序的suspend方法可能需要知道目标睡眠状态上的系统特定时钟约束。

一些平台支持可编程时钟生成器。这些可用于各种外部芯片,如其他cpu、多媒体编解码器和对接口时钟有严格要求的设备。

clk_notifier

定义:

struct clk_notifier 
{
  struct clk                      *clk;
  struct srcu_notifier_head       notifier_head;
  struct list_head                node;
};

clk_notifier_data

定义:

struct clk_notifier_data 
{
  struct clk              *clk;
  unsigned long           old_rate;
  unsigned long           new_rate;
};

clk_bulk_data

定义:

struct clk_bulk_data 
{
  const char              *id;
  struct clk              *clk;
};

clk_notifier_register

函数签名:

int clk_notifier_register(struct clk *clk, struct notifier_block *nb);

clk_notifier_unregister

函数签名:

int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb);

devm_clk_notifier_register

函数签名:

int devm_clk_notifier_register(struct device *dev, struct clk *clk, struct notifier_block *nb);

clk_get_accuracy

函数签名:

long clk_get_accuracy(struct clk *clk);

clk_set_phase

函数签名:

int clk_set_phase(struct clk *clk, int degrees);

clk_get_phase

函数签名:

int clk_get_phase(struct clk *clk);

clk_set_duty_cycle

函数签名:

int clk_set_duty_cycle(struct clk *clk, unsigned int num, unsigned int den);

clk_get_scaled_duty_cycle

函数签名:

int clk_get_scaled_duty_cycle(struct clk *clk, unsigned int scale);

clk_is_match

函数签名:

bool clk_is_match(const struct clk *p, const struct clk *q);

clk_rate_exclusive_get

函数签名:

int clk_rate_exclusive_get(struct clk *clk);

clk_rate_exclusive_put

函数签名:

void clk_rate_exclusive_put(struct clk *clk);

clk_prepare

函数签名:

int clk_prepare(struct clk *clk);

clk_is_enable_when_prepared

函数签名:

bool clk_is_enabled_when_prepared(struct clk *clk);

clk_unprepare

函数签名:

void clk_unprepare(struct clk *clk);

clk_get

函数签名:

struct clk *clk_get(struct device *dev, const char *id);

clk_bulk_get

函数签名:

int clk_bulk_get(struct device *dev, int num_clks, struct clk_bulk_data *clks);

clk_bulk_get_all

函数签名:

int clk_bulk_get_all(struct device *dev, struct clk_bulk_data **clks);

clk_bulk_get_optional

函数签名:

int clk_bulk_get_optional(struct device *dev, int num_clks, struct clk_bulk_data *clks);

devm_clk_bulk_get

函数签名:

int devm_clk_bulk_get(struct device *dev, int num_clks, struct clk_bulk_data *clks);

devm_clk_bulk_get_optional

函数签名:

int devm_clk_bulk_get_optional(struct device *dev, int num_clks, struct clk_bulk_data *clks);

devm_clk_bulk_get_all

函数签名:

int devm_clk_bulk_get_all(struct device *dev, struct clk_bulk_data **clks);

devm_clk_get

函数签名:

struct clk *devm_clk_get(struct device *dev, const char *id);

devm_clk_get_prepared

函数签名:

struct clk *devm_clk_get_prepared(struct device *dev, const char *id);

devm_clk_get_enabled

函数签名:

struct clk *devm_clk_get_enabled(struct device *dev, const char *id);

devm_clk_get_optional

函数签名:

struct clk *devm_clk_get_optional(struct device *dev, const char *id);

devm_clk_get_optional_prepared

函数签名:

struct clk *devm_clk_get_optional_prepared(struct device *dev, const char *id);

devm_clk_get_optional_enabled

函数签名:

struct clk *devm_clk_get_optional_enabled(struct device *dev, const char *id);

devm_get_clk_from_child

函数签名:

struct clk *devm_get_clk_from_child(struct device *dev, struct device_node *np, const char *con_id);

clk_enable

函数签名:

int clk_enable(struct clk *clk);

clk_bulk_enable

函数签名:

int clk_bulk_enable(int num_clks, const struct clk_bulk_data *clks);

clk_disable

函数签名:

void clk_disable(struct clk *clk);

clk_bulk_disable

函数签名:

void clk_bulk_disable(int num_clks, const struct clk_bulk_data *clks);

clk_get_rate

函数签名:

unsigned long clk_get_rate(struct clk *clk);

clk_put

函数签名:

void clk_put(struct clk *clk);

clk_bulk_put

函数签名:

void clk_bulk_put(int num_clks, struct clk_bulk_data *clks);

clk_bulk_put_all

函数签名:

void clk_bulk_put_all(int num_clks, struct clk_bulk_data *clks);

devm_clk_put

函数签名:

void devm_clk_put(struct device *dev, struct clk *clk);

clk_round_rate

函数签名:

long clk_round_rate(struct clk *clk, unsigned long rate);

clk_set_rate

函数签名:

int clk_set_rate(struct clk *clk, unsigned long rate);

clk_set_rate_exclusive

函数签名:

int clk_set_rate_exclusive(struct clk *clk, unsigned long rate);

clk_has_parent

函数签名:

bool clk_has_parent(const struct clk *clk, const struct clk *parent);

clk_set_rate_range

函数签名:

int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max);

clk_set_min_rate

函数签名:

int clk_set_min_rate(struct clk *clk, unsigned long rate)

clk_set_max_rate

函数签名:

int clk_set_max_rate(struct clk *clk, unsigned long rate);

clk_set_parent

函数签名:

int clk_set_parent(struct clk *clk, struct clk *parent);

clk_get_parent

函数签名:

struct clk *clk_get_parent(struct clk *clk);

clk_get_sys

函数签名:

struct clk *clk_get_sys(const char *dev_id, const char *con_id);

clk_save_context

函数签名:

int clk_save_context(void);

clk_restore_context

函数签名:

void clk_restore_context(void);

clk_drop_range

函数签名:

int clk_drop_range(struct clk *clk);

clk_get_optional

函数签名:

struct clk *clk_get_optional(struct device *dev, const char *id);