提交 22a0200b 编写于 作者: D Daniel Mack 提交者: Eric Miao

[ARM] pxa/colibri: provide MAC address from ATAG_SERIAL

In 67fca028, the ax88796 ethernet driver
learned a way to let the platform data hand in the MAC address. Use it
here as the original Colibri bootloader passes in a MAC address via
ATAG_SERIAL.
Reported-by: NMatthias Meier <matthias.j.meier@gmx.net>
Signed-off-by: NDaniel Mack <daniel@caiaq.de>
Signed-off-by: NEric Miao <eric.miao@marvell.com>
上级 50f6bb0a
...@@ -32,12 +32,13 @@ ...@@ -32,12 +32,13 @@
#if defined(CONFIG_AX88796) #if defined(CONFIG_AX88796)
#define COLIBRI_ETH_IRQ_GPIO mfp_to_gpio(GPIO26_GPIO) #define COLIBRI_ETH_IRQ_GPIO mfp_to_gpio(GPIO26_GPIO)
/* /*
* Asix AX88796 Ethernet * Asix AX88796 Ethernet
*/ */
static struct ax_plat_data colibri_asix_platdata = { static struct ax_plat_data colibri_asix_platdata = {
.flags = AXFLG_MAC_FROMDEV, .flags = 0, /* defined later */
.wordlength = 2 .wordlength = 2,
}; };
static struct resource colibri_asix_resource[] = { static struct resource colibri_asix_resource[] = {
...@@ -70,6 +71,7 @@ static mfp_cfg_t colibri_pxa300_eth_pin_config[] __initdata = { ...@@ -70,6 +71,7 @@ static mfp_cfg_t colibri_pxa300_eth_pin_config[] __initdata = {
static void __init colibri_pxa300_init_eth(void) static void __init colibri_pxa300_init_eth(void)
{ {
colibri_pxa3xx_init_eth(&colibri_asix_platdata);
pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa300_eth_pin_config)); pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa300_eth_pin_config));
set_irq_type(gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), IRQ_TYPE_EDGE_FALLING); set_irq_type(gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), IRQ_TYPE_EDGE_FALLING);
platform_device_register(&asix_device); platform_device_register(&asix_device);
......
...@@ -38,8 +38,8 @@ ...@@ -38,8 +38,8 @@
* Asix AX88796 Ethernet * Asix AX88796 Ethernet
*/ */
static struct ax_plat_data colibri_asix_platdata = { static struct ax_plat_data colibri_asix_platdata = {
.flags = AXFLG_MAC_FROMDEV, .flags = 0, /* defined later */
.wordlength = 2 .wordlength = 2,
}; };
static struct resource colibri_asix_resource[] = { static struct resource colibri_asix_resource[] = {
...@@ -72,6 +72,7 @@ static mfp_cfg_t colibri_pxa320_eth_pin_config[] __initdata = { ...@@ -72,6 +72,7 @@ static mfp_cfg_t colibri_pxa320_eth_pin_config[] __initdata = {
static void __init colibri_pxa320_init_eth(void) static void __init colibri_pxa320_init_eth(void)
{ {
colibri_pxa3xx_init_eth(&colibri_asix_platdata);
pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa320_eth_pin_config)); pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa320_eth_pin_config));
set_irq_type(gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), IRQ_TYPE_EDGE_FALLING); set_irq_type(gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), IRQ_TYPE_EDGE_FALLING);
platform_device_register(&asix_device); platform_device_register(&asix_device);
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/etherdevice.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <asm/sizes.h> #include <asm/sizes.h>
...@@ -28,6 +29,40 @@ ...@@ -28,6 +29,40 @@
#include "generic.h" #include "generic.h"
#include "devices.h" #include "devices.h"
#if defined(CONFIG_AX88796)
#define ETHER_ADDR_LEN 6
static u8 ether_mac_addr[ETHER_ADDR_LEN];
void __init colibri_pxa3xx_init_eth(struct ax_plat_data *plat_data)
{
int i;
u64 serial = ((u64) system_serial_high << 32) | system_serial_low;
/*
* If the bootloader passed in a serial boot tag, which contains a
* valid ethernet MAC, pass it to the interface. Toradex ships the
* modules with their own bootloader which provides a valid MAC
* this way.
*/
for (i = 0; i < ETHER_ADDR_LEN; i++) {
ether_mac_addr[i] = serial & 0xff;
serial >>= 8;
}
if (is_valid_ether_addr(ether_mac_addr)) {
plat_data->flags |= AXFLG_MAC_FROMPLATFORM;
plat_data->mac_addr = ether_mac_addr;
printk(KERN_INFO "%s(): taking MAC from serial boot tag\n",
__func__);
} else {
plat_data->flags |= AXFLG_MAC_FROMDEV;
printk(KERN_INFO "%s(): no valid serial boot tag found, "
"taking MAC from device\n", __func__);
}
}
#endif
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
static int mmc_detect_pin; static int mmc_detect_pin;
......
...@@ -16,6 +16,10 @@ extern void colibri_pxa3xx_init_lcd(int bl_pin); ...@@ -16,6 +16,10 @@ extern void colibri_pxa3xx_init_lcd(int bl_pin);
static inline void colibri_pxa3xx_init_lcd(int) {} static inline void colibri_pxa3xx_init_lcd(int) {}
#endif #endif
#if defined(CONFIG_AX88796)
extern void colibri_pxa3xx_init_eth(struct ax_plat_data *plat_data);
#endif
/* physical memory regions */ /* physical memory regions */
#define COLIBRI_SDRAM_BASE 0xa0000000 /* SDRAM region */ #define COLIBRI_SDRAM_BASE 0xa0000000 /* SDRAM region */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册