[U-Boot] [PATCH v2 09/21] pmic: Extend struct pmic to support battery and charger related operations [explanation]
    Lukasz Majewski 
    l.majewski at samsung.com
       
    Thu Oct 18 18:09:03 CEST 2012
    
    
  
Hi Stefano,
I'd like to present an overview of my idea (pseudo code):
struct battery {
	int (* battery_charge) ()
	struct pmic *fg, *muic, *chrg
}
struct chrg {
	int (*chrg_type) ()
	int (*chrg_bat_present) ()
	int (*chrg_state) ()
}
struct fg {
	int (*fg_bat_check) ()
	int (*fg_bat_update) ()
}
struct muic {
}
Then extend struct pmic:
struct pmic {
struct battery *bat_p;
struct chrg *chrg_p;
struct fg *fg_p;
struct muic *muic_p;
struct pmic *parent;
void (*low_power_mode) ();
}
The struct [battery|chrg|fg|muic] is provided during pmic device
initialization (it is defined as a static in a device's translation unit
- e.g. fg_max17042.c)
To solve the problem with multi instances of the same devices (e.g. two
identical HW devices - MAX17042 are connected to SOC), methods defined
for pmic/power devices accept struct pmic *p of the device instance.
You have suggested, that pmic device shall be a parent. However, I see
it differently (at least from my HW):
			struct pmic *fg, *muic, *chrg
			-----------------
		--------| BAT		|------------
		|	|		|	    |
		|	-----------------	    |
		|		|		    |
	       \|/	       \|/		   \|/
	-----------	-----------------	---------
	|FG       |	|MUIC		|	|CHRG	|
	|         |	|		| 	|	|
	-----------	-----------------	---------
  	struct	pmic *parent = &bat (for FG, MUIC, CHRG)
(PMIC is also connected to the rest via list)
I think that BAT is parent here, since when we want to e.g. charge the
battery we would look for it with:
p_bat = pmic_get("BAT_TRATS");
In my opinion it is natural to call p_bat->battery_charge(p_bat)
to enable charging and in the same time don't be concerned with "helper"
devices (like FG, MUIC, CHRG) - which provide methods to check if
battery is charged properly.
Moreover BAT shall be treated as a PMIC device and thereof has its own
instance of struct pmic. It is desirable to have all power related
devices connected in the list.
The __real__ problem here is how to "connect" functionality provided by
FG, CHRG, MUIC with battery, to have easy access:
p_bat->battery_charge(p_bat).
One option would be to fill: 
struct battery *bat_p;
struct chrg *chrg_p;
struct fg *fg_p;
struct muic *muic_p;
for struct pmic bat.
Then we could access relevant functions just from p_bat. 
-- 
Best regards,
Lukasz Majewski
Samsung Poland R&D Center | Linux Platform Group
    
    
More information about the U-Boot
mailing list