-
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] MV78XX0: MPP routines and definitions
This patch is composed of two new files : - mpp.c which is mainly inspired by the same file as in mach-kirkwood - mpp.h that is written from the documentation provided by Marvell http://www.marvell.com/products/processors/embedded/discovery_innovation/HW_MV78100_OpenSource.pdf Moreover, due to some implementation problem, I have defined some MPPX_UNUSED that offer developers the possibility to SET MPP to some unused value (such as for Buffalo WXL). Note: This patch doesn't support MV78200 yet (only 78100 MPP lines have been written) Signed-off-by: Sebastien Requiem <sebastien@kolios.dk> Signed-off-by: Nicolas Pitre <nico@marvell.com>
- Loading branch information
Sebastien Requiem
authored and
Nicolas Pitre
committed
Feb 23, 2010
1 parent
d5b5746
commit ee40cea
Showing
3 changed files
with
444 additions
and
1 deletion.
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
obj-y += common.o addr-map.o irq.o pcie.o | ||
obj-y += common.o addr-map.o mpp.o irq.o pcie.o | ||
obj-$(CONFIG_MACH_DB78X00_BP) += db78x00-bp-setup.o | ||
obj-$(CONFIG_MACH_RD78X00_MASA) += rd78x00-masa-setup.o |
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,96 @@ | ||
/* | ||
* arch/arm/mach-mv78x00/mpp.c | ||
* | ||
* MPP functions for Marvell MV78x00 SoCs | ||
* | ||
* This file is licensed under the terms of the GNU General Public | ||
* License version 2. This program is licensed "as is" without any | ||
* warranty of any kind, whether express or implied. | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/init.h> | ||
#include <linux/mbus.h> | ||
#include <linux/io.h> | ||
#include <asm/gpio.h> | ||
#include <mach/hardware.h> | ||
#include "common.h" | ||
#include "mpp.h" | ||
|
||
static unsigned int __init mv78xx0_variant(void) | ||
{ | ||
u32 dev, rev; | ||
|
||
mv78xx0_pcie_id(&dev, &rev); | ||
|
||
if (dev == MV78100_DEV_ID && rev >= MV78100_REV_A0) | ||
return MPP_78100_A0_MASK; | ||
|
||
printk(KERN_ERR "MPP setup: unknown mv78x00 variant " | ||
"(dev %#x rev %#x)\n", dev, rev); | ||
return 0; | ||
} | ||
|
||
#define MPP_CTRL(i) (DEV_BUS_VIRT_BASE + (i) * 4) | ||
#define MPP_NR_REGS (1 + MPP_MAX/8) | ||
|
||
void __init mv78xx0_mpp_conf(unsigned int *mpp_list) | ||
{ | ||
u32 mpp_ctrl[MPP_NR_REGS]; | ||
unsigned int variant_mask; | ||
int i; | ||
|
||
variant_mask = mv78xx0_variant(); | ||
if (!variant_mask) | ||
return; | ||
|
||
/* Initialize gpiolib. */ | ||
orion_gpio_init(); | ||
|
||
printk(KERN_DEBUG "initial MPP regs:"); | ||
for (i = 0; i < MPP_NR_REGS; i++) { | ||
mpp_ctrl[i] = readl(MPP_CTRL(i)); | ||
printk(" %08x", mpp_ctrl[i]); | ||
} | ||
printk("\n"); | ||
|
||
while (*mpp_list) { | ||
unsigned int num = MPP_NUM(*mpp_list); | ||
unsigned int sel = MPP_SEL(*mpp_list); | ||
int shift, gpio_mode; | ||
|
||
if (num > MPP_MAX) { | ||
printk(KERN_ERR "mv78xx0_mpp_conf: invalid MPP " | ||
"number (%u)\n", num); | ||
continue; | ||
} | ||
if (!(*mpp_list & variant_mask)) { | ||
printk(KERN_WARNING | ||
"mv78xx0_mpp_conf: requested MPP%u config " | ||
"unavailable on this hardware\n", num); | ||
continue; | ||
} | ||
|
||
shift = (num & 7) << 2; | ||
mpp_ctrl[num / 8] &= ~(0xf << shift); | ||
mpp_ctrl[num / 8] |= sel << shift; | ||
|
||
gpio_mode = 0; | ||
if (*mpp_list & MPP_INPUT_MASK) | ||
gpio_mode |= GPIO_INPUT_OK; | ||
if (*mpp_list & MPP_OUTPUT_MASK) | ||
gpio_mode |= GPIO_OUTPUT_OK; | ||
if (sel != 0) | ||
gpio_mode = 0; | ||
orion_gpio_set_valid(num, gpio_mode); | ||
|
||
mpp_list++; | ||
} | ||
|
||
printk(KERN_DEBUG " final MPP regs:"); | ||
for (i = 0; i < MPP_NR_REGS; i++) { | ||
writel(mpp_ctrl[i], MPP_CTRL(i)); | ||
printk(" %08x", mpp_ctrl[i]); | ||
} | ||
printk("\n"); | ||
} |
Oops, something went wrong.