[PATCH 3/9] ARM: mmp: remove redundant macro definition in mfp
Haojian Zhuang
hzhuang1 at marvell.com
Fri Apr 1 01:09:05 EDT 2011
>-----Original Message-----
>From: Eric Miao [mailto:eric.y.miao at gmail.com]
>Sent: 2011年4月1日 12:51 PM
>To: Haojian Zhuang
>Cc: linux at arm.linux.org.uk; linux-arm-kernel at lists.infradead.org
>Subject: Re: [PATCH 3/9] ARM: mmp: remove redundant macro definition in
>mfp
>
>On Fri, Apr 1, 2011 at 10:39 AM, Haojian Zhuang
><haojian.zhuang at marvell.com> wrote:
>> There're two layers in MFP implementation. One is MFP layer that is
>logical
>> pin setting. And the other is MFPR layer that is physical register
>setting.
>>
>> MFP drive setting is different between PXA168 and PXA910. But the
>difference
>> was stored in logical layer, not physical layer. And some unnecessary
>macro
>> definition were added for ARCH_MMP.
>
>The implementation is indeed a bit complicated, yet I don't see the
>change here is necessary so far.
>
>The MFPR bit definitions for pxa168/910 and mmp2 are basically
>following the pxa3xx's.
>
>And definitions like DRIVE_SLOW, DRIVE_VERY_SLOW are really
>pxa168/910, mmp2 specific. And it's no equivalent to DS01X, DS02X
>..., which is more pxa3xx specific.
>
>BTW, does the existing code cause any bug/limitation?
>
Yes, there's some limitation in existing code since it's for pxa3xx. For example, driver strength is bit[12..10] in PXA3xx. In PXA955/910/MMP2, it's bit[12..11]. In PXA168, it's bit[11..10]. And there's no sleep mode in PXA168. Sleep mode bit is different in PXA910.
>>
>> Signed-off-by: Haojian Zhuang <haojian.zhuang at marvell.com>
>> ---
>> arch/arm/mach-mmp/include/mach/mfp-mmp2.h | 7 +----
>> arch/arm/mach-mmp/include/mach/mfp-pxa168.h | 7 +----
>> arch/arm/mach-mmp/include/mach/mfp-pxa910.h | 7 +----
>> arch/arm/mach-mmp/include/mach/mfp.h | 34 ------------------
>---------
>> arch/arm/mach-mmp/mmp2.c | 2 +-
>> arch/arm/mach-mmp/pxa168.c | 2 +-
>> arch/arm/mach-mmp/pxa910.c | 2 +-
>> arch/arm/plat-pxa/include/plat/mfp.h | 4 +++
>> arch/arm/plat-pxa/mfp.c | 22 +++++++++++++++-
>> 9 files changed, 30 insertions(+), 57 deletions(-)
>> delete mode 100644 arch/arm/mach-mmp/include/mach/mfp.h
>>
>> diff --git a/arch/arm/mach-mmp/include/mach/mfp-mmp2.h
>b/arch/arm/mach-mmp/include/mach/mfp-mmp2.h
>> index 4ad3862..c66eaea 100644
>> --- a/arch/arm/mach-mmp/include/mach/mfp-mmp2.h
>> +++ b/arch/arm/mach-mmp/include/mach/mfp-mmp2.h
>> @@ -1,12 +1,7 @@
>> #ifndef __ASM_MACH_MFP_MMP2_H
>> #define __ASM_MACH_MFP_MMP2_H
>>
>> -#include <mach/mfp.h>
>> -
>> -#define MFP_DRIVE_VERY_SLOW (0x0 << 13)
>> -#define MFP_DRIVE_SLOW (0x2 << 13)
>> -#define MFP_DRIVE_MEDIUM (0x4 << 13)
>> -#define MFP_DRIVE_FAST (0x6 << 13)
>> +#include <plat/mfp.h>
>>
>> /* GPIO */
>> #define GPIO0_GPIO MFP_CFG(GPIO0, AF0)
>> diff --git a/arch/arm/mach-mmp/include/mach/mfp-pxa168.h
>b/arch/arm/mach-mmp/include/mach/mfp-pxa168.h
>> index 4621067..4aadbea 100644
>> --- a/arch/arm/mach-mmp/include/mach/mfp-pxa168.h
>> +++ b/arch/arm/mach-mmp/include/mach/mfp-pxa168.h
>> @@ -1,12 +1,7 @@
>> #ifndef __ASM_MACH_MFP_PXA168_H
>> #define __ASM_MACH_MFP_PXA168_H
>>
>> -#include <mach/mfp.h>
>> -
>> -#define MFP_DRIVE_VERY_SLOW (0x0 << 13)
>> -#define MFP_DRIVE_SLOW (0x1 << 13)
>> -#define MFP_DRIVE_MEDIUM (0x2 << 13)
>> -#define MFP_DRIVE_FAST (0x3 << 13)
>> +#include <plat/mfp.h>
>>
>> /* GPIO */
>> #define GPIO0_GPIO MFP_CFG(GPIO0, AF5)
>> diff --git a/arch/arm/mach-mmp/include/mach/mfp-pxa910.h
>b/arch/arm/mach-mmp/include/mach/mfp-pxa910.h
>> index fbd7ee8..f5d33be 100644
>> --- a/arch/arm/mach-mmp/include/mach/mfp-pxa910.h
>> +++ b/arch/arm/mach-mmp/include/mach/mfp-pxa910.h
>> @@ -1,12 +1,7 @@
>> #ifndef __ASM_MACH_MFP_PXA910_H
>> #define __ASM_MACH_MFP_PXA910_H
>>
>> -#include <mach/mfp.h>
>> -
>> -#define MFP_DRIVE_VERY_SLOW (0x0 << 13)
>> -#define MFP_DRIVE_SLOW (0x2 << 13)
>> -#define MFP_DRIVE_MEDIUM (0x4 << 13)
>> -#define MFP_DRIVE_FAST (0x6 << 13)
>> +#include <plat/mfp.h>
>>
>> /* UART2 */
>> #define GPIO47_UART2_RXD MFP_CFG(GPIO47, AF6)
>> diff --git a/arch/arm/mach-mmp/include/mach/mfp.h b/arch/arm/mach-
>mmp/include/mach/mfp.h
>> deleted file mode 100644
>> index 62e510e..0000000
>> --- a/arch/arm/mach-mmp/include/mach/mfp.h
>> +++ /dev/null
>> @@ -1,34 +0,0 @@
>> -#ifndef __ASM_MACH_MFP_H
>> -#define __ASM_MACH_MFP_H
>> -
>> -#include <plat/mfp.h>
>> -
>> -/*
>> - * NOTE: the MFPR register bit definitions on PXA168 processor lines
>are a
>> - * bit different from those on PXA3xx. Bit [7:10] are now reserved,
>which
>> - * were SLEEP_OE_N, SLEEP_DATA, SLEEP_SEL and the LSB of DRIVE bits.
>> - *
>> - * To cope with this difference and re-use the pxa3xx mfp code as
>much as
>> - * possible, we make the following compromise:
>> - *
>> - * 1. SLEEP_OE_N will always be programmed to '1' (by MFP_LPM_FLOAT)
>> - * 2. DRIVE strength definitions redefined to include the reserved
>bit
>> - * - the reserved bit differs between pxa168 and pxa910, and the
>> - * MFP_DRIVE_* macros are individually defined in mfp-
>pxa{168,910}.h
>> - * 3. Override MFP_CFG() and MFP_CFG_DRV()
>> - * 4. Drop the use of MFP_CFG_LPM() and MFP_CFG_X()
>> - */
>> -
>> -#undef MFP_CFG
>> -#undef MFP_CFG_DRV
>> -#undef MFP_CFG_LPM
>> -#undef MFP_CFG_X
>> -#undef MFP_CFG_DEFAULT
>> -
>> -#define MFP_CFG(pin, af) \
>> - (MFP_LPM_FLOAT | MFP_PIN(MFP_PIN_##pin) | MFP_##af |
>MFP_DRIVE_MEDIUM)
>> -
>> -#define MFP_CFG_DRV(pin, af, drv) \
>> - (MFP_LPM_FLOAT | MFP_PIN(MFP_PIN_##pin) | MFP_##af |
>MFP_DRIVE_##drv)
>> -
>> -#endif /* __ASM_MACH_MFP_H */
>> diff --git a/arch/arm/mach-mmp/mmp2.c b/arch/arm/mach-mmp/mmp2.c
>> index 8e6c3ac..14e6a23 100644
>> --- a/arch/arm/mach-mmp/mmp2.c
>> +++ b/arch/arm/mach-mmp/mmp2.c
>> @@ -24,10 +24,10 @@
>> #include <mach/cputype.h>
>> #include <mach/irqs.h>
>> #include <mach/dma.h>
>> -#include <mach/mfp.h>
>> #include <mach/gpio.h>
>> #include <mach/devices.h>
>> #include <mach/mmp2.h>
>> +#include <plat/mfp.h>
>>
>> #include "common.h"
>> #include "clock.h"
>> diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c
>> index 72b4e76..34df2b1 100644
>> --- a/arch/arm/mach-mmp/pxa168.c
>> +++ b/arch/arm/mach-mmp/pxa168.c
>> @@ -24,7 +24,7 @@
>> #include <mach/gpio.h>
>> #include <mach/dma.h>
>> #include <mach/devices.h>
>> -#include <mach/mfp.h>
>> +#include <plat/mfp.h>
>>
>> #include "common.h"
>> #include "clock.h"
>> diff --git a/arch/arm/mach-mmp/pxa910.c b/arch/arm/mach-mmp/pxa910.c
>> index 8f92ccd..93b3b25 100644
>> --- a/arch/arm/mach-mmp/pxa910.c
>> +++ b/arch/arm/mach-mmp/pxa910.c
>> @@ -22,8 +22,8 @@
>> #include <mach/irqs.h>
>> #include <mach/gpio.h>
>> #include <mach/dma.h>
>> -#include <mach/mfp.h>
>> #include <mach/devices.h>
>> +#include <plat/mfp.h>
>>
>> #include "common.h"
>> #include "clock.h"
>> diff --git a/arch/arm/plat-pxa/include/plat/mfp.h b/arch/arm/plat-
>pxa/include/plat/mfp.h
>> index 75f6564..b7dde0c 100644
>> --- a/arch/arm/plat-pxa/include/plat/mfp.h
>> +++ b/arch/arm/plat-pxa/include/plat/mfp.h
>> @@ -378,6 +378,10 @@ typedef unsigned long mfp_cfg_t;
>> #define MFP_DS13X (0x7 << 13)
>> #define MFP_DS_MASK (0x7 << 13)
>> #define MFP_DS(x) (((x) >> 13) & 0x7)
>> +#define MFP_VERY_SLOW MFP_DS01X
>> +#define MFP_SLOW MFP_DS02X
>> +#define MFP_MEDIUM MFP_DS03X
>> +#define MFP_FAST MFP_DS04X
>>
>> #define MFP_LPM_DEFAULT (0x0 << 16)
>> #define MFP_LPM_DRIVE_LOW (0x1 << 16)
>> diff --git a/arch/arm/plat-pxa/mfp.c b/arch/arm/plat-pxa/mfp.c
>> index a9aa5ad..d335551 100644
>> --- a/arch/arm/plat-pxa/mfp.c
>> +++ b/arch/arm/plat-pxa/mfp.c
>> @@ -19,6 +19,10 @@
>> #include <linux/io.h>
>> #include <linux/sysdev.h>
>>
>> +#ifdef CONFIG_ARCH_MMP
>> +#include <mach/cputype.h>
>> +#endif
>> +
>> #include <plat/mfp.h>
>>
>> #define MFPR_SIZE (PAGE_SIZE)
>> @@ -165,8 +169,14 @@ static inline void __mfp_config_lpm(struct
>mfp_pin *p)
>> void mfp_config(unsigned long *mfp_cfgs, int num)
>> {
>> unsigned long flags;
>> - int i;
>> -
>> + int i, drv_b11 = 0, no_lpm = 0;
>> +
>> +#ifdef CONFIG_ARCH_MMP
>> + if (cpu_is_pxa910() || cpu_is_mmp2())
>> + drv_b11 = 1;
>> + if (cpu_is_pxa168() || cpu_is_pxa910())
>> + no_lpm = 1;
>> +#endif
>> spin_lock_irqsave(&mfp_spin_lock, flags);
>>
>> for (i = 0; i < num; i++, mfp_cfgs++) {
>> @@ -183,6 +193,10 @@ void mfp_config(unsigned long *mfp_cfgs, int num)
>> lpm = MFP_LPM_STATE(c);
>> edge = MFP_LPM_EDGE(c);
>> pull = MFP_PULL(c);
>> + if (drv_b11)
>> + drv = drv << 1;
>> + if (no_lpm)
>> + lpm = 0;
>>
>> /* run-mode pull settings will conflict with MFPR bits
>of
>> * low power mode state, calculate mfpr_run and
>mfpr_lpm
>> @@ -272,6 +286,10 @@ void mfp_config_lpm(void)
>> struct mfp_pin *p = &mfp_table[0];
>> int pin;
>>
>> +#ifdef CONFIG_ARCH_MMP
>> + if (cpu_is_pxa168() || cpu_is_pxa910())
>> + return;
>> +#endif
>> for (pin = 0; pin < ARRAY_SIZE(mfp_table); pin++, p++)
>> __mfp_config_lpm(p);
>> }
>> --
>> 1.5.6.5
>>
>>
More information about the linux-arm-kernel
mailing list