RE: [PATCH 1/1] omap3: Add macros for comparing si revision

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Original Message-----
> From: Premi, Sanjeev
> Sent: Friday, January 08, 2010 8:56 PM
> To: linux-omap@xxxxxxxxxxxxxxx
> Cc: Premi, Sanjeev
> Subject: [PATCH 1/1] omap3: Add macros for comparing si revision
>
> This patch adds verbose macros for comparing silicon
> revision bits. Current mechanism of comparing complete
> 'omap_revision' does not work/ represent the multiple
> processors, and their revisions.
>
> Existing instances of comparison via omap_rev() have
> been replaced with new macros.
>
> Signed-off-by: Sanjeev Premi <premi@xxxxxx>
> ---
>  arch/arm/mach-omap2/clock34xx.c       |    2 +-
>  arch/arm/mach-omap2/clock34xx_data.c  |    6 ++-
>  arch/arm/mach-omap2/control.c         |    7 ++--
>  arch/arm/mach-omap2/id.c              |   13 +++----
>  arch/arm/mach-omap2/pm34xx.c          |   35 ++++++++++++++++-----
>  arch/arm/plat-omap/include/plat/cpu.h |   55
> +++++++++++++++++++++++++++++++++
>  6 files changed, 97 insertions(+), 21 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/clock34xx.c
> b/arch/arm/mach-omap2/clock34xx.c
> index d4217b9..6cef2f1 100644
> --- a/arch/arm/mach-omap2/clock34xx.c
> +++ b/arch/arm/mach-omap2/clock34xx.c
> @@ -154,7 +154,7 @@ int omap3_dpll4_set_rate(struct clk *clk,
> unsigned long rate)
>        * on 3430ES1 prevents us from changing DPLL
> multipliers or dividers
>        * on DPLL4.
>        */
> -     if (omap_rev() == OMAP3430_REV_ES1_0) {
> +     if (cpu_is_omap34xx() && omap_rev_is_1_0()) {
>               printk(KERN_ERR "clock: DPLL4 cannot change
> rate due to "
>                      "silicon 'Limitation 2.5' on 3430ES1.\n");
>               return -EINVAL;
> diff --git a/arch/arm/mach-omap2/clock34xx_data.c
> b/arch/arm/mach-omap2/clock34xx_data.c
> index c6031d7..0a00a49 100644
> --- a/arch/arm/mach-omap2/clock34xx_data.c
> +++ b/arch/arm/mach-omap2/clock34xx_data.c
> @@ -3230,7 +3230,7 @@ int __init omap2_clk_init(void)
>                * Update this if there are further clock
> changes between ES2
>                * and production parts
>                */
> -             if (omap_rev() == OMAP3430_REV_ES1_0) {
> +             if (cpu_is_omap34xx() && omap_rev_is_1_0()) {
>                       /* No 3430ES1-only rates exist, so no
> RATE_IN_3430ES1 */
>                       cpu_clkflg |= CK_3430ES1;
>               } else {
> @@ -3282,7 +3282,9 @@ int __init omap2_clk_init(void)
>       /*
>        * Lock DPLL5 and put it in autoidle.
>        */
> -     if (omap_rev() >= OMAP3430_REV_ES2_0)
> +     if ((cpu_is_omap34xx() && omap_rev_ge_2_0())
> +             || cpu_is_omap3505() || cpu_is_omap3517()
> +             || cpu_is_omap3630())
>               omap3_clk_lock_dpll5();
>
>       /* Avoid sleeping during omap3_core_dpll_m2_set_rate() */
> diff --git a/arch/arm/mach-omap2/control.c
> b/arch/arm/mach-omap2/control.c
> index cdd1f35..55e9b0a 100644
> --- a/arch/arm/mach-omap2/control.c
> +++ b/arch/arm/mach-omap2/control.c
> @@ -209,8 +209,7 @@ void omap3_save_scratchpad_contents(void)
>
>       /* Populate the Scratchpad contents */
>       scratchpad_contents.boot_config_ptr = 0x0;
> -     if (omap_rev() != OMAP3430_REV_ES3_0 &&
> -                                     omap_rev() !=
> OMAP3430_REV_ES3_1)
> +     if (cpu_is_omap34xx() && omap_rev_le_3_0())
>               scratchpad_contents.public_restore_ptr =
>                       virt_to_phys(get_restore_pointer());
>       else
> @@ -271,7 +270,9 @@ void omap3_save_scratchpad_contents(void)
>        * of AUTO_CNT = 1 prior to any transition to OFF mode.
>        */
>       if ((omap_type() != OMAP2_DEVICE_TYPE_GP)
> -                     && (omap_rev() >= OMAP3430_REV_ES3_0))
> +             && ((cpu_is_omap34xx() && omap_rev_ge_3_0())
> +                     || cpu_is_omap3505() || cpu_is_omap3517()
> +                     || cpu_is_omap3630()))
>               sdrc_block_contents.power = (sdrc_read_reg(SDRC_POWER) &
>                               ~(SDRC_POWER_AUTOCOUNT_MASK|
>                               SDRC_POWER_CLKCTRL_MASK)) |
> diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
> index a091b53..2d4c246 100644
> --- a/arch/arm/mach-omap2/id.c
> +++ b/arch/arm/mach-omap2/id.c
> @@ -379,19 +379,18 @@ void __init omap2_check_revision(void)
>               omap_chip.oc |= CHIP_IS_OMAP2420;
>       } else if (cpu_is_omap3505() || cpu_is_omap3517()) {
>               omap_chip.oc = CHIP_IS_OMAP3430 | CHIP_IS_OMAP3430ES3_1;
> +     } else if (cpu_is_omap3630()) {
> +             omap_chip.oc = CHIP_IS_OMAP3430 | CHIP_IS_OMAP3630ES1;
>       } else if (cpu_is_omap343x()) {
>               omap_chip.oc = CHIP_IS_OMAP3430;
> -             if (omap_rev() == OMAP3430_REV_ES1_0)
> +             if (omap_rev_is_1_0())
>                       omap_chip.oc |= CHIP_IS_OMAP3430ES1;
> -             else if (omap_rev() >= OMAP3430_REV_ES2_0 &&
> -                      omap_rev() <= OMAP3430_REV_ES2_1)
> +             else if (omap_rev_is_2_0() || omap_rev_is_2_1())
>                       omap_chip.oc |= CHIP_IS_OMAP3430ES2;
> -             else if (omap_rev() == OMAP3430_REV_ES3_0)
> +             else if (omap_rev_is_3_0())
>                       omap_chip.oc |= CHIP_IS_OMAP3430ES3_0;
> -             else if (omap_rev() == OMAP3430_REV_ES3_1)
> +             else if (omap_rev_is_3_1())
>                       omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
> -             else if (omap_rev() == OMAP3630_REV_ES1_0)
> -                     omap_chip.oc |= CHIP_IS_OMAP3630ES1;
>       } else {
>               pr_err("Uninitialized omap_chip, please fix!\n");
>       }
> diff --git a/arch/arm/mach-omap2/pm34xx.c
> b/arch/arm/mach-omap2/pm34xx.c
> index 81ed252..dc4050f 100644
> --- a/arch/arm/mach-omap2/pm34xx.c
> +++ b/arch/arm/mach-omap2/pm34xx.c
> @@ -27,6 +27,7 @@
>  #include <linux/gpio.h>
>  #include <linux/clk.h>
>
> +#include <plat/cpu.h>
>  #include <plat/sram.h>
>  #include <plat/clockdomain.h>
>  #include <plat/powerdomain.h>
> @@ -90,7 +91,9 @@ static void omap3_enable_io_chain(void)
>  {
>       int timeout = 0;
>
> -     if (omap_rev() >= OMAP3430_REV_ES3_1) {
> +     if ((cpu_is_omap34xx() && omap_rev_ge_3_1())
> +             || cpu_is_omap3505() || cpu_is_omap3517()
> +             || cpu_is_omap3630()) {
>               prm_set_mod_reg_bits(OMAP3430_EN_IO_CHAIN,
> WKUP_MOD, PM_WKEN);
>               /* Do a readback to assure write has been done */
>               prm_read_mod_reg(WKUP_MOD, PM_WKEN);
> @@ -111,7 +114,9 @@ static void omap3_enable_io_chain(void)
>
>  static void omap3_disable_io_chain(void)
>  {
> -     if (omap_rev() >= OMAP3430_REV_ES3_1)
> +     if ((cpu_is_omap34xx() && omap_rev_ge_3_1())
> +             || cpu_is_omap3505() || cpu_is_omap3517()
> +             || cpu_is_omap3630())
>               prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN,
> WKUP_MOD, PM_WKEN);
>  }
>
> @@ -230,7 +235,10 @@ static int _prcm_int_handle_wakeup(void)
>       c = prcm_clear_mod_irqs(WKUP_MOD, 1);
>       c += prcm_clear_mod_irqs(CORE_MOD, 1);
>       c += prcm_clear_mod_irqs(OMAP3430_PER_MOD, 1);
> -     if (omap_rev() > OMAP3430_REV_ES1_0) {
> +
> +     if ((cpu_is_omap34xx() && omap_rev_gt_1_0())
> +             || cpu_is_omap3505() || cpu_is_omap3517()
> +             || cpu_is_omap3630()) {
>               c += prcm_clear_mod_irqs(CORE_MOD, 3);
>               c += prcm_clear_mod_irqs(OMAP3430ES2_USBHOST_MOD, 1);
>       }
> @@ -399,7 +407,9 @@ void omap_sram_idle(void)
>       * of AUTO_CNT = 1 enabled. This takes care of errata 1.142.
>       * Hence store/restore the SDRC_POWER register here.
>       */
> -     if (omap_rev() >= OMAP3430_REV_ES3_0 &&
> +     if (((cpu_is_omap34xx() && omap_rev_ge_3_0())
> +             || cpu_is_omap3505() || cpu_is_omap3517()
> +             || cpu_is_omap3630()) &&
>           omap_type() != OMAP2_DEVICE_TYPE_GP &&
>           core_next_state == PWRDM_POWER_OFF)
>               sdrc_pwr = sdrc_read_reg(SDRC_POWER);
> @@ -413,7 +423,9 @@ void omap_sram_idle(void)
>       cpu_init();
>
>       /* Restore normal SDRC POWER settings */
> -     if (omap_rev() >= OMAP3430_REV_ES3_0 &&
> +     if (((cpu_is_omap34xx() && omap_rev_ge_3_0())
> +             || cpu_is_omap3505() || cpu_is_omap3517()
> +             || cpu_is_omap3630()) &&
>           omap_type() != OMAP2_DEVICE_TYPE_GP &&
>           core_next_state == PWRDM_POWER_OFF)
>               sdrc_write_reg(sdrc_pwr, SDRC_POWER);
> @@ -729,7 +741,10 @@ static void __init prcm_setup_regs(void)
>       prm_write_mod_reg(0, OMAP3430_NEON_MOD, PM_WKDEP);
>       prm_write_mod_reg(0, OMAP3430_CAM_MOD, PM_WKDEP);
>       prm_write_mod_reg(0, OMAP3430_PER_MOD, PM_WKDEP);
> -     if (omap_rev() > OMAP3430_REV_ES1_0) {
> +
> +     if ((cpu_is_omap34xx() && omap_rev_gt_1_0())
> +             || cpu_is_omap3505() || cpu_is_omap3517()
> +             || cpu_is_omap3630()) {
>               prm_write_mod_reg(0, OMAP3430ES2_SGX_MOD, PM_WKDEP);
>               prm_write_mod_reg(0, OMAP3430ES2_USBHOST_MOD, PM_WKDEP);
>       } else
> @@ -780,7 +795,9 @@ static void __init prcm_setup_regs(void)
>               OMAP3430_AUTO_DES1,
>               CORE_MOD, CM_AUTOIDLE2);
>
> -     if (omap_rev() > OMAP3430_REV_ES1_0) {
> +     if ((cpu_is_omap34xx() && omap_rev_gt_1_0())
> +             || cpu_is_omap3505() || cpu_is_omap3517()
> +             || cpu_is_omap3630()) {
>               cm_write_mod_reg(
>                       OMAP3430_AUTO_MAD2D |
>                       OMAP3430ES2_AUTO_USBTLL,
> @@ -828,7 +845,9 @@ static void __init prcm_setup_regs(void)
>               OMAP3430_PER_MOD,
>               CM_AUTOIDLE);
>
> -     if (omap_rev() > OMAP3430_REV_ES1_0) {
> +     if ((cpu_is_omap34xx() && omap_rev_gt_1_0())
> +             || cpu_is_omap3505() || cpu_is_omap3517()
> +             || cpu_is_omap3630()) {
>               cm_write_mod_reg(
>                       OMAP3430ES2_AUTO_USBHOST,
>                       OMAP3430ES2_USBHOST_MOD,
> diff --git a/arch/arm/plat-omap/include/plat/cpu.h
> b/arch/arm/plat-omap/include/plat/cpu.h
> index 9a028bd..534171a 100644
> --- a/arch/arm/plat-omap/include/plat/cpu.h
> +++ b/arch/arm/plat-omap/include/plat/cpu.h
> @@ -449,6 +449,61 @@ IS_OMAP_TYPE(3517, 0x3517)
>  #define OMAP4430_REV_ES1_0   0x44300044
>
>  /*
> + * Silicon revisions
> + */
> +#define OMAP_ES_1_0          0x00
> +#define OMAP_ES_2_0          0x10
> +#define OMAP_ES_2_1          0x20
> +#define OMAP_ES_3_0          0x30
> +#define OMAP_ES_3_1          0x40
> +
> +#define OMAP_REV_MASK                0x0000ff00
> +#define OMAP_REV_BITS                ((omap_rev() &
> OMAP_REV_MASK) >> 8)
> +
> +#define OMAP_REV_IS(revid)                                   \
> +static inline u8 omap_rev_is_ ##revid (void)                 \
> +{                                                            \
> +     return (OMAP_REV_BITS == OMAP_ES_ ##revid) ? 1 : 0;     \
> +}
> +
> +#define OMAP_REV_LT(revid)                                   \
> +static inline u8 omap_rev_lt_ ##revid (void)                 \
> +{                                                            \
> +     return (OMAP_REV_BITS < OMAP_ES_ ##revid) ? 1 : 0;      \
> +}
> +
> +#define OMAP_REV_LE(revid)                                   \
> +static inline u8 omap_rev_le_ ##revid (void)                 \
> +{                                                            \
> +     return (OMAP_REV_BITS <= OMAP_ES_ ##revid) ? 1 : 0;     \
> +}
> +
> +#define OMAP_REV_GT(revid)                                   \
> +static inline u8 omap_rev_gt_ ##revid (void)                 \
> +{                                                            \
> +     return (OMAP_REV_BITS > OMAP_ES_ ##revid) ? 1 : 0;      \
> +}
> +
> +#define OMAP_REV_GE(revid)                                   \
> +static inline u8 omap_rev_ge_ ##revid (void)                 \
> +{                                                            \
> +     return (OMAP_REV_BITS >= OMAP_ES_ ##revid) ? 1 : 0;     \
> +}
> +
> +#define OMAP_REV_FUNCTIONS(revid)    \
> +     OMAP_REV_IS(revid)              \
> +     OMAP_REV_LT(revid)              \
> +     OMAP_REV_LE(revid)              \
> +     OMAP_REV_GT(revid)              \
> +     OMAP_REV_GE(revid)
> +
> +OMAP_REV_FUNCTIONS(1_0)
> +OMAP_REV_FUNCTIONS(2_0)
> +OMAP_REV_FUNCTIONS(2_1)
> +OMAP_REV_FUNCTIONS(3_0)
> +OMAP_REV_FUNCTIONS(3_1)
> +
> +/*
>   * omap_chip bits
>   *
>   * CHIP_IS_OMAP{2420,2430,3430} indicate that a particular
> structure is
> --
> 1.6.2.2
>

While testing this patch on omap3630, Vaibhav (hvaibhav@xxxxxx) found
causes random failures during boot.

The problem stems from cpu_is_34xx() evaluating to true for omap3630 as
well. This caused the code meant for OMAP3430ES1.0 to be executed.

The delta patch below fixes the problem.
...Will wait for comments before sending a revised patch.

diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c
index 7898e20..797d2de 100644
--- a/arch/arm/mach-omap2/clock34xx.c
+++ b/arch/arm/mach-omap2/clock34xx.c
@@ -202,7 +202,7 @@ int omap3_dpll4_set_rate(struct clk *clk, unsigned long rate)
         * on 3430ES1 prevents us from changing DPLL multipliers or dividers
         * on DPLL4.
         */
-       if (cpu_is_omap34xx() && omap_rev_is_1_0()) {
+       if (!cpu_is_omap3630() && cpu_is_omap34xx() && omap_rev_is_1_0()) {
                printk(KERN_ERR "clock: DPLL4 cannot change rate due to "
                       "silicon 'Limitation 2.5' on 3430ES1.\n");
                return -EINVAL;
diff --git a/arch/arm/mach-omap2/clock34xx_data.c b/arch/arm/mach-omap2/clock34xx_data.c
index 003362c..76dc05a 100644
--- a/arch/arm/mach-omap2/clock34xx_data.c
+++ b/arch/arm/mach-omap2/clock34xx_data.c
@@ -3324,7 +3324,7 @@ int __init omap2_clk_init(void)
                 * Update this if there are further clock changes between ES2
                 * and production parts
                 */
-               if (cpu_is_omap34xx() && omap_rev_is_1_0()) {
+               if (!cpu_is_omap3630() && cpu_is_omap34xx() && omap_rev_is_1_0()) {
                        /* No 3430ES1-only rates exist, so no RATE_IN_3430ES1 */
                        cpu_clkflg |= CK_3430ES1;
                } else {
@@ -3376,7 +3376,7 @@ int __init omap2_clk_init(void)
        /*
         * Lock DPLL5 and put it in autoidle.
         */
-       if ((cpu_is_omap34xx() && omap_rev_ge_2_0())
+       if ((!cpu_is_omap3630() && cpu_is_omap34xx() && omap_rev_ge_2_0())
                || cpu_is_omap3505() || cpu_is_omap3517()
                || cpu_is_omap3630())
                omap3_clk_lock_dpll5();
diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c
index 3d8838b..2412ef8 100644
--- a/arch/arm/mach-omap2/control.c
+++ b/arch/arm/mach-omap2/control.c
@@ -215,7 +215,7 @@ void omap3_save_scratchpad_contents(void)

        /* Populate the Scratchpad contents */
        scratchpad_contents.boot_config_ptr = 0x0;
-       if (cpu_is_omap34xx() && omap_rev_le_3_0())
+       if (!cpu_is_omap3630() && cpu_is_omap34xx() && omap_rev_le_3_0())
                scratchpad_contents.public_restore_ptr =
                        virt_to_phys(get_restore_pointer());
        else
@@ -276,7 +276,7 @@ void omap3_save_scratchpad_contents(void)
         * of AUTO_CNT = 1 prior to any transition to OFF mode.
         */
        if ((omap_type() != OMAP2_DEVICE_TYPE_GP)
-               && ((cpu_is_omap34xx() && omap_rev_ge_3_0())
+               && ((!cpu_is_omap3630() && cpu_is_omap34xx() && omap_rev_ge_3_0())
                        || cpu_is_omap3505() || cpu_is_omap3517()
                        || cpu_is_omap3630()))
                sdrc_block_contents.power = (sdrc_read_reg(SDRC_POWER) &
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index 27b32b0..239f5c4 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -126,7 +126,7 @@ static void omap3_enable_io_chain(void)
 {
        int timeout = 0;

-       if ((cpu_is_omap34xx() && omap_rev_ge_3_1())
+       if ((!cpu_is_omap3630() && cpu_is_omap34xx() && omap_rev_ge_3_1())
                || cpu_is_omap3505() || cpu_is_omap3517()
                || cpu_is_omap3630()) {
                prm_set_mod_reg_bits(OMAP3430_EN_IO_CHAIN, WKUP_MOD, PM_WKEN);
@@ -149,7 +149,7 @@ static void omap3_enable_io_chain(void)

 static void omap3_disable_io_chain(void)
 {
-       if ((cpu_is_omap34xx() && omap_rev_ge_3_1())
+       if ((!cpu_is_omap3630() && cpu_is_omap34xx() && omap_rev_ge_3_1())
                || cpu_is_omap3505() || cpu_is_omap3517()
                || cpu_is_omap3630())
                prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN, WKUP_MOD, PM_WKEN);
@@ -279,7 +279,7 @@ static int _prcm_int_handle_wakeup(void)
        c += prcm_clear_mod_irqs(CORE_MOD, 1);
        c += prcm_clear_mod_irqs(OMAP3430_PER_MOD, 1);

-       if ((cpu_is_omap34xx() && omap_rev_gt_1_0())
+       if ((!cpu_is_omap3630() && cpu_is_omap34xx() && omap_rev_gt_1_0())
                || cpu_is_omap3505() || cpu_is_omap3517()
                || cpu_is_omap3630()) {
                c += prcm_clear_mod_irqs(CORE_MOD, 3);
@@ -472,7 +472,7 @@ void omap_sram_idle(void)
        * of AUTO_CNT = 1 enabled. This takes care of errata 1.142.
        * Hence store/restore the SDRC_POWER register here.
        */
-       if (((cpu_is_omap34xx() && omap_rev_ge_3_0())
+       if (((!cpu_is_omap3630() && cpu_is_omap34xx() && omap_rev_ge_3_0())
                || cpu_is_omap3505() || cpu_is_omap3517()
                || cpu_is_omap3630()) &&
            omap_type() != OMAP2_DEVICE_TYPE_GP &&
@@ -494,7 +494,7 @@ void omap_sram_idle(void)
                pm_dbg_regset_save(2);

        /* Restore normal SDRC POWER settings */
-       if (((cpu_is_omap34xx() && omap_rev_ge_3_0())
+       if (((!cpu_is_omap3630() && cpu_is_omap34xx() && omap_rev_ge_3_0())
                || cpu_is_omap3505() || cpu_is_omap3517()
                || cpu_is_omap3630()) &&
            omap_type() != OMAP2_DEVICE_TYPE_GP &&
@@ -847,7 +847,7 @@ static void __init prcm_setup_regs(void)
        prm_write_mod_reg(0, OMAP3430_CAM_MOD, PM_WKDEP);
        prm_write_mod_reg(0, OMAP3430_PER_MOD, PM_WKDEP);

-       if ((cpu_is_omap34xx() && omap_rev_gt_1_0())
+       if ((!cpu_is_omap3630() && cpu_is_omap34xx() && omap_rev_gt_1_0())
                || cpu_is_omap3505() || cpu_is_omap3517()
                || cpu_is_omap3630()) {
                prm_write_mod_reg(0, OMAP3430ES2_SGX_MOD, PM_WKDEP);
@@ -900,7 +900,7 @@ static void __init prcm_setup_regs(void)
                OMAP3430_AUTO_DES1,
                CORE_MOD, CM_AUTOIDLE2);

-       if ((cpu_is_omap34xx() && omap_rev_gt_1_0())
+       if ((!cpu_is_omap3630() && cpu_is_omap34xx() && omap_rev_gt_1_0())
                || cpu_is_omap3505() || cpu_is_omap3517()
                || cpu_is_omap3630()) {
                cm_write_mod_reg(
@@ -950,7 +950,7 @@ static void __init prcm_setup_regs(void)
                OMAP3430_PER_MOD,
                CM_AUTOIDLE);

-       if ((cpu_is_omap34xx() && omap_rev_gt_1_0())
+       if ((!cpu_is_omap3630() && cpu_is_omap34xx() && omap_rev_gt_1_0())
                || cpu_is_omap3505() || cpu_is_omap3517()
                || cpu_is_omap3630()) {
                cm_write_mod_reg(


Best regards,
Sanjeev

>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux