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
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to