Güç Yönetimi & Thermal
TEKNİK REHBER GÜÇ YÖNETİMİ REGULATOR 2026

Regulator Framework —
PMIC & DVFS.

Linux regulator consumer API ile voltaj yönetimi: LDO/buck/boost türleri, AXP803·TPS65217·BD71837·RK817 PMIC'leri, DVFS entegrasyonu ve güç bütçesi optimizasyonu.

00 Linux regulator framework mimarisi

Linux regulator framework, güç kaynağı donanımını (PMIC, LDO, buck converter) ve bu kaynakları kullanan tüketicileri (SoC, DDR, peripheral) soyutlayan kernel alt sistemidir.

Mimari katmanları
┌──────────────────────────────────────────────────────┐
│            Consumer (tüketen driver)                 │
│   regulator_get() → regulator_enable() → set_v()    │
├──────────────────────────────────────────────────────┤
│              Regulator Core                          │
│   regulator_dev + regulator_desc + ops               │
├──────────────────────────────────────────────────────┤
│           Regulator Driver (Provider)                │
│   AXP20x / TPS65217 / BD71837 / fixed-regulator      │
├──────────────────────────────────────────────────────┤
│         Hardware (I2C/SPI PMIC, Discrete)            │
└──────────────────────────────────────────────────────┘

Temel veri yapıları

struct regulator_desc
Regulator'ın statik tanımı: isim, tip, voltaj tablosu, ops, sahip modül. Driver tarafından doldurulur.
struct regulator_dev (rdev)
Kaydedilmiş bir regulator örneği. Core tarafından yönetilir. Supply chain bilgisini içerir.
struct regulator
Consumer handle: tüketici driver'ın elindeki referans. regulator_get() ile alınır.
Supply chain
Regulator'ların birbirine bağlandığı hiyerarşi. Buck → LDO → SoC gibi. Üst katman kapanınca alt katmanlar da kapanır.

PMIC mimarisi örneği

Tipik PMIC supply zinciri
Battery / VIN
    │
    ├── DCDC1 (Buck 3.3V)  ─── VCC_3V3_SYS
    │       │                    ├── DDR (LDO1 1.35V)
    │       │                    └── USB PHY
    │
    ├── DCDC2 (Buck, variable) ─── VDD_CPU  (cpufreq kontrollü)
    │
    ├── DCDC3 (Buck, variable) ─── VDD_GPU
    │
    ├── LDO1  (1.8V)  ─── VCCIO_SD
    ├── LDO2  (3.0V)  ─── VCCIO_WIFI
    └── LDO3  (1.8V)  ─── VCC_SENSOR

01 DT regulator binding

PMIC regulator'ları Device Tree'de iki katmanda tanımlanır: PMIC'in kendisi (I2C/SPI client) ve PMIC içindeki her regulator bloğu.

dts — AXP209 PMIC regulator binding
&i2c0 {
    axp209: pmic@34 {
        compatible = "x-powers,axp209";
        reg = <0x34>;
        interrupts = <0 62 4>;
        interrupt-controller;
        #interrupt-cells = <1>;

        regulators {
            /* DC-DC1 — VCC 3.3V, her zaman açık */
            reg_dcdc1: dcdc1 {
                regulator-name        = "vcc-3v3";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
                regulator-always-on;  /* system rail, kapatılmaz */
            };

            /* DC-DC2 — VDD CPU, değiştirilebilir */
            reg_dcdc2: dcdc2 {
                regulator-name        = "vdd-cpu";
                regulator-min-microvolt = <700000>;   /* 0.7V */
                regulator-max-microvolt = <1300000>;  /* 1.3V */
                regulator-always-on;
                /* cpufreq driver bu regulator'ı kullanır */
            };

            /* LDO3 — USB PHY 3.3V */
            reg_ldo3: ldo3 {
                regulator-name        = "vcc-usb";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
                regulator-boot-on;    /* önyükleme sırasında aç */
            };

            /* LDO4 — sensör 2.8V (isteğe bağlı açık/kapalı) */
            reg_ldo4: ldo4 {
                regulator-name        = "vcc-sensor";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <3300000>;
                /* regulator-always-on YOK: consumer açıp kapayabilir */
            };
        };
    };
};

Önemli DT özellikleri

regulator-name
Consumer'ın regulator_get() içinde kullandığı isim veya supply alias. Zorunlu değil ama önerilir.
regulator-min/max-microvolt
Güvenli voltaj aralığı. Bu aralık dışında regulator_set_voltage() başarısız olur.
regulator-always-on
Bu regulator hiç kapatılmaz. Sistem rail'leri için kullanılır.
regulator-boot-on
Önyükleme sırasında açık olmalı, ama ilgili consumer kapatabilir.
regulator-over-current-protection
Aşırı akım korumasını etkinleştir (destekleyen donanımlar için).
vin-supply
Bu regulator'ı besleyen üst seviye regulator (supply chain).

02 Consumer API — get, enable, set_voltage

Consumer driver'ları regulator'lara standart bir API ile erişir. Bu API, donanım farklılıklarını soyutlar.

c — consumer driver örneği
#include <linux/regulator/consumer.h>

struct mydev_priv {
    struct device    *dev;
    struct regulator *vdd;     /* güç kaynağı */
    struct regulator *vio;     /* I/O voltajı */
};

static int mydev_probe(struct platform_device *pdev)
{
    struct mydev_priv *priv;

    priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);

    /* Regulator'ı al — DT'de "vdd-supply" property'si ile eşleşir */
    priv->vdd = devm_regulator_get(&pdev->dev, "vdd");
    if (IS_ERR(priv->vdd)) {
        dev_err(&pdev->dev, "vdd regulator alınamadı\n");
        return PTR_ERR(priv->vdd);
    }

    priv->vio = devm_regulator_get_optional(&pdev->dev, "vio");
    /* get_optional: regulator yoksa hata değil, NULL döner */

    /* Voltaj ayarla */
    int ret = regulator_set_voltage(priv->vdd, 1800000, 1800000);
    /* min_uV ve max_uV eşit = sabit voltaj iste */
    if (ret) {
        dev_err(&pdev->dev, "voltaj ayarlanamadı\n");
        return ret;
    }

    /* Regulator'ı aç */
    ret = regulator_enable(priv->vdd);
    if (ret) {
        dev_err(&pdev->dev, "regulator açılamadı\n");
        return ret;
    }

    /* Açılma süresi — bazı regulator'lar stabil olmak için zaman ister */
    usleep_range(1000, 2000);   /* 1-2ms */

    /* ... donanım başlatma ... */

    return 0;
}

static void mydev_remove(struct platform_device *pdev)
{
    struct mydev_priv *priv = platform_get_drvdata(pdev);
    regulator_disable(priv->vdd);
    /* devm_regulator_get ile alındıysa regulator_put otomatik */
}

Ek API fonksiyonları

regulator_get_voltage()
Mevcut çıkış voltajını mikrovolt cinsinden oku.
regulator_is_enabled()
Regulator'ın açık olup olmadığını kontrol et (1=açık, 0=kapalı).
regulator_get_current_limit()
Maksimum akım sınırını mikroamper cinsinden oku.
regulator_set_load()
Beklenen yükü bildir — regulator modu optimizasyonu için (normal vs low-power mode).
devm_regulator_bulk_get()
Birden fazla regulator'ı aynı anda al. regulator_bulk_enable/disable ile toplu kontrol.
c — bulk regulator kullanımı
static const char * const supply_names[] = {
    "vdd", "vio", "vana"
};
struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];

/* İsimleri ata */
for (int i = 0; i < ARRAY_SIZE(supply_names); i++)
    supplies[i].supply = supply_names[i];

/* Tümünü al */
ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(supplies), supplies);

/* Tümünü aç */
ret = regulator_bulk_enable(ARRAY_SIZE(supplies), supplies);

/* Tümünü kapat */
regulator_bulk_disable(ARRAY_SIZE(supplies), supplies);

03 Regulator türleri — LDO, buck, boost, fixed

Her regulator tipi farklı elektriksel özelliklere sahiptir. Doğru tip seçimi hem verimlilik hem de düzenleme kalitesi için önemlidir.

LDO (Low Dropout)
Basit ve düşük gürültülü. Giriş voltajından biraz düşük çıkış üretir. Fazla enerji ısıya dönüşür. RF/analog devreler, gürültüye duyarlı I/O için ideal. Verimlilik: ~(Vout/Vin) × 100%.
Buck (Step-down)
Anahtarlamalı, yüksek verimli (%85-95). Giriş voltajından düşük çıkış. CPU/GPU/DDR gibi yüksek akım tüketiciler için. EMI üretir — ek filtreleme gerekebilir.
Boost (Step-up)
Anahtarlamalı. Giriş voltajından yüksek çıkış üretir. USB 5V üretimi, LED sürücüleri, pil şarj sistemleri.
Buck-Boost
Giriş voltajından hem yüksek hem düşük çıkış üretebilir. Pil sistemlerinde (3.7V LiPo → sabit 3.3V veya 5V) kullanışlı.
Charge pump
Kondansatör anahtarlamalı, bobinsiz boost. Küçük güçler için (LCD vias, flash bellek programlama).
Fixed regulator
Voltaj ayarlanamaz, sadece enable/disable. DT'de compatible = "regulator-fixed".
dts — fixed regulator
/* Sabit 5V güç kaynağı (örn. USB VBUS) */
reg_usb_vbus: regulator-usb-vbus {
    compatible = "regulator-fixed";
    regulator-name = "usb-vbus";
    regulator-min-microvolt = <5000000>;
    regulator-max-microvolt = <5000000>;
    gpio = <&gpio1 13 GPIO_ACTIVE_HIGH>;  /* enable GPIO */
    enable-active-high;
    regulator-boot-on;
};

04 Yaygın PMIC'ler: AXP803, TPS65217, BD71837, RK817

Gömülü Linux dünyasında en sık karşılaşılan PMIC'ler ve platform bağlantıları.

X-Powers AXP209/AXP803 (Allwinner SoC)

AXP803 özet (A64/H6 SoC)
AXP803:
  DC-DC1: 1.6–3.4V (sys, sd)
  DC-DC2: 0.5–1.3V (CPU VDD — DVFS)
  DC-DC3: 0.5–1.3V (GPU VDD)
  DC-DC4: 0.5–1.3V (DRAM)
  DC-DC5: 0.8–1.84V
  DC-DC6: 0.6–1.52V
  LDO1..14: çeşitli sabit/değişken
  ALDO/DLDO/ELDO: Audio/SD/EFUSE LDO
  Batarya şarj kontrolcüsü dahil

Texas Instruments TPS65217 (BeagleBone Black)

dts — TPS65217 (AM335x)
&i2c0 {
    tps: tps@24 {
        compatible = "ti,tps65217";
        reg = <0x24>;
        interrupts = <7>;  /* GPIO 7 */

        regulators {
            dcdc1_reg: regulator@0 {
                regulator-name = "vdd_1_8v";
                regulator-min-microvolt = <900000>;
                regulator-max-microvolt = <1800000>;
                regulator-boot-on;
                regulator-always-on;
            };
            dcdc2_reg: regulator@1 {
                regulator-name = "vdd_core";   /* AM335x çekirdek */
                regulator-min-microvolt = <925000>;
                regulator-max-microvolt = <1325000>;
                regulator-always-on;
            };
            dcdc3_reg: regulator@2 {
                regulator-name = "vdd_mpu";    /* ARM Cortex-A8 */
                regulator-min-microvolt = <925000>;
                regulator-max-microvolt = <1325000>;
                regulator-always-on;
                /* cpufreq bu regulator'ı DVFS için kullanır */
            };
        };
    };
};

ROHM BD71837 (i.MX8M)

BD71837 özet (i.MX8MQ/Mini)
BD71837:
  BUCK1: VDD_SOC (NXP i.MX8M SOC rail, DVFS)
  BUCK2: VDD_ARM (ARM A53 cluster, DVFS)
  BUCK3: VDD_0V9_DRAM (DDR4 rail)
  BUCK4: VDD_0V9_SD
  BUCK5: 3V3 (system)
  BUCK6: 1V1 (HDMI)
  BUCK7: 1V8 (IO)
  BUCK8: variable (eMMC)
  LDO1..7: çeşitli

Rockchip RK817 (RK3568/RK3399)

dts — RK817 (RK3568)
&i2c0 {
    rk817: pmic@20 {
        compatible = "rockchip,rk817";
        reg = <0x20>;
        interrupt-parent = <&gpio0>;
        interrupts = <RK_PA3 IRQ_TYPE_LEVEL_LOW>;

        regulators {
            vdd_logic: DCDC_REG1 {
                regulator-name = "vdd_logic";
                regulator-min-microvolt = <500000>;
                regulator-max-microvolt = <1350000>;
                regulator-always-on;
            };
            vdd_arm: DCDC_REG2 {
                regulator-name = "vdd_arm";
                regulator-min-microvolt = <500000>;
                regulator-max-microvolt = <1350000>;
                regulator-always-on;
                /* cpufreq ile DVFS */
            };
        };
    };
};

05 Voltage scaling — DVFS ile regulator

DVFS (Dynamic Voltage & Frequency Scaling) çalışırken cpufreq driver, OPP tablosundaki voltaj değerlerini regulator_set_voltage() ile uygular.

DVFS akışı

DVFS geçiş sırası
Frekans artırılacak (600 MHz → 1200 MHz):
  1. regulator_set_voltage(vdd_cpu, 1100mV, 1100mV)  ← önce voltaj artır
  2. clk_set_rate(cpu_clk, 1200MHz)                  ← sonra frekans artır
  3. regulator_set_load(vdd_cpu, new_load)

Frekans düşürülecek (1200 MHz → 600 MHz):
  1. clk_set_rate(cpu_clk, 600MHz)                   ← önce frekans düşür
  2. regulator_set_voltage(vdd_cpu, 950mV, 950mV)    ← sonra voltaj düşür

Regulator notifier chain

c — regulator event notifier
#include <linux/regulator/consumer.h>

static int my_regulator_notifier(struct notifier_block *nb,
                                  unsigned long event, void *data)
{
    switch (event) {
    case REGULATOR_EVENT_VOLTAGE_CHANGE:
        pr_info("Voltaj değişti: %luuV\n",
                (unsigned long)data);
        break;
    case REGULATOR_EVENT_OVER_CURRENT:
        pr_warn("Aşırı akım algılandı!\n");
        break;
    case REGULATOR_EVENT_UNDER_VOLTAGE:
        pr_warn("Düşük voltaj!\n");
        break;
    case REGULATOR_EVENT_DISABLE:
        pr_info("Regulator kapandı\n");
        break;
    }
    return NOTIFY_OK;
}

static struct notifier_block regulator_nb = {
    .notifier_call = my_regulator_notifier,
};

/* Notifier'ı kaydet */
regulator_register_notifier(reg, &regulator_nb);

Güç tüketimi tahmini

bash / python3 — voltaj × akım = güç
# debugfs'ten regulator bilgisi
cat /sys/kernel/debug/regulator/vdd-cpu/microvolts
# 1100000  (1.1V)

cat /sys/kernel/debug/regulator/vdd-cpu/microamps
# 500000   (500mA)

cat /sys/kernel/debug/regulator/vdd-cpu/min_microvolts
cat /sys/kernel/debug/regulator/vdd-cpu/max_microvolts

# Güç hesabı: P = V × I
python3 -c "
v_uv = 1100000   # 1.1V
i_ua = 500000    # 500mA
p_uw = v_uv * i_ua // 1000000   # mikrowatt'a çevir bölme
print(f'Güç: {p_uw/1000:.0f} mW ({p_uw} uW)')
"
# Güç: 550 mW

06 sysfs ve debugfs arayüzü

/sys/kernel/debug/regulator/ altında her regulator hakkında detaylı bilgi mevcuttur. Güç bütçesi analizi ve hata ayıklama için temel araçtır.

bash
# tüm regulator'ları listele
ls /sys/kernel/debug/regulator/
# vdd-cpu  vdd-gpu  vcc-3v3  vcc-1v8  vcc-usb  ...

# regulator detayları
cat /sys/kernel/debug/regulator/vdd-cpu/name
# dcdc2

cat /sys/kernel/debug/regulator/vdd-cpu/microvolts
# 1100000

cat /sys/kernel/debug/regulator/vdd-cpu/enable_count
# 2  (2 consumer bu regulator'ı açık tutuyor)

cat /sys/kernel/debug/regulator/vdd-cpu/use_count
# 2

# Tüm regulator özeti (tek seferlik)
for r in /sys/kernel/debug/regulator/*/; do
    name=$(basename "$r")
    uv=$(cat "${r}microvolts" 2>/dev/null || echo "N/A")
    ena=$(cat "${r}enable_count" 2>/dev/null || echo "?")
    printf "%-20s  %8s uV  enabled=%s\n" "$name" "$uv" "$ena"
done

regulator_summary debugfs

bash
# Tüm regulator'ların hiyerarşik özeti
cat /sys/kernel/debug/regulator/regulator_summary
# regulator                      use open bypass  min(uV)   max(uV)    load(uA) consumers
# ---------------------------------------------------------------------------------------------------
# vdd-cpu dcdc2                    1    1    0  1100000   1100000       0
#   cpufreq                                                              0
# vcc-3v3 dcdc1                    2    2    0  3300000   3300000       0
#   dwmmc                                                                0
#   usb-phy                                                              0

07 Yeni regulator driver yazımı

Desteklenmeyen bir PMIC için regulator driver yazmak, regulator_desc ve ops yapılarını doldurmak ve regulator_register() çağırmaktan ibarettir.

c — minimal I2C regulator driver
#include <linux/i2c.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/of_regulator.h>

/* Desteklenen voltaj tablosu (uV cinsinden) */
static const unsigned int myreg_voltages[] = {
    800000, 900000, 1000000, 1100000,
    1200000, 1300000, 1800000, 3300000,
};

static int myreg_get_voltage_sel(struct regulator_dev *rdev)
{
    struct i2c_client *i2c = rdev_get_drvdata(rdev);
    int val = i2c_smbus_read_byte_data(i2c, REG_VSEL);
    if (val < 0) return val;
    return val & 0x07;  /* alt 3 bit = selector */
}

static int myreg_set_voltage_sel(struct regulator_dev *rdev,
                                   unsigned int selector)
{
    struct i2c_client *i2c = rdev_get_drvdata(rdev);
    int cur = i2c_smbus_read_byte_data(i2c, REG_VSEL);
    if (cur < 0) return cur;

    cur = (cur & ~0x07) | (selector & 0x07);
    return i2c_smbus_write_byte_data(i2c, REG_VSEL, cur);
}

static int myreg_enable(struct regulator_dev *rdev)
{
    struct i2c_client *i2c = rdev_get_drvdata(rdev);
    return i2c_smbus_write_byte_data(i2c, REG_CTRL, 0x01);
}

static int myreg_disable(struct regulator_dev *rdev)
{
    struct i2c_client *i2c = rdev_get_drvdata(rdev);
    return i2c_smbus_write_byte_data(i2c, REG_CTRL, 0x00);
}

static int myreg_is_enabled(struct regulator_dev *rdev)
{
    struct i2c_client *i2c = rdev_get_drvdata(rdev);
    return i2c_smbus_read_byte_data(i2c, REG_CTRL) & 0x01;
}

static const struct regulator_ops myreg_ops = {
    .get_voltage_sel   = myreg_get_voltage_sel,
    .set_voltage_sel   = myreg_set_voltage_sel,
    .list_voltage      = regulator_list_voltage_table,
    .map_voltage       = regulator_map_voltage_ascend,
    .enable            = myreg_enable,
    .disable           = myreg_disable,
    .is_enabled        = myreg_is_enabled,
};

static const struct regulator_desc myreg_desc = {
    .name          = "myreg-dcdc1",
    .of_match      = "myreg-dcdc1",
    .type          = REGULATOR_VOLTAGE,
    .ops           = &myreg_ops,
    .volt_table    = myreg_voltages,
    .n_voltages    = ARRAY_SIZE(myreg_voltages),
    .owner         = THIS_MODULE,
};

static int myreg_i2c_probe(struct i2c_client *client)
{
    struct regulator_config config = {};
    struct regulator_dev *rdev;

    config.dev     = &client->dev;
    config.of_node = client->dev.of_node;
    config.driver_data = client;

    /* regulator_init_data DT'den otomatik okunur */
    config.init_data = of_get_regulator_init_data(
        &client->dev, client->dev.of_node, &myreg_desc);

    rdev = devm_regulator_register(&client->dev, &myreg_desc, &config);
    return PTR_ERR_OR_ZERO(rdev);
}

08 Pratik: TPS65217 CPU VDD düşürme ve i.MX8 güç bütçesi

İki pratik senaryo: BeagleBone Black'te TPS65217 üzerinden CPU VDD voltajını düşürerek güç tasarrufu ve i.MX8 sistemde güç bütçesi optimizasyonu.

1 — BeagleBone Black TPS65217 CPU VDD Düşürme

bash — BBB TPS65217 regulator kontrolü
# BeagleBone Black'te regulator'ları listele
cat /sys/kernel/debug/regulator/regulator_summary
# vdd_mpu dcdc3        1  1  0   925000  1325000    0  cpufreq
# vdd_core dcdc2       1  1  0   925000  1325000    0  opp

# Mevcut CPU voltajı
cat /sys/kernel/debug/regulator/vdd_mpu/microvolts
# 1275000  (1.275V @ 1GHz)

# OPP tablosunu görüntüle
cat /sys/kernel/debug/opp/cpu0/opp_summary
# OPP: 300000000 Hz, 950000 uV  (300MHz, 0.95V)
# OPP: 600000000 Hz, 1100000 uV  (600MHz, 1.1V)
# OPP: 720000000 Hz, 1200000 uV  (720MHz, 1.2V)
# OPP: 800000000 Hz, 1275000 uV  (800MHz, 1.275V)
# OPP: 1000000000 Hz, 1325000 uV (1GHz,  1.325V)

# Frekansı 600MHz'e sabitle — voltaj otomatik 1.1V'a düşer
cpupower frequency-set -u 600MHz
cat /sys/kernel/debug/regulator/vdd_mpu/microvolts
# 1100000  (1.1V)

# Güç farkı hesabı:
# 1GHz:  P ~ V² × f = 1.325² × 1.0  = 1.756 (normalize)
# 600MHz: P ~ 1.1² × 0.6 = 0.726 (normalize)
# Tasarruf: ~58%!

# INA219 ile gerçek ölçüm (eğer donanım varsa)
python3 -c "
from ina219 import INA219
ina = INA219(0.1, address=0x40)
ina.configure()
print(f'Voltaj: {ina.voltage():.3f}V')
print(f'Akım:   {ina.current():.1f}mA')
print(f'Güç:    {ina.power():.1f}mW')
"

2 — i.MX8 PMIC ile Güç Bütçesi Optimizasyonu

python3 — i.MX8 güç bütçesi scripti
#!/usr/bin/env python3
"""
i.MX8 sistemi için regulator debugfs üzerinden güç bütçesi analizi.
Her regulator'ın voltaj × enable durumunu raporlar.
"""
import os, pathlib

REGULATOR_BASE = pathlib.Path("/sys/kernel/debug/regulator")

def read_file(path):
    try:
        return path.read_text().strip()
    except Exception:
        return None

def analyze_regulators():
    regs = []
    for reg_dir in sorted(REGULATOR_BASE.iterdir()):
        if not reg_dir.is_dir():
            continue
        name    = reg_dir.name
        uv      = read_file(reg_dir / "microvolts")
        enable  = read_file(reg_dir / "enable_count")
        use     = read_file(reg_dir / "use_count")
        min_uv  = read_file(reg_dir / "min_microvolts")
        max_uv  = read_file(reg_dir / "max_microvolts")

        if uv is None:
            continue

        regs.append({
            "name":    name,
            "uv":      int(uv),
            "enabled": int(enable or 0) > 0,
            "use":     int(use or 0),
            "min_uv":  int(min_uv or 0),
            "max_uv":  int(max_uv or 0),
        })
    return regs

def print_budget(regs):
    print(f"{'Regulator':<25} {'Voltaj':>10} {'Etkin':>6} {'Kullanıcı':>10}")
    print("-" * 60)
    active = [r for r in regs if r["enabled"]]
    for r in active:
        v_str = f"{r['uv']/1000000:.3f}V"
        print(f"{r['name']:<25} {v_str:>10} {'Evet':>6} {r['use']:>10}")

    print(f"\nToplam etkin regulator: {len(active)}/{len(regs)}")
    print("\nOptimizasyon önerileri:")
    for r in regs:
        if not r["enabled"] and r["use"] == 0:
            print(f"  {r['name']}: kapalı (tasarruf sağlıyor)")
        if r["enabled"] and r["uv"] == r["max_uv"] and r["max_uv"] > 1800000:
            print(f"  {r['name']}: {r['uv']/1e6:.2f}V (maksimumda, düşürülebilir?)")

if __name__ == "__main__":
    regs = analyze_regulators()
    print_budget(regs)
bash — i.MX8 güç optimizasyon adımları
# 1. Kullanılmayan peripheral'ları kapat (runtime PM)
echo auto > /sys/bus/platform/devices/30a30000.ethernet/power/control
echo auto > /sys/bus/platform/devices/30900000.usb/power/control

# 2. cpufreq schedutil + düşük max frekans
cpupower frequency-set -g schedutil
cpupower frequency-set -u 1200MHz   # turbo OPP'yi kapat

# 3. Boşta regulator voltajını izle
watch -n2 'for r in vdd_arm vdd_soc; do
    v=$(cat /sys/kernel/debug/regulator/${r}/microvolts 2>/dev/null)
    echo "$r: $((v/1000))mV"
done'

# 4. GPU devfreq powersave
echo powersave > /sys/class/devfreq/*/governor 2>/dev/null

# 5. Sonuç: yüksüz i.MX8 sistemde tipik tüketim
# - Tam performans (1.8GHz): ~3.5W
# - schedutil + 1.2GHz:      ~2.1W
# - powersave + 600MHz:       ~1.2W
# - Suspend-to-RAM:           ~0.5W
ÖZET

Regulator framework ile güç optimizasyonu üç katmanda yapılır: (1) kullanılmayan blokları tamamen kapat (regulator_disable), (2) çalışan bloklar için voltajı minimize et (OPP/DVFS), (3) yük tahminini doğru bildir (regulator_set_load) — böylece PMIC düşük güç moduna geçebilir. Bu üç adımı birlikte uygulayan bir i.MX8 sistemde %40-60 güç tasarrufu mümkündür.