build_embed_linux_system

regulator电源管理模块

随着芯片的性能越来越强,功耗和发热也更加严重,为了优化电源管理,SoC常常包含数十个独立供电域,来提供精确的电源控制,一些复杂的SoC还会配合外部的PMIC电源管理芯片,同时也对软件控制带来了更高的要求,regulator正是在这一背景下实现的,用来适配越来越复杂的电源管理需求。regulator模块作为linux内核中用于管理电源的子系统,提供了一套接口,用于对电源管理模块进行操作,并定义获取电源硬件信息的一些基本接口。regulator模块的基本功能如下所示。

  1. 电源调节控制,支持动态电压/电流调整,提供使能控制接口,实现软启动与关断时序管理
  2. 管理电源的拓扑关系,支持树状的的电源供应结构,管理访问电源的设备列表,处理多电源耦合关系
  3. 状态监控保护,提供互斥访问机制,异常状态检测,提供保护机制

next_chapter

struct regulator_desc {
    const char *name;
    const char *supply_name;
    const char *of_match;
    bool of_match_full_name;
    const char *regulators_node;
    int (*of_parse_cb)(struct device_node *,
                const struct regulator_desc *,
                struct regulator_config *);
    int id;
    unsigned int continuous_voltage_range:1;
    unsigned n_voltages;
    unsigned int n_current_limits;
    const struct regulator_ops *ops;
    int irq;
    enum regulator_type type;
    struct module *owner;

    unsigned int min_uV;
    unsigned int uV_step;
    unsigned int linear_min_sel;
    int fixed_uV;
    unsigned int ramp_delay;
    int min_dropout_uV;

    const struct linear_range *linear_ranges;
    const unsigned int *linear_range_selectors;

    int n_linear_ranges;

    const unsigned int *volt_table;
    const unsigned int *curr_table;

    unsigned int vsel_range_reg;
    unsigned int vsel_range_mask;
    unsigned int vsel_reg;
    unsigned int vsel_mask;
    unsigned int vsel_step;
    unsigned int csel_reg;
    unsigned int csel_mask;
    unsigned int apply_reg;
    unsigned int apply_bit;
    unsigned int enable_reg;
    unsigned int enable_mask;
    unsigned int enable_val;
    unsigned int disable_val;
    bool enable_is_inverted;
    unsigned int bypass_reg;
    unsigned int bypass_mask;
    unsigned int bypass_val_on;
    unsigned int bypass_val_off;
    unsigned int active_discharge_on;
    unsigned int active_discharge_off;
    unsigned int active_discharge_mask;
    unsigned int active_discharge_reg;
    unsigned int soft_start_reg;
    unsigned int soft_start_mask;
    unsigned int soft_start_val_on;
    unsigned int pull_down_reg;
    unsigned int pull_down_mask;
    unsigned int pull_down_val_on;
    unsigned int ramp_reg;
    unsigned int ramp_mask;
    const unsigned int *ramp_delay_table;
    unsigned int n_ramp_values;

    unsigned int enable_time;

    unsigned int off_on_delay;

    unsigned int poll_enabled_time;

    unsigned int (*of_map_mode)(unsigned int mode);
};

struct coupling_desc {
    struct regulator_dev **coupled_rdevs;
    struct regulator_coupler *coupler;
    int n_resolved;
    int n_coupled;
};

struct regulator_enable_gpio {
    struct list_head list;
    struct gpio_desc *gpiod;
    u32 enable_count;   /* a number of enabled shared GPIO */
    u32 request_count;  /* a number of requested shared GPIO */
};


struct regulator_dev {
    const struct regulator_desc *desc;
    int exclusive;
    u32 use_count;
    u32 open_count;
    u32 bypass_count;

    /* lists we belong to */
    struct list_head list; /* list of all regulators */

    /* lists we own */
    struct list_head consumer_list; /* consumers we supply */

    struct coupling_desc coupling_desc;

    struct blocking_notifier_head notifier;
    struct ww_mutex mutex; /* consumer lock */
    struct task_struct *mutex_owner;
    int ref_cnt;
    struct module *owner;
    struct device dev;
    struct regulation_constraints *constraints;
    struct regulator *supply;   /* for tree */
    const char *supply_name;
    struct regmap *regmap;

    struct delayed_work disable_work;

    void *reg_data; /* regulator_dev data */

    struct dentry *debugfs;

    struct regulator_enable_gpio *ena_pin;
    unsigned int ena_gpio_state:1;

    unsigned int is_switch:1;

    /* time when this regulator was disabled last time */
    ktime_t last_off;
    int cached_err;
    bool use_cached_err;
    spinlock_t err_lock;
};


返回目录

直接开始下一节说明: 串口tty管理框架