-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ARM: OMAP3LOGIC: Add generic smsc911x support when connected to GPMC
Introduce of a generic way to setup smsc911x based Ethernet controller connected to GPMC similar to gpmc-smc91x but without timing setup. Signed-off-by: Tim Nordell <tim.nordell@logicpd.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
- Loading branch information
Tim Nordell
authored and
Tony Lindgren
committed
Sep 28, 2010
1 parent
8430281
commit cdd280b
Showing
3 changed files
with
151 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
/* | ||
* linux/arch/arm/mach-omap2/gpmc-smsc911x.c | ||
* | ||
* Copyright (C) 2009 Li-Pro.Net | ||
* Stephan Linz <linz@li-pro.net> | ||
* | ||
* Modified from linux/arch/arm/mach-omap2/gpmc-smc91x.c | ||
* | ||
* 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. | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/platform_device.h> | ||
#include <linux/gpio.h> | ||
#include <linux/delay.h> | ||
#include <linux/interrupt.h> | ||
#include <linux/io.h> | ||
#include <linux/smsc911x.h> | ||
|
||
#include <plat/board.h> | ||
#include <plat/gpmc.h> | ||
#include <plat/gpmc-smsc911x.h> | ||
|
||
static struct omap_smsc911x_platform_data *gpmc_cfg; | ||
|
||
static struct resource gpmc_smsc911x_resources[] = { | ||
[0] = { | ||
.flags = IORESOURCE_MEM, | ||
}, | ||
[1] = { | ||
.flags = IORESOURCE_IRQ, | ||
}, | ||
}; | ||
|
||
static struct smsc911x_platform_config gpmc_smsc911x_config = { | ||
.phy_interface = PHY_INTERFACE_MODE_MII, | ||
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | ||
.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | ||
.flags = SMSC911X_USE_16BIT, | ||
}; | ||
|
||
static struct platform_device gpmc_smsc911x_device = { | ||
.name = "smsc911x", | ||
.id = -1, | ||
.num_resources = ARRAY_SIZE(gpmc_smsc911x_resources), | ||
.resource = gpmc_smsc911x_resources, | ||
.dev = { | ||
.platform_data = &gpmc_smsc911x_config, | ||
}, | ||
}; | ||
|
||
/* | ||
* Initialize smsc911x device connected to the GPMC. Note that we | ||
* assume that pin multiplexing is done in the board-*.c file, | ||
* or in the bootloader. | ||
*/ | ||
void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data) | ||
{ | ||
unsigned long cs_mem_base; | ||
int ret; | ||
|
||
gpmc_cfg = board_data; | ||
|
||
if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) { | ||
printk(KERN_ERR "Failed to request GPMC mem for smsc911x\n"); | ||
return; | ||
} | ||
|
||
gpmc_smsc911x_resources[0].start = cs_mem_base + 0x0; | ||
gpmc_smsc911x_resources[0].end = cs_mem_base + 0xff; | ||
|
||
if (gpio_request(gpmc_cfg->gpio_irq, "smsc911x irq") < 0) { | ||
printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n", | ||
gpmc_cfg->gpio_irq); | ||
goto free1; | ||
} | ||
|
||
gpio_direction_input(gpmc_cfg->gpio_irq); | ||
gpmc_smsc911x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq); | ||
gpmc_smsc911x_resources[1].flags |= | ||
(gpmc_cfg->flags & IRQF_TRIGGER_MASK); | ||
|
||
if (gpio_is_valid(gpmc_cfg->gpio_reset)) { | ||
ret = gpio_request(gpmc_cfg->gpio_reset, "smsc911x reset"); | ||
if (ret) { | ||
printk(KERN_ERR "Failed to request GPIO%d for smsc911x reset\n", | ||
gpmc_cfg->gpio_reset); | ||
goto free2; | ||
} | ||
|
||
gpio_direction_output(gpmc_cfg->gpio_reset, 1); | ||
gpio_set_value(gpmc_cfg->gpio_reset, 0); | ||
msleep(100); | ||
gpio_set_value(gpmc_cfg->gpio_reset, 1); | ||
} | ||
|
||
if (platform_device_register(&gpmc_smsc911x_device) < 0) { | ||
printk(KERN_ERR "Unable to register smsc911x device\n"); | ||
gpio_free(gpmc_cfg->gpio_reset); | ||
goto free2; | ||
} | ||
|
||
return; | ||
|
||
free2: | ||
gpio_free(gpmc_cfg->gpio_irq); | ||
free1: | ||
gpmc_cs_free(gpmc_cfg->cs); | ||
|
||
printk(KERN_ERR "Could not initialize smsc911x\n"); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
/* | ||
* arch/arm/plat-omap/include/plat/gpmc-smsc911x.h | ||
* | ||
* Copyright (C) 2009 Li-Pro.Net | ||
* Stephan Linz <linz@li-pro.net> | ||
* | ||
* Modified from arch/arm/plat-omap/include/plat/gpmc-smc91x.h | ||
* | ||
* 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. | ||
*/ | ||
|
||
#ifndef __ASM_ARCH_OMAP_GPMC_SMSC911X_H__ | ||
|
||
struct omap_smsc911x_platform_data { | ||
int cs; | ||
int gpio_irq; | ||
int gpio_reset; | ||
u32 flags; | ||
}; | ||
|
||
#if defined(CONFIG_SMSC911X) || \ | ||
defined(CONFIG_SMSC911X_MODULE) | ||
|
||
extern void gpmc_smsc911x_init(struct omap_smsc911x_platform_data *d); | ||
|
||
#else | ||
|
||
static inline void gpmc_smsc911x_init(struct omap_smsc911x_platform_data *d) | ||
{ | ||
} | ||
|
||
#endif | ||
#endif |