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
--------------------------------

  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

  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

  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
