[PATCH][RFC] arm: Add basic support for VIA/WonderMedia SoC's

Alexey Charkov alchark at gmail.com
Mon Jul 12 16:03:07 EDT 2010


2010/7/12 Arnd Bergmann <arnd at arndb.de>:
> On Monday 12 July 2010 18:50:25 Alexey Charkov wrote:
>>
>> This adds basic support for machine initialization, interrupts, timers and
>> serial console on VIA/WonderMedia VT8500 and WM8505 Systems-on-Chip.
>>
>> Signed-off-by: Alexey Charkov <alchark at gmail.com>
>> ---
>>
>> These SoC's are used in quite many netbooks and tablets produced in China
>> and sold online at relatively low prices (typically below 100 USD).
>>
>> Support for WM8505 is known incomplete, while VT8500 is tested by me on the
>> hardware and at least prints kernel messages to the serial console with timing
>> information.
>
> That was quick. Marek already said most of what I had to say about the
> patch, and more. Here are some other minor comments. First of all, I'd
> suggest moving all of the descriptory text above into the changelog
> (above ---), since that looks like useful information to people that might
> want to try out the code.
>
>> +             .section        ".start", "ax"
>> +
>> +__VT8500_start:
>> +             /* Override the obscure machine id from bootloader */
>> +#ifdef CONFIG_MACH_BV07
>> +             mov     r7, #(MACH_TYPE_BV07 & ~0xf)
>> +             orr     r7, r7, #(MACH_TYPE_BV07 & 0xf)
>> +#elif defined CONFIG_MACH_WM8505_7IN_NETBOOK
>> +             mov     r7, #(MACH_TYPE_WM8505_7IN_NETBOOK & ~0xf)
>> +             orr     r7, r7, #(MACH_TYPE_WM8505_7IN_NETBOOK & 0xf)
>> +#endif
>
> Do you have any way to detect the actual machines from the existing
> boot loader? The way you do it here, the kernel ends up being usable
> on only one of the machines at a time.
>

Actually, as the devices using these SoC's are mainly generic Chinese
products, I would not expect any consistency in this area. The
bootloader is a modification of an old U-boot, but I could not find
the sources for my version (yes, a GPL violation). It seems to use
some machine IDs in the range of 4000+, but again I would not trust
that. That's why I decided to hardcode the intended target devices
here (which is what some of the other machines do).

>> +#ifdef CONFIG_MMU
>> +/* macro to get at IO space when running virtually */
>> +#define IO_ADDRESS(x) ((x) | 0xf0000000)
>> +#else
>> +#define IO_ADDRESS(x) (x)
>> +#endif
>
> I don't know yet what the general consensus in the arm world is about this,
> but this looks hacky to me. I'd recommend killing off the IO_ADDRESS macro
> and replacing it with proper calls to ioremap.
>
>

I just followed the way how some of the other machine code functions:
mach-versatile and mach-realview both define similar macros. If using
ioremap is a better way, I could try to rework it.

>> diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types
>> index 8f10d24..f5745d1 100644
>> --- a/arch/arm/tools/mach-types
>> +++ b/arch/arm/tools/mach-types
>> @@ -12,7 +12,7 @@
>>  #
>>  #   http://www.arm.linux.org.uk/developer/machines/?action=new
>>  #
>> -# Last update: Sat May 1 10:36:42 2010
>> +# Last update: Sat Jun 19 13:07:40 2010
>>  #
>>  # machine_is_xxx     CONFIG_xxxx             MACH_TYPE_xxx           number
>>  #
>
> If you need the updated version of this file, it would probably make
> sense to build the patch instead a kernel tree that already contains
> the latest version, rather than Linus' tree.
>

I just couldn't find any. It seems that most (all?) trees have at most
99a0099a8, which is dated May 1 (too old).

>> diff --git a/drivers/serial/vt8500_serial.c b/drivers/serial/vt8500_serial.c
>> new file mode 100644
>> index 0000000..21e0462
>> --- /dev/null
>> +++ b/drivers/serial/vt8500_serial.c
>> @@ -0,0 +1,612 @@
>> +/*
>> + * drivers/serial/vt8500_serial.c
>> + *
>> + * Copyright (C) 2010 Alexey Charkov <alchark at gmail.com>
>> + *
>> + * Based on msm_serial.c, which is:
>> + * Copyright (C) 2007 Google, Inc.
>> + * Author: Robert Love <rlove at google.com>
>
> This device driver should probably go to the tty maintainer,
> Greg Kroah-Hartman <gregkh at suse.de>, with the linux-arm-kernel and
> linux-serial at vger.kernel.org mailing lists on Cc.
>

Ok, I will split it out and submit separately. However, this code
depends on at least <mach/vt8500.h> to compile, so should I wait for
integration of the remaining parts before submitting the serial
driver?

>> +struct vt8500_port {
>> +     struct uart_port        uart;
>> +     char                    name[16];
>> +     struct clk              *clk;
>> +     unsigned int            ier;
>> +};
>> +
>> +#define UART_TO_VT8500(uart_port)    ((struct vt8500_port *) uart_port)
>
> Instead of the direct cast from one type to another, please use
> container_of(), which is more type safe.
>

Thanks, I'll do that. Probably msm_serial would also need conversion
then (the construct is taken from there).

>> diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
>> index f10db6e..20ba8c3 100644
>> --- a/include/linux/serial_core.h
>> +++ b/include/linux/serial_core.h
>> @@ -186,6 +186,9 @@
>>  #define PORT_ALTERA_JTAGUART 91
>>  #define PORT_ALTERA_UART     92
>>
>> +/* VIA VT8500 SoC */
>> +#define PORT_VT8500    93
>> +
>>  #ifdef __KERNEL__
>>
>
> In the linux-next tree, number 94 is already being used, so you should
> probably use 95 as the next free number when sending the driver to the
> serial list.
>
> Otherwise, as I mentioned before, nice work!
>
>        Arnd
>

Thanks!

Alexey



More information about the linux-arm-kernel mailing list