穩壓器機器驅動介面¶
穩壓器機器驅動介面旨在供板/機器特定的初始化程式碼配置穩壓器子系統。
考慮以下機器
Regulator-1 -+-> Regulator-2 --> [Consumer A @ 1.8 - 2.0V]
|
+-> [Consumer B @ 3.3V]
消費者 A 和 B 的驅動程式必須對映到正確的穩壓器,才能控制其電源。 這種對映可以透過在機器初始化程式碼中為每個穩壓器建立一個 struct regulator_consumer_supply 來實現
struct regulator_consumer_supply {
const char *dev_name; /* consumer dev_name() */
const char *supply; /* consumer supply - e.g. "vcc" */
};
例如,對於上面的機器
static struct regulator_consumer_supply regulator1_consumers[] = {
REGULATOR_SUPPLY("Vcc", "consumer B"),
};
static struct regulator_consumer_supply regulator2_consumers[] = {
REGULATOR_SUPPLY("Vcc", "consumer A"),
};
這會將穩壓器 1 對映到消費者 B 的“Vcc”電源,並將穩壓器 2 對映到消費者 A 的“Vcc”電源。
現在可以透過為每個穩壓器電源域定義一個 struct regulator_init_data 來註冊約束。 此結構還將消費者對映到其電源穩壓器
static struct regulator_init_data regulator1_data = {
.constraints = {
.name = "Regulator-1",
.min_uV = 3300000,
.max_uV = 3300000,
.valid_modes_mask = REGULATOR_MODE_NORMAL,
},
.num_consumer_supplies = ARRAY_SIZE(regulator1_consumers),
.consumer_supplies = regulator1_consumers,
};
名稱欄位應設定為對板卡有用的描述性內容,用於配置其他穩壓器的電源,以及用於日誌記錄和其他診斷輸出。 通常,原理圖中用於電源軌的名稱是一個不錯的選擇。 如果未提供名稱,則子系統將選擇一個。
穩壓器 1 向穩壓器 2 供電。 這種關係必須在核心中註冊,以便當消費者 A 啟用其電源 (穩壓器 2) 時,穩壓器 1 也被啟用。 電源穩壓器由下面的 supply_regulator 欄位設定
static struct regulator_init_data regulator2_data = {
.supply_regulator = "Regulator-1",
.constraints = {
.min_uV = 1800000,
.max_uV = 2000000,
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
.valid_modes_mask = REGULATOR_MODE_NORMAL,
},
.num_consumer_supplies = ARRAY_SIZE(regulator2_consumers),
.consumer_supplies = regulator2_consumers,
};
最後,必須以通常的方式註冊穩壓器裝置
static struct platform_device regulator_devices[] = {
{
.name = "regulator",
.id = DCDC_1,
.dev = {
.platform_data = ®ulator1_data,
},
},
{
.name = "regulator",
.id = DCDC_2,
.dev = {
.platform_data = ®ulator2_data,
},
},
};
/* register regulator 1 device */
platform_device_register(®ulator_devices[0]);
/* register regulator 2 device */
platform_device_register(®ulator_devices[1]);