mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-13 14:14:37 +00:00
[ARM] pxa/colibri: provide MAC address from ATAG_SERIAL
In 67fca028f1
, 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: Matthias Meier <matthias.j.meier@gmx.net>
Signed-off-by: Daniel Mack <daniel@caiaq.de>
Signed-off-by: Eric Miao <eric.miao@marvell.com>
This commit is contained in:
parent
50f6bb0ab7
commit
22a0200b18
4 changed files with 46 additions and 4 deletions
|
@ -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 = {
|
||||||
|
|
||||||
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 @@
|
||||||
* 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 = {
|
||||||
|
|
||||||
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 @@
|
||||||
#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 @@
|
||||||
#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);
|
||||||
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 */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue