2005-04-17 06:20:36 +08:00
|
|
|
/***************************************************************************/
|
|
|
|
|
|
|
|
/*
|
2014-08-19 09:55:24 +08:00
|
|
|
* m528x.c -- platform support for ColdFire 528x based boards
|
2005-04-17 06:20:36 +08:00
|
|
|
*
|
2011-03-31 09:57:33 +08:00
|
|
|
* Sub-architcture dependent initialization code for the Freescale
|
2009-04-28 12:24:25 +08:00
|
|
|
* 5280, 5281 and 5282 CPUs.
|
2005-04-17 06:20:36 +08:00
|
|
|
*
|
|
|
|
* Copyright (C) 1999-2003, Greg Ungerer (gerg@snapgear.com)
|
|
|
|
* Copyright (C) 2001-2003, SnapGear Inc. (www.snapgear.com)
|
|
|
|
*/
|
|
|
|
|
|
|
|
/***************************************************************************/
|
|
|
|
|
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <linux/param.h>
|
|
|
|
#include <linux/init.h>
|
2008-02-01 15:34:50 +08:00
|
|
|
#include <linux/platform_device.h>
|
|
|
|
#include <linux/io.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
#include <asm/machdep.h>
|
|
|
|
#include <asm/coldfire.h>
|
|
|
|
#include <asm/mcfsim.h>
|
2008-02-01 15:34:50 +08:00
|
|
|
#include <asm/mcfuart.h>
|
2012-07-13 14:04:22 +08:00
|
|
|
#include <asm/mcfclk.h>
|
|
|
|
|
|
|
|
/***************************************************************************/
|
|
|
|
|
|
|
|
DEFINE_CLK(pll, "pll.0", MCF_CLK);
|
|
|
|
DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
|
|
|
|
DEFINE_CLK(mcfpit0, "mcfpit.0", MCF_CLK);
|
|
|
|
DEFINE_CLK(mcfpit1, "mcfpit.1", MCF_CLK);
|
|
|
|
DEFINE_CLK(mcfpit2, "mcfpit.2", MCF_CLK);
|
|
|
|
DEFINE_CLK(mcfpit3, "mcfpit.3", MCF_CLK);
|
|
|
|
DEFINE_CLK(mcfuart0, "mcfuart.0", MCF_BUSCLK);
|
|
|
|
DEFINE_CLK(mcfuart1, "mcfuart.1", MCF_BUSCLK);
|
|
|
|
DEFINE_CLK(mcfuart2, "mcfuart.2", MCF_BUSCLK);
|
2014-05-15 01:06:29 +08:00
|
|
|
DEFINE_CLK(mcfqspi0, "mcfqspi.0", MCF_BUSCLK);
|
2012-07-13 14:04:22 +08:00
|
|
|
DEFINE_CLK(fec0, "fec.0", MCF_BUSCLK);
|
2014-07-01 00:53:19 +08:00
|
|
|
DEFINE_CLK(mcfi2c0, "imx1-i2c.0", MCF_BUSCLK);
|
2012-07-13 14:04:22 +08:00
|
|
|
|
|
|
|
struct clk *mcf_clks[] = {
|
|
|
|
&clk_pll,
|
|
|
|
&clk_sys,
|
|
|
|
&clk_mcfpit0,
|
|
|
|
&clk_mcfpit1,
|
|
|
|
&clk_mcfpit2,
|
|
|
|
&clk_mcfpit3,
|
|
|
|
&clk_mcfuart0,
|
|
|
|
&clk_mcfuart1,
|
|
|
|
&clk_mcfuart2,
|
2014-05-15 01:06:29 +08:00
|
|
|
&clk_mcfqspi0,
|
2012-07-13 14:04:22 +08:00
|
|
|
&clk_fec0,
|
2014-07-01 00:53:19 +08:00
|
|
|
&clk_mcfi2c0,
|
2012-07-13 14:04:22 +08:00
|
|
|
NULL
|
|
|
|
};
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/***************************************************************************/
|
|
|
|
|
2010-01-23 04:43:03 +08:00
|
|
|
static void __init m528x_qspi_init(void)
|
|
|
|
{
|
2014-05-15 01:07:55 +08:00
|
|
|
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
2010-01-23 04:43:03 +08:00
|
|
|
/* setup Port QS for QSPI with gpio CS control */
|
|
|
|
__raw_writeb(0x07, MCFGPIO_PQSPAR);
|
2012-05-07 03:22:53 +08:00
|
|
|
#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
|
2014-05-15 01:07:55 +08:00
|
|
|
}
|
2008-02-01 15:34:50 +08:00
|
|
|
|
|
|
|
/***************************************************************************/
|
|
|
|
|
2014-07-01 00:53:19 +08:00
|
|
|
static void __init m528x_i2c_init(void)
|
|
|
|
{
|
|
|
|
#if IS_ENABLED(CONFIG_I2C_IMX)
|
|
|
|
u16 paspar;
|
|
|
|
|
|
|
|
/* setup Port AS Pin Assignment Register for I2C */
|
|
|
|
/* set PASPA0 to SCL and PASPA1 to SDA */
|
|
|
|
paspar = readw(MCFGPIO_PASPAR);
|
|
|
|
paspar |= 0xF;
|
|
|
|
writew(paspar, MCFGPIO_PASPAR);
|
|
|
|
#endif /* IS_ENABLED(CONFIG_I2C_IMX) */
|
|
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************/
|
|
|
|
|
2011-12-23 23:00:48 +08:00
|
|
|
static void __init m528x_uarts_init(void)
|
2008-02-01 15:34:50 +08:00
|
|
|
{
|
|
|
|
u8 port;
|
|
|
|
|
|
|
|
/* make sure PUAPAR is set for UART0 and UART1 */
|
2013-03-04 09:51:45 +08:00
|
|
|
port = readb(MCFGPIO_PUAPAR);
|
2011-12-23 23:00:48 +08:00
|
|
|
port |= 0x03 | (0x03 << 2);
|
m68knommu: refactor Coldfire GPIO not to require GPIOLIB, eliminate mcf_gpio_chips.
If we're not connecting external GPIO extenders via i2c or spi or whatever, we
probably don't need GPIOLIB. If we provide an alternate implementation of
the GPIOLIB functions to use when only on-chip GPIO is needed, we can change
ARCH_REQUIRE_GPIOLIB to ARCH_WANTS_OPTIONAL_GPIOLIB so that GPIOLIB becomes
optional.
The downside is that in the GPIOLIB=n case, we lose all error checking done by
gpiolib, ie multiply allocating the gpio, free'ing gpio etc., so that the
only checking that can be done is if we reference a gpio on an external part.
Targets that need the extra error checking can still select GPIOLIB=y.
For the case where GPIOLIB=y, we can simplify the table of gpio chips to use a
single chip, eliminating the tables of chips in the 5xxx.c files. The
original motivation for the definition of multiple chips was to match the way
many of the Coldfire variants defined their gpio as a spare array in memory.
However, all this really gains us is some error checking when we request a
gpio, gpiolib can check that it doesn't fall in one of the holes. If thats
important, I think we can still come up with a better way of accomplishing
that.
Also in this patch is some general cleanup and reorganizing of the gpio header
files (I'm sure I must have had a reason why I sometimes used a prefix of
mcf_gpio and other times mcfgpio but for the life of me I can't think of it
now).
Signed-off-by: Steven King <sfking@fdwdc.com>
Signed-off-by: Greg Ungerer <gerg@uclinux.org>
2012-05-22 04:10:19 +08:00
|
|
|
writeb(port, MCFGPIO_PUAPAR);
|
2008-02-01 15:34:50 +08:00
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/***************************************************************************/
|
|
|
|
|
2009-02-27 14:40:38 +08:00
|
|
|
static void __init m528x_fec_init(void)
|
|
|
|
{
|
|
|
|
u16 v16;
|
|
|
|
|
|
|
|
/* Set multi-function pins to ethernet mode for fec0 */
|
2012-09-17 10:20:20 +08:00
|
|
|
v16 = readw(MCFGPIO_PASPAR);
|
|
|
|
writew(v16 | 0xf00, MCFGPIO_PASPAR);
|
|
|
|
writeb(0xc0, MCFGPIO_PEHLPAR);
|
2009-02-27 14:40:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************/
|
|
|
|
|
2008-05-01 10:17:08 +08:00
|
|
|
#ifdef CONFIG_WILDFIRE
|
|
|
|
void wildfire_halt(void)
|
|
|
|
{
|
|
|
|
writeb(0, 0x30000007);
|
|
|
|
writeb(0x2, 0x30000007);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef CONFIG_WILDFIREMOD
|
|
|
|
void wildfiremod_halt(void)
|
|
|
|
{
|
|
|
|
printk(KERN_INFO "WildFireMod hibernating...\n");
|
|
|
|
|
|
|
|
/* Set portE.5 to Digital IO */
|
2016-08-23 19:27:16 +08:00
|
|
|
writew(readw(MCFGPIO_PEPAR) & ~(1 << (5 * 2)), MCFGPIO_PEPAR);
|
2008-05-01 10:17:08 +08:00
|
|
|
|
|
|
|
/* Make portE.5 an output */
|
2016-08-23 19:27:16 +08:00
|
|
|
writeb(readb(MCFGPIO_PDDR_E) | (1 << 5), MCFGPIO_PDDR_E);
|
2008-05-01 10:17:08 +08:00
|
|
|
|
|
|
|
/* Now toggle portE.5 from low to high */
|
2016-08-23 19:27:16 +08:00
|
|
|
writeb(readb(MCFGPIO_PODR_E) & ~(1 << 5), MCFGPIO_PODR_E);
|
|
|
|
writeb(readb(MCFGPIO_PODR_E) | (1 << 5), MCFGPIO_PODR_E);
|
2008-05-01 10:17:08 +08:00
|
|
|
|
|
|
|
printk(KERN_EMERG "Failed to hibernate. Halting!\n");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2008-02-01 15:34:50 +08:00
|
|
|
void __init config_BSP(char *commandp, int size)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2008-05-01 10:17:08 +08:00
|
|
|
#ifdef CONFIG_WILDFIRE
|
|
|
|
mach_halt = wildfire_halt;
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_WILDFIREMOD
|
|
|
|
mach_halt = wildfiremod_halt;
|
|
|
|
#endif
|
2012-01-23 13:34:58 +08:00
|
|
|
mach_sched_init = hw_timer_init;
|
2008-02-01 15:34:50 +08:00
|
|
|
m528x_uarts_init();
|
2009-02-27 14:40:38 +08:00
|
|
|
m528x_fec_init();
|
2010-01-23 04:43:03 +08:00
|
|
|
m528x_qspi_init();
|
2014-07-01 00:53:19 +08:00
|
|
|
m528x_i2c_init();
|
2008-02-01 15:34:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************/
|