The U-Boot Driver Model Project
===============================
POWER analysis
==============
Viktor Krivak <viktor.krivak@gmail.com>
2012-03-09

I) Overview
-----------

  1) Actual state
  ---------------

  At this moment power doesn't contain API. There are many methods for
  initialization of some board specific functions but only few does what is
  expected. Basically only one file contains something meaningful for this
  driver.

  2) Current implementation
  -------------------------

  In file twl6030.c are methods twl6030_stop_usb_charging() and
  twl6030_start_usb_charging() for start and stop charging from USB. There are
  also methods to get information about battery state and initialization of
  battery charging. Only these methods are used in converted API.


II) Approach
------------

  1) New API
  ----------

  New API implements only functions specific for managing power. All board
  specific init methods are moved to other files. Name of methods are
  self-explanatory.

  struct ops {
    void (*start_usb_charging)(struct instance *i);
    void (*stop_usb_charging)(struct instance *i);
    int  (*get_battery_current)(struct instance *i);
    int  (*get_battery_voltage)(struct instance *i);
    void (*init_battery_charging)(struct instance *i);
  }

  2) Conversions of other methods
  -------------------------------

  Methods that can't be converted to new API are moved to board file or to
  special file for board hacks.

III) Analysis of in-tree drivers
--------------------------------

  1) ftpmu010.c
  -------------
  All methods of this file are moved to another location.
    void ftpmu010_32768osc_enable(void): Move to boards hacks
    void ftpmu010_mfpsr_select_dev(unsigned int dev): Move to board file
                                                      arch/nds32/lib/board.c
    void ftpmu010_mfpsr_diselect_dev(unsigned int dev): Dead code
    void ftpmu010_dlldis_disable(void): Dead code
    void ftpmu010_sdram_clk_disable(unsigned int cr0): Move to board file
                                                       arch/nds32/lib/board.c
    void ftpmu010_sdramhtc_set(unsigned int val): Move to board file
                                                  arch/nds32/lib/board.c

  2) twl4030.c
  ------------
  All methods of this file are moved to another location.
    void twl4030_power_reset_init(void): Move to board hacks
    void twl4030_pmrecv_vsel_cfg(u8 vsel_reg, u8 vsel_val, u8 dev_grp,
                                 u8 dev_grp_sel): Move to board hacks
    void twl4030_power_init(void): Move to board hacks
    void twl4030_power_mmc_init(void): Move to board hacks

  3) twl6030.c
  ------------
  Some methods are converted to new API and rest are moved to another location.
    void twl6030_stop_usb_charging(void): Convert to new API
    void twl6030_start_usb_charging(void): Convert to new API
    int twl6030_get_battery_current(void): Convert to new API
    int twl6030_get_battery_voltage(void): Convert to new API
    void twl6030_init_battery_charging(void): Convert to new API
    void twl6030_power_mmc_init(): Move to board file
                                   drivers/mmc/omap_hsmmc.c
    void twl6030_usb_device_settings(): Move to board file
                                        drivers/usb/musb/omap3.c
