ARM imx51: Add Armadeus systems APF51 support
Subsystems (3)
PATCH 1/1 ARM imx51: Add Armadeus systems APF51 support
From: Julien Boibessot <[email protected]>
The APF51 is an i.M51 based System On Module that can be plugged on several docking/development boards. Here only basic module support is added (Ethernet, Serial, I2C & PMIC (Wolfson's WM8311)).
--- arch/arm/mach-mx5/Kconfig | 10 ++ arch/arm/mach-mx5/Makefile | 1 + arch/arm/mach-mx5/board-apf51.c | 195 +++++++++++++++++++++++++++ arch/arm/plat-mxc/include/mach/uncompress.h | 4 + 4 files changed, 210 insertions(+), 0 deletions(-) create mode 100644 arch/arm/mach-mx5/board-apf51.c
arch/arm/mach-mx5/Kconfig +10 -0
@@ -169,6 +169,16 @@ config MACH_MX51_EFIKASB Include support for Genesi Efika Smartbook. This includes specific configurations for the board and its peripherals. +config MACH_APF51 + bool "Support Armadeus APF51 System On Module" + select SOC_IMX51 + select IMX_HAVE_PLATFORM_IMX_UART + select IMX_HAVE_PLATFORM_IMX_I2C + select IMX_HAVE_PLATFORM_IMX2_WDT + help + Include support for Armadeus systems APF51 System On Module. This + includes specific configurations for the board and its peripherals. + comment "i.MX53 machines:" config MACH_MX53_EVK
arch/arm/mach-mx5/Makefile +1 -0
@@ -21,3 +21,4 @@ obj-$(CONFIG_MX51_EFIKA_COMMON) += mx51_efika.o obj-$(CONFIG_MACH_MX51_EFIKAMX) += board-mx51_efikamx.o obj-$(CONFIG_MACH_MX51_EFIKASB) += board-mx51_efikasb.o obj-$(CONFIG_MACH_MX50_RDP) += board-mx50_rdp.o +obj-$(CONFIG_MACH_APF51) += board-apf51.o
arch/arm/mach-mx5/board-apf51.c new file +195 -0
195 lines not on this page · raw message
arch/arm/plat-mxc/include/mach/uncompress.h +4 -0
@@ -64,6 +64,7 @@ static inline void flush(void)#define MX3X_UART2_BASE_ADDR 0x43F94000#define MX3X_UART5_BASE_ADDR 0x43FB4000#define MX51_UART1_BASE_ADDR 0x73fbc000 +#define MX51_UART3_BASE_ADDR 0x7000c000#define MX50_UART1_BASE_ADDR 0x53fbc000#define MX53_UART1_BASE_ADDR 0x53fbc000
@@ -111,6 +112,9 @@ static __inline__ void __arch_decomp_setup(unsigned long arch_id)case MACH_TYPE_MX51_3DS : uart_base =MX51_UART1_BASE_ADDR ;break ; +case MACH_TYPE_APF51 : + uart_base =MX51_UART3_BASE_ADDR ; +break ;case MACH_TYPE_MX50_RDP : uart_base =MX50_UART1_BASE_ADDR ;break ;
Signature · 1 line
1.7.4.1
PATCH 1/1 ARM imx51: Add Armadeus systems APF51 support
Quoted 6 lines · julien.boibessot at free.fr
arch/arm/mach-mx5/board-apf51.c new file +5
-0+static struct gpio apf51_wm8311_gpios[] = { + {APF51_WM8311_IRQ_GPIO ,GPIOF_IN ,"wm8311_irq" }, + {APF51_WM8311_TOUCH_DETECT_GPIO ,GPIOF_IN ,"wm8311_touch_detect" }, + {APF51_WM8311_TOUCH_EOC_GPIO ,GPIOF_IN ,"wm8311_touch_eoc" }, +};
arch/arm/mach-mx5/board-apf51.c line 91
Quoted 10 lines
arch/arm/mach-mx5/board-apf51.c new file +10
-0+static int apf51_wm8311_pre_init (struct wm831x *wm831x) +{ +int ret; + + ret =gpio_request_array (apf51_wm8311_gpios, +ARRAY_SIZE (apf51_wm8311_gpios)); +if (ret) { +pr_err ("failed to get WM8311 GPIOs: %d\n" , ret); +return ret; + }
These are all interrupts, if you need to request them as GPIOs then the IRQ implementation is buggy.
arch/arm/mach-mx5/board-apf51.c line 98
Quoted 6 lines
arch/arm/mach-mx5/board-apf51.c new file +6
-0+irq_set_irq_type (gpio_to_irq (APF51_WM8311_IRQ_GPIO ), +IRQF_TRIGGER_FALLING ); +irq_set_irq_type (gpio_to_irq (APF51_WM8311_TOUCH_DETECT_GPIO ), +IRQF_TRIGGER_FALLING ); +irq_set_irq_type (gpio_to_irq (APF51_WM8311_TOUCH_EOC_GPIO ), +IRQF_TRIGGER_FALLING );
Similarly here, request_threaded_irq() should be doing anything that's needed.
arch/arm/mach-mx5/board-apf51.c line 106
Quoted 4 lines
arch/arm/mach-mx5/board-apf51.c new file +4
-0+static int apf51_wm8311_post_init (struct wm831x *wm831x) +{ +/* Configure GPIO6: input, pwdmn 0, inverted, CMOS, enable, pullup */ +wm831x_reg_write (wm831x,WM831X_GPIO6_CONTROL ,0xc080 );
Use gpio_defaults in the platform data.
arch/arm/mach-mx5/board-apf51.c line 138
Quoted 11 lines
arch/arm/mach-mx5/board-apf51.c new file +11
-0+static struct wm831x_pdata apf51_wm8311_pdata = { + .pre_init = apf51_wm8311_pre_init, + .post_init = apf51_wm8311_post_init, + .irq_cmos =1 , + .irq_base =MXC_BOARD_IRQ_START , + .status = { + &apf51_wm8311_led1_pdata, + &apf51_wm8311_led2_pdata, + }, + .touch = &apf51_wm8311_touch_pdata, +};
I'm surprised you've not got the ARM supply wired up to cpufreq, though I don't know if the cpufreq driver for the CPU got merged.
Shawn Guo
NAKPATCH 1/1 ARM imx51: Add Armadeus systems APF51 support
In reply to julien.boibessot at free.frQuoted 8 lines · julien.boibessot at free.fr
From: Julien Boibessot <[email protected]>
The APF51 is an i.M51 based System On Module that can be plugged on several docking/development boards. Here only basic module support is added (Ethernet, Serial, I2C & PMIC (Wolfson's WM8311)).
Signed-off-by Julien Boibessot <[email protected]>Signed-off-by Nicolas Colombain <[email protected]>
NAK.
It makes no sense to add yet another non-dt board file for imx51 at this point. Why not starting using device tree?
Regards,
Shawn
Quoted 270 lines
--- arch/arm/mach-mx5/Kconfig | 10 ++ arch/arm/mach-mx5/Makefile | 1 + arch/arm/mach-mx5/board-apf51.c | 195 +++++++++++++++++++++++++++ arch/arm/plat-mxc/include/mach/uncompress.h | 4 + 4 files changed, 210 insertions(+), 0 deletions(-) create mode 100644 arch/arm/mach-mx5/board-apf51.carch/arm/mach-mx5/Kconfig +10
-0@@ -169,6 +169,16 @@ config MACH_MX51_EFIKASB Include support for Genesi Efika Smartbook. This includes specific configurations for the board and its peripherals. +config MACH_APF51 + bool "Support Armadeus APF51 System On Module" + select SOC_IMX51 + select IMX_HAVE_PLATFORM_IMX_UART + select IMX_HAVE_PLATFORM_IMX_I2C + select IMX_HAVE_PLATFORM_IMX2_WDT + help + Include support for Armadeus systems APF51 System On Module. This + includes specific configurations for the board and its peripherals. + comment "i.MX53 machines:" config MACH_MX53_EVKarch/arm/mach-mx5/Makefile +1
-0@@ -21,3 +21,4 @@ obj-$(CONFIG_MX51_EFIKA_COMMON) += mx51_efika.o obj-$(CONFIG_MACH_MX51_EFIKAMX) += board-mx51_efikamx.o obj-$(CONFIG_MACH_MX51_EFIKASB) += board-mx51_efikasb.o obj-$(CONFIG_MACH_MX50_RDP) += board-mx50_rdp.o +obj-$(CONFIG_MACH_APF51) += board-apf51.oarch/arm/mach-mx5/board-apf51.c new file +195
-0@@ -0,0 +1,195 @@ +/* +* Support for APF51 System On Module +* Copyright (C) 2010-2011 Armadeus systems <[email protected]> +* +* Based on code which is: +* Copyright 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved. +* Copyright (C) 2009-2010 Amit Kucheria <[email protected]> +* +* The code contained herein is licensed under the GNU General Public +* License. You may obtain a copy of the GNU General Public License +* Version 2 or later at the following locations: +* +* http://www.opensource.org/licenses/gpl-license.html +* http://www.gnu.org/copyleft/gpl.html +*/ + +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/gpio.h> +#include <linux/irq.h> +#include <linux/mfd/wm831x/core.h> +#include <linux/mfd/wm831x/pdata.h> + +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <asm/mach/time.h> + +#include <mach/common.h> +#include <mach/iomux-mx51.h> + +#include "devices-imx51.h" + +static iomux_v3_cfg_t apf51_pads[] = { +/* UART3 (Console) */ +MX51_PAD_UART3_RXD__UART3_RXD , +MX51_PAD_UART3_TXD__UART3_TXD , + +/* FEC */ +MX51_PAD_DI_GP3__FEC_TX_ER , +MX51_PAD_DI2_PIN4__FEC_CRS , +MX51_PAD_DI2_PIN2__FEC_MDC , +MX51_PAD_DI2_PIN3__FEC_MDIO , +MX51_PAD_DI2_DISP_CLK__FEC_RDATA1 , +MX51_PAD_DI_GP4__FEC_RDATA2 , +MX51_PAD_DISP2_DAT0__FEC_RDATA3 , +MX51_PAD_DISP2_DAT1__FEC_RX_ER , +MX51_PAD_DISP2_DAT6__FEC_TDATA1 , +MX51_PAD_DISP2_DAT7__FEC_TDATA2 , +MX51_PAD_DISP2_DAT8__FEC_TDATA3 , +MX51_PAD_DISP2_DAT9__FEC_TX_EN , +MX51_PAD_DISP2_DAT10__FEC_COL , +MX51_PAD_DISP2_DAT11__FEC_RX_CLK , +MX51_PAD_DISP2_DAT12__FEC_RX_DV , +MX51_PAD_DISP2_DAT13__FEC_TX_CLK , +MX51_PAD_DISP2_DAT14__FEC_RDATA0 , +MX51_PAD_DISP2_DAT15__FEC_TDATA0 , +MX51_PAD_DI1_PIN11__GPIO3_0 ,/* FEC PHY reset line */ + +/* I2C2 */ +MX51_PAD_EIM_D24__I2C2_SDA , +MX51_PAD_EIM_D27__I2C2_SCL , + +/* PMIC */ +MX51_PAD_GPIO1_4__GPIO1_4 ,/* WM8311 TOUCH_DETECT */ +MX51_PAD_GPIO1_6__GPIO1_6 ,/* WM8311 TOUCH_EOC */ +MX51_PAD_GPIO1_7__GPIO1_7 ,/* WM8311 IRQ */ +}; + +#ifdef CONFIG_MFD_WM831X_I2C +/* APF51 has a Wolfson PMIC on I2C2 */ + +#define APF51_WM8311_TOUCH_DETECT_GPIO IMX_GPIO_NR(1, 4) +#define APF51_WM8311_TOUCH_EOC_GPIO IMX_GPIO_NR(1, 6) +#define APF51_WM8311_IRQ_GPIO IMX_GPIO_NR(1, 7) + +static struct gpio apf51_wm8311_gpios[] = { + {APF51_WM8311_IRQ_GPIO ,GPIOF_IN ,"wm8311_irq" }, + {APF51_WM8311_TOUCH_DETECT_GPIO ,GPIOF_IN ,"wm8311_touch_detect" }, + {APF51_WM8311_TOUCH_EOC_GPIO ,GPIOF_IN ,"wm8311_touch_eoc" }, +}; + +static int apf51_wm8311_pre_init (struct wm831x *wm831x) +{ +int ret; + + ret =gpio_request_array (apf51_wm8311_gpios, +ARRAY_SIZE (apf51_wm8311_gpios)); +if (ret) { +pr_err ("failed to get WM8311 GPIOs: %d\n" , ret); +return ret; + } + +irq_set_irq_type (gpio_to_irq (APF51_WM8311_IRQ_GPIO ), +IRQF_TRIGGER_FALLING ); +irq_set_irq_type (gpio_to_irq (APF51_WM8311_TOUCH_DETECT_GPIO ), +IRQF_TRIGGER_FALLING ); +irq_set_irq_type (gpio_to_irq (APF51_WM8311_TOUCH_EOC_GPIO ), +IRQF_TRIGGER_FALLING ); + +return 0 ; +} + +static int apf51_wm8311_post_init (struct wm831x *wm831x) +{ +/* Configure GPIO6: input, pwdmn 0, inverted, CMOS, enable, pullup */ +wm831x_reg_write (wm831x,WM831X_GPIO6_CONTROL ,0xc080 ); + +return 0 ; +} + +static struct wm831x_status_pdata apf51_wm8311_led1_pdata = { + .default_src =WM831X_STATUS_PRESERVE , + .name ="LED1:red:" , +}; + +static struct wm831x_status_pdata apf51_wm8311_led2_pdata = { + .default_src =WM831X_STATUS_PRESERVE , + .name ="LED2:green:" , +}; + +static struct wm831x_touch_pdata apf51_wm8311_touch_pdata = { + .fivewire =0 , + .pressure =1 , + .data_irq =IMX_GPIO_TO_IRQ (APF51_WM8311_TOUCH_EOC_GPIO ), + .pd_irq =IMX_GPIO_TO_IRQ (APF51_WM8311_TOUCH_DETECT_GPIO ), +}; + +static struct wm831x_pdata apf51_wm8311_pdata = { + .pre_init = apf51_wm8311_pre_init, + .post_init = apf51_wm8311_post_init, + .irq_cmos =1 , + .irq_base =MXC_BOARD_IRQ_START , + .status = { + &apf51_wm8311_led1_pdata, + &apf51_wm8311_led2_pdata, + }, + .touch = &apf51_wm8311_touch_pdata, +}; +#endif /* CONFIG_MFD_WM831X_I2C */ + +static const struct imxi2c_platform_data apf51_i2c1_data__initconst = { + .bitrate =400000 , +}; + +static struct i2c_board_info apf51_i2c1_devices[]__initdata = { +#ifdef CONFIG_MFD_WM831X_I2C + { +I2C_BOARD_INFO ("wm8311" ,0x36 ), + .platform_data = &apf51_wm8311_pdata, + .irq =IMX_GPIO_TO_IRQ (APF51_WM8311_IRQ_GPIO ), + }, +#endif +}; + +/* +* Board specific initialization. +*/ +static void __init apf51_board_init (void ) +{ +imx51_soc_init (); + +#if defined(CONFIG_CPU_FREQ_IMX ) + get_cpu_op = mx51_get_cpu_op; +#endif +mxc_iomux_v3_setup_multiple_pads (apf51_pads, +ARRAY_SIZE (apf51_pads)); + +imx51_add_imx_uart (2 ,NULL ); + +imx51_add_imx_i2c (1 , &apf51_i2c1_data); +i2c_register_board_info (1 , apf51_i2c1_devices, +ARRAY_SIZE (apf51_i2c1_devices)); + +imx51_add_fec (NULL ); + +imx51_add_imx2_wdt (0 ,NULL ); +} + +static void __init apf51_timer_init (void ) +{ +mx51_clocks_init (32768 ,32768 *1024 ,0 ,0 ); +} + +static struct sys_timer apf51_timer = { + .init = apf51_timer_init, +}; + +MACHINE_START (APF51 ,"Armadeus APF51" ) +/* Maintainer: Julien Boibessot <[email protected]> */ + .map_io = mx51_map_io, + .init_early = imx51_init_early, + .init_irq = mx51_init_irq, + .timer = &apf51_timer, + .init_machine = apf51_board_init, +MACHINE_END arch/arm/plat-mxc/include/mach/uncompress.h +4
-0@@ -64,6 +64,7 @@ static inline void flush(void)#define MX3X_UART2_BASE_ADDR 0x43F94000#define MX3X_UART5_BASE_ADDR 0x43FB4000#define MX51_UART1_BASE_ADDR 0x73fbc000 +#define MX51_UART3_BASE_ADDR 0x7000c000#define MX50_UART1_BASE_ADDR 0x53fbc000#define MX53_UART1_BASE_ADDR 0x53fbc000@@ -111,6 +112,9 @@ static __inline__ void __arch_decomp_setup(unsigned long arch_id)case MACH_TYPE_MX51_3DS : uart_base =MX51_UART1_BASE_ADDR ;break ; +case MACH_TYPE_APF51 : + uart_base =MX51_UART3_BASE_ADDR ; +break ;case MACH_TYPE_MX50_RDP : uart_base =MX50_UART1_BASE_ADDR ;break ;Signature · 7 lines
1.7.4.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH 1/1 ARM imx51: Add Armadeus systems APF51 support
Quoted 4 lines · Shawn Guo
NAK.
It makes no sense to add yet another non-dt board file for imx51 at this point.
Ok. Sorry I didn't notice your previous patches for device tree on MX5.
Quoted 1 line
Why not starting using device tree?
As I am a total beginner with this thing, I will wait until it is mainlined with one of the i.MX51 boards and resend my patch at that time.
Regards,
Julien