[PATCH 3/9] ARM: pxa: support pxa95x
Haojian Zhuang
hzhuang1 at marvell.com
Sun Nov 21 23:18:39 EST 2010
>-----Original Message-----
>From: Eric Miao [mailto:eric.y.miao at gmail.com]
>Sent: 2010年11月22日 9:08 AM
>To: Haojian Zhuang
>Cc: linux-arm-kernel at lists.infradead.org
>Subject: Re: [PATCH 3/9] ARM: pxa: support pxa95x
>
>On Fri, Nov 19, 2010 at 5:16 PM, Haojian Zhuang <hzhuang1 at marvell.com> wrote:
>>
>>
>>>-----Original Message-----
>>>From: Eric Miao [mailto:eric.y.miao at gmail.com]
>>>Sent: 2010年11月19日 4:45 PM
>>>To: Haojian Zhuang
>>>Cc: linux-arm-kernel at lists.infradead.org
>>>Subject: Re: [PATCH 3/9] ARM: pxa: support pxa95x
>>>
>>>On Wed, Nov 17, 2010 at 7:03 PM, Haojian Zhuang
>>><haojian.zhuang at marvell.com> wrote:
>>>> The core of PXA955 is PJ4. Add new PJ4 support. And add new macro
>>>> CONFIG_PXA95x.
>>>>
>>>> Signed-off-by: Haojian Zhuang <haojian.zhuang at marvell.com>
>>>> Cc: Eric Miao <eric.y.miao at gmail.com>
>>>> ---
>>>> arch/arm/mach-pxa/Kconfig | 12 +-
>>>> arch/arm/mach-pxa/Makefile | 1 +
>>>> arch/arm/mach-pxa/clock.h | 20 ++
>>>> arch/arm/mach-pxa/devices.c | 267 +++++++++---------
>>>> arch/arm/mach-pxa/generic.c | 8 +-
>>>> arch/arm/mach-pxa/generic.h | 3 +-
>>>> arch/arm/mach-pxa/include/mach/hardware.h | 34 ++-
>>>> arch/arm/mach-pxa/include/mach/irqs.h | 1 +
>>>> arch/arm/mach-pxa/pxa3xx.c | 9 -
>>>> arch/arm/mach-pxa/pxa930.c | 2 +-
>>>> arch/arm/mach-pxa/pxa95x.c | 437
>>>+++++++++++++++++++++++++++++
>>>> arch/arm/mm/Kconfig | 6 +
>>>> arch/arm/plat-pxa/Makefile | 1 +
>>>> arch/arm/plat-pxa/include/plat/mfp.h | 4 +-
>>>> 14 files changed, 643 insertions(+), 162 deletions(-)
>>>> create mode 100644 arch/arm/mach-pxa/pxa95x.c
>>>>
>>>> +void __init pxa95x_init_irq(void)
>>>> +{
>>>
>>>No enabling of CP6 is needed for pxa95x?
>>>
>> Yes, PXA95x can't support to access interrupt registers via co-processors.
>>
>>>> + pxa_init_irq(96, NULL);
>>>> + pxa_init_ext_wakeup_irq(NULL);
>>>> + pxa_init_gpio(IRQ_GPIO_2_x, 2, 127, NULL);
>>>> +}
>>>> +
>>>> +
>>>> +static int __init pxa95x_init(void)
>>>> +{
>>>> + int ret = 0;
>>>> +
>>>> + if (cpu_is_pxa95x()) {
>>>> + mfp_init_base(io_p2v(MFPR_BASE));
>>>> + mfp_init_addr(pxa95x_mfp_addr_map);
>>>> +
>>>> + reset_status = ARSR;
>>>> +
>>>> + /*
>>>> + * clear RDH bit every time after reset
>>>> + *
>>>> + * Note: the last 3 bits DxS are write-1-to-clear so carefully
>>>> + * preserve them here in case they will be referenced later
>>>> + */
>>>> + ASCR &= ~(ASCR_RDH | ASCR_D1S | ASCR_D2S | ASCR_D3S);
>>>> +
>>>> + clkdev_add_table(pxa95x_clkregs, ARRAY_SIZE(pxa95x_clkregs));
>>>> +
>>>> + if ((ret = pxa_init_dma(IRQ_DMA, 32)))
>>>> + return ret;
>>>> +
>>>
>>>No need to register pxa3xx_sysdev[]? My understanding is the IRQ/MFP/GPIO
>>>subsystems are just same.
>>>
>> I don't want to support PM feature now. So I remove them in current patch.
>>
>>>> + ret = platform_add_devices(devices, ARRAY_SIZE(devices));
>>>> + }
>>>> +
>>>> + return ret;
>>>> +}
>>>
>>>I'm afraid the above duplicates most part of pxa3xx.c, the only subtle
>>>difference
>>>is the missing of pxa3xx_init_pm(), which is due to the difference of the power
>>>management. Instead of duplicating so much code, another better way out is:
>>>
>>>1) remove pxa3xx_init_pm() from pxa3xx_init()
>>>2) remove pxa3xx_init() from postcore_init()
>>>3) change pxa3xx_init() to pxa3xx_common_init()
>>>4) in pxa300_init() and pxa320_init(), call pxa3xx_common_init() as
>>>well as pxa3xx_init_pm()
>>>5) in pxa95x_init(), call pxa3xx_common_init() and pxa95x's specific
>>>pm initialization
>>> (e.g. pxa95x_init_pm)
>>>
>> The name of pxa3xx_init() and pxa3xx_common_init() is very confusion.
>
>I know it's a bit confusing. But they are sharing the same code, and it's
>only a matter of naming issue. Like many drivers we have, they are called
>'pxa2xx-*' but actually able to support pxa3xx, pxa9xx and even pxa168.
>
>> PXA95x is based on ARMv7. I don't prefer to compile it with PXA3xx in one image now.
>Actually I failed to compile them together.
>>
>
>Nah, it's not a hard requirement to build them together. It's about reducing
>code duplication.
>
>My idea would be to separate clock and pm into separate files, making them
>more self-contained driver-like, instead of hardcoding them into pxa3xx.c.
>So in the end, the pxa95x_init() will be something like below:
>
>static int __init pxa95x_init(void)
>{
> if (cpu_is_pxa95x()) {
> pxa_init_dma(IRQ_DMA, 32);
> pxa3xx_init_pm();
> pxa3xx_init_clock();
> clkdev_add_table(ARRAY_AND_SIZE(pxa95x_clkregs));
>
> for_each(p, pxa95x_sysdevs)
> sysdev_register(p);
>
> platform_add_devices(ARRAY_AND_SIZE(pxa95x_devices));
> }
>}
>
>So it reads like pxa95x is using the same subsystem as pxa3xx PM
>and clock, and if there are any subtle differences to handle, we can
>just change the API, and let know the difference through parameters,
>just like pxa_init_dma().
>
>Let me know if you think this is better and acceptable.
I don't agree invoking pxa3xx_init_pm() and pxa3xx_init_clock() in pxa95x.c. It's based on two reasons of naming confusion and force building pxa3xx.c for pxa95x.
If we want to share code, I suggest to move the sharing code into generic.c. So pxa95x.c will call xsc3_init_pm()/xsc3_init_clock() or common_init_pm()/common_init_clock(). What's your opinion?
Now we move PXA300/PXA310/PXA320/PXA930/PXA935 into pxa3xx family. So we shouldn't invoke pxa3xx_xxx() functions in other family. Otherwise, it's hard to be understood and maintained.
Thanks
Haojian
More information about the linux-arm-kernel
mailing list