From mboxrd@z Thu Jan 1 00:00:00 1970 From: Uwe =?iso-8859-1?Q?Kleine-K=F6nig?= Date: Thu, 02 Sep 2010 13:26:41 +0000 Subject: Re: [RFC] [PATCH v2] arm & sh: factorised duplicated clkdev.c Message-Id: <20100902132641.GI14214@pengutronix.de> List-Id: References: <1283253402-3139-1-git-send-email-plagnioj@jcrosoft.com> <1283431716-21540-1-git-send-email-plagnioj@jcrosoft.com> In-Reply-To: <1283431716-21540-1-git-send-email-plagnioj@jcrosoft.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To: linux-arm-kernel@lists.infradead.org Hello Jean, On Thu, Sep 02, 2010 at 02:48:36PM +0200, Jean-Christophe PLAGNIOL-VILLARD = wrote: > factorise some generic infrastructure to assist looking up struct clks > for the ARM & SH architecture. >=20 > as the code is identical at 99% >=20 > put the arch specific code for allocation as example in asm/clkdev.h >=20 > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD > --- > V2: >=20 > update base on Russel & Uwe Comments s/Russel/Russell/ BTW. > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > index a7ed21f..1d8a26c 100644 > --- a/arch/arm/Kconfig > +++ b/arch/arm/Kconfig > @@ -221,7 +221,7 @@ config ARCH_INTEGRATOR > bool "ARM Ltd. Integrator family" > select ARM_AMBA > select ARCH_HAS_CPUFREQ > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select ICST > select GENERIC_CLOCKEVENTS > select PLAT_VERSATILE did you think about keeping the name COMMON_CLKDEV? > @@ -231,7 +231,7 @@ config ARCH_INTEGRATOR > config ARCH_REALVIEW > bool "ARM Ltd. RealView family" > select ARM_AMBA > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select ICST > select GENERIC_CLOCKEVENTS > select ARCH_WANT_OPTIONAL_GPIOLIB > @@ -245,7 +245,7 @@ config ARCH_VERSATILE > bool "ARM Ltd. Versatile family" > select ARM_AMBA > select ARM_VIC > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select ICST > select GENERIC_CLOCKEVENTS > select ARCH_WANT_OPTIONAL_GPIOLIB > @@ -259,7 +259,7 @@ config ARCH_VEXPRESS > select ARCH_WANT_OPTIONAL_GPIOLIB > select ARM_AMBA > select ARM_TIMER_SP804 > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select GENERIC_CLOCKEVENTS > select HAVE_CLK > select ICST > @@ -281,7 +281,7 @@ config ARCH_BCMRING > depends on MMU > select CPU_V6 > select ARM_AMBA > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select GENERIC_CLOCKEVENTS > select ARCH_WANT_OPTIONAL_GPIOLIB > help > @@ -328,7 +328,7 @@ config ARCH_EP93XX > select CPU_ARM920T > select ARM_AMBA > select ARM_VIC > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select ARCH_REQUIRE_GPIOLIB > select ARCH_HAS_HOLES_MEMORYMODEL > select ARCH_USES_GETTIMEOFFSET > @@ -348,14 +348,14 @@ config ARCH_MXC > bool "Freescale MXC/iMX-based" > select GENERIC_CLOCKEVENTS > select ARCH_REQUIRE_GPIOLIB > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > help > Support for Freescale MXC/iMX-based family of processors > =20 > config ARCH_STMP3XXX > bool "Freescale STMP3xxx" > select CPU_ARM926T > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select ARCH_REQUIRE_GPIOLIB > select GENERIC_CLOCKEVENTS > select USB_ARCH_HAS_EHCI > @@ -473,7 +473,7 @@ config ARCH_LPC32XX > select HAVE_IDE > select ARM_AMBA > select USB_ARCH_HAS_OHCI > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select GENERIC_TIME > select GENERIC_CLOCKEVENTS > help > @@ -507,7 +507,7 @@ config ARCH_MMP > bool "Marvell PXA168/910/MMP2" > depends on MMU > select ARCH_REQUIRE_GPIOLIB > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select GENERIC_CLOCKEVENTS > select TICK_ONESHOT > select PLAT_PXA > @@ -539,7 +539,7 @@ config ARCH_W90X900 > bool "Nuvoton W90X900 CPU" > select CPU_ARM926T > select ARCH_REQUIRE_GPIOLIB > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select GENERIC_CLOCKEVENTS > help > Support for Nuvoton (Winbond logic dept.) ARM9 processor, > @@ -553,7 +553,7 @@ config ARCH_W90X900 > config ARCH_NUC93X > bool "Nuvoton NUC93X CPU" > select CPU_ARM926T > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > help > Support for Nuvoton (Winbond logic dept.) NUC93X MCU,The NUC93X is a > low-power and high performance MPEG-4/JPEG multimedia controller chip. > @@ -564,7 +564,7 @@ config ARCH_TEGRA > select GENERIC_CLOCKEVENTS > select GENERIC_GPIO > select HAVE_CLK > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select ARCH_HAS_BARRIERS if CACHE_L2X0 > help > This enables support for NVIDIA Tegra based systems (Tegra APX, > @@ -573,7 +573,7 @@ config ARCH_TEGRA > config ARCH_PNX4008 > bool "Philips Nexperia PNX4008 Mobile" > select CPU_ARM926T > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select ARCH_USES_GETTIMEOFFSET > help > This enables support for Philips PNX4008 mobile platform. > @@ -583,7 +583,7 @@ config ARCH_PXA > depends on MMU > select ARCH_MTD_XIP > select ARCH_HAS_CPUFREQ > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select ARCH_REQUIRE_GPIOLIB > select GENERIC_CLOCKEVENTS > select TICK_ONESHOT > @@ -767,7 +767,7 @@ config ARCH_U300 > select ARM_AMBA > select ARM_VIC > select GENERIC_CLOCKEVENTS > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select GENERIC_GPIO > help > Support for ST-Ericsson U300 series mobile platforms. > @@ -777,7 +777,7 @@ config ARCH_U8500 > select CPU_V7 > select ARM_AMBA > select GENERIC_CLOCKEVENTS > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select ARCH_REQUIRE_GPIOLIB > help > Support for ST-Ericsson's Ux500 architecture > @@ -787,7 +787,7 @@ config ARCH_NOMADIK > select ARM_AMBA > select ARM_VIC > select CPU_ARM926T > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select GENERIC_CLOCKEVENTS > select ARCH_REQUIRE_GPIOLIB > help > @@ -799,7 +799,7 @@ config ARCH_DAVINCI > select ARCH_REQUIRE_GPIOLIB > select ZONE_DMA > select HAVE_IDE > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select GENERIC_ALLOCATOR > select ARCH_HAS_HOLES_MEMORYMODEL > help > @@ -819,7 +819,7 @@ config PLAT_SPEAR > bool "ST SPEAr" > select ARM_AMBA > select ARCH_REQUIRE_GPIOLIB > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select GENERIC_CLOCKEVENTS > select HAVE_CLK > help > diff --git a/arch/arm/common/Kconfig b/arch/arm/common/Kconfig > index 0a34c81..778655f 100644 > --- a/arch/arm/common/Kconfig > +++ b/arch/arm/common/Kconfig > @@ -37,7 +37,3 @@ config SHARP_PARAM > =20 > config SHARP_SCOOP > bool > - > -config COMMON_CLKDEV > - bool > - select HAVE_CLK > diff --git a/arch/arm/common/Makefile b/arch/arm/common/Makefile > index e6e8664..799e140 100644 > --- a/arch/arm/common/Makefile > +++ b/arch/arm/common/Makefile > @@ -16,4 +16,3 @@ obj-$(CONFIG_SHARP_SCOOP) +=3D scoop.o > obj-$(CONFIG_ARCH_IXP2000) +=3D uengine.o > obj-$(CONFIG_ARCH_IXP23XX) +=3D uengine.o > obj-$(CONFIG_PCI_HOST_ITE8152) +=3D it8152.o > -obj-$(CONFIG_COMMON_CLKDEV) +=3D clkdev.o > diff --git a/arch/arm/include/asm/clkdev.h b/arch/arm/include/asm/clkdev.h > index b56c138..1293780 100644 > --- a/arch/arm/include/asm/clkdev.h > +++ b/arch/arm/include/asm/clkdev.h > @@ -1,5 +1,5 @@ > /* > - * arch/arm/include/asm/clkdev.h > + * arch/arm/include/linux/clkdev.h ??, arch/arm/include/asm/clkdev.h was correct, no? > * > * Copyright (C) 2008 Russell King. > * > @@ -12,23 +12,13 @@ > #ifndef __ASM_CLKDEV_H > #define __ASM_CLKDEV_H > =20 > -struct clk; > -struct device; > +#include > =20 > -struct clk_lookup { > - struct list_head node; > - const char *dev_id; > - const char *con_id; > - struct clk *clk; > -}; > +#include > =20 > -struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id, > - const char *dev_fmt, ...); > - > -void clkdev_add(struct clk_lookup *cl); > -void clkdev_drop(struct clk_lookup *cl); > - > -void clkdev_add_table(struct clk_lookup *, size_t); > -int clk_add_alias(const char *, const char *, char *, struct device *); > +static inline struct clk_lookup_alloc *__clkdev_alloc(size_t size) > +{ > + return kzalloc(size, GFP_KERNEL); > +} > =20 > #endif > diff --git a/arch/arm/mach-bcmring/clock.c b/arch/arm/mach-bcmring/clock.c > index 14bafc3..ad237a4 100644 > --- a/arch/arm/mach-bcmring/clock.c > +++ b/arch/arm/mach-bcmring/clock.c > @@ -21,13 +21,12 @@ > #include > #include > #include > +#include > #include > #include > #include > #include > =20 > -#include > - > #include "clock.h" > =20 > #define clk_is_primary(x) ((x)->type & CLK_TYPE_PRIMARY) > diff --git a/arch/arm/mach-bcmring/core.c b/arch/arm/mach-bcmring/core.c > index d3f959e..ed96ef4 100644 > --- a/arch/arm/mach-bcmring/core.c > +++ b/arch/arm/mach-bcmring/core.c > @@ -30,10 +30,10 @@ > #include > #include > #include > +#include > =20 > #include > #include > -#include > #include > #include > #include > diff --git a/arch/arm/mach-davinci/clock.h b/arch/arm/mach-davinci/clock.h > index 01e3648..64c58ad 100644 > --- a/arch/arm/mach-davinci/clock.h > +++ b/arch/arm/mach-davinci/clock.h > @@ -68,7 +68,7 @@ > #ifndef __ASSEMBLER__ > =20 > #include > -#include > +#include > =20 > struct pll_data { > u32 phys_base; > diff --git a/arch/arm/mach-ep93xx/clock.c b/arch/arm/mach-ep93xx/clock.c > index 8bf3cec..f60d636 100644 > --- a/arch/arm/mach-ep93xx/clock.c > +++ b/arch/arm/mach-ep93xx/clock.c > @@ -19,10 +19,10 @@ > #include > #include > #include > +#include > =20 > #include > =20 > -#include > #include > =20 > =20 > diff --git a/arch/arm/mach-imx/clock-imx1.c b/arch/arm/mach-imx/clock-imx= 1.c > index c05096c..9c848d9 100644 > --- a/arch/arm/mach-imx/clock-imx1.c > +++ b/arch/arm/mach-imx/clock-imx1.c > @@ -22,8 +22,7 @@ > #include > #include > #include > - > -#include > +#include > =20 > #include > #include > diff --git a/arch/arm/mach-imx/clock-imx21.c b/arch/arm/mach-imx/clock-im= x21.c > index bb419ef..19e966e 100644 > --- a/arch/arm/mach-imx/clock-imx21.c > +++ b/arch/arm/mach-imx/clock-imx21.c > @@ -21,11 +21,11 @@ > #include > #include > #include > +#include > =20 > #include > #include > #include > -#include > #include > =20 > #define IO_ADDR_CCM(off) (MX21_IO_ADDRESS(MX21_CCM_BASE_ADDR + (off))) > diff --git a/arch/arm/mach-imx/clock-imx27.c b/arch/arm/mach-imx/clock-im= x27.c > index 5a1aa15..f121114 100644 > --- a/arch/arm/mach-imx/clock-imx27.c > +++ b/arch/arm/mach-imx/clock-imx27.c > @@ -21,8 +21,8 @@ > #include > #include > #include > +#include > =20 > -#include > #include > =20 > #include > diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/c= ore.c > index 8f4fb6d..b8e884b 100644 > --- a/arch/arm/mach-integrator/core.c > +++ b/arch/arm/mach-integrator/core.c > @@ -21,9 +21,8 @@ > #include > #include > #include > +#include > =20 > -#include > -#include > #include > #include > #include > diff --git a/arch/arm/mach-integrator/impd1.c b/arch/arm/mach-integrator/= impd1.c > index fd684bf..5db574f 100644 > --- a/arch/arm/mach-integrator/impd1.c > +++ b/arch/arm/mach-integrator/impd1.c > @@ -22,9 +22,8 @@ > #include > #include > #include > +#include > =20 > -#include > -#include > #include > #include > #include > diff --git a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-int= egrator/integrator_cp.c > index 05db40e..fce64fc 100644 > --- a/arch/arm/mach-integrator/integrator_cp.c > +++ b/arch/arm/mach-integrator/integrator_cp.c > @@ -21,9 +21,8 @@ > #include > #include > #include > +#include > =20 > -#include > -#include > #include > #include > #include > diff --git a/arch/arm/mach-lpc32xx/clock.c b/arch/arm/mach-lpc32xx/clock.c > index 32d6379..da0e649 100644 > --- a/arch/arm/mach-lpc32xx/clock.c > +++ b/arch/arm/mach-lpc32xx/clock.c > @@ -90,10 +90,9 @@ > #include > #include > #include > +#include > =20 > #include > -#include > -#include > #include > #include "clock.h" > #include "common.h" > diff --git a/arch/arm/mach-mmp/clock.h b/arch/arm/mach-mmp/clock.h > index 016ae94..9b027d7 100644 > --- a/arch/arm/mach-mmp/clock.h > +++ b/arch/arm/mach-mmp/clock.h > @@ -6,7 +6,7 @@ > * published by the Free Software Foundation. > */ > =20 > -#include > +#include > =20 > struct clkops { > void (*enable)(struct clk *); > diff --git a/arch/arm/mach-mx25/clock.c b/arch/arm/mach-mx25/clock.c > index 40c7cc4..b3196bb 100644 > --- a/arch/arm/mach-mx25/clock.c > +++ b/arch/arm/mach-mx25/clock.c > @@ -21,8 +21,7 @@ > #include > #include > #include > - > -#include > +#include > =20 > #include > #include > diff --git a/arch/arm/mach-mx3/clock-imx31.c b/arch/arm/mach-mx3/clock-im= x31.c > index 9a9eb6d..2ba7094 100644 > --- a/arch/arm/mach-mx3/clock-imx31.c > +++ b/arch/arm/mach-mx3/clock-imx31.c > @@ -23,8 +23,8 @@ > #include > #include > #include > +#include > =20 > -#include > #include > =20 > #include > diff --git a/arch/arm/mach-mx3/clock-imx35.c b/arch/arm/mach-mx3/clock-im= x35.c > index d3af0fd..2d17c03 100644 > --- a/arch/arm/mach-mx3/clock-imx35.c > +++ b/arch/arm/mach-mx3/clock-imx35.c > @@ -21,8 +21,7 @@ > #include > #include > #include > - > -#include > +#include > =20 > #include > #include > diff --git a/arch/arm/mach-mx5/clock-mx51.c b/arch/arm/mach-mx5/clock-mx5= 1.c > index 6af69de..e599b6d 100644 > --- a/arch/arm/mach-mx5/clock-mx51.c > +++ b/arch/arm/mach-mx5/clock-mx51.c > @@ -14,8 +14,8 @@ > #include > #include > #include > +#include > =20 > -#include > #include > =20 > #include > diff --git a/arch/arm/mach-mxc91231/clock.c b/arch/arm/mach-mxc91231/cloc= k.c > index 5c85075..9fab505 100644 > --- a/arch/arm/mach-mxc91231/clock.c > +++ b/arch/arm/mach-mxc91231/clock.c > @@ -2,12 +2,12 @@ > #include > #include > #include > +#include > =20 > #include > #include > #include > =20 > -#include > #include > #include > =20 > diff --git a/arch/arm/mach-nomadik/clock.c b/arch/arm/mach-nomadik/clock.c > index 89f793a..48a59f2 100644 > --- a/arch/arm/mach-nomadik/clock.c > +++ b/arch/arm/mach-nomadik/clock.c > @@ -7,7 +7,7 @@ > #include > #include > #include > -#include > +#include > #include "clock.h" > =20 > /* > diff --git a/arch/arm/mach-nuc93x/clock.h b/arch/arm/mach-nuc93x/clock.h > index 18e51be..4de1f1d 100644 > --- a/arch/arm/mach-nuc93x/clock.h > +++ b/arch/arm/mach-nuc93x/clock.h > @@ -10,7 +10,7 @@ > * the Free Software Foundation; either version 2 of the License. > */ > =20 > -#include > +#include > =20 > void nuc93x_clk_enable(struct clk *clk, int enable); > void clks_register(struct clk_lookup *clks, size_t num); > diff --git a/arch/arm/mach-omap1/clock.c b/arch/arm/mach-omap1/clock.c > index b8c7fb9..84ef704 100644 > --- a/arch/arm/mach-omap1/clock.c > +++ b/arch/arm/mach-omap1/clock.c > @@ -17,9 +17,9 @@ > #include > #include > #include > +#include > =20 > #include > -#include > =20 > #include > #include > diff --git a/arch/arm/mach-omap2/dpll3xxx.c b/arch/arm/mach-omap2/dpll3xx= x.c > index ed8d330..ebb888f 100644 > --- a/arch/arm/mach-omap2/dpll3xxx.c > +++ b/arch/arm/mach-omap2/dpll3xxx.c > @@ -26,10 +26,10 @@ > #include > #include > #include > +#include > =20 > #include > #include > -#include > =20 > #include "clock.h" > #include "prm.h" > diff --git a/arch/arm/mach-pnx4008/clock.c b/arch/arm/mach-pnx4008/clock.c > index 9d1975f..a4a3819 100644 > --- a/arch/arm/mach-pnx4008/clock.c > +++ b/arch/arm/mach-pnx4008/clock.c > @@ -21,8 +21,7 @@ > #include > #include > #include > - > -#include > +#include > =20 > #include > #include > diff --git a/arch/arm/mach-pxa/clock.c b/arch/arm/mach-pxa/clock.c > index abba008..4e4a84b 100644 > --- a/arch/arm/mach-pxa/clock.c > +++ b/arch/arm/mach-pxa/clock.c > @@ -11,8 +11,8 @@ > #include > #include > #include > +#include > =20 > -#include > #include > #include > =20 > diff --git a/arch/arm/mach-pxa/clock.h b/arch/arm/mach-pxa/clock.h > index d848874..12cc0e8 100644 > --- a/arch/arm/mach-pxa/clock.h > +++ b/arch/arm/mach-pxa/clock.h > @@ -1,4 +1,4 @@ > -#include > +#include > =20 > struct clkops { > void (*enable)(struct clk *); > diff --git a/arch/arm/mach-realview/core.c b/arch/arm/mach-realview/core.c > index 2fa38df..cda8b04 100644 > --- a/arch/arm/mach-realview/core.c > +++ b/arch/arm/mach-realview/core.c > @@ -30,8 +30,8 @@ > #include > #include > #include > +#include > =20 > -#include > #include > #include > #include > @@ -47,7 +47,6 @@ > =20 > #include > =20 > -#include > #include > #include > #include > diff --git a/arch/arm/mach-shmobile/Kconfig b/arch/arm/mach-shmobile/Kcon= fig > index 54b479c..f8f06e9 100644 > --- a/arch/arm/mach-shmobile/Kconfig > +++ b/arch/arm/mach-shmobile/Kconfig > @@ -6,7 +6,7 @@ config ARCH_SH7367 > bool "SH-Mobile G3 (SH7367)" > select CPU_V6 > select HAVE_CLK > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select SH_CLK_CPG > select GENERIC_CLOCKEVENTS > =20 > @@ -14,7 +14,7 @@ config ARCH_SH7377 > bool "SH-Mobile G4 (SH7377)" > select CPU_V7 > select HAVE_CLK > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select SH_CLK_CPG > select GENERIC_CLOCKEVENTS > =20 > @@ -22,7 +22,7 @@ config ARCH_SH7372 > bool "SH-Mobile AP4 (SH7372)" > select CPU_V7 > select HAVE_CLK > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > select SH_CLK_CPG > select GENERIC_CLOCKEVENTS > =20 > diff --git a/arch/arm/mach-shmobile/clock-sh7367.c b/arch/arm/mach-shmobi= le/clock-sh7367.c > index b6454c9..3030935 100644 > --- a/arch/arm/mach-shmobile/clock-sh7367.c > +++ b/arch/arm/mach-shmobile/clock-sh7367.c > @@ -20,8 +20,8 @@ > #include > #include > #include > +#include > #include > -#include > =20 > /* SH7367 registers */ > #define RTFRQCR 0xe6150000 > diff --git a/arch/arm/mach-shmobile/clock-sh7372.c b/arch/arm/mach-shmobi= le/clock-sh7372.c > index fb4e9b1..907f46d 100644 > --- a/arch/arm/mach-shmobile/clock-sh7372.c > +++ b/arch/arm/mach-shmobile/clock-sh7372.c > @@ -20,8 +20,8 @@ > #include > #include > #include > +#include > #include > -#include > =20 > /* SH7372 registers */ > #define FRQCRA 0xe6150000 > diff --git a/arch/arm/mach-shmobile/clock-sh7377.c b/arch/arm/mach-shmobi= le/clock-sh7377.c > index e007c28..a322c9b 100644 > --- a/arch/arm/mach-shmobile/clock-sh7377.c > +++ b/arch/arm/mach-shmobile/clock-sh7377.c > @@ -20,8 +20,8 @@ > #include > #include > #include > +#include > #include > -#include > =20 > /* SH7377 registers */ > #define RTFRQCR 0xe6150000 > diff --git a/arch/arm/mach-tegra/clock.c b/arch/arm/mach-tegra/clock.c > index 03ad578..cad740c 100644 > --- a/arch/arm/mach-tegra/clock.c > +++ b/arch/arm/mach-tegra/clock.c > @@ -24,7 +24,7 @@ > #include > #include > #include > -#include > +#include > =20 > #include "clock.h" > =20 > diff --git a/arch/arm/mach-tegra/clock.h b/arch/arm/mach-tegra/clock.h > index af7c70e..39a87e7 100644 > --- a/arch/arm/mach-tegra/clock.h > +++ b/arch/arm/mach-tegra/clock.h > @@ -21,7 +21,7 @@ > #define __MACH_TEGRA_CLOCK_H > =20 > #include > -#include > +#include > =20 > #define DIV_BUS (1 << 0) > #define DIV_U71 (1 << 1) > diff --git a/arch/arm/mach-tegra/tegra2_clocks.c b/arch/arm/mach-tegra/te= gra2_clocks.c > index 4261632..d2cecbf 100644 > --- a/arch/arm/mach-tegra/tegra2_clocks.c > +++ b/arch/arm/mach-tegra/tegra2_clocks.c > @@ -24,8 +24,7 @@ > #include > #include > #include > - > -#include > +#include > =20 > #include > =20 > diff --git a/arch/arm/mach-u300/clock.c b/arch/arm/mach-u300/clock.c > index 60acf9e..cb3ab08 100644 > --- a/arch/arm/mach-u300/clock.c > +++ b/arch/arm/mach-u300/clock.c > @@ -25,8 +25,8 @@ > #include > #include > #include > +#include > =20 > -#include > #include > #include > =20 > diff --git a/arch/arm/mach-ux500/clock.c b/arch/arm/mach-ux500/clock.c > index d8ab7f1..df238ab 100644 > --- a/arch/arm/mach-ux500/clock.c > +++ b/arch/arm/mach-ux500/clock.c > @@ -13,8 +13,7 @@ > #include > #include > #include > - > -#include > +#include > =20 > #include > #include > diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/cor= e.c > index e38acb0..8c1ca1d 100644 > --- a/arch/arm/mach-versatile/core.c > +++ b/arch/arm/mach-versatile/core.c > @@ -31,8 +31,8 @@ > #include > #include > #include > +#include > =20 > -#include > #include > #include > #include > @@ -46,7 +46,6 @@ > #include > #include > #include > -#include > #include > #include > #include > diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/c= t-ca9x4.c > index 577df6c..fb94f30 100644 > --- a/arch/arm/mach-vexpress/ct-ca9x4.c > +++ b/arch/arm/mach-vexpress/ct-ca9x4.c > @@ -8,8 +8,8 @@ > #include > #include > #include > +#include > =20 > -#include > #include > #include > #include > @@ -18,7 +18,6 @@ > #include > #include > =20 > -#include > #include > =20 > #include > diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c > index 817f0ad..919103d 100644 > --- a/arch/arm/mach-vexpress/v2m.c > +++ b/arch/arm/mach-vexpress/v2m.c > @@ -11,15 +11,14 @@ > #include > #include > #include > +#include > =20 > -#include > #include > #include > #include > #include > #include > =20 > -#include > #include > =20 > #include > diff --git a/arch/arm/mach-w90x900/clock.h b/arch/arm/mach-w90x900/clock.h > index c56ddab..b88a1b1 100644 > --- a/arch/arm/mach-w90x900/clock.h > +++ b/arch/arm/mach-w90x900/clock.h > @@ -10,7 +10,7 @@ > * the Free Software Foundation; either version 2 of the License. > */ > =20 > -#include > +#include > =20 > void nuc900_clk_enable(struct clk *clk, int enable); > void nuc900_subclk_enable(struct clk *clk, int enable); > diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig > index e39a417..271d7b8 100644 > --- a/arch/arm/plat-omap/Kconfig > +++ b/arch/arm/plat-omap/Kconfig > @@ -11,13 +11,13 @@ choice > =20 > config ARCH_OMAP1 > bool "TI OMAP1" > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > help > "Systems based on omap7xx, omap15xx or omap16xx" > =20 > config ARCH_OMAP2PLUS > bool "TI OMAP2/3/4" > - select COMMON_CLKDEV > + select CLKDEV_LOOKUP > help > "Systems based on omap24xx, omap34xx or omap44xx" > =20 > diff --git a/arch/arm/plat-omap/include/plat/clkdev_omap.h b/arch/arm/pla= t-omap/include/plat/clkdev_omap.h > index bb937f3..4b2028a 100644 > --- a/arch/arm/plat-omap/include/plat/clkdev_omap.h > +++ b/arch/arm/plat-omap/include/plat/clkdev_omap.h > @@ -8,7 +8,7 @@ > #ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_PLAT_CLKDEV_OMAP_H > #define __ARCH_ARM_PLAT_OMAP_INCLUDE_PLAT_CLKDEV_OMAP_H > =20 > -#include > +#include > =20 > struct omap_clk { > u16 cpu; > diff --git a/arch/arm/plat-spear/include/plat/clock.h b/arch/arm/plat-spe= ar/include/plat/clock.h > index 298bafc..2572260 100644 > --- a/arch/arm/plat-spear/include/plat/clock.h > +++ b/arch/arm/plat-spear/include/plat/clock.h > @@ -15,7 +15,7 @@ > #define __PLAT_CLOCK_H > =20 > #include > -#include > +#include > #include > =20 > /* clk structure flags */ > diff --git a/arch/arm/plat-stmp3xxx/clock.c b/arch/arm/plat-stmp3xxx/cloc= k.c > index e593a2a..2e712e1 100644 > --- a/arch/arm/plat-stmp3xxx/clock.c > +++ b/arch/arm/plat-stmp3xxx/clock.c > @@ -25,9 +25,9 @@ > #include > #include > #include > +#include > =20 > #include > -#include > #include > #include > =20 > diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig > index 33990fa..b5f8a0f 100644 > --- a/arch/sh/Kconfig > +++ b/arch/sh/Kconfig > @@ -8,7 +8,7 @@ mainmenu "Linux/SuperH Kernel Configuration" > config SUPERH > def_bool y > select EMBEDDED > - select HAVE_CLK > + select CLKDEV_LOOKUP > select HAVE_IDE if HAS_IOPORT > select HAVE_MEMBLOCK > select HAVE_OPROFILE > diff --git a/arch/sh/boards/mach-highlander/setup.c b/arch/sh/boards/mach= -highlander/setup.c > index a5ecfba..87618c9 100644 > --- a/arch/sh/boards/mach-highlander/setup.c > +++ b/arch/sh/boards/mach-highlander/setup.c > @@ -24,10 +24,10 @@ > #include > #include > #include > +#include > #include > #include > #include > -#include > #include > #include > #include > diff --git a/arch/sh/include/asm/clkdev.h b/arch/sh/include/asm/clkdev.h > dissimilarity index 69% > index 5645f35..6ba9186 100644 > --- a/arch/sh/include/asm/clkdev.h > +++ b/arch/sh/include/asm/clkdev.h > @@ -1,35 +1,31 @@ > -/* > - * arch/sh/include/asm/clkdev.h > - * > - * Cloned from arch/arm/include/asm/clkdev.h: > - * > - * Copyright (C) 2008 Russell King. > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License version 2 as > - * published by the Free Software Foundation. > - * > - * Helper for the clk API to assist looking up a struct clk. > - */ > -#ifndef __ASM_CLKDEV_H > -#define __ASM_CLKDEV_H > - > -struct clk; > - > -struct clk_lookup { > - struct list_head node; > - const char *dev_id; > - const char *con_id; > - struct clk *clk; > -}; > - > -struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id, > - const char *dev_fmt, ...); > - > -void clkdev_add(struct clk_lookup *cl); > -void clkdev_drop(struct clk_lookup *cl); > - > -void clkdev_add_table(struct clk_lookup *, size_t); > -int clk_add_alias(const char *, const char *, char *, struct device *); > - > -#endif > +/* > + * Copyright (C) 2010 Paul Mundt > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * Helper for the clk API to assist looking up a struct clk. > + */ > + > +#ifndef __CLKDEV__H_ > +#define __CLKDEV__H_ > + > +#include > +#include > +#include > + > +#include > + > +static inline struct clk_lookup_alloc *__clkdev_alloc(size_t size) > +{ > + if (!slab_is_available()) > + return alloc_bootmem_low_pages(size); > + else > + return kzalloc(size, GFP_KERNEL); > +} > + > +#define __clk_put(clk) > +#define __clk_get(clk) ({ 1; }) > + > +#endif /* __CLKDEV_H__ */ > diff --git a/arch/sh/kernel/Makefile b/arch/sh/kernel/Makefile > index e25f3c6..e4fe614 100644 > --- a/arch/sh/kernel/Makefile > +++ b/arch/sh/kernel/Makefile > @@ -11,7 +11,7 @@ endif > =20 > CFLAGS_REMOVE_return_address.o =3D -pg > =20 > -obj-y :=3D clkdev.o debugtraps.o dma-nommu.o dumpstack.o \ > +obj-y :=3D debugtraps.o dma-nommu.o dumpstack.o \ > idle.o io.o irq.o \ > irq_$(BITS).o machvec.o nmi_debug.o process.o \ > process_$(BITS).o ptrace_$(BITS).o \ > diff --git a/arch/sh/kernel/clkdev.c b/arch/sh/kernel/clkdev.c > deleted file mode 100644 > index befc255..0000000 > --- a/arch/sh/kernel/clkdev.c > +++ /dev/null > @@ -1,169 +0,0 @@ > -/* > - * arch/sh/kernel/clkdev.c > - * > - * Cloned from arch/arm/common/clkdev.c: > - * > - * Copyright (C) 2008 Russell King. > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License version 2 as > - * published by the Free Software Foundation. > - * > - * Helper for the clk API to assist looking up a struct clk. > - */ > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -static LIST_HEAD(clocks); > -static DEFINE_MUTEX(clocks_mutex); > - > -/* > - * Find the correct struct clk for the device and connection ID. > - * We do slightly fuzzy matching here: > - * An entry with a NULL ID is assumed to be a wildcard. > - * If an entry has a device ID, it must match > - * If an entry has a connection ID, it must match > - * Then we take the most specific entry - with the following > - * order of precedence: dev+con > dev only > con only. > - */ > -static struct clk *clk_find(const char *dev_id, const char *con_id) > -{ > - struct clk_lookup *p; > - struct clk *clk =3D NULL; > - int match, best =3D 0; > - > - list_for_each_entry(p, &clocks, node) { > - match =3D 0; > - if (p->dev_id) { > - if (!dev_id || strcmp(p->dev_id, dev_id)) > - continue; > - match +=3D 2; > - } > - if (p->con_id) { > - if (!con_id || strcmp(p->con_id, con_id)) > - continue; > - match +=3D 1; > - } > - if (match =3D 0) > - continue; > - > - if (match > best) { > - clk =3D p->clk; > - best =3D match; > - } > - } > - return clk; > -} > - > -struct clk *clk_get_sys(const char *dev_id, const char *con_id) > -{ > - struct clk *clk; > - > - mutex_lock(&clocks_mutex); > - clk =3D clk_find(dev_id, con_id); > - mutex_unlock(&clocks_mutex); > - > - return clk ? clk : ERR_PTR(-ENOENT); > -} > -EXPORT_SYMBOL(clk_get_sys); > - > -void clkdev_add(struct clk_lookup *cl) > -{ > - mutex_lock(&clocks_mutex); > - list_add_tail(&cl->node, &clocks); > - mutex_unlock(&clocks_mutex); > -} > -EXPORT_SYMBOL(clkdev_add); > - > -void __init clkdev_add_table(struct clk_lookup *cl, size_t num) > -{ > - mutex_lock(&clocks_mutex); > - while (num--) { > - list_add_tail(&cl->node, &clocks); > - cl++; > - } > - mutex_unlock(&clocks_mutex); > -} > - > -#define MAX_DEV_ID 20 > -#define MAX_CON_ID 16 > - > -struct clk_lookup_alloc { > - struct clk_lookup cl; > - char dev_id[MAX_DEV_ID]; > - char con_id[MAX_CON_ID]; > -}; > - > -struct clk_lookup * __init_refok > -clkdev_alloc(struct clk *clk, const char *con_id, const char *dev_fmt, .= ..) > -{ > - struct clk_lookup_alloc *cla; > - > - if (!slab_is_available()) > - cla =3D alloc_bootmem_low_pages(sizeof(*cla)); > - else > - cla =3D kzalloc(sizeof(*cla), GFP_KERNEL); > - > - if (!cla) > - return NULL; > - > - cla->cl.clk =3D clk; > - if (con_id) { > - strlcpy(cla->con_id, con_id, sizeof(cla->con_id)); > - cla->cl.con_id =3D cla->con_id; > - } > - > - if (dev_fmt) { > - va_list ap; > - > - va_start(ap, dev_fmt); > - vscnprintf(cla->dev_id, sizeof(cla->dev_id), dev_fmt, ap); > - cla->cl.dev_id =3D cla->dev_id; > - va_end(ap); > - } > - > - return &cla->cl; > -} > -EXPORT_SYMBOL(clkdev_alloc); > - > -int clk_add_alias(const char *alias, const char *alias_dev_name, char *i= d, > - struct device *dev) > -{ > - struct clk *r =3D clk_get(dev, id); > - struct clk_lookup *l; > - > - if (IS_ERR(r)) > - return PTR_ERR(r); > - > - l =3D clkdev_alloc(r, alias, alias_dev_name); > - clk_put(r); > - if (!l) > - return -ENODEV; > - clkdev_add(l); > - return 0; > -} > -EXPORT_SYMBOL(clk_add_alias); > - > -/* > - * clkdev_drop - remove a clock dynamically allocated > - */ > -void clkdev_drop(struct clk_lookup *cl) > -{ > - mutex_lock(&clocks_mutex); > - list_del(&cl->node); > - mutex_unlock(&clocks_mutex); > - kfree(cl); > -} > -EXPORT_SYMBOL(clkdev_drop); > diff --git a/arch/sh/kernel/cpu/clock-cpg.c b/arch/sh/kernel/cpu/clock-cp= g.c > index e2f63d6..dd0e0f2 100644 > --- a/arch/sh/kernel/cpu/clock-cpg.c > +++ b/arch/sh/kernel/cpu/clock-cpg.c > @@ -2,7 +2,7 @@ > #include > #include > #include > -#include > +#include > #include > =20 > static struct clk master_clk =3D { > diff --git a/arch/sh/kernel/cpu/clock.c b/arch/sh/kernel/cpu/clock.c > index 50f887d..4187cf4 100644 > --- a/arch/sh/kernel/cpu/clock.c > +++ b/arch/sh/kernel/cpu/clock.c > @@ -48,20 +48,4 @@ int __init clk_init(void) > return ret; > } > =20 > -/* > - * Returns a clock. Note that we first try to use device id on the bus > - * and clock name. If this fails, we try to use clock name only. > - */ > -struct clk *clk_get(struct device *dev, const char *con_id) > -{ > - const char *dev_id =3D dev ? dev_name(dev) : NULL; > - > - return clk_get_sys(dev_id, con_id); > -} > -EXPORT_SYMBOL_GPL(clk_get); > - > -void clk_put(struct clk *clk) > -{ > -} > -EXPORT_SYMBOL_GPL(clk_put); > =20 > diff --git a/arch/sh/kernel/cpu/sh4/clock-sh4-202.c b/arch/sh/kernel/cpu/= sh4/clock-sh4-202.c > index 4eabc68..6c1492b 100644 > --- a/arch/sh/kernel/cpu/sh4/clock-sh4-202.c > +++ b/arch/sh/kernel/cpu/sh4/clock-sh4-202.c > @@ -13,7 +13,7 @@ > #include > #include > #include > -#include > +#include > #include > #include > =20 > diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7343.c b/arch/sh/kernel/cpu/= sh4a/clock-sh7343.c > index 71291ae..93c6460 100644 > --- a/arch/sh/kernel/cpu/sh4a/clock-sh7343.c > +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7343.c > @@ -21,7 +21,7 @@ > #include > #include > #include > -#include > +#include > #include > =20 > /* SH7343 registers */ > diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7366.c b/arch/sh/kernel/cpu/= sh4a/clock-sh7366.c > index 7ce5bbc..049dc06 100644 > --- a/arch/sh/kernel/cpu/sh4a/clock-sh7366.c > +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7366.c > @@ -21,7 +21,7 @@ > #include > #include > #include > -#include > +#include > #include > =20 > /* SH7366 registers */ > diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7722.c b/arch/sh/kernel/cpu/= sh4a/clock-sh7722.c > index 2030f3d..9d23a36 100644 > --- a/arch/sh/kernel/cpu/sh4a/clock-sh7722.c > +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7722.c > @@ -21,7 +21,7 @@ > #include > #include > #include > -#include > +#include > #include > #include > #include > diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7723.c b/arch/sh/kernel/cpu/= sh4a/clock-sh7723.c > index d3938f0..55493cd 100644 > --- a/arch/sh/kernel/cpu/sh4a/clock-sh7723.c > +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7723.c > @@ -22,7 +22,7 @@ > #include > #include > #include > -#include > +#include > #include > #include > #include > diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7724.c b/arch/sh/kernel/cpu/= sh4a/clock-sh7724.c > index 2d9700c..527936b 100644 > --- a/arch/sh/kernel/cpu/sh4a/clock-sh7724.c > +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7724.c > @@ -22,7 +22,7 @@ > #include > #include > #include > -#include > +#include > #include > #include > #include > diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7757.c b/arch/sh/kernel/cpu/= sh4a/clock-sh7757.c > index 0a752bd..589ee0a 100644 > --- a/arch/sh/kernel/cpu/sh4a/clock-sh7757.c > +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7757.c > @@ -12,7 +12,7 @@ > #include > #include > #include > -#include > +#include > #include > #include > =20 > diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7763.c b/arch/sh/kernel/cpu/= sh4a/clock-sh7763.c > index 1f1df48..599630f 100644 > --- a/arch/sh/kernel/cpu/sh4a/clock-sh7763.c > +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7763.c > @@ -13,7 +13,7 @@ > #include > #include > #include > -#include > +#include > #include > #include > #include > diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7780.c b/arch/sh/kernel/cpu/= sh4a/clock-sh7780.c > index 62d7063..8894926 100644 > --- a/arch/sh/kernel/cpu/sh4a/clock-sh7780.c > +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7780.c > @@ -12,7 +12,7 @@ > #include > #include > #include > -#include > +#include > #include > #include > #include > diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7785.c b/arch/sh/kernel/cpu/= sh4a/clock-sh7785.c > index c3e458a..2d96024 100644 > --- a/arch/sh/kernel/cpu/sh4a/clock-sh7785.c > +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7785.c > @@ -14,7 +14,7 @@ > #include > #include > #include > -#include > +#include > #include > #include > #include > diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7786.c b/arch/sh/kernel/cpu/= sh4a/clock-sh7786.c > index 597c9fb..42e403b 100644 > --- a/arch/sh/kernel/cpu/sh4a/clock-sh7786.c > +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7786.c > @@ -13,7 +13,7 @@ > #include > #include > #include > -#include > +#include > #include > #include > =20 > diff --git a/arch/sh/kernel/cpu/sh4a/clock-shx3.c b/arch/sh/kernel/cpu/sh= 4a/clock-shx3.c > index 236a628..228d7e6 100644 > --- a/arch/sh/kernel/cpu/sh4a/clock-shx3.c > +++ b/arch/sh/kernel/cpu/sh4a/clock-shx3.c > @@ -14,7 +14,7 @@ > #include > #include > #include > -#include > +#include > #include > #include > =20 > diff --git a/drivers/Kconfig b/drivers/Kconfig > index a2b902f..3d93b3a 100644 > --- a/drivers/Kconfig > +++ b/drivers/Kconfig > @@ -111,4 +111,6 @@ source "drivers/xen/Kconfig" > source "drivers/staging/Kconfig" > =20 > source "drivers/platform/Kconfig" > + > +source "drivers/clk/Kconfig" > endmenu > diff --git a/drivers/Makefile b/drivers/Makefile > index ae47344..b0e30b2 100644 > --- a/drivers/Makefile > +++ b/drivers/Makefile > @@ -115,3 +115,5 @@ obj-$(CONFIG_VLYNQ) +=3D vlynq/ > obj-$(CONFIG_STAGING) +=3D staging/ > obj-y +=3D platform/ > obj-y +=3D ieee802154/ > +#common clk code > +obj-y +=3D clk/ > diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig > new file mode 100644 > index 0000000..4168c88 > --- /dev/null > +++ b/drivers/clk/Kconfig > @@ -0,0 +1,4 @@ > + > +config CLKDEV_LOOKUP > + bool > + select HAVE_CLK > diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile > new file mode 100644 > index 0000000..07613fa > --- /dev/null > +++ b/drivers/clk/Makefile > @@ -0,0 +1,2 @@ > + > +obj-$(CONFIG_CLKDEV_LOOKUP) +=3D clkdev.o > diff --git a/arch/arm/common/clkdev.c b/drivers/clk/clkdev.c > similarity index 91% > rename from arch/arm/common/clkdev.c > rename to drivers/clk/clkdev.c > index e2b2bb6..d8b91ae 100644 > --- a/arch/arm/common/clkdev.c > +++ b/drivers/clk/clkdev.c > @@ -1,5 +1,5 @@ > /* > - * arch/arm/common/clkdev.c > + * drivers/clk/clkdev.c > * > * Copyright (C) 2008 Russell King. > * > @@ -18,10 +18,7 @@ > #include > #include > #include > -#include > - > -#include > -#include > +#include > =20 > static LIST_HEAD(clocks); > static DEFINE_MUTEX(clocks_mutex); > @@ -79,6 +76,10 @@ struct clk *clk_get_sys(const char *dev_id, const char= *con_id) > } > EXPORT_SYMBOL(clk_get_sys); > =20 > +/* > + * Returns a clock. Note that we first try to use device id on the bus > + * and clock name. If this fails, we try to use clock name only. > + */ > struct clk *clk_get(struct device *dev, const char *con_id) > { > const char *dev_id =3D dev ? dev_name(dev) : NULL; > @@ -120,12 +121,12 @@ struct clk_lookup_alloc { > char con_id[MAX_CON_ID]; > }; > =20 > -struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id, > - const char *dev_fmt, ...) > +struct clk_lookup * __init_refok > +clkdev_alloc(struct clk *clk, const char *con_id, const char *dev_fmt, .= ..) I'm not very satisfied by Russell's answer. But even if I accept that it should not move to .init.text, why .ref.text? If I'm not mistaken clkdev_alloc references the following non-local symbols: __clkdev_alloc strlcpy vscnprintf non of these are in .init, so I think it's not needed. Russell, would at least __module_or_init be OK? =20 Best regards Uwe --=20 Pengutronix e.K. | Uwe Kleine-K=F6nig | Industrial Linux Solutions | http://www.pengutronix.de/ |