Difference between revisions of "OMAP wishlist"

From eLinux.org
Jump to: navigation, search
Line 7: Line 7:
 
* IP based Revision and errata handling handling framework
 
* IP based Revision and errata handling handling framework
 
* capability for I2C to handle board+bus based timing parameters (SCLL and SLH)
 
* capability for I2C to handle board+bus based timing parameters (SCLL and SLH)
 +
 +
== References ==
 +
=== PXA ===
 +
PXA uses MFP (Multi-Function Pin) framework for pin multiplexing. Brief MFP description can be found at [http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/arm/pxa/mfp.txt;h=a179e5bc02c94c655b3d1795c899664a2e1f2778;hb=HEAD Documentation/arm/pxa/mfp.txt].
 +
 +
The concept of MFP is as follows:
 +
* There's an enumeration of all possible configurable pins.
 +
* The enumeration values are used as indexes to the <tt>mfp_table</tt> that defines pin configuration register address and pin configuration for active and low power modes. The table entries are quite similar to OMAP's <tt>pin_config</tt>, and the <tt>mfp_table</tt> is much like <tt>omapXXXX_pins[]</tt>. The main difference is that <tt>omapXXXX_pins[]</tt> tries to define all possible mux modes and the <tt>mfp_table</tt> has exactly one entry for a pin.
 +
* Possible pin configurations are encoded together with pin enumeration index with a set of a macros, e.g
 +
<pre>
 +
#define GPIO32_UART1_CTS    MFP_CFG_LPM(GPIO32,  AF2, FLOAT)
 +
#define GPIO32_UART1_RTS    MFP_CFG_LPM(GPIO32,  AF4, FLOAT)
 +
#define GPIO32_UTM_PHYDATA_2      MFP_CFG(GPIO32,  AF3)
 +
#define GPIO32_USB_P2_4            MFP_CFG(GPIO32, AF1)
 +
</pre>
 +
* Processor initialization code sets pin configuration register addresses in the <tt>mfp_table</tt> for all pins present of the CPU variant
 +
* Board initialization code uses MFP API to set actual pin configuration both in the <tt>mfp_table</tt> and in the pin configuration registers, e.g :
 +
<pre>
 +
static mfp_cfg_t cm_x300_mfp_cfg[] __initdata = {
 +
/* LCD */
 +
GPIO54_LCD_LDD_0,
 +
GPIO55_LCD_LDD_1,
 +
GPIO56_LCD_LDD_2,
 +
GPIO57_LCD_LDD_3,
 +
 +
/* BTUART */
 +
GPIO111_UART2_RTS,
 +
GPIO112_UART2_RXD | MFP_LPM_EDGE_FALL,
 +
GPIO113_UART2_TXD,
 +
GPIO114_UART2_CTS | MFP_LPM_EDGE_BOTH,
 +
 +
/* STUART */
 +
GPIO109_UART3_TXD,
 +
GPIO110_UART3_RXD | MFP_LPM_EDGE_FALL,
 +
}
 +
 +
static void __init machine_init_func(void)
 +
{
 +
pxa3xx_mfp_config(ARRAY_AND_SIZE(cm_x300_mfp_cfg));
 +
        ...
 +
}
 +
</pre>

Revision as of 23:16, 14 September 2009

Pin-mux framework

Feature list

  • dynamic, run-time alloc/free of pins
  • handle various SoCs: 34xx, 35xx including the various packages of 35xx
  • IP based Revision and errata handling handling framework
  • capability for I2C to handle board+bus based timing parameters (SCLL and SLH)

References

PXA

PXA uses MFP (Multi-Function Pin) framework for pin multiplexing. Brief MFP description can be found at Documentation/arm/pxa/mfp.txt.

The concept of MFP is as follows:

  • There's an enumeration of all possible configurable pins.
  • The enumeration values are used as indexes to the mfp_table that defines pin configuration register address and pin configuration for active and low power modes. The table entries are quite similar to OMAP's pin_config, and the mfp_table is much like omapXXXX_pins[]. The main difference is that omapXXXX_pins[] tries to define all possible mux modes and the mfp_table has exactly one entry for a pin.
  • Possible pin configurations are encoded together with pin enumeration index with a set of a macros, e.g
#define GPIO32_UART1_CTS    MFP_CFG_LPM(GPIO32,  AF2, FLOAT)
#define GPIO32_UART1_RTS    MFP_CFG_LPM(GPIO32,  AF4, FLOAT)
#define GPIO32_UTM_PHYDATA_2       MFP_CFG(GPIO32,  AF3)
#define GPIO32_USB_P2_4            MFP_CFG(GPIO32, AF1)
  • Processor initialization code sets pin configuration register addresses in the mfp_table for all pins present of the CPU variant
  • Board initialization code uses MFP API to set actual pin configuration both in the mfp_table and in the pin configuration registers, e.g :
static mfp_cfg_t cm_x300_mfp_cfg[] __initdata = {
	/* LCD */
	GPIO54_LCD_LDD_0,
	GPIO55_LCD_LDD_1,
	GPIO56_LCD_LDD_2,
	GPIO57_LCD_LDD_3,

	/* BTUART */
	GPIO111_UART2_RTS,
	GPIO112_UART2_RXD | MFP_LPM_EDGE_FALL,
	GPIO113_UART2_TXD,
	GPIO114_UART2_CTS | MFP_LPM_EDGE_BOTH,

	/* STUART */
	GPIO109_UART3_TXD,
	GPIO110_UART3_RXD | MFP_LPM_EDGE_FALL,
}

static void __init machine_init_func(void)
{
	pxa3xx_mfp_config(ARRAY_AND_SIZE(cm_x300_mfp_cfg));
        ...
}