稳压器机器驱动接口

稳压器机器驱动接口旨在供板/机器特定的初始化代码配置稳压器子系统。

考虑以下机器

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]);