Linux regulator子系統分析之三 相關的接口說明

      在上一章我們介紹了regulator子系統相關的數據結構間的關聯以及每一個數據結構的定義。針對數據結構間的關聯則需要regulator子系統提供的接口實現。而本章我們就說明這些接口。本章的章節如下:

一、regulator device的註冊與註銷

 

二、regulator的註冊與註銷(regulator device的使用者)

 

三、regulator子系統提供的接口

 

 

一、regulator device的註冊與註銷

     針對regulator device的註冊與註銷函數主要涉及regulator_register、regulator_unregister這兩個函數。而針對regulator_register函數,其實現哪些功能呢?我們還是以數據結構圖來說明吧,如下圖所示,根據下圖中標號1中的“regulator_dev運行配置參數”、標號2中的“regulator_dev靜態描述相關參數”,完成以下功能:

  1. 若該regulator_dev支持使用gpio控制使能與否,則完成下圖標號3的gpio相關配置,並將該regulator_dev 使能控制相關的gpio參數註冊到下圖標號7中的鏈表regulator_env_gpio_list,通過函數regulator_ena_gpio_request實現;
  2. 將該regulator dev的所有使用者相關的信息(struct regulator_map類型變量),註冊到下圖標號5中的鏈表regulator_map_list;
  3. 確定該regulator_dev的約束信息(下圖標號4 struct regulator_constraints類型的變量配置,通過函數set_machine_constraints實現);
  4. 完成該regulator_dev的註冊,即將該regulator_dev註冊到下圖標號6中所示的regulator_list上;

除了上述四個主要的內容外,還涉及如下內容:

  1. 對regulator dev相關的參數進行合法性檢測,如get_voltage_sel、list_voltage這兩個接口是否只設置一個等;
  2. 爲該regulator_dev創建struct device類型的變量,並註冊到linux設備驅動模型子系統中,並完成與regulator_class的關聯;
  3. 爲該regulator_dev創建設備屬性文件(在sysfs文件系統下創建屬性文件,以便應用程序通過設備屬性文件即可查看該regulator_dev相關的配置信息,如最小電壓、最大電壓、操作模式、使能狀態、bypass、suspend相關state等),通過函數add_regulator_attributes;
  4. 若該regulator dev由別的regulator dev提供電壓/電流輸入,則需要使能其輸出,通過函數regulator_enable實現;

以上即爲regulator_register實現的主要功能。而針對regulator_unregister則主要實現相反的操作。

 

 

 

 

 

二、regulator的註冊與註銷(regulator device的使用者)

       針對regulator_dev的使用者,則主要涉及接口regulator_get、regulator_put這兩個函數。而針對regulator_get接口,其主要用於創建struct regulator類型的變量,並完成與regulator_dev的關聯,建立如下圖的關聯關係,具體說明如下:

  1. 根據dev_name、supply name,在regulator_map_list上進行查找與匹配,若查找到,即獲取到對應的regulator_dev;
  2. 調用create_regulator接口創建一個regulator,並加入到regulator_dev的consumer_list鏈表中;

 

 

 

 

 

三、regulator子系統提供的接口

     上面所說的regulator_register、regulator_unregister、regulator_get、regulator_put主要實現regulator_dev的註冊與註銷、regulator的創建與銷燬。而regulator 子系統也提供了regulator 電壓、電流的設置、操作模式設置、電壓獲取、電流獲取、regulator dev使能相關的接口。而這些接口主要由regulator dev的使用者調用(傳遞的均是struct regulator類型的變量),這些接口包括regulator_enable、regulator_disable、regulator_get_current_limit、regulator_get_mode、regulator_get_voltage、regulator_is_enabled、regulator_list_voltage、regulator_set_current_limit、regulator_set_voltage、regulator_set_mode、regulator_suspend_prepare、regulator_suspend_finish、regulator_force_disable、regulator_bulk_get等等。各外設驅動在通過regulator_get完成struct regulator類型變量的創建後,則可以使用這些接口進行電壓、電流、regulator dev使能相關的操作。

 

       以上即爲本章的內容,主要說明regulator dev的註冊與註銷、regulator的註冊與註銷、regulator操作相關的接口。其實regulator子系統的軟件架構與之前我們介紹的pinctrl子系統類似,相對而言還沒有pinctrl子系統複雜。在pinctrl子系統中我們所說的board級別的pinctrl配置即類似於regulator consumer map的註冊(實現regulator_map…),但pinctrl 子系統的board級別的pinctrl配置註冊可通過單獨的函數pinctrl_register_mappings實現,而regulator consumer對應regulator_map的註冊則只由regulator_register函數調用實現。至此我們基本完成regulator 子系統的分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章