mirror of
https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
synced 2025-09-09 01:28:05 -04:00
Fixed MTP to work with TWRP
This commit is contained in:
commit
f6dfaef42e
50820 changed files with 20846062 additions and 0 deletions
182
arch/powerpc/platforms/8xx/Kconfig
Normal file
182
arch/powerpc/platforms/8xx/Kconfig
Normal file
|
@ -0,0 +1,182 @@
|
|||
config FADS
|
||||
bool
|
||||
|
||||
config CPM1
|
||||
bool
|
||||
select CPM
|
||||
|
||||
choice
|
||||
prompt "8xx Machine Type"
|
||||
depends on PPC_8xx
|
||||
depends on 8xx
|
||||
default MPC885ADS
|
||||
|
||||
config MPC8XXFADS
|
||||
bool "FADS"
|
||||
select FADS
|
||||
|
||||
config MPC86XADS
|
||||
bool "MPC86XADS"
|
||||
select CPM1
|
||||
help
|
||||
MPC86x Application Development System by Freescale Semiconductor.
|
||||
The MPC86xADS is meant to serve as a platform for s/w and h/w
|
||||
development around the MPC86X processor families.
|
||||
|
||||
config MPC885ADS
|
||||
bool "MPC885ADS"
|
||||
select CPM1
|
||||
select OF_DYNAMIC
|
||||
help
|
||||
Freescale Semiconductor MPC885 Application Development System (ADS).
|
||||
Also known as DUET.
|
||||
The MPC885ADS is meant to serve as a platform for s/w and h/w
|
||||
development around the MPC885 processor family.
|
||||
|
||||
config PPC_EP88XC
|
||||
bool "Embedded Planet EP88xC (a.k.a. CWH-PPC-885XN-VE)"
|
||||
select CPM1
|
||||
help
|
||||
This enables support for the Embedded Planet EP88xC board.
|
||||
|
||||
This board is also resold by Freescale as the QUICCStart
|
||||
MPC885 Evaluation System and/or the CWH-PPC-885XN-VE.
|
||||
|
||||
config PPC_ADDER875
|
||||
bool "Analogue & Micro Adder 875"
|
||||
select CPM1
|
||||
help
|
||||
This enables support for the Analogue & Micro Adder 875
|
||||
board.
|
||||
|
||||
config TQM8XX
|
||||
bool "TQM8XX"
|
||||
select CPM1
|
||||
help
|
||||
support for the mpc8xx based boards from TQM.
|
||||
|
||||
endchoice
|
||||
|
||||
menu "Freescale Ethernet driver platform-specific options"
|
||||
depends on (FS_ENET && MPC885ADS)
|
||||
|
||||
config MPC8xx_SECOND_ETH
|
||||
bool "Second Ethernet channel"
|
||||
depends on MPC885ADS
|
||||
default y
|
||||
help
|
||||
This enables support for second Ethernet on MPC885ADS and MPC86xADS boards.
|
||||
The latter will use SCC1, for 885ADS you can select it below.
|
||||
|
||||
choice
|
||||
prompt "Second Ethernet channel"
|
||||
depends on MPC8xx_SECOND_ETH
|
||||
default MPC8xx_SECOND_ETH_FEC2
|
||||
|
||||
config MPC8xx_SECOND_ETH_FEC2
|
||||
bool "FEC2"
|
||||
depends on MPC885ADS
|
||||
help
|
||||
Enable FEC2 to serve as 2-nd Ethernet channel. Note that SMC2
|
||||
(often 2-nd UART) will not work if this is enabled.
|
||||
|
||||
config MPC8xx_SECOND_ETH_SCC3
|
||||
bool "SCC3"
|
||||
depends on MPC885ADS
|
||||
help
|
||||
Enable SCC3 to serve as 2-nd Ethernet channel. Note that SMC1
|
||||
(often 1-nd UART) will not work if this is enabled.
|
||||
|
||||
endchoice
|
||||
|
||||
endmenu
|
||||
|
||||
#
|
||||
# MPC8xx Communication options
|
||||
#
|
||||
|
||||
menu "MPC8xx CPM Options"
|
||||
depends on 8xx
|
||||
|
||||
# This doesn't really belong here, but it is convenient to ask
|
||||
# 8xx specific questions.
|
||||
comment "Generic MPC8xx Options"
|
||||
|
||||
config 8xx_COPYBACK
|
||||
bool "Copy-Back Data Cache (else Writethrough)"
|
||||
help
|
||||
Saying Y here will cause the cache on an MPC8xx processor to be used
|
||||
in Copy-Back mode. If you say N here, it is used in Writethrough
|
||||
mode.
|
||||
|
||||
If in doubt, say Y here.
|
||||
|
||||
config 8xx_GPIO
|
||||
bool "GPIO API Support"
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
help
|
||||
Saying Y here will cause the ports on an MPC8xx processor to be used
|
||||
with the GPIO API. If you say N here, the kernel needs less memory.
|
||||
|
||||
If in doubt, say Y here.
|
||||
|
||||
config 8xx_CPU6
|
||||
bool "CPU6 Silicon Errata (860 Pre Rev. C)"
|
||||
help
|
||||
MPC860 CPUs, prior to Rev C have some bugs in the silicon, which
|
||||
require workarounds for Linux (and most other OSes to work). If you
|
||||
get a BUG() very early in boot, this might fix the problem. For
|
||||
more details read the document entitled "MPC860 Family Device Errata
|
||||
Reference" on Freescale's website. This option also incurs a
|
||||
performance hit.
|
||||
|
||||
If in doubt, say N here.
|
||||
|
||||
config 8xx_CPU15
|
||||
bool "CPU15 Silicon Errata"
|
||||
default y
|
||||
help
|
||||
This enables a workaround for erratum CPU15 on MPC8xx chips.
|
||||
This bug can cause incorrect code execution under certain
|
||||
circumstances. This workaround adds some overhead (a TLB miss
|
||||
every time execution crosses a page boundary), and you may wish
|
||||
to disable it if you have worked around the bug in the compiler
|
||||
(by not placing conditional branches or branches to LR or CTR
|
||||
in the last word of a page, with a target of the last cache
|
||||
line in the next page), or if you have used some other
|
||||
workaround.
|
||||
|
||||
If in doubt, say Y here.
|
||||
|
||||
choice
|
||||
prompt "Microcode patch selection"
|
||||
default NO_UCODE_PATCH
|
||||
help
|
||||
Help not implemented yet, coming soon.
|
||||
|
||||
config NO_UCODE_PATCH
|
||||
bool "None"
|
||||
|
||||
config USB_SOF_UCODE_PATCH
|
||||
bool "USB SOF patch"
|
||||
help
|
||||
Help not implemented yet, coming soon.
|
||||
|
||||
config I2C_SPI_UCODE_PATCH
|
||||
bool "I2C/SPI relocation patch"
|
||||
help
|
||||
Help not implemented yet, coming soon.
|
||||
|
||||
config I2C_SPI_SMC1_UCODE_PATCH
|
||||
bool "I2C/SPI/SMC1 relocation patch"
|
||||
help
|
||||
Help not implemented yet, coming soon.
|
||||
|
||||
endchoice
|
||||
|
||||
config UCODE_PATCH
|
||||
bool
|
||||
default y
|
||||
depends on !NO_UCODE_PATCH
|
||||
|
||||
endmenu
|
9
arch/powerpc/platforms/8xx/Makefile
Normal file
9
arch/powerpc/platforms/8xx/Makefile
Normal file
|
@ -0,0 +1,9 @@
|
|||
#
|
||||
# Makefile for the PowerPC 8xx linux kernel.
|
||||
#
|
||||
obj-$(CONFIG_PPC_8xx) += m8xx_setup.o
|
||||
obj-$(CONFIG_MPC885ADS) += mpc885ads_setup.o
|
||||
obj-$(CONFIG_MPC86XADS) += mpc86xads_setup.o
|
||||
obj-$(CONFIG_PPC_EP88XC) += ep88xc.o
|
||||
obj-$(CONFIG_PPC_ADDER875) += adder875.o
|
||||
obj-$(CONFIG_TQM8XX) += tqm8xx_setup.o
|
118
arch/powerpc/platforms/8xx/adder875.c
Normal file
118
arch/powerpc/platforms/8xx/adder875.c
Normal file
|
@ -0,0 +1,118 @@
|
|||
/* Analogue & Micro Adder MPC875 board support
|
||||
*
|
||||
* Author: Scott Wood <scottwood@freescale.com>
|
||||
*
|
||||
* Copyright (c) 2007 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* 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/init.h>
|
||||
#include <linux/fs_enet_pd.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
#include <asm/time.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/cpm1.h>
|
||||
#include <asm/fs_pd.h>
|
||||
#include <asm/udbg.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
#include "mpc8xx.h"
|
||||
|
||||
struct cpm_pin {
|
||||
int port, pin, flags;
|
||||
};
|
||||
|
||||
static __initdata struct cpm_pin adder875_pins[] = {
|
||||
/* SMC1 */
|
||||
{CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */
|
||||
{CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
|
||||
|
||||
/* MII1 */
|
||||
{CPM_PORTA, 0, CPM_PIN_INPUT},
|
||||
{CPM_PORTA, 1, CPM_PIN_INPUT},
|
||||
{CPM_PORTA, 2, CPM_PIN_INPUT},
|
||||
{CPM_PORTA, 3, CPM_PIN_INPUT},
|
||||
{CPM_PORTA, 4, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTA, 10, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTA, 11, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTB, 19, CPM_PIN_INPUT},
|
||||
{CPM_PORTB, 31, CPM_PIN_INPUT},
|
||||
{CPM_PORTC, 12, CPM_PIN_INPUT},
|
||||
{CPM_PORTC, 13, CPM_PIN_INPUT},
|
||||
{CPM_PORTE, 30, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 31, CPM_PIN_OUTPUT},
|
||||
|
||||
/* MII2 */
|
||||
{CPM_PORTE, 14, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{CPM_PORTE, 15, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{CPM_PORTE, 16, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 17, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{CPM_PORTE, 18, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{CPM_PORTE, 19, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{CPM_PORTE, 20, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{CPM_PORTE, 21, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 22, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 23, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 24, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 25, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 26, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 27, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 28, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 29, CPM_PIN_OUTPUT},
|
||||
};
|
||||
|
||||
static void __init init_ioports(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(adder875_pins); i++) {
|
||||
const struct cpm_pin *pin = &adder875_pins[i];
|
||||
cpm1_set_pin(pin->port, pin->pin, pin->flags);
|
||||
}
|
||||
|
||||
cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);
|
||||
|
||||
/* Set FEC1 and FEC2 to MII mode */
|
||||
clrbits32(&mpc8xx_immr->im_cpm.cp_cptr, 0x00000180);
|
||||
}
|
||||
|
||||
static void __init adder875_setup(void)
|
||||
{
|
||||
cpm_reset();
|
||||
init_ioports();
|
||||
}
|
||||
|
||||
static int __init adder875_probe(void)
|
||||
{
|
||||
unsigned long root = of_get_flat_dt_root();
|
||||
return of_flat_dt_is_compatible(root, "analogue-and-micro,adder875");
|
||||
}
|
||||
|
||||
static const struct of_device_id of_bus_ids[] __initconst = {
|
||||
{ .compatible = "simple-bus", },
|
||||
{},
|
||||
};
|
||||
|
||||
static int __init declare_of_platform_devices(void)
|
||||
{
|
||||
of_platform_bus_probe(NULL, of_bus_ids, NULL);
|
||||
return 0;
|
||||
}
|
||||
machine_device_initcall(adder875, declare_of_platform_devices);
|
||||
|
||||
define_machine(adder875) {
|
||||
.name = "Adder MPC875",
|
||||
.probe = adder875_probe,
|
||||
.setup_arch = adder875_setup,
|
||||
.init_IRQ = mpc8xx_pics_init,
|
||||
.get_irq = mpc8xx_get_irq,
|
||||
.restart = mpc8xx_restart,
|
||||
.calibrate_decr = generic_calibrate_decr,
|
||||
.set_rtc_time = mpc8xx_set_rtc_time,
|
||||
.get_rtc_time = mpc8xx_get_rtc_time,
|
||||
.progress = udbg_progress,
|
||||
};
|
177
arch/powerpc/platforms/8xx/ep88xc.c
Normal file
177
arch/powerpc/platforms/8xx/ep88xc.c
Normal file
|
@ -0,0 +1,177 @@
|
|||
/*
|
||||
* Platform setup for the Embedded Planet EP88xC board
|
||||
*
|
||||
* Author: Scott Wood <scottwood@freescale.com>
|
||||
* Copyright 2007 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* 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/init.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_fdt.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/udbg.h>
|
||||
#include <asm/cpm1.h>
|
||||
|
||||
#include "mpc8xx.h"
|
||||
|
||||
struct cpm_pin {
|
||||
int port, pin, flags;
|
||||
};
|
||||
|
||||
static struct cpm_pin ep88xc_pins[] = {
|
||||
/* SMC1 */
|
||||
{1, 24, CPM_PIN_INPUT}, /* RX */
|
||||
{1, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
|
||||
|
||||
/* SCC2 */
|
||||
{0, 12, CPM_PIN_INPUT}, /* TX */
|
||||
{0, 13, CPM_PIN_INPUT}, /* RX */
|
||||
{2, 8, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* CD */
|
||||
{2, 9, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* CTS */
|
||||
{2, 14, CPM_PIN_INPUT}, /* RTS */
|
||||
|
||||
/* MII1 */
|
||||
{0, 0, CPM_PIN_INPUT},
|
||||
{0, 1, CPM_PIN_INPUT},
|
||||
{0, 2, CPM_PIN_INPUT},
|
||||
{0, 3, CPM_PIN_INPUT},
|
||||
{0, 4, CPM_PIN_OUTPUT},
|
||||
{0, 10, CPM_PIN_OUTPUT},
|
||||
{0, 11, CPM_PIN_OUTPUT},
|
||||
{1, 19, CPM_PIN_INPUT},
|
||||
{1, 31, CPM_PIN_INPUT},
|
||||
{2, 12, CPM_PIN_INPUT},
|
||||
{2, 13, CPM_PIN_INPUT},
|
||||
{3, 8, CPM_PIN_INPUT},
|
||||
{4, 30, CPM_PIN_OUTPUT},
|
||||
{4, 31, CPM_PIN_OUTPUT},
|
||||
|
||||
/* MII2 */
|
||||
{4, 14, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{4, 15, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{4, 16, CPM_PIN_OUTPUT},
|
||||
{4, 17, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{4, 18, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{4, 19, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{4, 20, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{4, 21, CPM_PIN_OUTPUT},
|
||||
{4, 22, CPM_PIN_OUTPUT},
|
||||
{4, 23, CPM_PIN_OUTPUT},
|
||||
{4, 24, CPM_PIN_OUTPUT},
|
||||
{4, 25, CPM_PIN_OUTPUT},
|
||||
{4, 26, CPM_PIN_OUTPUT},
|
||||
{4, 27, CPM_PIN_OUTPUT},
|
||||
{4, 28, CPM_PIN_OUTPUT},
|
||||
{4, 29, CPM_PIN_OUTPUT},
|
||||
|
||||
/* USB */
|
||||
{0, 6, CPM_PIN_INPUT}, /* CLK2 */
|
||||
{0, 14, CPM_PIN_INPUT}, /* USBOE */
|
||||
{0, 15, CPM_PIN_INPUT}, /* USBRXD */
|
||||
{2, 6, CPM_PIN_OUTPUT}, /* USBTXN */
|
||||
{2, 7, CPM_PIN_OUTPUT}, /* USBTXP */
|
||||
{2, 10, CPM_PIN_INPUT}, /* USBRXN */
|
||||
{2, 11, CPM_PIN_INPUT}, /* USBRXP */
|
||||
|
||||
/* Misc */
|
||||
{1, 26, CPM_PIN_INPUT}, /* BRGO2 */
|
||||
{1, 27, CPM_PIN_INPUT}, /* BRGO1 */
|
||||
};
|
||||
|
||||
static void __init init_ioports(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ep88xc_pins); i++) {
|
||||
struct cpm_pin *pin = &ep88xc_pins[i];
|
||||
cpm1_set_pin(pin->port, pin->pin, pin->flags);
|
||||
}
|
||||
|
||||
cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);
|
||||
cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK2, CPM_CLK_TX); /* USB */
|
||||
cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK2, CPM_CLK_RX);
|
||||
cpm1_clk_setup(CPM_CLK_SCC2, CPM_BRG2, CPM_CLK_TX);
|
||||
cpm1_clk_setup(CPM_CLK_SCC2, CPM_BRG2, CPM_CLK_RX);
|
||||
}
|
||||
|
||||
static u8 __iomem *ep88xc_bcsr;
|
||||
|
||||
#define BCSR7_SCC2_ENABLE 0x10
|
||||
|
||||
#define BCSR8_PHY1_ENABLE 0x80
|
||||
#define BCSR8_PHY1_POWER 0x40
|
||||
#define BCSR8_PHY2_ENABLE 0x20
|
||||
#define BCSR8_PHY2_POWER 0x10
|
||||
|
||||
#define BCSR9_USB_ENABLE 0x80
|
||||
#define BCSR9_USB_POWER 0x40
|
||||
#define BCSR9_USB_HOST 0x20
|
||||
#define BCSR9_USB_FULL_SPEED_TARGET 0x10
|
||||
|
||||
static void __init ep88xc_setup_arch(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
cpm_reset();
|
||||
init_ioports();
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,ep88xc-bcsr");
|
||||
if (!np) {
|
||||
printk(KERN_CRIT "Could not find fsl,ep88xc-bcsr node\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ep88xc_bcsr = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
|
||||
if (!ep88xc_bcsr) {
|
||||
printk(KERN_CRIT "Could not remap BCSR\n");
|
||||
return;
|
||||
}
|
||||
|
||||
setbits8(&ep88xc_bcsr[7], BCSR7_SCC2_ENABLE);
|
||||
setbits8(&ep88xc_bcsr[8], BCSR8_PHY1_ENABLE | BCSR8_PHY1_POWER |
|
||||
BCSR8_PHY2_ENABLE | BCSR8_PHY2_POWER);
|
||||
}
|
||||
|
||||
static int __init ep88xc_probe(void)
|
||||
{
|
||||
unsigned long root = of_get_flat_dt_root();
|
||||
return of_flat_dt_is_compatible(root, "fsl,ep88xc");
|
||||
}
|
||||
|
||||
static const struct of_device_id of_bus_ids[] __initconst = {
|
||||
{ .name = "soc", },
|
||||
{ .name = "cpm", },
|
||||
{ .name = "localbus", },
|
||||
{},
|
||||
};
|
||||
|
||||
static int __init declare_of_platform_devices(void)
|
||||
{
|
||||
/* Publish the QE devices */
|
||||
of_platform_bus_probe(NULL, of_bus_ids, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
machine_device_initcall(ep88xc, declare_of_platform_devices);
|
||||
|
||||
define_machine(ep88xc) {
|
||||
.name = "Embedded Planet EP88xC",
|
||||
.probe = ep88xc_probe,
|
||||
.setup_arch = ep88xc_setup_arch,
|
||||
.init_IRQ = mpc8xx_pics_init,
|
||||
.get_irq = mpc8xx_get_irq,
|
||||
.restart = mpc8xx_restart,
|
||||
.calibrate_decr = mpc8xx_calibrate_decr,
|
||||
.set_rtc_time = mpc8xx_set_rtc_time,
|
||||
.get_rtc_time = mpc8xx_get_rtc_time,
|
||||
.progress = udbg_progress,
|
||||
};
|
246
arch/powerpc/platforms/8xx/m8xx_setup.c
Normal file
246
arch/powerpc/platforms/8xx/m8xx_setup.c
Normal file
|
@ -0,0 +1,246 @@
|
|||
/*
|
||||
* Copyright (C) 1995 Linus Torvalds
|
||||
* Adapted from 'alpha' version by Gary Thomas
|
||||
* Modified by Cort Dougan (cort@cs.nmt.edu)
|
||||
* Modified for MBX using prep/chrp/pmac functions by Dan (dmalek@jlc.net)
|
||||
* Further modified for generic 8xx by Dan.
|
||||
*/
|
||||
|
||||
/*
|
||||
* bootup setup stuff..
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/fsl_devices.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/8xx_immap.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/fs_pd.h>
|
||||
#include <mm/mmu_decl.h>
|
||||
|
||||
#include <sysdev/mpc8xx_pic.h>
|
||||
|
||||
#include "mpc8xx.h"
|
||||
|
||||
extern int cpm_pic_init(void);
|
||||
extern int cpm_get_irq(void);
|
||||
|
||||
/* A place holder for time base interrupts, if they are ever enabled. */
|
||||
static irqreturn_t timebase_interrupt(int irq, void *dev)
|
||||
{
|
||||
printk ("timebase_interrupt()\n");
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static struct irqaction tbint_irqaction = {
|
||||
.handler = timebase_interrupt,
|
||||
.flags = IRQF_NO_THREAD,
|
||||
.name = "tbint",
|
||||
};
|
||||
|
||||
/* per-board overridable init_internal_rtc() function. */
|
||||
void __init __attribute__ ((weak))
|
||||
init_internal_rtc(void)
|
||||
{
|
||||
sit8xx_t __iomem *sys_tmr = immr_map(im_sit);
|
||||
|
||||
/* Disable the RTC one second and alarm interrupts. */
|
||||
clrbits16(&sys_tmr->sit_rtcsc, (RTCSC_SIE | RTCSC_ALE));
|
||||
|
||||
/* Enable the RTC */
|
||||
setbits16(&sys_tmr->sit_rtcsc, (RTCSC_RTF | RTCSC_RTE));
|
||||
immr_unmap(sys_tmr);
|
||||
}
|
||||
|
||||
static int __init get_freq(char *name, unsigned long *val)
|
||||
{
|
||||
struct device_node *cpu;
|
||||
const unsigned int *fp;
|
||||
int found = 0;
|
||||
|
||||
/* The cpu node should have timebase and clock frequency properties */
|
||||
cpu = of_find_node_by_type(NULL, "cpu");
|
||||
|
||||
if (cpu) {
|
||||
fp = of_get_property(cpu, name, NULL);
|
||||
if (fp) {
|
||||
found = 1;
|
||||
*val = *fp;
|
||||
}
|
||||
|
||||
of_node_put(cpu);
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
/* The decrementer counts at the system (internal) clock frequency divided by
|
||||
* sixteen, or external oscillator divided by four. We force the processor
|
||||
* to use system clock divided by sixteen.
|
||||
*/
|
||||
void __init mpc8xx_calibrate_decr(void)
|
||||
{
|
||||
struct device_node *cpu;
|
||||
cark8xx_t __iomem *clk_r1;
|
||||
car8xx_t __iomem *clk_r2;
|
||||
sitk8xx_t __iomem *sys_tmr1;
|
||||
sit8xx_t __iomem *sys_tmr2;
|
||||
int irq, virq;
|
||||
|
||||
clk_r1 = immr_map(im_clkrstk);
|
||||
|
||||
/* Unlock the SCCR. */
|
||||
out_be32(&clk_r1->cark_sccrk, ~KAPWR_KEY);
|
||||
out_be32(&clk_r1->cark_sccrk, KAPWR_KEY);
|
||||
immr_unmap(clk_r1);
|
||||
|
||||
/* Force all 8xx processors to use divide by 16 processor clock. */
|
||||
clk_r2 = immr_map(im_clkrst);
|
||||
setbits32(&clk_r2->car_sccr, 0x02000000);
|
||||
immr_unmap(clk_r2);
|
||||
|
||||
/* Processor frequency is MHz.
|
||||
*/
|
||||
ppc_proc_freq = 50000000;
|
||||
if (!get_freq("clock-frequency", &ppc_proc_freq))
|
||||
printk(KERN_ERR "WARNING: Estimating processor frequency "
|
||||
"(not found)\n");
|
||||
|
||||
ppc_tb_freq = ppc_proc_freq / 16;
|
||||
printk("Decrementer Frequency = 0x%lx\n", ppc_tb_freq);
|
||||
|
||||
/* Perform some more timer/timebase initialization. This used
|
||||
* to be done elsewhere, but other changes caused it to get
|
||||
* called more than once....that is a bad thing.
|
||||
*
|
||||
* First, unlock all of the registers we are going to modify.
|
||||
* To protect them from corruption during power down, registers
|
||||
* that are maintained by keep alive power are "locked". To
|
||||
* modify these registers we have to write the key value to
|
||||
* the key location associated with the register.
|
||||
* Some boards power up with these unlocked, while others
|
||||
* are locked. Writing anything (including the unlock code?)
|
||||
* to the unlocked registers will lock them again. So, here
|
||||
* we guarantee the registers are locked, then we unlock them
|
||||
* for our use.
|
||||
*/
|
||||
sys_tmr1 = immr_map(im_sitk);
|
||||
out_be32(&sys_tmr1->sitk_tbscrk, ~KAPWR_KEY);
|
||||
out_be32(&sys_tmr1->sitk_rtcsck, ~KAPWR_KEY);
|
||||
out_be32(&sys_tmr1->sitk_tbk, ~KAPWR_KEY);
|
||||
out_be32(&sys_tmr1->sitk_tbscrk, KAPWR_KEY);
|
||||
out_be32(&sys_tmr1->sitk_rtcsck, KAPWR_KEY);
|
||||
out_be32(&sys_tmr1->sitk_tbk, KAPWR_KEY);
|
||||
immr_unmap(sys_tmr1);
|
||||
|
||||
init_internal_rtc();
|
||||
|
||||
/* Enabling the decrementer also enables the timebase interrupts
|
||||
* (or from the other point of view, to get decrementer interrupts
|
||||
* we have to enable the timebase). The decrementer interrupt
|
||||
* is wired into the vector table, nothing to do here for that.
|
||||
*/
|
||||
cpu = of_find_node_by_type(NULL, "cpu");
|
||||
virq= irq_of_parse_and_map(cpu, 0);
|
||||
irq = virq_to_hw(virq);
|
||||
|
||||
sys_tmr2 = immr_map(im_sit);
|
||||
out_be16(&sys_tmr2->sit_tbscr, ((1 << (7 - (irq/2))) << 8) |
|
||||
(TBSCR_TBF | TBSCR_TBE));
|
||||
immr_unmap(sys_tmr2);
|
||||
|
||||
if (setup_irq(virq, &tbint_irqaction))
|
||||
panic("Could not allocate timer IRQ!");
|
||||
}
|
||||
|
||||
/* The RTC on the MPC8xx is an internal register.
|
||||
* We want to protect this during power down, so we need to unlock,
|
||||
* modify, and re-lock.
|
||||
*/
|
||||
|
||||
int mpc8xx_set_rtc_time(struct rtc_time *tm)
|
||||
{
|
||||
sitk8xx_t __iomem *sys_tmr1;
|
||||
sit8xx_t __iomem *sys_tmr2;
|
||||
int time;
|
||||
|
||||
sys_tmr1 = immr_map(im_sitk);
|
||||
sys_tmr2 = immr_map(im_sit);
|
||||
time = mktime(tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
|
||||
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||
|
||||
out_be32(&sys_tmr1->sitk_rtck, KAPWR_KEY);
|
||||
out_be32(&sys_tmr2->sit_rtc, time);
|
||||
out_be32(&sys_tmr1->sitk_rtck, ~KAPWR_KEY);
|
||||
|
||||
immr_unmap(sys_tmr2);
|
||||
immr_unmap(sys_tmr1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mpc8xx_get_rtc_time(struct rtc_time *tm)
|
||||
{
|
||||
unsigned long data;
|
||||
sit8xx_t __iomem *sys_tmr = immr_map(im_sit);
|
||||
|
||||
/* Get time from the RTC. */
|
||||
data = in_be32(&sys_tmr->sit_rtc);
|
||||
to_tm(data, tm);
|
||||
tm->tm_year -= 1900;
|
||||
tm->tm_mon -= 1;
|
||||
immr_unmap(sys_tmr);
|
||||
return;
|
||||
}
|
||||
|
||||
void mpc8xx_restart(char *cmd)
|
||||
{
|
||||
car8xx_t __iomem *clk_r = immr_map(im_clkrst);
|
||||
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
setbits32(&clk_r->car_plprcr, 0x00000080);
|
||||
/* Clear the ME bit in MSR to cause checkstop on machine check
|
||||
*/
|
||||
mtmsr(mfmsr() & ~0x1000);
|
||||
|
||||
in_8(&clk_r->res[0]);
|
||||
panic("Restart failed\n");
|
||||
}
|
||||
|
||||
static void cpm_cascade(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
int cascade_irq = cpm_get_irq();
|
||||
|
||||
if (cascade_irq >= 0)
|
||||
generic_handle_irq(cascade_irq);
|
||||
|
||||
chip->irq_eoi(&desc->irq_data);
|
||||
}
|
||||
|
||||
/* Initialize the internal interrupt controllers. The number of
|
||||
* interrupts supported can vary with the processor type, and the
|
||||
* 82xx family can have up to 64.
|
||||
* External interrupts can be either edge or level triggered, and
|
||||
* need to be initialized by the appropriate driver.
|
||||
*/
|
||||
void __init mpc8xx_pics_init(void)
|
||||
{
|
||||
int irq;
|
||||
|
||||
if (mpc8xx_pic_init()) {
|
||||
printk(KERN_ERR "Failed interrupt 8xx controller initialization\n");
|
||||
return;
|
||||
}
|
||||
|
||||
irq = cpm_pic_init();
|
||||
if (irq != NO_IRQ)
|
||||
irq_set_chained_handler(irq, cpm_cascade);
|
||||
}
|
47
arch/powerpc/platforms/8xx/mpc86xads.h
Normal file
47
arch/powerpc/platforms/8xx/mpc86xads.h
Normal file
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* A collection of structures, addresses, and values associated with
|
||||
* the Freescale MPC86xADS board.
|
||||
* Copied from the FADS stuff.
|
||||
*
|
||||
* Author: MontaVista Software, Inc.
|
||||
* source@mvista.com
|
||||
*
|
||||
* 2005 (c) MontaVista Software, Inc. 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.
|
||||
*/
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#ifndef __ASM_MPC86XADS_H__
|
||||
#define __ASM_MPC86XADS_H__
|
||||
|
||||
/* Bits of interest in the BCSRs.
|
||||
*/
|
||||
#define BCSR1_ETHEN ((uint)0x20000000)
|
||||
#define BCSR1_IRDAEN ((uint)0x10000000)
|
||||
#define BCSR1_RS232EN_1 ((uint)0x01000000)
|
||||
#define BCSR1_PCCEN ((uint)0x00800000)
|
||||
#define BCSR1_PCCVCC0 ((uint)0x00400000)
|
||||
#define BCSR1_PCCVPP0 ((uint)0x00200000)
|
||||
#define BCSR1_PCCVPP1 ((uint)0x00100000)
|
||||
#define BCSR1_PCCVPP_MASK (BCSR1_PCCVPP0 | BCSR1_PCCVPP1)
|
||||
#define BCSR1_RS232EN_2 ((uint)0x00040000)
|
||||
#define BCSR1_PCCVCC1 ((uint)0x00010000)
|
||||
#define BCSR1_PCCVCC_MASK (BCSR1_PCCVCC0 | BCSR1_PCCVCC1)
|
||||
|
||||
#define BCSR4_ETH10_RST ((uint)0x80000000) /* 10Base-T PHY reset*/
|
||||
#define BCSR4_USB_LO_SPD ((uint)0x04000000)
|
||||
#define BCSR4_USB_VCC ((uint)0x02000000)
|
||||
#define BCSR4_USB_FULL_SPD ((uint)0x00040000)
|
||||
#define BCSR4_USB_EN ((uint)0x00020000)
|
||||
|
||||
#define BCSR5_MII2_EN 0x40
|
||||
#define BCSR5_MII2_RST 0x20
|
||||
#define BCSR5_T1_RST 0x10
|
||||
#define BCSR5_ATM155_RST 0x08
|
||||
#define BCSR5_ATM25_RST 0x04
|
||||
#define BCSR5_MII1_EN 0x02
|
||||
#define BCSR5_MII1_RST 0x01
|
||||
|
||||
#endif /* __ASM_MPC86XADS_H__ */
|
||||
#endif /* __KERNEL__ */
|
151
arch/powerpc/platforms/8xx/mpc86xads_setup.c
Normal file
151
arch/powerpc/platforms/8xx/mpc86xads_setup.c
Normal file
|
@ -0,0 +1,151 @@
|
|||
/*arch/powerpc/platforms/8xx/mpc86xads_setup.c
|
||||
*
|
||||
* Platform setup for the Freescale mpc86xads board
|
||||
*
|
||||
* Vitaly Bordug <vbordug@ru.mvista.com>
|
||||
*
|
||||
* Copyright 2005 MontaVista Software Inc.
|
||||
*
|
||||
* Heavily modified by Scott Wood <scottwood@freescale.com>
|
||||
* Copyright 2007 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* 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/init.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_fdt.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/8xx_immap.h>
|
||||
#include <asm/cpm1.h>
|
||||
#include <asm/fs_pd.h>
|
||||
#include <asm/udbg.h>
|
||||
|
||||
#include "mpc86xads.h"
|
||||
#include "mpc8xx.h"
|
||||
|
||||
struct cpm_pin {
|
||||
int port, pin, flags;
|
||||
};
|
||||
|
||||
static struct cpm_pin mpc866ads_pins[] = {
|
||||
/* SMC1 */
|
||||
{CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */
|
||||
{CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
|
||||
|
||||
/* SMC2 */
|
||||
{CPM_PORTB, 21, CPM_PIN_INPUT}, /* RX */
|
||||
{CPM_PORTB, 20, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
|
||||
|
||||
/* SCC1 */
|
||||
{CPM_PORTA, 6, CPM_PIN_INPUT}, /* CLK1 */
|
||||
{CPM_PORTA, 7, CPM_PIN_INPUT}, /* CLK2 */
|
||||
{CPM_PORTA, 14, CPM_PIN_INPUT}, /* TX */
|
||||
{CPM_PORTA, 15, CPM_PIN_INPUT}, /* RX */
|
||||
{CPM_PORTB, 19, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TENA */
|
||||
{CPM_PORTC, 10, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* RENA */
|
||||
{CPM_PORTC, 11, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* CLSN */
|
||||
|
||||
/* MII */
|
||||
{CPM_PORTD, 3, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 4, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 5, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 6, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 7, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 8, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 9, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 10, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 11, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 12, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 13, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 14, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 15, CPM_PIN_OUTPUT},
|
||||
|
||||
/* I2C */
|
||||
{CPM_PORTB, 26, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN},
|
||||
{CPM_PORTB, 27, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN},
|
||||
};
|
||||
|
||||
static void __init init_ioports(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mpc866ads_pins); i++) {
|
||||
struct cpm_pin *pin = &mpc866ads_pins[i];
|
||||
cpm1_set_pin(pin->port, pin->pin, pin->flags);
|
||||
}
|
||||
|
||||
cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);
|
||||
cpm1_clk_setup(CPM_CLK_SMC2, CPM_BRG2, CPM_CLK_RTX);
|
||||
cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK1, CPM_CLK_TX);
|
||||
cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK2, CPM_CLK_RX);
|
||||
|
||||
/* Set FEC1 and FEC2 to MII mode */
|
||||
clrbits32(&mpc8xx_immr->im_cpm.cp_cptr, 0x00000180);
|
||||
}
|
||||
|
||||
static void __init mpc86xads_setup_arch(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
u32 __iomem *bcsr_io;
|
||||
|
||||
cpm_reset();
|
||||
init_ioports();
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,mpc866ads-bcsr");
|
||||
if (!np) {
|
||||
printk(KERN_CRIT "Could not find fsl,mpc866ads-bcsr node\n");
|
||||
return;
|
||||
}
|
||||
|
||||
bcsr_io = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
|
||||
if (bcsr_io == NULL) {
|
||||
printk(KERN_CRIT "Could not remap BCSR\n");
|
||||
return;
|
||||
}
|
||||
|
||||
clrbits32(bcsr_io, BCSR1_RS232EN_1 | BCSR1_RS232EN_2 | BCSR1_ETHEN);
|
||||
iounmap(bcsr_io);
|
||||
}
|
||||
|
||||
static int __init mpc86xads_probe(void)
|
||||
{
|
||||
unsigned long root = of_get_flat_dt_root();
|
||||
return of_flat_dt_is_compatible(root, "fsl,mpc866ads");
|
||||
}
|
||||
|
||||
static const struct of_device_id of_bus_ids[] __initconst = {
|
||||
{ .name = "soc", },
|
||||
{ .name = "cpm", },
|
||||
{ .name = "localbus", },
|
||||
{},
|
||||
};
|
||||
|
||||
static int __init declare_of_platform_devices(void)
|
||||
{
|
||||
of_platform_bus_probe(NULL, of_bus_ids, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
machine_device_initcall(mpc86x_ads, declare_of_platform_devices);
|
||||
|
||||
define_machine(mpc86x_ads) {
|
||||
.name = "MPC86x ADS",
|
||||
.probe = mpc86xads_probe,
|
||||
.setup_arch = mpc86xads_setup_arch,
|
||||
.init_IRQ = mpc8xx_pics_init,
|
||||
.get_irq = mpc8xx_get_irq,
|
||||
.restart = mpc8xx_restart,
|
||||
.calibrate_decr = mpc8xx_calibrate_decr,
|
||||
.set_rtc_time = mpc8xx_set_rtc_time,
|
||||
.get_rtc_time = mpc8xx_get_rtc_time,
|
||||
.progress = udbg_progress,
|
||||
};
|
49
arch/powerpc/platforms/8xx/mpc885ads.h
Normal file
49
arch/powerpc/platforms/8xx/mpc885ads.h
Normal file
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* A collection of structures, addresses, and values associated with
|
||||
* the Freescale MPC885ADS board.
|
||||
* Copied from the FADS stuff.
|
||||
*
|
||||
* Author: MontaVista Software, Inc.
|
||||
* source@mvista.com
|
||||
*
|
||||
* 2005 (c) MontaVista Software, Inc. 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.
|
||||
*/
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#ifndef __ASM_MPC885ADS_H__
|
||||
#define __ASM_MPC885ADS_H__
|
||||
|
||||
#include <sysdev/fsl_soc.h>
|
||||
|
||||
/* Bits of interest in the BCSRs.
|
||||
*/
|
||||
#define BCSR1_ETHEN ((uint)0x20000000)
|
||||
#define BCSR1_IRDAEN ((uint)0x10000000)
|
||||
#define BCSR1_RS232EN_1 ((uint)0x01000000)
|
||||
#define BCSR1_PCCEN ((uint)0x00800000)
|
||||
#define BCSR1_PCCVCC0 ((uint)0x00400000)
|
||||
#define BCSR1_PCCVPP0 ((uint)0x00200000)
|
||||
#define BCSR1_PCCVPP1 ((uint)0x00100000)
|
||||
#define BCSR1_PCCVPP_MASK (BCSR1_PCCVPP0 | BCSR1_PCCVPP1)
|
||||
#define BCSR1_RS232EN_2 ((uint)0x00040000)
|
||||
#define BCSR1_PCCVCC1 ((uint)0x00010000)
|
||||
#define BCSR1_PCCVCC_MASK (BCSR1_PCCVCC0 | BCSR1_PCCVCC1)
|
||||
|
||||
#define BCSR4_ETH10_RST ((uint)0x80000000) /* 10Base-T PHY reset*/
|
||||
#define BCSR4_USB_LO_SPD ((uint)0x04000000)
|
||||
#define BCSR4_USB_VCC ((uint)0x02000000)
|
||||
#define BCSR4_USB_FULL_SPD ((uint)0x00040000)
|
||||
#define BCSR4_USB_EN ((uint)0x00020000)
|
||||
|
||||
#define BCSR5_MII2_EN 0x40
|
||||
#define BCSR5_MII2_RST 0x20
|
||||
#define BCSR5_T1_RST 0x10
|
||||
#define BCSR5_ATM155_RST 0x08
|
||||
#define BCSR5_ATM25_RST 0x04
|
||||
#define BCSR5_MII1_EN 0x02
|
||||
#define BCSR5_MII1_RST 0x01
|
||||
|
||||
#endif /* __ASM_MPC885ADS_H__ */
|
||||
#endif /* __KERNEL__ */
|
227
arch/powerpc/platforms/8xx/mpc885ads_setup.c
Normal file
227
arch/powerpc/platforms/8xx/mpc885ads_setup.c
Normal file
|
@ -0,0 +1,227 @@
|
|||
/*
|
||||
* Platform setup for the Freescale mpc885ads board
|
||||
*
|
||||
* Vitaly Bordug <vbordug@ru.mvista.com>
|
||||
*
|
||||
* Copyright 2005 MontaVista Software Inc.
|
||||
*
|
||||
* Heavily modified by Scott Wood <scottwood@freescale.com>
|
||||
* Copyright 2007 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* 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/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/param.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <linux/fs_enet_pd.h>
|
||||
#include <linux/fs_uart_pd.h>
|
||||
#include <linux/fsl_devices.h>
|
||||
#include <linux/mii.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_fdt.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
#include <asm/delay.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/8xx_immap.h>
|
||||
#include <asm/cpm1.h>
|
||||
#include <asm/fs_pd.h>
|
||||
#include <asm/udbg.h>
|
||||
|
||||
#include "mpc885ads.h"
|
||||
#include "mpc8xx.h"
|
||||
|
||||
static u32 __iomem *bcsr, *bcsr5;
|
||||
|
||||
struct cpm_pin {
|
||||
int port, pin, flags;
|
||||
};
|
||||
|
||||
static struct cpm_pin mpc885ads_pins[] = {
|
||||
/* SMC1 */
|
||||
{CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */
|
||||
{CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
|
||||
|
||||
/* SMC2 */
|
||||
#ifndef CONFIG_MPC8xx_SECOND_ETH_FEC2
|
||||
{CPM_PORTE, 21, CPM_PIN_INPUT}, /* RX */
|
||||
{CPM_PORTE, 20, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
|
||||
#endif
|
||||
|
||||
/* SCC3 */
|
||||
{CPM_PORTA, 9, CPM_PIN_INPUT}, /* RX */
|
||||
{CPM_PORTA, 8, CPM_PIN_INPUT}, /* TX */
|
||||
{CPM_PORTC, 4, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* RENA */
|
||||
{CPM_PORTC, 5, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* CLSN */
|
||||
{CPM_PORTE, 27, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TENA */
|
||||
{CPM_PORTE, 17, CPM_PIN_INPUT}, /* CLK5 */
|
||||
{CPM_PORTE, 16, CPM_PIN_INPUT}, /* CLK6 */
|
||||
|
||||
/* MII1 */
|
||||
{CPM_PORTA, 0, CPM_PIN_INPUT},
|
||||
{CPM_PORTA, 1, CPM_PIN_INPUT},
|
||||
{CPM_PORTA, 2, CPM_PIN_INPUT},
|
||||
{CPM_PORTA, 3, CPM_PIN_INPUT},
|
||||
{CPM_PORTA, 4, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTA, 10, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTA, 11, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTB, 19, CPM_PIN_INPUT},
|
||||
{CPM_PORTB, 31, CPM_PIN_INPUT},
|
||||
{CPM_PORTC, 12, CPM_PIN_INPUT},
|
||||
{CPM_PORTC, 13, CPM_PIN_INPUT},
|
||||
{CPM_PORTE, 30, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 31, CPM_PIN_OUTPUT},
|
||||
|
||||
/* MII2 */
|
||||
#ifdef CONFIG_MPC8xx_SECOND_ETH_FEC2
|
||||
{CPM_PORTE, 14, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{CPM_PORTE, 15, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{CPM_PORTE, 16, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 17, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{CPM_PORTE, 18, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{CPM_PORTE, 19, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{CPM_PORTE, 20, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
|
||||
{CPM_PORTE, 21, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 22, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 23, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 24, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 25, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 26, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 27, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 28, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTE, 29, CPM_PIN_OUTPUT},
|
||||
#endif
|
||||
/* I2C */
|
||||
{CPM_PORTB, 26, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN},
|
||||
{CPM_PORTB, 27, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN},
|
||||
};
|
||||
|
||||
static void __init init_ioports(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mpc885ads_pins); i++) {
|
||||
struct cpm_pin *pin = &mpc885ads_pins[i];
|
||||
cpm1_set_pin(pin->port, pin->pin, pin->flags);
|
||||
}
|
||||
|
||||
cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);
|
||||
cpm1_clk_setup(CPM_CLK_SMC2, CPM_BRG2, CPM_CLK_RTX);
|
||||
cpm1_clk_setup(CPM_CLK_SCC3, CPM_CLK5, CPM_CLK_TX);
|
||||
cpm1_clk_setup(CPM_CLK_SCC3, CPM_CLK6, CPM_CLK_RX);
|
||||
|
||||
/* Set FEC1 and FEC2 to MII mode */
|
||||
clrbits32(&mpc8xx_immr->im_cpm.cp_cptr, 0x00000180);
|
||||
}
|
||||
|
||||
static void __init mpc885ads_setup_arch(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
cpm_reset();
|
||||
init_ioports();
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,mpc885ads-bcsr");
|
||||
if (!np) {
|
||||
printk(KERN_CRIT "Could not find fsl,mpc885ads-bcsr node\n");
|
||||
return;
|
||||
}
|
||||
|
||||
bcsr = of_iomap(np, 0);
|
||||
bcsr5 = of_iomap(np, 1);
|
||||
of_node_put(np);
|
||||
|
||||
if (!bcsr || !bcsr5) {
|
||||
printk(KERN_CRIT "Could not remap BCSR\n");
|
||||
return;
|
||||
}
|
||||
|
||||
clrbits32(&bcsr[1], BCSR1_RS232EN_1);
|
||||
#ifdef CONFIG_MPC8xx_SECOND_ETH_FEC2
|
||||
setbits32(&bcsr[1], BCSR1_RS232EN_2);
|
||||
#else
|
||||
clrbits32(&bcsr[1], BCSR1_RS232EN_2);
|
||||
#endif
|
||||
|
||||
clrbits32(bcsr5, BCSR5_MII1_EN);
|
||||
setbits32(bcsr5, BCSR5_MII1_RST);
|
||||
udelay(1000);
|
||||
clrbits32(bcsr5, BCSR5_MII1_RST);
|
||||
|
||||
#ifdef CONFIG_MPC8xx_SECOND_ETH_FEC2
|
||||
clrbits32(bcsr5, BCSR5_MII2_EN);
|
||||
setbits32(bcsr5, BCSR5_MII2_RST);
|
||||
udelay(1000);
|
||||
clrbits32(bcsr5, BCSR5_MII2_RST);
|
||||
#else
|
||||
setbits32(bcsr5, BCSR5_MII2_EN);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MPC8xx_SECOND_ETH_SCC3
|
||||
clrbits32(&bcsr[4], BCSR4_ETH10_RST);
|
||||
udelay(1000);
|
||||
setbits32(&bcsr[4], BCSR4_ETH10_RST);
|
||||
|
||||
setbits32(&bcsr[1], BCSR1_ETHEN);
|
||||
|
||||
np = of_find_node_by_path("/soc@ff000000/cpm@9c0/serial@a80");
|
||||
#else
|
||||
np = of_find_node_by_path("/soc@ff000000/cpm@9c0/ethernet@a40");
|
||||
#endif
|
||||
|
||||
/* The SCC3 enet registers overlap the SMC1 registers, so
|
||||
* one of the two must be removed from the device tree.
|
||||
*/
|
||||
|
||||
if (np) {
|
||||
of_detach_node(np);
|
||||
of_node_put(np);
|
||||
}
|
||||
}
|
||||
|
||||
static int __init mpc885ads_probe(void)
|
||||
{
|
||||
unsigned long root = of_get_flat_dt_root();
|
||||
return of_flat_dt_is_compatible(root, "fsl,mpc885ads");
|
||||
}
|
||||
|
||||
static const struct of_device_id of_bus_ids[] __initconst = {
|
||||
{ .name = "soc", },
|
||||
{ .name = "cpm", },
|
||||
{ .name = "localbus", },
|
||||
{},
|
||||
};
|
||||
|
||||
static int __init declare_of_platform_devices(void)
|
||||
{
|
||||
/* Publish the QE devices */
|
||||
of_platform_bus_probe(NULL, of_bus_ids, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
machine_device_initcall(mpc885_ads, declare_of_platform_devices);
|
||||
|
||||
define_machine(mpc885_ads) {
|
||||
.name = "Freescale MPC885 ADS",
|
||||
.probe = mpc885ads_probe,
|
||||
.setup_arch = mpc885ads_setup_arch,
|
||||
.init_IRQ = mpc8xx_pics_init,
|
||||
.get_irq = mpc8xx_get_irq,
|
||||
.restart = mpc8xx_restart,
|
||||
.calibrate_decr = mpc8xx_calibrate_decr,
|
||||
.set_rtc_time = mpc8xx_set_rtc_time,
|
||||
.get_rtc_time = mpc8xx_get_rtc_time,
|
||||
.progress = udbg_progress,
|
||||
};
|
21
arch/powerpc/platforms/8xx/mpc8xx.h
Normal file
21
arch/powerpc/platforms/8xx/mpc8xx.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* Prototypes, etc. for the Freescale MPC8xx embedded cpu chips
|
||||
* May need to be cleaned as the port goes on ...
|
||||
*
|
||||
* Copyright (C) 2008 Jochen Friedrich <jochen@scram.de>
|
||||
*
|
||||
* 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 __MPC8xx_H
|
||||
#define __MPC8xx_H
|
||||
|
||||
extern void mpc8xx_restart(char *cmd);
|
||||
extern void mpc8xx_calibrate_decr(void);
|
||||
extern int mpc8xx_set_rtc_time(struct rtc_time *tm);
|
||||
extern void mpc8xx_get_rtc_time(struct rtc_time *tm);
|
||||
extern void mpc8xx_pics_init(void);
|
||||
extern unsigned int mpc8xx_get_irq(void);
|
||||
|
||||
#endif /* __MPC8xx_H */
|
154
arch/powerpc/platforms/8xx/tqm8xx_setup.c
Normal file
154
arch/powerpc/platforms/8xx/tqm8xx_setup.c
Normal file
|
@ -0,0 +1,154 @@
|
|||
/*
|
||||
* Platform setup for the MPC8xx based boards from TQM.
|
||||
*
|
||||
* Heiko Schocher <hs@denx.de>
|
||||
* Copyright 2010 DENX Software Engineering GmbH
|
||||
*
|
||||
* based on:
|
||||
* Vitaly Bordug <vbordug@ru.mvista.com>
|
||||
*
|
||||
* Copyright 2005 MontaVista Software Inc.
|
||||
*
|
||||
* Heavily modified by Scott Wood <scottwood@freescale.com>
|
||||
* Copyright 2007 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* 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/init.h>
|
||||
#include <linux/param.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <linux/fs_enet_pd.h>
|
||||
#include <linux/fs_uart_pd.h>
|
||||
#include <linux/fsl_devices.h>
|
||||
#include <linux/mii.h>
|
||||
#include <linux/of_fdt.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
#include <asm/delay.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/8xx_immap.h>
|
||||
#include <asm/cpm1.h>
|
||||
#include <asm/fs_pd.h>
|
||||
#include <asm/udbg.h>
|
||||
|
||||
#include "mpc8xx.h"
|
||||
|
||||
struct cpm_pin {
|
||||
int port, pin, flags;
|
||||
};
|
||||
|
||||
static struct cpm_pin tqm8xx_pins[] __initdata = {
|
||||
/* SMC1 */
|
||||
{CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */
|
||||
{CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
|
||||
|
||||
/* SCC1 */
|
||||
{CPM_PORTA, 5, CPM_PIN_INPUT}, /* CLK1 */
|
||||
{CPM_PORTA, 7, CPM_PIN_INPUT}, /* CLK2 */
|
||||
{CPM_PORTA, 14, CPM_PIN_INPUT}, /* TX */
|
||||
{CPM_PORTA, 15, CPM_PIN_INPUT}, /* RX */
|
||||
{CPM_PORTC, 15, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TENA */
|
||||
{CPM_PORTC, 10, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO},
|
||||
{CPM_PORTC, 11, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO},
|
||||
};
|
||||
|
||||
static struct cpm_pin tqm8xx_fec_pins[] __initdata = {
|
||||
/* MII */
|
||||
{CPM_PORTD, 3, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 4, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 5, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 6, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 7, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 8, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 9, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 10, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 11, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 12, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 13, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 14, CPM_PIN_OUTPUT},
|
||||
{CPM_PORTD, 15, CPM_PIN_OUTPUT},
|
||||
};
|
||||
|
||||
static void __init init_pins(int n, struct cpm_pin *pin)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
cpm1_set_pin(pin->port, pin->pin, pin->flags);
|
||||
pin++;
|
||||
}
|
||||
}
|
||||
|
||||
static void __init init_ioports(void)
|
||||
{
|
||||
struct device_node *dnode;
|
||||
struct property *prop;
|
||||
int len;
|
||||
|
||||
init_pins(ARRAY_SIZE(tqm8xx_pins), &tqm8xx_pins[0]);
|
||||
|
||||
cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);
|
||||
|
||||
dnode = of_find_node_by_name(NULL, "aliases");
|
||||
if (dnode == NULL)
|
||||
return;
|
||||
prop = of_find_property(dnode, "ethernet1", &len);
|
||||
if (prop == NULL)
|
||||
return;
|
||||
|
||||
/* init FEC pins */
|
||||
init_pins(ARRAY_SIZE(tqm8xx_fec_pins), &tqm8xx_fec_pins[0]);
|
||||
}
|
||||
|
||||
static void __init tqm8xx_setup_arch(void)
|
||||
{
|
||||
cpm_reset();
|
||||
init_ioports();
|
||||
}
|
||||
|
||||
static int __init tqm8xx_probe(void)
|
||||
{
|
||||
unsigned long node = of_get_flat_dt_root();
|
||||
|
||||
return of_flat_dt_is_compatible(node, "tqc,tqm8xx");
|
||||
}
|
||||
|
||||
static const struct of_device_id of_bus_ids[] __initconst = {
|
||||
{ .name = "soc", },
|
||||
{ .name = "cpm", },
|
||||
{ .name = "localbus", },
|
||||
{ .compatible = "simple-bus" },
|
||||
{},
|
||||
};
|
||||
|
||||
static int __init declare_of_platform_devices(void)
|
||||
{
|
||||
of_platform_bus_probe(NULL, of_bus_ids, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
machine_device_initcall(tqm8xx, declare_of_platform_devices);
|
||||
|
||||
define_machine(tqm8xx) {
|
||||
.name = "TQM8xx",
|
||||
.probe = tqm8xx_probe,
|
||||
.setup_arch = tqm8xx_setup_arch,
|
||||
.init_IRQ = mpc8xx_pics_init,
|
||||
.get_irq = mpc8xx_get_irq,
|
||||
.restart = mpc8xx_restart,
|
||||
.calibrate_decr = mpc8xx_calibrate_decr,
|
||||
.set_rtc_time = mpc8xx_set_rtc_time,
|
||||
.get_rtc_time = mpc8xx_get_rtc_time,
|
||||
.progress = udbg_progress,
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue