[RK3288][Android6.0] PMIC之RK818驅動小結
阿新 • • 發佈:2018-12-31
uboot部分:
pmic_init -> power_rockchip.c
pmic_rk818_init -> pmic_rk818.c
rk818_parse_dt ->
fdt_get_i2c_info
rk818_i2c_probe ->
i2c_set_bus_num
i2c_init -> //RK818_I2C_SPEED是200K
rk_i2c_init -> //設定複用功能以及clock
rk_i2c_iomux
rk_i2c_set_clk
i2c_probe //探測chip
fdt_for_each_subnode
fdt_regulator_match //依次匹配regulator下的各個電源節點,值存到rk818_reg_matches中
rk818_set_regulator_init -> //當最大和最小電壓相同並且設定了regulator-boot-on的話就enable電壓.
rk818_regulator_set_voltage //先set再enable
rk818_regulator_enable
rk818_pre_init //enable lcd power以及其他ldo
fg_rk818_init //battery相關,暫時未用.
所以說如果想在uboot中就enable相應的dc/dc或者ldo, 那麼在dts要設定成regulator-boot-on以及
regulator-min-microvolt和regulator-max-microvolt要一致.
kernel部分:
rk818_module_init -> rk818.c
rk818_i2c_probe ->
rk818_pre_init
rk818_parse_dt -> //解析和uboot類似,只是最後存放的結構體有些變化和差異.
of_regulator_match -> of_regulator.c
of_get_regulator_init_data ->
of_get_regulation_constraints //獲取各個電源下的各項屬性.
regulator_register -> core.c//註冊所有的regulator
device_register //以名字為regulator.x的方式註冊,可以在/sys/class/regulator看到註冊的各個regulators.
set_machine_constraints ->
_regulator_do_enable //如果是always_on或者是boot_on就enable起來.
list_add //新增到regulator_list連結串列中.
rk818_irq_init ->
irq_domain_add_linear //建立一個線性對映的domain, rk818的rtc和battery驅動會用它(用irq_create_mapping()定義).
//相關知識: 中斷code用IRQ number(虛擬值)標示,而中斷controller用HW ID表示,兩者需要轉換,當一個模組的
//中斷數比較多時,可以通過建立一個對映(IRQ Domain)實現(也就是這裡的irq_domain_add_linear()),
//具體的IRQ number如何和HW id對應,就通過irq_create_mapping()定義了,這樣就得到對應的IRQ number後
//就可以同樣方法用request_threaded_irq()註冊中斷了.
request_threaded_irq //之前有說過,INT腳會發送過流,過壓,RTC等給cpu,中斷函式就是這個,注意裡面還有中斷巢狀會呼叫對應小模組的中斷函式,比如rtc-rk818.c的alarm中斷.
mfd_add_devices //新增rtc和battery的platform_device, 接下來就會匹配各自的驅動了,後面再小結對應的驅動.
register_syscore_ops //註冊系統關機函式是rk818_shutdown(), 關機跑syscore_shutdown()會調到它.
pmic_init -> power_rockchip.c
pmic_rk818_init -> pmic_rk818.c
rk818_parse_dt ->
fdt_get_i2c_info
rk818_i2c_probe ->
i2c_set_bus_num
i2c_init -> //RK818_I2C_SPEED是200K
rk_i2c_init -> //設定複用功能以及clock
rk_i2c_iomux
rk_i2c_set_clk
i2c_probe //探測chip
fdt_for_each_subnode
fdt_regulator_match //依次匹配regulator下的各個電源節點,值存到rk818_reg_matches中
rk818_set_regulator_init -> //當最大和最小電壓相同並且設定了regulator-boot-on的話就enable電壓.
rk818_regulator_set_voltage //先set再enable
rk818_regulator_enable
rk818_pre_init //enable lcd power以及其他ldo
fg_rk818_init //battery相關,暫時未用.
所以說如果想在uboot中就enable相應的dc/dc或者ldo, 那麼在dts要設定成regulator-boot-on以及
regulator-min-microvolt和regulator-max-microvolt要一致.
kernel部分:
rk818_module_init -> rk818.c
rk818_i2c_probe ->
rk818_pre_init
rk818_parse_dt -> //解析和uboot類似,只是最後存放的結構體有些變化和差異.
of_regulator_match -> of_regulator.c
of_get_regulator_init_data ->
of_get_regulation_constraints //獲取各個電源下的各項屬性.
regulator_register -> core.c//註冊所有的regulator
device_register //以名字為regulator.x的方式註冊,可以在/sys/class/regulator看到註冊的各個regulators.
set_machine_constraints ->
_regulator_do_enable //如果是always_on或者是boot_on就enable起來.
list_add //新增到regulator_list連結串列中.
rk818_irq_init ->
irq_domain_add_linear //建立一個線性對映的domain, rk818的rtc和battery驅動會用它(用irq_create_mapping()定義).
//相關知識: 中斷code用IRQ number(虛擬值)標示,而中斷controller用HW ID表示,兩者需要轉換,當一個模組的
//中斷數比較多時,可以通過建立一個對映(IRQ Domain)實現(也就是這裡的irq_domain_add_linear()),
//具體的IRQ number如何和HW id對應,就通過irq_create_mapping()定義了,這樣就得到對應的IRQ number後
//就可以同樣方法用request_threaded_irq()註冊中斷了.
request_threaded_irq //之前有說過,INT腳會發送過流,過壓,RTC等給cpu,中斷函式就是這個,注意裡面還有中斷巢狀會呼叫對應小模組的中斷函式,比如rtc-rk818.c的alarm中斷.
mfd_add_devices //新增rtc和battery的platform_device, 接下來就會匹配各自的驅動了,後面再小結對應的驅動.
register_syscore_ops //註冊系統關機函式是rk818_shutdown(), 關機跑syscore_shutdown()會調到它.