穩壓器機器驅動介面

穩壓器機器驅動介面旨在供板/機器特定的初始化程式碼配置穩壓器子系統。

考慮以下機器

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 = &regulator1_data,
              },
      },
      {
              .name = "regulator",
              .id = DCDC_2,
              .dev = {
                      .platform_data = &regulator2_data,
              },
      },
};
/* register regulator 1 device */
platform_device_register(&regulator_devices[0]);

/* register regulator 2 device */
platform_device_register(&regulator_devices[1]);