[PATCH] feature_list: a way to pass hardware info to the kernel

vj vicencb at gmail.com
Wed Jan 23 16:37:55 EST 2013


On Wed, Jan 23, 2013 at 9:51 PM, Sascha Hauer <s.hauer at pengutronix.de> wrote:
> On Sat, Jan 19, 2013 at 06:23:27PM +0100, Vicente Bergas wrote:
>> Hi Sascha,
>> I've made the changes you suggested in this resent patch.
>>
>> Everything related to custom ATAGs has been moved to the board
>> directory.
>>
>> The generic code does not make any references to feature lists or
>> bootloader versions.
>>
>> About the setup_feature_list prototype:
>>  it has been renamed to atag_appender
>>  it's not a function, it's a pointer to a function. Can it have a
>> prototype other than it's own declaration?
>>
>> All non-related changes has been dropped. They were checkpatch.pl
>> warnings unrelated to this patch.
>>
>
> Applied, some days ago already.
>
> Sascha
>

Oh, Thanks!

 Vitente.

>> Regards,
>>   Vicente.
>>
>> Signed-off-by: Vicente Bergas <vicencb at gmail.com>
>> ---
>>  arch/arm/Kconfig                           |   7 +
>>  arch/arm/boards/archosg9/Makefile          |   1 +
>>  arch/arm/boards/archosg9/archos_features.c | 225 ++++++++++++++++++
>>  arch/arm/boards/archosg9/archos_features.h |  22 ++
>>  arch/arm/boards/archosg9/board.c           |   2 +
>>  arch/arm/boards/archosg9/feature_list.h    | 352 +++++++++++++++++++++++++++++
>>  arch/arm/configs/archosg9_defconfig        |   1 +
>>  arch/arm/include/asm/armlinux.h            |   9 +
>>  arch/arm/lib/armlinux.c                    |  12 +
>>  9 files changed, 631 insertions(+)
>>  create mode 100644 arch/arm/boards/archosg9/archos_features.c
>>  create mode 100644 arch/arm/boards/archosg9/archos_features.h
>>  create mode 100644 arch/arm/boards/archosg9/feature_list.h
>>
>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
>> index f567531..6f7a71f 100644
>> --- a/arch/arm/Kconfig
>> +++ b/arch/arm/Kconfig
>> @@ -152,6 +152,13 @@ config THUMB2_BAREBOX
>>         your board lowlevel init code may break in thumb-2 mode. You have been
>>         warned.
>>
>> +config ARM_BOARD_APPEND_ATAG
>> +     bool "Let board specific code to add ATAGs to be passed to the kernel"
>> +     depends on ARM_LINUX
>> +     help
>> +       This option is purely to start some vendor provided kernels.
>> +       ** DO NOT USE FOR YOUR OWN DESIGNS! **
>> +
>>  endmenu
>>
>>  menu "Arm specific settings"
>> diff --git a/arch/arm/boards/archosg9/Makefile b/arch/arm/boards/archosg9/Makefile
>> index 256eaf6..450c03f 100644
>> --- a/arch/arm/boards/archosg9/Makefile
>> +++ b/arch/arm/boards/archosg9/Makefile
>> @@ -1,3 +1,4 @@
>>  obj-y += board.o
>> +obj-$(CONFIG_ARM_BOARD_APPEND_ATAG) += archos_features.o
>>  obj-$(CONFIG_MACH_DO_LOWLEVEL_INIT) += lowlevel.o mux.o
>>  pbl-$(CONFIG_MACH_DO_LOWLEVEL_INIT) += lowlevel.o mux.o
>> diff --git a/arch/arm/boards/archosg9/archos_features.c b/arch/arm/boards/archosg9/archos_features.c
>> new file mode 100644
>> index 0000000..cd20984
>> --- /dev/null
>> +++ b/arch/arm/boards/archosg9/archos_features.c
>> @@ -0,0 +1,225 @@
>> +/*
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License as published by
>> + * the Free Software Foundation; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> + * GNU General Public License for more details.
>> + */
>> +
>> +#include <boot.h>
>> +#include <asm/setup.h>
>> +#include "archos_features.h"
>> +#include "feature_list.h"
>> +
>> +static inline void *atag_data(struct tag *t)
>> +{
>> +     return ((void *)t) + sizeof(struct tag_header);
>> +}
>> +
>> +static struct feature_tag *features;
>> +
>> +static void setup_feature_core(void)
>> +{
>> +     features->hdr.tag = FTAG_CORE;
>> +     features->hdr.size = feature_tag_size(feature_tag_core);
>> +
>> +     features->u.core.magic = FEATURE_LIST_MAGIC;
>> +     features->u.core.list_revision = FEATURE_LIST_REV;
>> +     features->u.core.flags = 0;
>> +
>> +     features = feature_tag_next(features);
>> +}
>> +static void setup_feature_product_name(void)
>> +{
>> +     features->hdr.tag = FTAG_PRODUCT_NAME;
>> +     features->hdr.size = feature_tag_size(feature_tag_product_name);
>> +
>> +     memset(features->u.product_name.name, 0,
>> +             sizeof(features->u.product_name.name));
>> +     sprintf(features->u.product_name.name, "A80S");
>> +     features->u.product_name.id = 0x13A8;
>> +
>> +     features = feature_tag_next(features);
>> +}
>> +static void setup_feature_product_serial_number(void)
>> +{
>> +     features->hdr.tag = FTAG_PRODUCT_SERIAL_NUMBER;
>> +     features->hdr.size = feature_tag_size(feature_tag_product_serial);
>> +
>> +     features->u.product_serial.serial[0] = 0;
>> +     features->u.product_serial.serial[1] = 0;
>> +     features->u.product_serial.serial[2] = 0;
>> +     features->u.product_serial.serial[3] = 0;
>> +
>> +     features = feature_tag_next(features);
>> +}
>> +static void setup_feature_product_mac_address(void)
>> +{
>> +     features->hdr.tag = FTAG_PRODUCT_MAC_ADDRESS;
>> +     features->hdr.size = feature_tag_size(feature_tag_product_mac_address);
>> +
>> +     features->u.mac_address.addr[0] = 0;
>> +     features->u.mac_address.addr[1] = 0;
>> +     features->u.mac_address.addr[2] = 0;
>> +     features->u.mac_address.addr[3] = 0;
>> +     features->u.mac_address.addr[4] = 0;
>> +     features->u.mac_address.addr[5] = 0;
>> +     features->u.mac_address.reserved1 = 0;
>> +     features->u.mac_address.reserved2 = 0;
>> +
>> +     features = feature_tag_next(features);
>> +}
>> +static void setup_feature_board_pcb_revision(void)
>> +{
>> +     features->hdr.tag = FTAG_BOARD_PCB_REVISION;
>> +     features->hdr.size = feature_tag_size(feature_tag_board_revision);
>> +
>> +     features->u.board_revision.revision = 5;
>> +
>> +     features = feature_tag_next(features);
>> +}
>> +static void setup_feature_sdram(void)
>> +{
>> +     features->hdr.tag = FTAG_SDRAM;
>> +     features->hdr.size = feature_tag_size(feature_tag_sdram);
>> +
>> +     memset(features->u.sdram.vendor, 0, sizeof(features->u.sdram.vendor));
>> +     memset(features->u.sdram.product, 0,
>> +             sizeof(features->u.sdram.product));
>> +     sprintf(features->u.sdram.vendor , "elpida");
>> +     sprintf(features->u.sdram.product, "EDB8064B1PB"/*"EDB4064B2PB"*/);
>> +     features->u.sdram.type     = 0;
>> +     features->u.sdram.revision = 0;
>> +     features->u.sdram.flags    = 0;
>> +     features->u.sdram.clock    = 400;
>> +     features->u.sdram.param_0  = 0;
>> +     features->u.sdram.param_1  = 0;
>> +     features->u.sdram.param_2  = 0;
>> +     features->u.sdram.param_3  = 0;
>> +     features->u.sdram.param_4  = 0;
>> +     features->u.sdram.param_5  = 0;
>> +     features->u.sdram.param_6  = 0;
>> +     features->u.sdram.param_7  = 0;
>> +
>> +     features = feature_tag_next(features);
>> +}
>> +static void setup_feature_pmic(void)
>> +{
>> +     features->hdr.tag = FTAG_PMIC;
>> +     features->hdr.size = feature_tag_size(feature_tag_pmic);
>> +
>> +     features->u.pmic.flags = FTAG_PMIC_TPS62361;
>> +
>> +     features = feature_tag_next(features);
>> +}
>> +static void setup_feature_serial_port(void)
>> +{
>> +     features->hdr.tag = FTAG_SERIAL_PORT;
>> +     features->hdr.size = feature_tag_size(feature_tag_serial_port);
>> +
>> +     features->u.serial_port.uart_id = 1;
>> +     features->u.serial_port.speed = 115200;
>> +
>> +     features = feature_tag_next(features);
>> +}
>> +static void setup_feature_has_gpio_volume_keys(void)
>> +{
>> +     features->hdr.tag = FTAG_HAS_GPIO_VOLUME_KEYS;
>> +     features->hdr.size = feature_tag_size(feature_tag_gpio_volume_keys);
>> +
>> +     features->u.gpio_volume_keys.gpio_vol_up   = 0x2B;
>> +     features->u.gpio_volume_keys.gpio_vol_down = 0x2C;
>> +     features->u.gpio_volume_keys.flags = 0;
>> +
>> +     features = feature_tag_next(features);
>> +}
>> +static void setup_feature_screen(void)
>> +{
>> +     features->hdr.tag = FTAG_SCREEN;
>> +     features->hdr.size = feature_tag_size(feature_tag_screen);
>> +
>> +     memset(features->u.screen.vendor, 0,
>> +             sizeof(features->u.screen.vendor));
>> +     sprintf(features->u.screen.vendor, "CMI");
>> +     features->u.screen.type = 0;
>> +     features->u.screen.revision = 0;
>> +     features->u.screen.vcom = 0;
>> +     features->u.screen.backlight = 0xC8;
>> +     features->u.screen.reserved[0] = 0;
>> +     features->u.screen.reserved[1] = 0;
>> +     features->u.screen.reserved[2] = 0;
>> +     features->u.screen.reserved[3] = 0;
>> +     features->u.screen.reserved[4] = 0;
>> +
>> +     features = feature_tag_next(features);
>> +}
>> +static void setup_feature_turbo(void)
>> +{
>> +     features->hdr.tag = FTAG_TURBO;
>> +     features->hdr.size = feature_tag_size(feature_tag_turbo);
>> +
>> +     features->u.turbo.flag = 1;
>> +
>> +     features = feature_tag_next(features);
>> +}
>> +static void setup_feature_none(void)
>> +{
>> +     features->hdr.tag = FTAG_NONE;
>> +     features->hdr.size = sizeof(struct feature_tag_header) >> 2;
>> +
>> +     features = feature_tag_next(features);
>> +}
>> +static struct tag *setup_feature_list(struct tag * params)
>> +{
>> +     struct tag_feature_list *fl;
>> +
>> +     fl = atag_data(params);
>> +     features = (struct feature_tag *)fl->data;
>> +
>> +     setup_feature_core();
>> +     setup_feature_product_name();
>> +     setup_feature_product_serial_number();
>> +     setup_feature_product_mac_address();
>> +     setup_feature_board_pcb_revision();
>> +     setup_feature_sdram();
>> +     setup_feature_pmic();
>> +     setup_feature_serial_port();
>> +     setup_feature_has_gpio_volume_keys();
>> +     setup_feature_screen();
>> +     setup_feature_turbo();
>> +     setup_feature_none();
>> +
>> +     fl->size = ((u32)features) - ((u32)(fl->data));
>> +
>> +     params->hdr.tag = ATAG_FEATURE_LIST;
>> +     params->hdr.size = (sizeof(struct tag_feature_list) + fl->size) >> 2;
>> +
>> +     return tag_next(params);
>> +}
>> +
>> +static struct tag *setup_boot_version(struct tag *params)
>> +{
>> +     struct tag_boot_version *bv;
>> +
>> +     bv = atag_data(params);
>> +
>> +     params->hdr.tag = ATAG_BOOT_VERSION;
>> +     params->hdr.size = tag_size(tag_boot_version);
>> +
>> +     bv->major = 5;
>> +     bv->minor = 5;
>> +     bv->extra = 3;
>> +
>> +     return tag_next(params);
>> +}
>> +
>> +struct tag *archos_append_atags(struct tag *params)
>> +{
>> +     params = setup_feature_list(params);
>> +     params = setup_boot_version(params);
>> +     return params;
>> +}
>> diff --git a/arch/arm/boards/archosg9/archos_features.h b/arch/arm/boards/archosg9/archos_features.h
>> new file mode 100644
>> index 0000000..5769c6c
>> --- /dev/null
>> +++ b/arch/arm/boards/archosg9/archos_features.h
>> @@ -0,0 +1,22 @@
>> +#ifndef __ARCHOS_FEATURES_H
>> +#define __ARCHOS_FEATURES_H
>> +
>> +/* bootloader version */
>> +#define ATAG_BOOT_VERSION    0x5441000A
>> +
>> +struct tag_boot_version {
>> +     u32             major;
>> +     u32             minor;
>> +     u32             extra;
>> +};
>> +
>> +#define ATAG_FEATURE_LIST    0x5441000B
>> +
>> +struct tag_feature_list {
>> +     u32     size;
>> +     u8      data[0];
>> +};
>> +
>> +struct tag *archos_append_atags(struct tag * params);
>> +
>> +#endif /* __ARCHOS_FEATURES_H */
>> diff --git a/arch/arm/boards/archosg9/board.c b/arch/arm/boards/archosg9/board.c
>> index 200fe92..8366cca 100644
>> --- a/arch/arm/boards/archosg9/board.c
>> +++ b/arch/arm/boards/archosg9/board.c
>> @@ -20,6 +20,7 @@
>>  #include <sizes.h>
>>  #include <i2c/i2c.h>
>>  #include <gpio.h>
>> +#include "archos_features.h"
>>
>>  static int archosg9_console_init(void){
>>       if (IS_ENABLED(CONFIG_DRIVER_SERIAL_OMAP4_USBBOOT))
>> @@ -59,6 +60,7 @@ static int archosg9_devices_init(void){
>>        */
>>       armlinux_set_architecture(5032);
>>       armlinux_set_revision(5);
>> +     armlinux_set_atag_appender(archos_append_atags);
>>
>>       return 0;
>>  }
>> diff --git a/arch/arm/boards/archosg9/feature_list.h b/arch/arm/boards/archosg9/feature_list.h
>> new file mode 100644
>> index 0000000..51f33ab
>> --- /dev/null
>> +++ b/arch/arm/boards/archosg9/feature_list.h
>> @@ -0,0 +1,352 @@
>> +#ifndef _FEATURE_LIST_H
>> +#define _FEATURE_LIST_H
>> +
>> +/*
>> + This file comes from:
>> + http://gitorious.org/archos/archos-gpl-gen9-kernel-ics/blobs/raw/master/
>> + arch/arm/include/asm/feature_list.h
>> +*/
>> +
>> +#define FEATURE_LIST_MAGIC           0xFEA01234
>> +
>> +#define FEATURE_LIST_REV             0x00000001
>> +
>> +struct feature_tag_header {
>> +     u32 size;
>> +     u32 tag;
>> +};
>> +
>> +struct feature_tag_generic {
>> +     u32 vendor;
>> +     u32 product;
>> +     u32 type;
>> +     u32 revision;
>> +     u32 flags;
>> +};
>> +
>> +#define FTAG_NONE                    0x00000000
>> +
>> +#define FTAG_CORE                    0x00000001
>> +struct feature_tag_core {
>> +     u32 magic;
>> +     u32 list_revision;
>> +     u32 flags;
>> +};
>> +
>> +/* product specific */
>> +#define FTAG_PRODUCT_NAME            0x00000002
>> +struct feature_tag_product_name {
>> +     char name[64];
>> +     u32 id;
>> +};
>> +#define FTAG_PRODUCT_SERIAL_NUMBER   0x00000003
>> +struct feature_tag_product_serial {
>> +     u32 serial[4];
>> +};
>> +
>> +#define FTAG_PRODUCT_MAC_ADDRESS     0x00000004
>> +struct feature_tag_product_mac_address {
>> +     u8 addr[6];
>> +     u8 reserved1;
>> +     u8 reserved2;
>> +};
>> +
>> +#define FTAG_PRODUCT_OEM             0x00000005
>> +struct feature_tag_product_oem {
>> +     char name[16];
>> +     u32 id;
>> +};
>> +
>> +#define FTAG_PRODUCT_ZONE            0x00000006
>> +struct feature_tag_product_zone {
>> +     char name[16];
>> +     u32 id;
>> +};
>> +
>> +/* board pcb specific */
>> +#define FTAG_BOARD_PCB_REVISION              0x00000010
>> +struct feature_tag_board_revision {
>> +     u32 revision;
>> +};
>> +
>> +/* clock and ram setup */
>> +#define FTAG_CLOCK                   0x00000011
>> +struct feature_tag_clock {
>> +     u32 clock;
>> +};
>> +
>> +#define FTAG_SDRAM                   0x00000012
>> +struct feature_tag_sdram {
>> +     char vendor[16];
>> +     char product[32];
>> +     u32 type;
>> +     u32 revision;
>> +     u32 flags;
>> +     u32 clock;
>> +     /* custom params */
>> +     u32 param_0;
>> +     u32 param_1;
>> +     u32 param_2;
>> +     u32 param_3;
>> +     u32 param_4;
>> +     u32 param_5;
>> +     u32 param_6;
>> +     u32 param_7;
>> +};
>> +
>> +/* PMIC */
>> +#define FTAG_PMIC                    0x00000013
>> +#define FTAG_PMIC_TPS62361           0x00000001
>> +struct feature_tag_pmic {
>> +     u32 flags;
>> +};
>> +
>> +/* serial port */
>> +#define FTAG_SERIAL_PORT             0x00000020
>> +struct feature_tag_serial_port {
>> +     u32 uart_id;
>> +     u32 speed;
>> +};
>> +
>> +/* turbo bit */
>> +#define FTAG_TURBO                   0x00000014
>> +struct feature_tag_turbo {
>> +     u32 flag;
>> +};
>> +
>> +/*** features ****/
>> +#define FTAG_HAS_GPIO_VOLUME_KEYS    0x00010001
>> +struct feature_tag_gpio_volume_keys {
>> +     u32 gpio_vol_up;
>> +     u32 gpio_vol_down;
>> +     u32 flags;
>> +};
>> +
>> +#define FTAG_HAS_ELECTRICAL_SHORTCUT 0x00010002
>> +#define FTAG_HAS_DCIN                        0x00010003
>> +struct feature_tag_dcin {
>> +     u32 autodetect;
>> +};
>> +
>> +/* external screen support */
>> +#define FTAG_HAS_EXT_SCREEN          0x00010004
>> +
>> +#define EXT_SCREEN_TYPE_TVOUT        0x00000001
>> +#define EXT_SCREEN_TYPE_HDMI 0x00000002
>> +#define EXT_SCREEN_TYPE_VGA  0x00000004
>> +struct feature_tag_ext_screen {
>> +     u32 type;
>> +     u32 revision;
>> +};
>> +
>> +/* wireless lan */
>> +#define FTAG_HAS_WIFI                        0x00010005
>> +
>> +#define WIFI_TYPE_TIWLAN     0x00000001
>> +struct feature_tag_wifi {
>> +     u32 vendor;
>> +     u32 product;
>> +     u32 type;
>> +     u32 revision;
>> +     u32 flags;
>> +};
>> +
>> +/* bluetooth */
>> +#define FTAG_HAS_BLUETOOTH           0x00010006
>> +
>> +#define BLUETOOTH_TYPE_TIWLAN        0x00000001
>> +struct feature_tag_bluetooth {
>> +     u32 vendor;
>> +     u32 product;
>> +     u32 type;
>> +     u32 revision;
>> +     u32 flags;
>> +};
>> +
>> +/* accelerometer */
>> +#define FTAG_HAS_ACCELEROMETER               0x00010007
>> +struct feature_tag_accelerometer {
>> +     u32 vendor;
>> +     u32 product;
>> +     u32 type;
>> +     u32 revision;
>> +     u32 flags;
>> +};
>> +
>> +/* gyroscope */
>> +#define FTAG_HAS_GYROSCOPE           0x00010008
>> +
>> +/* compass */
>> +#define FTAG_HAS_COMPASS             0x00010009
>> +
>> +/* gps */
>> +#define FTAG_HAS_GPS                 0x0001000a
>> +#define GPS_FLAG_DISABLED            0x00000001
>> +struct feature_tag_gps {
>> +     u32 vendor;
>> +     u32 product;
>> +     u32 revision;
>> +     u32 flags;
>> +};
>> +
>> +/* camera */
>> +#define FTAG_HAS_CAMERA                      0x0001000b
>> +
>> +/* harddisk controller */
>> +#define FTAG_HAS_HARDDISK_CONTROLLER 0x0001000c
>> +#define HDCONTROLLER_TYPE_SATA       0x00000001
>> +struct feature_tag_harddisk_controller {
>> +     u32 vendor;
>> +     u32 product;
>> +     u32 type;
>> +     u32 revision;
>> +     u32 flags;
>> +};
>> +
>> +/* harddisk */
>> +#define FTAG_HAS_HARDDISK            0x0001000d
>> +
>> +#define HARDDISK_TYPE_SATA   0x00000001
>> +#define HARDDISK_TYPE_PATA   0x00000002
>> +struct feature_tag_harddisk {
>> +     u32 vendor;
>> +     u32 product;
>> +     u32 type;
>> +     u32 revision;
>> +     u32 flags;
>> +};
>> +
>> +/* touchscreen */
>> +#define FTAG_HAS_TOUCHSCREEN         0x0001000e
>> +
>> +#define TOUCHSCREEN_TYPE_CAPACITIVE 0x00000001
>> +#define TOUCHSCREEN_TYPE_RESISTIVE  0x00000002
>> +
>> +#define TOUCHSCREEN_FLAG_MULTITOUCH 0x00000001
>> +struct feature_tag_touchscreen {
>> +     u32 vendor;
>> +     u32 product;
>> +     u32 type;
>> +     u32 revision;
>> +     u32 flags;
>> +};
>> +
>> +/* microphone */
>> +#define FTAG_HAS_MICROPHONE          0x0001000f
>> +
>> +/* external SDMMC slot */
>> +#define FTAG_HAS_EXT_MMCSD_SLOT              0x00010010
>> +#define MMCSD_FLAG_CARDDETECT    0x00000001
>> +#define MMCSD_FLAG_CARDPREDETECT 0x00000002
>> +
>> +struct feature_tag_mmcsd {
>> +     u32 width;
>> +     u32 voltagemask;
>> +     u32 revision;
>> +     u32 flags;
>> +};
>> +
>> +/* ambient light sensor */
>> +#define FTAG_HAS_AMBIENT_LIGHT_SENSOR        0x00010011
>> +
>> +/* proximity sensor */
>> +#define FTAG_HAS_PROXIMITY_SENSOR    0x00010012
>> +
>> +/* gps */
>> +#define FTAG_HAS_GSM                 0x00010013
>> +
>> +/* dect */
>> +#define FTAG_HAS_DECT                        0x00010014
>> +
>> +/* hsdpa data modem */
>> +#define FTAG_HAS_HSDPA                       0x00010015
>> +
>> +/* near field communication */
>> +#define FTAG_HAS_NFC                 0x00010016
>> +
>> +#define FTAG_GPIO_KEYS                       0x00010017
>> +struct feature_tag_gpio_keys {
>> +#define GPIO_KEYS_LONG_PRESS         0x00010000
>> +     u32 vol_up;
>> +     u32 vol_down;
>> +     u32 ok;
>> +     u32 reserved[5];
>> +};
>> +
>> +#define FTAG_SCREEN                  0x00010018
>> +struct feature_tag_screen {
>> +     char vendor[16];
>> +     u32 type;
>> +     u32 revision;
>> +     u32 vcom;
>> +     u32 backlight;
>> +     u32 reserved[5];
>> +};
>> +
>> +#define FTAG_WIFI_PA                 0x00010019
>> +struct feature_tag_wifi_pa {
>> +     char vendor[16];
>> +     u32 type;
>> +};
>> +
>> +/* loudspeaker */
>> +#define FTAG_HAS_SPEAKER             0x0001001a
>> +
>> +#define SPEAKER_FLAG_STEREO   0x00000001
>> +#define SPEAKER_FLAG_OWN_VOLCTRL 0x00000002
>> +struct feature_tag_speaker {
>> +     u32 flags;
>> +};
>> +
>> +#define FTAG_BATTERY                 0x0001001b
>> +struct feature_tag_battery {
>> +     u32 type;
>> +};
>> +#define BATTERY_TYPE_HIGHRS   0x00000000
>> +#define BATTERY_TYPE_LOWRS    0x00000001
>> +
>> +
>> +#define feature_tag_next(t) \
>> +     ((struct feature_tag *)((u32 *)(t) + (t)->hdr.size))
>> +#define feature_tag_size(type) \
>> +     ((sizeof(struct feature_tag_header) + sizeof(struct type)) >> 2)
>> +#define for_each_feature_tag(t, base) \
>> +     for (t = base; t->hdr.size; t = feature_tag_next(t))
>> +
>> +
>> +struct feature_tag {
>> +     struct feature_tag_header hdr;
>> +     union {
>> +             struct feature_tag_core                 core;
>> +             struct feature_tag_generic              generic;
>> +             struct feature_tag_product_name         product_name;
>> +             struct feature_tag_product_serial       product_serial;
>> +             struct feature_tag_product_oem          product_oem;
>> +             struct feature_tag_product_zone         product_zone;
>> +             struct feature_tag_product_mac_address  mac_address;
>> +             struct feature_tag_board_revision       board_revision;
>> +             struct feature_tag_clock                clock;
>> +             struct feature_tag_sdram                sdram;
>> +             struct feature_tag_pmic                 pmic;
>> +             struct feature_tag_turbo                turbo;
>> +             struct feature_tag_serial_port          serial_port;
>> +             struct feature_tag_gpio_volume_keys     gpio_volume_keys;
>> +             struct feature_tag_dcin                 dcin;
>> +             struct feature_tag_ext_screen           ext_screen;
>> +             struct feature_tag_wifi                 wifi;
>> +             struct feature_tag_bluetooth            bluetooth;
>> +             struct feature_tag_accelerometer        accelerometer;
>> +             struct feature_tag_harddisk_controller  harddisk_controller;
>> +             struct feature_tag_harddisk             harddisk;
>> +             struct feature_tag_touchscreen          touchscreen;
>> +             struct feature_tag_gps                  gps;
>> +             struct feature_tag_speaker              speaker;
>> +             struct feature_tag_mmcsd                mmcsd;
>> +             struct feature_tag_gpio_keys            gpio_keys;
>> +             struct feature_tag_screen               screen;
>> +             struct feature_tag_wifi_pa              wifi_pa;
>> +             struct feature_tag_battery              battery;
>> +     } u;
>> +};
>> +
>> +#endif /* _FEATURE_LIST_H */
>> diff --git a/arch/arm/configs/archosg9_defconfig b/arch/arm/configs/archosg9_defconfig
>> index 2a20dd7..1f3d105 100644
>> --- a/arch/arm/configs/archosg9_defconfig
>> +++ b/arch/arm/configs/archosg9_defconfig
>> @@ -11,6 +11,7 @@ CONFIG_TEXT_BASE=0xa0000000
>>  CONFIG_MALLOC_BASE=0x90000000
>>  CONFIG_MALLOC_SIZE=0x10000000
>>  CONFIG_KALLSYMS=y
>> +CONFIG_ARM_BOARD_APPEND_ATAG=y
>>  CONFIG_PROMPT="barebox> "
>>  CONFIG_LONGHELP=y
>>  CONFIG_GLOB=y
>> diff --git a/arch/arm/include/asm/armlinux.h b/arch/arm/include/asm/armlinux.h
>> index 8ec8c4d..07479fb 100644
>> --- a/arch/arm/include/asm/armlinux.h
>> +++ b/arch/arm/include/asm/armlinux.h
>> @@ -2,6 +2,7 @@
>>  #define __ARCH_ARMLINUX_H
>>
>>  #include <asm/memory.h>
>> +#include <asm/setup.h>
>>
>>  #if defined CONFIG_ARM_LINUX
>>  void armlinux_set_bootparams(void *params);
>> @@ -26,6 +27,14 @@ static inline void armlinux_set_serial(u64 serial)
>>  }
>>  #endif
>>
>> +#if defined CONFIG_ARM_BOARD_APPEND_ATAG
>> +void armlinux_set_atag_appender(struct tag *(*)(struct tag *));
>> +#else
>> +static inline void armlinux_set_atag_appender(struct tag *(*func)(struct tag *))
>> +{
>> +}
>> +#endif
>> +
>>  struct image_data;
>>
>>  void start_linux(void *adr, int swap, unsigned long initrd_address,
>> diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c
>> index 9c134ed..40a63ea 100644
>> --- a/arch/arm/lib/armlinux.c
>> +++ b/arch/arm/lib/armlinux.c
>> @@ -106,6 +106,14 @@ u64 armlinux_get_serial(void)
>>  #endif
>>  }
>>
>> +#ifdef CONFIG_ARM_BOARD_APPEND_ATAG
>> +static struct tag *(*atag_appender)(struct tag *);
>> +void armlinux_set_atag_appender(struct tag *(*func)(struct tag *))
>> +{
>> +     atag_appender = func;
>> +}
>> +#endif
>> +
>>  static void setup_start_tag(void)
>>  {
>>       params = (struct tag *)armlinux_bootparams;
>> @@ -233,6 +241,10 @@ static void setup_tags(unsigned long initrd_address,
>>
>>       setup_revision_tag();
>>       setup_serial_tag();
>> +#ifdef CONFIG_ARM_BOARD_APPEND_ATAG
>> +     if (atag_appender != NULL)
>> +             params = atag_appender(params);
>> +#endif
>>       setup_end_tag();
>>
>>       printf("commandline: %s\n"
>> --
>> 1.8.1.1
>>
>>
>> _______________________________________________
>> barebox mailing list
>> barebox at lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/barebox
>>
>
> --
> Pengutronix e.K.                           |                             |
> Industrial Linux Solutions                 | http://www.pengutronix.de/  |
> Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



More information about the barebox mailing list