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

Sascha Hauer s.hauer at pengutronix.de
Wed Jan 23 15:51:22 EST 2013


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

> 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