forked from torvalds/linux
-
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: orion: Refactor the MPP code common in the orion platform
mv78xx0 and kirkwood use identical mpp code. It should also be possible to rewrite the orion5x mpp to use this platform code. Signed-off-by: Andrew Lunn <[email protected]> Signed-off-by: Nicolas Pitre <[email protected]>
- Loading branch information
Showing
7 changed files
with
122 additions
and
123 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
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
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,34 @@ | ||
/* | ||
* arch/arm/plat-orion/include/plat/mpp.h | ||
* | ||
* Marvell Orion SoC MPP handling. | ||
* | ||
* 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. | ||
*/ | ||
|
||
#ifndef __PLAT_MPP_H | ||
#define __PLAT_MPP_H | ||
|
||
#define MPP_NUM(x) ((x) & 0xff) | ||
#define MPP_SEL(x) (((x) >> 8) & 0xf) | ||
|
||
/* This is the generic MPP macro, without any variant information. | ||
Each machine architecture is expected to extend this with further | ||
bit fields indicating which MPP configurations are valid for a | ||
specific variant. */ | ||
|
||
#define GENERIC_MPP(_num, _sel, _in, _out) ( \ | ||
/* MPP number */ ((_num) & 0xff) | \ | ||
/* MPP select value */ (((_sel) & 0xf) << 8) | \ | ||
/* may be input signal */ ((!!(_in)) << 12) | \ | ||
/* may be output signal */ ((!!(_out)) << 13)) | ||
|
||
#define MPP_INPUT_MASK GENERIC_MPP(0, 0x0, 1, 0) | ||
#define MPP_OUTPUT_MASK GENERIC_MPP(0, 0x0, 0, 1) | ||
|
||
void __init orion_mpp_conf(unsigned int *mpp_list, unsigned int variant_mask, | ||
unsigned int mpp_max, unsigned int dev_bus); | ||
|
||
#endif |
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,81 @@ | ||
/* | ||
* arch/arm/plat-orion/mpp.c | ||
* | ||
* MPP functions for Marvell orion 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 <linux/gpio.h> | ||
#include <mach/hardware.h> | ||
#include <plat/mpp.h> | ||
|
||
/* Address of the ith MPP control register */ | ||
static __init unsigned long mpp_ctrl_addr(unsigned int i, | ||
unsigned long dev_bus) | ||
{ | ||
return dev_bus + (i) * 4; | ||
} | ||
|
||
|
||
void __init orion_mpp_conf(unsigned int *mpp_list, unsigned int variant_mask, | ||
unsigned int mpp_max, unsigned int dev_bus) | ||
{ | ||
unsigned int mpp_nr_regs = (1 + mpp_max/8); | ||
u32 mpp_ctrl[mpp_nr_regs]; | ||
int i; | ||
|
||
if (!variant_mask) | ||
return; | ||
|
||
printk(KERN_DEBUG "initial MPP regs:"); | ||
for (i = 0; i < mpp_nr_regs; i++) { | ||
mpp_ctrl[i] = readl(mpp_ctrl_addr(i, dev_bus)); | ||
printk(" %08x", mpp_ctrl[i]); | ||
} | ||
printk("\n"); | ||
|
||
for ( ; *mpp_list; 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 "orion_mpp_conf: invalid MPP " | ||
"number (%u)\n", num); | ||
continue; | ||
} | ||
if (!(*mpp_list & variant_mask)) { | ||
printk(KERN_WARNING | ||
"orion_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); | ||
} | ||
|
||
printk(KERN_DEBUG " final MPP regs:"); | ||
for (i = 0; i < mpp_nr_regs; i++) { | ||
writel(mpp_ctrl[i], mpp_ctrl_addr(i, dev_bus)); | ||
printk(" %08x", mpp_ctrl[i]); | ||
} | ||
printk("\n"); | ||
} |