[U-Boot] [PATCH v3 1/2] MX25: tx25: Avoid the usage of extern in C file

Avoid the usage of extern in C file as pointed out by checkpatch.
Signed-off-by: Fabio Estevam fabio.estevam@freescale.com --- Changes since v2: - Place the extern in the MX25 imx-regs.h instead of inside the MX27 imx-regs.h Changes since v1: - No changes arch/arm/include/asm/arch-mx25/imx-regs.h | 1 + board/karo/tx25/tx25.c | 1 - 2 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/arch/arm/include/asm/arch-mx25/imx-regs.h b/arch/arm/include/asm/arch-mx25/imx-regs.h index 9e30f7c..7e34050 100644 --- a/arch/arm/include/asm/arch-mx25/imx-regs.h +++ b/arch/arm/include/asm/arch-mx25/imx-regs.h @@ -37,6 +37,7 @@ #ifdef CONFIG_FEC_MXC extern void mx25_fec_init_pins(void); extern void imx_get_mac_from_fuse(unsigned char *mac); +extern void mx25_uart1_init_pins(void); #endif
/* Clock Control Module (CCM) registers */ diff --git a/board/karo/tx25/tx25.c b/board/karo/tx25/tx25.c index 25b99e8..2787715 100644 --- a/board/karo/tx25/tx25.c +++ b/board/karo/tx25/tx25.c @@ -141,7 +141,6 @@ void tx25_fec_init(void) int board_init() { #ifdef CONFIG_MXC_UART - extern void mx25_uart1_init_pins(void);
mx25_uart1_init_pins(); #endif

Add the initial support for MX25PDK booting from SD card via internal boot.
Signed-off-by: Fabio Estevam fabio.estevam@freescale.com --- Changes since v2: - No changes Changes since v1: - Keep mx25pdk entry to boards.cfg sorted - Removed unused defines in mx25pdk.h - Do not use the whole RAM space for memory test MAINTAINERS | 1 + board/freescale/mx25pdk/Makefile | 49 ++++++++++++++ board/freescale/mx25pdk/imximage.cfg | 73 +++++++++++++++++++++ board/freescale/mx25pdk/lowlevel_init.S | 21 ++++++ board/freescale/mx25pdk/mx25pdk.c | 62 ++++++++++++++++++ boards.cfg | 1 + include/configs/mx25pdk.h | 106 +++++++++++++++++++++++++++++++ 7 files changed, 313 insertions(+), 0 deletions(-) create mode 100644 board/freescale/mx25pdk/Makefile create mode 100644 board/freescale/mx25pdk/imximage.cfg create mode 100644 board/freescale/mx25pdk/lowlevel_init.S create mode 100644 board/freescale/mx25pdk/mx25pdk.c create mode 100644 include/configs/mx25pdk.h
diff --git a/MAINTAINERS b/MAINTAINERS index f895e9a..7f07b60 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -645,6 +645,7 @@ Kristoffer Ericson kristoffer.ericson@gmail.com
Fabio Estevam fabio.estevam@freescale.com
+ mx25pdk i.MX25 mx31pdk i.MX31 mx53ard i.MX53 mx53smd i.MX53 diff --git a/board/freescale/mx25pdk/Makefile b/board/freescale/mx25pdk/Makefile new file mode 100644 index 0000000..4d45ae3 --- /dev/null +++ b/board/freescale/mx25pdk/Makefile @@ -0,0 +1,49 @@ +# +# Copyright (C) 2007, Guennadi Liakhovetski lg@denx.de +# +# (C) Copyright 2011 Freescale Semiconductor, Inc. +# +# 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +include $(TOPDIR)/config.mk + +LIB = $(obj)lib$(BOARD).o + +COBJS := mx25pdk.o +SOBJS := lowlevel_init.o + +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(obj).depend $(OBJS) $(SOBJS) + $(call cmd_link_o_target, $(OBJS) $(SOBJS)) + +clean: + rm -f $(SOBJS) $(OBJS) + +distclean: clean + rm -f $(LIB) core *.bak .depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/freescale/mx25pdk/imximage.cfg b/board/freescale/mx25pdk/imximage.cfg new file mode 100644 index 0000000..f7af7ff --- /dev/null +++ b/board/freescale/mx25pdk/imximage.cfg @@ -0,0 +1,73 @@ +# +# (C) Copyright 2009 +# Stefano Babic DENX Software Engineering sbabic@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# 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. +# +# Refer docs/README.imxmage for more details about how-to configure +# and create imximage boot image +# +# The syntax is taken as close as possible with the kwbimage + +# Boot Device : one of +# spi, sd (the board has no nand neither onenand) + +BOOT_FROM sd + +# Device Configuration Data (DCD) +# +# Each entry must have the format: +# Addr-type Address Value +# +# where: +# Addr-type register length (1,2 or 4 bytes) +# Address absolute address of the register +# value value to be stored in the register + +# EIM config-CS5 init -- CPLD +DATA 4 0xB8002050 0x0000D843 +DATA 4 0xB8002054 0x22252521 +DATA 4 0xB8002058 0x22220A00 + +# DDR2 init +DATA 4 0xB8001004 0x0076E83A +DATA 4 0xB8001010 0x00000204 +DATA 4 0xB8001000 0x92210000 +DATA 4 0x80000f00 0x12344321 +DATA 4 0xB8001000 0xB2210000 +DATA 1 0x82000000 0xda +DATA 1 0x83000000 0xda +DATA 1 0x81000400 0xda +DATA 1 0x80000333 0xda + +DATA 4 0xB8001000 0x92210000 +DATA 1 0x80000400 0x12345678 + +DATA 4 0xB8001000 0xA2210000 +DATA 4 0x80000000 0x87654321 +DATA 4 0x80000000 0x87654321 + +DATA 4 0xB8001000 0xB2210000 +DATA 1 0x80000233 0xda +DATA 1 0x81000780 0xda +DATA 1 0x81000400 0xda +DATA 4 0xB8001000 0x82216080 +DATA 4 0x43FAC454 0x00001000 + +DATA 4 0x53F80008 0x20034000 + +# Enable the clocks +DATA 4 0x53f8000c 0x1fffffff +DATA 4 0x53f80010 0xffffffff +DATA 4 0x53f80014 0xfdfff diff --git a/board/freescale/mx25pdk/lowlevel_init.S b/board/freescale/mx25pdk/lowlevel_init.S new file mode 100644 index 0000000..6e6810f --- /dev/null +++ b/board/freescale/mx25pdk/lowlevel_init.S @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2011 Freescale Semiconductor + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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. + */ + +.globl lowlevel_init +lowlevel_init: + + mov pc, lr diff --git a/board/freescale/mx25pdk/mx25pdk.c b/board/freescale/mx25pdk/mx25pdk.c new file mode 100644 index 0000000..bb27824 --- /dev/null +++ b/board/freescale/mx25pdk/mx25pdk.c @@ -0,0 +1,62 @@ +/* + * (C) Copyright 2011 Freescale Semiconductor, Inc. + * + * Author: Fabio Estevam fabio.estevam@freescale.com + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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 <common.h> +#include <asm/io.h> +#include <asm/arch/imx-regs.h> +#include <asm/arch/imx25-pinmux.h> + +DECLARE_GLOBAL_DATA_PTR; + +int dram_init(void) +{ + /* dram_init must store complete ramsize in gd->ram_size */ + gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE, + PHYS_SDRAM_1_SIZE); + return 0; +} + +void dram_init_banksize(void) +{ + gd->bd->bi_dram[0].start = PHYS_SDRAM_1; + gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; +} + +int board_early_init_f(void) +{ + mx25_uart1_init_pins(); + + return 0; +} + +int board_init(void) +{ + gd->bd->bi_arch_number = MACH_TYPE_MX25_3DS; + /* address of boot parameters */ + gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; + + return 0; +} + +int checkboard(void) +{ + puts("Board: MX25PDK\n"); + + return 0; +} diff --git a/boards.cfg b/boards.cfg index c31114d..17452e4 100644 --- a/boards.cfg +++ b/boards.cfg @@ -162,6 +162,7 @@ rd6281a arm arm926ejs - Marvell sheevaplug arm arm926ejs - Marvell kirkwood dockstar arm arm926ejs - Seagate kirkwood jadecpu arm arm926ejs jadecpu syteco mb86r0x +mx25pdk arm arm926ejs mx25pdk freescale mx25 mx25pdk:IMX_CONFIG=board/freescale/mx25pdk/imximage.cfg zmx25 arm arm926ejs zmx25 syteco mx25 imx27lite arm arm926ejs imx27lite logicpd mx27 magnesium arm arm926ejs imx27lite logicpd mx27 diff --git a/include/configs/mx25pdk.h b/include/configs/mx25pdk.h new file mode 100644 index 0000000..fc80a71 --- /dev/null +++ b/include/configs/mx25pdk.h @@ -0,0 +1,106 @@ +/* + * (C) Copyright 2011 Freescale Semiconductor, Inc. + * + * 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. + */ + +#ifndef __CONFIG_H +#define __CONFIG_H + +/* High Level Configuration Options */ + +#define CONFIG_MX25_CLK32 32768 /* OSC32K frequency */ +#define CONFIG_SYS_HZ 1000 +#define CONFIG_SYS_TEXT_BASE 0x81200000 + +#define CONFIG_DISPLAY_CPUINFO +#define CONFIG_DISPLAY_BOARDINFO + +#define CONFIG_CMDLINE_TAG /* enable passing of ATAGs */ +#define CONFIG_SETUP_MEMORY_TAGS +#define CONFIG_INITRD_TAG + +/* Size of malloc() pool */ +#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 2 * 1024 * 1024) + +/* Physical Memory Map */ + +#define CONFIG_NR_DRAM_BANKS 1 +#define PHYS_SDRAM_1 0x80000000 +#define PHYS_SDRAM_1_SIZE (64 * 1024 * 1024) + +#define CONFIG_BOARD_EARLY_INIT_F + +#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1 +#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x1000 - \ + GENERATED_GBL_DATA_SIZE) + +/* Memory Test */ +#define CONFIG_SYS_MEMTEST_START (PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE/2) +#define CONFIG_SYS_MEMTEST_END (PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE) + +/* Stack sizes */ +#define CONFIG_STACKSIZE (128 * 1024) /* regular stack */ + +/* Serial Info */ +#define CONFIG_MXC_UART +#define CONFIG_SYS_MX25_UART1 +#define CONFIG_CONS_INDEX 1 /* use UART0 for console */ +#define CONFIG_BAUDRATE 115200 /* Default baud rate */ +#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } + +/* No NOR flash present */ +#define CONFIG_ENV_OFFSET (6 * 64 * 1024) +#define CONFIG_ENV_SIZE (8 * 1024) +#define CONFIG_ENV_IS_NOWHERE + +#define CONFIG_SYS_NO_FLASH +#define CONFIG_SYS_64BIT_VSPRINTF + +/* U-Boot general configuration */ +#define CONFIG_SYS_PROMPT "MX25PDK U-Boot > " +#define CONFIG_AUTO_COMPLETE +#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */ +/* Print buffer sz */ +#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + \ + sizeof(CONFIG_SYS_PROMPT) + 16) +#define CONFIG_SYS_MAXARGS 16 /* max number of command args */ +/* Boot Argument Buffer Size */ +#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE +#define CONFIG_CMDLINE_EDITING +#define CONFIG_SYS_LONGHELP + +/* U-Boot commands */ +#include <config_cmd_default.h> +#define CONFIG_CMD_CACHE + +/* Ethernet */ +#define CONFIG_FEC_MXC +#define CONFIG_FEC_MXC_PHYADDR 0x1f +#define CONFIG_MII +#define CONFIG_CMD_NET +#define CONFIG_NET_MULTI +#define CONFIG_ENV_OVERWRITE + +#define CONFIG_BOOTDELAY 3 + +#define CONFIG_LOADADDR 0x81000000 /* loadaddr env var */ +#define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR + +#define CONFIG_EXTRA_ENV_SETTINGS \ + "script=boot.scr\0" \ + "uimage=uImage\0" \ + "netargs=setenv bootargs console=ttymxc0,${baudrate} " \ + "root=/dev/nfs " \ + "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \ + "bootcmd=run netargs; dhcp ${uimage}; bootm\0" \ + +#endif /* __CONFIG_H */

On 09/02/2011 04:02 PM, Fabio Estevam wrote:
Avoid the usage of extern in C file as pointed out by checkpatch.
Signed-off-by: Fabio Estevam fabio.estevam@freescale.com
Hi Fabio,
diff --git a/arch/arm/include/asm/arch-mx25/imx-regs.h b/arch/arm/include/asm/arch-mx25/imx-regs.h index 9e30f7c..7e34050 100644 --- a/arch/arm/include/asm/arch-mx25/imx-regs.h +++ b/arch/arm/include/asm/arch-mx25/imx-regs.h @@ -37,6 +37,7 @@ #ifdef CONFIG_FEC_MXC extern void mx25_fec_init_pins(void); extern void imx_get_mac_from_fuse(unsigned char *mac); +extern void mx25_uart1_init_pins(void);
As i can see, in the imx-regs.h for the different processors there is (as the name says) only definitions and structures for the internal registers of each processor. No function prototypes.
What about to move the prototype ? For MX5/MX35 there is a sys_proto.h (as it is done for other SOCs), in this case, well, it seems too much to add a file for a single line. However, we could move it in clock.h and creating a sys_proto.h if the number of exported functions will increase.
Best regards, Stefano Babic

On Mon, Sep 5, 2011 at 7:43 AM, Stefano Babic sbabic@denx.de wrote: ...
What about to move the prototype ? For MX5/MX35 there is a sys_proto.h (as it is done for other SOCs), in this case, well, it seems too much to add a file for a single line. However, we could move it in clock.h and creating a sys_proto.h if the number of exported functions will increase.
Ok, I can create a sys_proto.h for MX25 and put the following extern´s there:
extern void mx25_fec_init_pins(void); extern void imx_get_mac_from_fuse(unsigned char *mac); extern void mx25_uart1_init_pins(void);
Regards,
Fabio Estevam

On Monday, September 05, 2011 01:37:17 PM Fabio Estevam wrote:
On Mon, Sep 5, 2011 at 7:43 AM, Stefano Babic sbabic@denx.de wrote: ...
What about to move the prototype ? For MX5/MX35 there is a sys_proto.h (as it is done for other SOCs), in this case, well, it seems too much to add a file for a single line. However, we could move it in clock.h and creating a sys_proto.h if the number of exported functions will increase.
Ok, I can create a sys_proto.h for MX25 and put the following extern´s there:
extern void mx25_fec_init_pins(void); extern void imx_get_mac_from_fuse(unsigned char *mac); extern void mx25_uart1_init_pins(void);
Ok, this might be a stupid one, but ...
why use externs in header files ?
Regards,
Fabio Estevam _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot

On Mon, Sep 5, 2011 at 10:05 AM, Marek Vasut marek.vasut@gmail.com wrote: ...
extern void mx25_fec_init_pins(void); extern void imx_get_mac_from_fuse(unsigned char *mac); extern void mx25_uart1_init_pins(void);
Ok, this might be a stupid one, but ...
why use externs in header files ?
This will make checkpatch happy :-)
Regards,
Fabio Estevam

On Monday, September 05, 2011 03:15:44 PM Fabio Estevam wrote:
On Mon, Sep 5, 2011 at 10:05 AM, Marek Vasut marek.vasut@gmail.com wrote: ...
extern void mx25_fec_init_pins(void); extern void imx_get_mac_from_fuse(unsigned char *mac); extern void mx25_uart1_init_pins(void);
Ok, this might be a stupid one, but ...
why use externs in header files ?
This will make checkpatch happy :-)
I'm not quite sure I understand ... ?
Regards,
Fabio Estevam

On Mon, Sep 5, 2011 at 12:05 PM, Marek Vasut marek.vasut@gmail.com wrote:
On Monday, September 05, 2011 03:15:44 PM Fabio Estevam wrote:
On Mon, Sep 5, 2011 at 10:05 AM, Marek Vasut marek.vasut@gmail.com wrote: ...
extern void mx25_fec_init_pins(void); extern void imx_get_mac_from_fuse(unsigned char *mac); extern void mx25_uart1_init_pins(void);
Ok, this might be a stupid one, but ...
why use externs in header files ?
This will make checkpatch happy :-)
I'm not quite sure I understand ... ?
./scripts/checkpatch.pl -F u-boot/board/karo/tx25/tx25.c .... WARNING: externs should be avoided in .c files #144: FILE: home/fabio/denx/u-boot/board/karo/tx25/tx25.c:144: + extern void mx25_uart1_init_pins(void);

On Monday, September 05, 2011 05:38:26 PM Fabio Estevam wrote:
On Mon, Sep 5, 2011 at 12:05 PM, Marek Vasut marek.vasut@gmail.com wrote:
On Monday, September 05, 2011 03:15:44 PM Fabio Estevam wrote:
On Mon, Sep 5, 2011 at 10:05 AM, Marek Vasut marek.vasut@gmail.com wrote: ...
extern void mx25_fec_init_pins(void); extern void imx_get_mac_from_fuse(unsigned char *mac); extern void mx25_uart1_init_pins(void);
Ok, this might be a stupid one, but ...
why use externs in header files ?
This will make checkpatch happy :-)
I'm not quite sure I understand ... ?
./scripts/checkpatch.pl -F u-boot/board/karo/tx25/tx25.c .... WARNING: externs should be avoided in .c files #144: FILE: home/fabio/denx/u-boot/board/karo/tx25/tx25.c:144:
- extern void mx25_uart1_init_pins(void);
But you're using extern in _header_ (.h) file ... so ... why ?

On Mon, Sep 5, 2011 at 12:40 PM, Marek Vasut marek.vasut@gmail.com wrote: ...
./scripts/checkpatch.pl -F u-boot/board/karo/tx25/tx25.c .... WARNING: externs should be avoided in .c files #144: FILE: home/fabio/denx/u-boot/board/karo/tx25/tx25.c:144:
- extern void mx25_uart1_init_pins(void);
But you're using extern in _header_ (.h) file ... so ... why ?
My patch removes the extern from the C file and put it on a header file with other extern's.
The checkpatch warning I showed happens with the original file, and not after my patch is applied.

Dear Fabio Estevam,
In message CAOMZO5A1v5jUkXTF9nKnZh8VNewzkoMB1tMmE9cRJCJDp+y2ug@mail.gmail.com you wrote:
But you're using extern in _header_ (.h) file ... so ... why ?
My patch removes the extern from the C file and put it on a header file with other extern's.
What Marek probably wants to tell yet (in a bit a complicated way) is that you should omit the "extern" in the prototype declaration. Just remove all "extern" from the header file.
Best regards,
Wolfgang Denk

On Monday, September 05, 2011 06:02:21 PM Wolfgang Denk wrote:
Dear Fabio Estevam,
In message
CAOMZO5A1v5jUkXTF9nKnZh8VNewzkoMB1tMmE9cRJCJDp+y2ug@mail.gmail.com you wrote:
But you're using extern in _header_ (.h) file ... so ... why ?
My patch removes the extern from the C file and put it on a header file with other extern's.
What Marek probably wants to tell yet (in a bit a complicated way) is that you should omit the "extern" in the prototype declaration. Just remove all "extern" from the header file.
No, I was asking if there's some special reason for this or it's plain wrong. I see the later's the case.
Thanks, cheers!
Best regards,
Wolfgang Denk

On 09/05/2011 05:48 PM, Fabio Estevam wrote:
On Mon, Sep 5, 2011 at 12:40 PM, Marek Vasut marek.vasut@gmail.com wrote: ...
Hi Fabio,
./scripts/checkpatch.pl -F u-boot/board/karo/tx25/tx25.c .... WARNING: externs should be avoided in .c files #144: FILE: home/fabio/denx/u-boot/board/karo/tx25/tx25.c:144:
extern void mx25_uart1_init_pins(void);
But you're using extern in _header_ (.h) file ... so ... why ?
My patch removes the extern from the C file and put it on a header file with other extern's.
The checkpatch warning I showed happens with the original file, and not after my patch is applied.
I think checkpatch warnings because the original file has already some extern. In the most of u-boot code we do not mark the prototypes with extern. I made this simple test - I create a new file (from sys_proto.h) and I run checkpatch on it:
+#ifndef _SYS_PROTO_H_ +#define _SYS_PROTO_H_ + +u32 get_cpu_rev(void); +#define is_soc_rev(rev) ((get_cpu_rev() & 0xFF) - rev) +void sdelay(unsigned long); +void set_chipselect_size(int const); +#endif
participants (5)
-
Fabio Estevam
-
Fabio Estevam
-
Marek Vasut
-
Stefano Babic
-
Wolfgang Denk