forked from Minki/linux
ARM: shmobile: Remove legacy SoC code for R-Mobile A1
The last user of the R-Mobile A1 (r8a7740) legacy SoC code was the Armadillo-800 EVA legacy board code, which has been removed. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> [horms: resolved trivial conflicts with v4.2-rc1] Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
This commit is contained in:
parent
6a902a2ea1
commit
44d88c754e
@ -103,13 +103,6 @@ if ARCH_SHMOBILE_LEGACY
|
||||
|
||||
comment "Renesas ARM SoCs System Type"
|
||||
|
||||
config ARCH_R8A7740
|
||||
bool "R-Mobile A1 (R8A77400)"
|
||||
select ARCH_RMOBILE
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select ARM_GIC
|
||||
select RENESAS_INTC_IRQPIN
|
||||
|
||||
config ARCH_R8A7778
|
||||
bool "R-Car M1A (R8A77781)"
|
||||
select ARCH_RCAR_GEN1
|
||||
|
@ -8,7 +8,7 @@ obj-y := timer.o console.o
|
||||
# CPU objects
|
||||
obj-$(CONFIG_ARCH_SH73A0) += setup-sh73a0.o
|
||||
obj-$(CONFIG_ARCH_R8A73A4) += setup-r8a73a4.o
|
||||
obj-$(CONFIG_ARCH_R8A7740) += setup-r8a7740.o pm-r8a7740.o
|
||||
obj-$(CONFIG_ARCH_R8A7740) += setup-r8a7740.o
|
||||
obj-$(CONFIG_ARCH_R8A7778) += setup-r8a7778.o
|
||||
obj-$(CONFIG_ARCH_R8A7779) += setup-r8a7779.o pm-r8a7779.o
|
||||
obj-$(CONFIG_ARCH_R8A7790) += setup-r8a7790.o
|
||||
@ -20,7 +20,6 @@ obj-$(CONFIG_ARCH_R7S72100) += setup-r7s72100.o
|
||||
# Clock objects
|
||||
ifndef CONFIG_COMMON_CLK
|
||||
obj-y += clock.o
|
||||
obj-$(CONFIG_ARCH_R8A7740) += clock-r8a7740.o
|
||||
obj-$(CONFIG_ARCH_R8A7778) += clock-r8a7778.o
|
||||
obj-$(CONFIG_ARCH_R8A7779) += clock-r8a7779.o
|
||||
endif
|
||||
|
@ -1,675 +0,0 @@
|
||||
/*
|
||||
* R8A7740 processor support
|
||||
*
|
||||
* Copyright (C) 2011 Renesas Solutions Corp.
|
||||
* Copyright (C) 2011 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/sh_clk.h>
|
||||
#include <linux/clkdev.h>
|
||||
|
||||
#include "clock.h"
|
||||
#include "common.h"
|
||||
#include "r8a7740.h"
|
||||
|
||||
/*
|
||||
* | MDx | XTAL1/EXTAL1 | System | EXTALR |
|
||||
* Clock |-------+-----------------+ clock | 32.768 | RCLK
|
||||
* Mode | 2/1/0 | src MHz | source | KHz | source
|
||||
* -------+-------+-----------------+-----------+--------+----------
|
||||
* 0 | 0 0 0 | External 20~50 | XTAL1 | O | EXTALR
|
||||
* 1 | 0 0 1 | Crystal 20~30 | XTAL1 | O | EXTALR
|
||||
* 2 | 0 1 0 | External 40~50 | XTAL1 / 2 | O | EXTALR
|
||||
* 3 | 0 1 1 | Crystal 40~50 | XTAL1 / 2 | O | EXTALR
|
||||
* 4 | 1 0 0 | External 20~50 | XTAL1 | x | XTAL1 / 1024
|
||||
* 5 | 1 0 1 | Crystal 20~30 | XTAL1 | x | XTAL1 / 1024
|
||||
* 6 | 1 1 0 | External 40~50 | XTAL1 / 2 | x | XTAL1 / 2048
|
||||
* 7 | 1 1 1 | Crystal 40~50 | XTAL1 / 2 | x | XTAL1 / 2048
|
||||
*/
|
||||
|
||||
/* CPG registers */
|
||||
#define FRQCRA IOMEM(0xe6150000)
|
||||
#define FRQCRB IOMEM(0xe6150004)
|
||||
#define VCLKCR1 IOMEM(0xE6150008)
|
||||
#define VCLKCR2 IOMEM(0xE615000c)
|
||||
#define FRQCRC IOMEM(0xe61500e0)
|
||||
#define FSIACKCR IOMEM(0xe6150018)
|
||||
#define PLLC01CR IOMEM(0xe6150028)
|
||||
|
||||
#define SUBCKCR IOMEM(0xe6150080)
|
||||
#define USBCKCR IOMEM(0xe615008c)
|
||||
|
||||
#define MSTPSR0 IOMEM(0xe6150030)
|
||||
#define MSTPSR1 IOMEM(0xe6150038)
|
||||
#define MSTPSR2 IOMEM(0xe6150040)
|
||||
#define MSTPSR3 IOMEM(0xe6150048)
|
||||
#define MSTPSR4 IOMEM(0xe615004c)
|
||||
#define FSIBCKCR IOMEM(0xe6150090)
|
||||
#define HDMICKCR IOMEM(0xe6150094)
|
||||
#define SMSTPCR0 IOMEM(0xe6150130)
|
||||
#define SMSTPCR1 IOMEM(0xe6150134)
|
||||
#define SMSTPCR2 IOMEM(0xe6150138)
|
||||
#define SMSTPCR3 IOMEM(0xe615013c)
|
||||
#define SMSTPCR4 IOMEM(0xe6150140)
|
||||
|
||||
#define FSIDIVA IOMEM(0xFE1F8000)
|
||||
#define FSIDIVB IOMEM(0xFE1F8008)
|
||||
|
||||
/* Fixed 32 KHz root clock from EXTALR pin */
|
||||
static struct clk extalr_clk = {
|
||||
.rate = 32768,
|
||||
};
|
||||
|
||||
/*
|
||||
* 25MHz default rate for the EXTAL1 root input clock.
|
||||
* If needed, reset this with clk_set_rate() from the platform code.
|
||||
*/
|
||||
static struct clk extal1_clk = {
|
||||
.rate = 25000000,
|
||||
};
|
||||
|
||||
/*
|
||||
* 48MHz default rate for the EXTAL2 root input clock.
|
||||
* If needed, reset this with clk_set_rate() from the platform code.
|
||||
*/
|
||||
static struct clk extal2_clk = {
|
||||
.rate = 48000000,
|
||||
};
|
||||
|
||||
/*
|
||||
* 27MHz default rate for the DV_CLKI root input clock.
|
||||
* If needed, reset this with clk_set_rate() from the platform code.
|
||||
*/
|
||||
static struct clk dv_clk = {
|
||||
.rate = 27000000,
|
||||
};
|
||||
|
||||
SH_CLK_RATIO(div2, 1, 2);
|
||||
SH_CLK_RATIO(div1k, 1, 1024);
|
||||
|
||||
SH_FIXED_RATIO_CLK(extal1_div2_clk, extal1_clk, div2);
|
||||
SH_FIXED_RATIO_CLK(extal1_div1024_clk, extal1_clk, div1k);
|
||||
SH_FIXED_RATIO_CLK(extal1_div2048_clk, extal1_div2_clk, div1k);
|
||||
SH_FIXED_RATIO_CLK(extal2_div2_clk, extal2_clk, div2);
|
||||
|
||||
static struct sh_clk_ops followparent_clk_ops = {
|
||||
.recalc = followparent_recalc,
|
||||
};
|
||||
|
||||
/* Main clock */
|
||||
static struct clk system_clk = {
|
||||
.ops = &followparent_clk_ops,
|
||||
};
|
||||
|
||||
SH_FIXED_RATIO_CLK(system_div2_clk, system_clk, div2);
|
||||
|
||||
/* r_clk */
|
||||
static struct clk r_clk = {
|
||||
.ops = &followparent_clk_ops,
|
||||
};
|
||||
|
||||
/* PLLC0/PLLC1 */
|
||||
static unsigned long pllc01_recalc(struct clk *clk)
|
||||
{
|
||||
unsigned long mult = 1;
|
||||
|
||||
if (__raw_readl(PLLC01CR) & (1 << 14))
|
||||
mult = ((__raw_readl(clk->enable_reg) >> 24) & 0x7f) + 1;
|
||||
|
||||
return clk->parent->rate * mult;
|
||||
}
|
||||
|
||||
static struct sh_clk_ops pllc01_clk_ops = {
|
||||
.recalc = pllc01_recalc,
|
||||
};
|
||||
|
||||
static struct clk pllc0_clk = {
|
||||
.ops = &pllc01_clk_ops,
|
||||
.flags = CLK_ENABLE_ON_INIT,
|
||||
.parent = &system_clk,
|
||||
.enable_reg = (void __iomem *)FRQCRC,
|
||||
};
|
||||
|
||||
static struct clk pllc1_clk = {
|
||||
.ops = &pllc01_clk_ops,
|
||||
.flags = CLK_ENABLE_ON_INIT,
|
||||
.parent = &system_div2_clk,
|
||||
.enable_reg = (void __iomem *)FRQCRA,
|
||||
};
|
||||
|
||||
/* PLLC1 / 2 */
|
||||
SH_FIXED_RATIO_CLK(pllc1_div2_clk, pllc1_clk, div2);
|
||||
|
||||
/* USB clock */
|
||||
/*
|
||||
* USBCKCR is controlling usb24 clock
|
||||
* bit[7] : parent clock
|
||||
* bit[6] : clock divide rate
|
||||
* And this bit[7] is used as a "usb24s" from other devices.
|
||||
* (Video clock / Sub clock / SPU clock)
|
||||
* You can controll this clock as a below.
|
||||
*
|
||||
* struct clk *usb24 = clk_get(dev, "usb24");
|
||||
* struct clk *usb24s = clk_get(NULL, "usb24s");
|
||||
* struct clk *system = clk_get(NULL, "system_clk");
|
||||
* int rate = clk_get_rate(system);
|
||||
*
|
||||
* clk_set_parent(usb24s, system); // for bit[7]
|
||||
* clk_set_rate(usb24, rate / 2); // for bit[6]
|
||||
*/
|
||||
static struct clk *usb24s_parents[] = {
|
||||
[0] = &system_clk,
|
||||
[1] = &extal2_clk
|
||||
};
|
||||
|
||||
static int usb24s_enable(struct clk *clk)
|
||||
{
|
||||
__raw_writel(__raw_readl(USBCKCR) & ~(1 << 8), USBCKCR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void usb24s_disable(struct clk *clk)
|
||||
{
|
||||
__raw_writel(__raw_readl(USBCKCR) | (1 << 8), USBCKCR);
|
||||
}
|
||||
|
||||
static int usb24s_set_parent(struct clk *clk, struct clk *parent)
|
||||
{
|
||||
int i, ret;
|
||||
u32 val;
|
||||
|
||||
if (!clk->parent_table || !clk->parent_num)
|
||||
return -EINVAL;
|
||||
|
||||
/* Search the parent */
|
||||
for (i = 0; i < clk->parent_num; i++)
|
||||
if (clk->parent_table[i] == parent)
|
||||
break;
|
||||
|
||||
if (i == clk->parent_num)
|
||||
return -ENODEV;
|
||||
|
||||
ret = clk_reparent(clk, parent);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
val = __raw_readl(USBCKCR);
|
||||
val &= ~(1 << 7);
|
||||
val |= i << 7;
|
||||
__raw_writel(val, USBCKCR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sh_clk_ops usb24s_clk_ops = {
|
||||
.recalc = followparent_recalc,
|
||||
.enable = usb24s_enable,
|
||||
.disable = usb24s_disable,
|
||||
.set_parent = usb24s_set_parent,
|
||||
};
|
||||
|
||||
static struct clk usb24s_clk = {
|
||||
.ops = &usb24s_clk_ops,
|
||||
.parent_table = usb24s_parents,
|
||||
.parent_num = ARRAY_SIZE(usb24s_parents),
|
||||
.parent = &system_clk,
|
||||
};
|
||||
|
||||
static unsigned long usb24_recalc(struct clk *clk)
|
||||
{
|
||||
return clk->parent->rate /
|
||||
((__raw_readl(USBCKCR) & (1 << 6)) ? 1 : 2);
|
||||
};
|
||||
|
||||
static int usb24_set_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
/* closer to which ? parent->rate or parent->rate/2 */
|
||||
val = __raw_readl(USBCKCR);
|
||||
val &= ~(1 << 6);
|
||||
val |= (rate > (clk->parent->rate / 4) * 3) << 6;
|
||||
__raw_writel(val, USBCKCR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sh_clk_ops usb24_clk_ops = {
|
||||
.recalc = usb24_recalc,
|
||||
.set_rate = usb24_set_rate,
|
||||
};
|
||||
|
||||
static struct clk usb24_clk = {
|
||||
.ops = &usb24_clk_ops,
|
||||
.parent = &usb24s_clk,
|
||||
};
|
||||
|
||||
/* External FSIACK/FSIBCK clock */
|
||||
static struct clk fsiack_clk = {
|
||||
};
|
||||
|
||||
static struct clk fsibck_clk = {
|
||||
};
|
||||
|
||||
static struct clk *main_clks[] = {
|
||||
&extalr_clk,
|
||||
&extal1_clk,
|
||||
&extal2_clk,
|
||||
&extal1_div2_clk,
|
||||
&extal1_div1024_clk,
|
||||
&extal1_div2048_clk,
|
||||
&extal2_div2_clk,
|
||||
&dv_clk,
|
||||
&system_clk,
|
||||
&system_div2_clk,
|
||||
&r_clk,
|
||||
&pllc0_clk,
|
||||
&pllc1_clk,
|
||||
&pllc1_div2_clk,
|
||||
&usb24s_clk,
|
||||
&usb24_clk,
|
||||
&fsiack_clk,
|
||||
&fsibck_clk,
|
||||
};
|
||||
|
||||
/* DIV4 clocks */
|
||||
static void div4_kick(struct clk *clk)
|
||||
{
|
||||
unsigned long value;
|
||||
|
||||
/* set KICK bit in FRQCRB to update hardware setting */
|
||||
value = __raw_readl(FRQCRB);
|
||||
value |= (1 << 31);
|
||||
__raw_writel(value, FRQCRB);
|
||||
}
|
||||
|
||||
static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18,
|
||||
24, 32, 36, 48, 0, 72, 96, 0 };
|
||||
|
||||
static struct clk_div_mult_table div4_div_mult_table = {
|
||||
.divisors = divisors,
|
||||
.nr_divisors = ARRAY_SIZE(divisors),
|
||||
};
|
||||
|
||||
static struct clk_div4_table div4_table = {
|
||||
.div_mult_table = &div4_div_mult_table,
|
||||
.kick = div4_kick,
|
||||
};
|
||||
|
||||
enum {
|
||||
DIV4_I, DIV4_ZG, DIV4_B, DIV4_M1, DIV4_HP,
|
||||
DIV4_HPP, DIV4_USBP, DIV4_S, DIV4_ZB, DIV4_M3, DIV4_CP,
|
||||
DIV4_NR
|
||||
};
|
||||
|
||||
static struct clk div4_clks[DIV4_NR] = {
|
||||
[DIV4_I] = SH_CLK_DIV4(&pllc1_clk, FRQCRA, 20, 0x6fff, CLK_ENABLE_ON_INIT),
|
||||
[DIV4_ZG] = SH_CLK_DIV4(&pllc1_clk, FRQCRA, 16, 0x6fff, CLK_ENABLE_ON_INIT),
|
||||
[DIV4_B] = SH_CLK_DIV4(&pllc1_clk, FRQCRA, 8, 0x6fff, CLK_ENABLE_ON_INIT),
|
||||
[DIV4_M1] = SH_CLK_DIV4(&pllc1_clk, FRQCRA, 4, 0x6fff, CLK_ENABLE_ON_INIT),
|
||||
[DIV4_HP] = SH_CLK_DIV4(&pllc1_clk, FRQCRB, 4, 0x6fff, 0),
|
||||
[DIV4_HPP] = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 20, 0x6fff, 0),
|
||||
[DIV4_USBP] = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 16, 0x6fff, 0),
|
||||
[DIV4_S] = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 12, 0x6fff, 0),
|
||||
[DIV4_ZB] = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 8, 0x6fff, 0),
|
||||
[DIV4_M3] = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 4, 0x6fff, 0),
|
||||
[DIV4_CP] = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 0, 0x6fff, 0),
|
||||
};
|
||||
|
||||
/* DIV6 reparent */
|
||||
enum {
|
||||
DIV6_HDMI,
|
||||
DIV6_VCLK1, DIV6_VCLK2,
|
||||
DIV6_FSIA, DIV6_FSIB,
|
||||
DIV6_REPARENT_NR,
|
||||
};
|
||||
|
||||
static struct clk *hdmi_parent[] = {
|
||||
[0] = &pllc1_div2_clk,
|
||||
[1] = &system_clk,
|
||||
[2] = &dv_clk
|
||||
};
|
||||
|
||||
static struct clk *vclk_parents[8] = {
|
||||
[0] = &pllc1_div2_clk,
|
||||
[2] = &dv_clk,
|
||||
[3] = &usb24s_clk,
|
||||
[4] = &extal1_div2_clk,
|
||||
[5] = &extalr_clk,
|
||||
};
|
||||
|
||||
static struct clk *fsia_parents[] = {
|
||||
[0] = &pllc1_div2_clk,
|
||||
[1] = &fsiack_clk, /* external clock */
|
||||
};
|
||||
|
||||
static struct clk *fsib_parents[] = {
|
||||
[0] = &pllc1_div2_clk,
|
||||
[1] = &fsibck_clk, /* external clock */
|
||||
};
|
||||
|
||||
static struct clk div6_reparent_clks[DIV6_REPARENT_NR] = {
|
||||
[DIV6_HDMI] = SH_CLK_DIV6_EXT(HDMICKCR, 0,
|
||||
hdmi_parent, ARRAY_SIZE(hdmi_parent), 6, 2),
|
||||
[DIV6_VCLK1] = SH_CLK_DIV6_EXT(VCLKCR1, 0,
|
||||
vclk_parents, ARRAY_SIZE(vclk_parents), 12, 3),
|
||||
[DIV6_VCLK2] = SH_CLK_DIV6_EXT(VCLKCR2, 0,
|
||||
vclk_parents, ARRAY_SIZE(vclk_parents), 12, 3),
|
||||
[DIV6_FSIA] = SH_CLK_DIV6_EXT(FSIACKCR, 0,
|
||||
fsia_parents, ARRAY_SIZE(fsia_parents), 6, 2),
|
||||
[DIV6_FSIB] = SH_CLK_DIV6_EXT(FSIBCKCR, 0,
|
||||
fsib_parents, ARRAY_SIZE(fsib_parents), 6, 2),
|
||||
};
|
||||
|
||||
/* DIV6 clocks */
|
||||
enum {
|
||||
DIV6_SUB,
|
||||
DIV6_NR
|
||||
};
|
||||
|
||||
static struct clk div6_clks[DIV6_NR] = {
|
||||
[DIV6_SUB] = SH_CLK_DIV6(&pllc1_div2_clk, SUBCKCR, 0),
|
||||
};
|
||||
|
||||
/* HDMI1/2 clock */
|
||||
static unsigned long hdmi12_recalc(struct clk *clk)
|
||||
{
|
||||
u32 val = __raw_readl(HDMICKCR);
|
||||
int shift = (int)clk->priv;
|
||||
|
||||
val >>= shift;
|
||||
val &= 0x3;
|
||||
|
||||
return clk->parent->rate / (1 << val);
|
||||
};
|
||||
|
||||
static int hdmi12_set_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
u32 val, mask;
|
||||
int i, shift;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
if (rate == clk->parent->rate / (1 << i))
|
||||
goto find;
|
||||
return -ENODEV;
|
||||
|
||||
find:
|
||||
shift = (int)clk->priv;
|
||||
|
||||
val = __raw_readl(HDMICKCR);
|
||||
mask = ~(0x3 << shift);
|
||||
val = (val & mask) | i << shift;
|
||||
__raw_writel(val, HDMICKCR);
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
static struct sh_clk_ops hdmi12_clk_ops = {
|
||||
.recalc = hdmi12_recalc,
|
||||
.set_rate = hdmi12_set_rate,
|
||||
};
|
||||
|
||||
static struct clk hdmi1_clk = {
|
||||
.ops = &hdmi12_clk_ops,
|
||||
.priv = (void *)9,
|
||||
.parent = &div6_reparent_clks[DIV6_HDMI], /* late install */
|
||||
};
|
||||
|
||||
static struct clk hdmi2_clk = {
|
||||
.ops = &hdmi12_clk_ops,
|
||||
.priv = (void *)11,
|
||||
.parent = &div6_reparent_clks[DIV6_HDMI], /* late install */
|
||||
};
|
||||
|
||||
static struct clk *late_main_clks[] = {
|
||||
&hdmi1_clk,
|
||||
&hdmi2_clk,
|
||||
};
|
||||
|
||||
/* FSI DIV */
|
||||
enum { FSIDIV_A, FSIDIV_B, FSIDIV_REPARENT_NR };
|
||||
|
||||
static struct clk fsidivs[] = {
|
||||
[FSIDIV_A] = SH_CLK_FSIDIV(FSIDIVA, &div6_reparent_clks[DIV6_FSIA]),
|
||||
[FSIDIV_B] = SH_CLK_FSIDIV(FSIDIVB, &div6_reparent_clks[DIV6_FSIB]),
|
||||
};
|
||||
|
||||
/* MSTP */
|
||||
enum {
|
||||
MSTP128, MSTP127, MSTP125,
|
||||
MSTP116, MSTP111, MSTP100, MSTP117,
|
||||
|
||||
MSTP230, MSTP229,
|
||||
MSTP222,
|
||||
MSTP218, MSTP217, MSTP216, MSTP214,
|
||||
MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,
|
||||
|
||||
MSTP329, MSTP328, MSTP323, MSTP320,
|
||||
MSTP314, MSTP313, MSTP312,
|
||||
MSTP309, MSTP304,
|
||||
|
||||
MSTP416, MSTP415, MSTP407, MSTP406,
|
||||
|
||||
MSTP_NR
|
||||
};
|
||||
|
||||
static struct clk mstp_clks[MSTP_NR] = {
|
||||
[MSTP128] = SH_CLK_MSTP32(&div4_clks[DIV4_S], SMSTPCR1, 28, 0), /* CEU21 */
|
||||
[MSTP127] = SH_CLK_MSTP32(&div4_clks[DIV4_S], SMSTPCR1, 27, 0), /* CEU20 */
|
||||
[MSTP125] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR1, 25, 0), /* TMU0 */
|
||||
[MSTP117] = SH_CLK_MSTP32(&div4_clks[DIV4_B], SMSTPCR1, 17, 0), /* LCDC1 */
|
||||
[MSTP116] = SH_CLK_MSTP32(&div4_clks[DIV4_HPP], SMSTPCR1, 16, 0), /* IIC0 */
|
||||
[MSTP111] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR1, 11, 0), /* TMU1 */
|
||||
[MSTP100] = SH_CLK_MSTP32(&div4_clks[DIV4_B], SMSTPCR1, 0, 0), /* LCDC0 */
|
||||
|
||||
[MSTP230] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR2, 30, 0), /* SCIFA6 */
|
||||
[MSTP229] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR2, 29, 0), /* INTCA */
|
||||
[MSTP222] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR2, 22, 0), /* SCIFA7 */
|
||||
[MSTP218] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR2, 18, 0), /* DMAC1 */
|
||||
[MSTP217] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR2, 17, 0), /* DMAC2 */
|
||||
[MSTP216] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR2, 16, 0), /* DMAC3 */
|
||||
[MSTP214] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR2, 14, 0), /* USBDMAC */
|
||||
[MSTP207] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR2, 7, 0), /* SCIFA5 */
|
||||
[MSTP206] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR2, 6, 0), /* SCIFB */
|
||||
[MSTP204] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR2, 4, 0), /* SCIFA0 */
|
||||
[MSTP203] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR2, 3, 0), /* SCIFA1 */
|
||||
[MSTP202] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR2, 2, 0), /* SCIFA2 */
|
||||
[MSTP201] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR2, 1, 0), /* SCIFA3 */
|
||||
[MSTP200] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR2, 0, 0), /* SCIFA4 */
|
||||
|
||||
[MSTP329] = SH_CLK_MSTP32(&r_clk, SMSTPCR3, 29, 0), /* CMT10 */
|
||||
[MSTP328] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 28, 0), /* FSI */
|
||||
[MSTP323] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR3, 23, 0), /* IIC1 */
|
||||
[MSTP320] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 20, 0), /* USBF */
|
||||
[MSTP314] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 14, 0), /* SDHI0 */
|
||||
[MSTP313] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 13, 0), /* SDHI1 */
|
||||
[MSTP312] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 12, 0), /* MMC */
|
||||
[MSTP309] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 9, 0), /* GEther */
|
||||
[MSTP304] = SH_CLK_MSTP32(&div4_clks[DIV4_CP], SMSTPCR3, 4, 0), /* TPU0 */
|
||||
|
||||
[MSTP416] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR4, 16, 0), /* USBHOST */
|
||||
[MSTP415] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR4, 15, 0), /* SDHI2 */
|
||||
[MSTP407] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR4, 7, 0), /* USB-Func */
|
||||
[MSTP406] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR4, 6, 0), /* USB Phy */
|
||||
};
|
||||
|
||||
static struct clk_lookup lookups[] = {
|
||||
/* main clocks */
|
||||
CLKDEV_CON_ID("extalr", &extalr_clk),
|
||||
CLKDEV_CON_ID("extal1", &extal1_clk),
|
||||
CLKDEV_CON_ID("extal2", &extal2_clk),
|
||||
CLKDEV_CON_ID("extal1_div2", &extal1_div2_clk),
|
||||
CLKDEV_CON_ID("extal1_div1024", &extal1_div1024_clk),
|
||||
CLKDEV_CON_ID("extal1_div2048", &extal1_div2048_clk),
|
||||
CLKDEV_CON_ID("extal2_div2", &extal2_div2_clk),
|
||||
CLKDEV_CON_ID("dv_clk", &dv_clk),
|
||||
CLKDEV_CON_ID("system_clk", &system_clk),
|
||||
CLKDEV_CON_ID("system_div2_clk", &system_div2_clk),
|
||||
CLKDEV_CON_ID("r_clk", &r_clk),
|
||||
CLKDEV_CON_ID("pllc0_clk", &pllc0_clk),
|
||||
CLKDEV_CON_ID("pllc1_clk", &pllc1_clk),
|
||||
CLKDEV_CON_ID("pllc1_div2_clk", &pllc1_div2_clk),
|
||||
CLKDEV_CON_ID("usb24s", &usb24s_clk),
|
||||
CLKDEV_CON_ID("hdmi1", &hdmi1_clk),
|
||||
CLKDEV_CON_ID("hdmi2", &hdmi2_clk),
|
||||
CLKDEV_CON_ID("video1", &div6_reparent_clks[DIV6_VCLK1]),
|
||||
CLKDEV_CON_ID("video2", &div6_reparent_clks[DIV6_VCLK2]),
|
||||
CLKDEV_CON_ID("fsiack", &fsiack_clk),
|
||||
CLKDEV_CON_ID("fsibck", &fsibck_clk),
|
||||
|
||||
/* DIV4 clocks */
|
||||
CLKDEV_CON_ID("i_clk", &div4_clks[DIV4_I]),
|
||||
CLKDEV_CON_ID("zg_clk", &div4_clks[DIV4_ZG]),
|
||||
CLKDEV_CON_ID("b_clk", &div4_clks[DIV4_B]),
|
||||
CLKDEV_CON_ID("m1_clk", &div4_clks[DIV4_M1]),
|
||||
CLKDEV_CON_ID("hp_clk", &div4_clks[DIV4_HP]),
|
||||
CLKDEV_CON_ID("hpp_clk", &div4_clks[DIV4_HPP]),
|
||||
CLKDEV_CON_ID("s_clk", &div4_clks[DIV4_S]),
|
||||
CLKDEV_CON_ID("zb_clk", &div4_clks[DIV4_ZB]),
|
||||
CLKDEV_CON_ID("m3_clk", &div4_clks[DIV4_M3]),
|
||||
CLKDEV_CON_ID("cp_clk", &div4_clks[DIV4_CP]),
|
||||
|
||||
/* DIV6 clocks */
|
||||
CLKDEV_CON_ID("sub_clk", &div6_clks[DIV6_SUB]),
|
||||
|
||||
/* MSTP32 clocks */
|
||||
CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]),
|
||||
CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]),
|
||||
CLKDEV_DEV_ID("fff20000.i2c", &mstp_clks[MSTP116]),
|
||||
CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1", &mstp_clks[MSTP117]),
|
||||
CLKDEV_DEV_ID("sh_mobile_ceu.0", &mstp_clks[MSTP127]),
|
||||
CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[MSTP128]),
|
||||
|
||||
CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]),
|
||||
CLKDEV_DEV_ID("e6c80000.serial", &mstp_clks[MSTP200]),
|
||||
CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP201]),
|
||||
CLKDEV_DEV_ID("e6c70000.serial", &mstp_clks[MSTP201]),
|
||||
CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP202]),
|
||||
CLKDEV_DEV_ID("e6c60000.serial", &mstp_clks[MSTP202]),
|
||||
CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]),
|
||||
CLKDEV_DEV_ID("e6c50000.serial", &mstp_clks[MSTP203]),
|
||||
CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]),
|
||||
CLKDEV_DEV_ID("e6c40000.serial", &mstp_clks[MSTP204]),
|
||||
CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP206]),
|
||||
CLKDEV_DEV_ID("e6c30000.serial", &mstp_clks[MSTP206]),
|
||||
CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]),
|
||||
CLKDEV_DEV_ID("e6cb0000.serial", &mstp_clks[MSTP207]),
|
||||
CLKDEV_DEV_ID("sh-dma-engine.3", &mstp_clks[MSTP214]),
|
||||
CLKDEV_DEV_ID("sh-dma-engine.2", &mstp_clks[MSTP216]),
|
||||
CLKDEV_DEV_ID("sh-dma-engine.1", &mstp_clks[MSTP217]),
|
||||
CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]),
|
||||
CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP222]),
|
||||
CLKDEV_DEV_ID("e6cd0000.serial", &mstp_clks[MSTP222]),
|
||||
CLKDEV_DEV_ID("renesas_intc_irqpin.0", &mstp_clks[MSTP229]),
|
||||
CLKDEV_DEV_ID("renesas_intc_irqpin.1", &mstp_clks[MSTP229]),
|
||||
CLKDEV_DEV_ID("renesas_intc_irqpin.2", &mstp_clks[MSTP229]),
|
||||
CLKDEV_DEV_ID("renesas_intc_irqpin.3", &mstp_clks[MSTP229]),
|
||||
CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP230]),
|
||||
CLKDEV_DEV_ID("e6cc0000.serial", &mstp_clks[MSTP230]),
|
||||
|
||||
CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]),
|
||||
CLKDEV_DEV_ID("fe1f0000.sound", &mstp_clks[MSTP328]),
|
||||
CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]),
|
||||
CLKDEV_DEV_ID("e6c20000.i2c", &mstp_clks[MSTP323]),
|
||||
CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP320]),
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]),
|
||||
CLKDEV_DEV_ID("e6850000.sd", &mstp_clks[MSTP314]),
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]),
|
||||
CLKDEV_DEV_ID("e6860000.sd", &mstp_clks[MSTP313]),
|
||||
CLKDEV_DEV_ID("sh_mmcif", &mstp_clks[MSTP312]),
|
||||
CLKDEV_DEV_ID("e6bd0000.mmc", &mstp_clks[MSTP312]),
|
||||
CLKDEV_DEV_ID("r8a7740-gether", &mstp_clks[MSTP309]),
|
||||
CLKDEV_DEV_ID("e9a00000.ethernet", &mstp_clks[MSTP309]),
|
||||
CLKDEV_DEV_ID("renesas-tpu-pwm", &mstp_clks[MSTP304]),
|
||||
CLKDEV_DEV_ID("e6600000.pwm", &mstp_clks[MSTP304]),
|
||||
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP415]),
|
||||
CLKDEV_DEV_ID("e6870000.sd", &mstp_clks[MSTP415]),
|
||||
|
||||
/* ICK */
|
||||
CLKDEV_ICK_ID("fck", "sh-tmu.1", &mstp_clks[MSTP111]),
|
||||
CLKDEV_ICK_ID("fck", "fff90000.timer", &mstp_clks[MSTP111]),
|
||||
CLKDEV_ICK_ID("fck", "sh-tmu.0", &mstp_clks[MSTP125]),
|
||||
CLKDEV_ICK_ID("fck", "fff80000.timer", &mstp_clks[MSTP125]),
|
||||
CLKDEV_ICK_ID("fck", "sh-cmt-48.1", &mstp_clks[MSTP329]),
|
||||
CLKDEV_ICK_ID("fck", "e6138000.timer", &mstp_clks[MSTP329]),
|
||||
CLKDEV_ICK_ID("host", "renesas_usbhs", &mstp_clks[MSTP416]),
|
||||
CLKDEV_ICK_ID("func", "renesas_usbhs", &mstp_clks[MSTP407]),
|
||||
CLKDEV_ICK_ID("phy", "renesas_usbhs", &mstp_clks[MSTP406]),
|
||||
CLKDEV_ICK_ID("pci", "renesas_usbhs", &div4_clks[DIV4_USBP]),
|
||||
CLKDEV_ICK_ID("usb24", "renesas_usbhs", &usb24_clk),
|
||||
CLKDEV_ICK_ID("ick", "sh-mobile-hdmi", &div6_reparent_clks[DIV6_HDMI]),
|
||||
|
||||
CLKDEV_ICK_ID("icka", "sh_fsi2", &div6_reparent_clks[DIV6_FSIA]),
|
||||
CLKDEV_ICK_ID("ickb", "sh_fsi2", &div6_reparent_clks[DIV6_FSIB]),
|
||||
CLKDEV_ICK_ID("diva", "sh_fsi2", &fsidivs[FSIDIV_A]),
|
||||
CLKDEV_ICK_ID("divb", "sh_fsi2", &fsidivs[FSIDIV_B]),
|
||||
CLKDEV_ICK_ID("xcka", "sh_fsi2", &fsiack_clk),
|
||||
CLKDEV_ICK_ID("xckb", "sh_fsi2", &fsibck_clk),
|
||||
};
|
||||
|
||||
void __init r8a7740_clock_init(u8 md_ck)
|
||||
{
|
||||
int k, ret = 0;
|
||||
|
||||
/* detect system clock parent */
|
||||
if (md_ck & MD_CK1)
|
||||
system_clk.parent = &extal1_div2_clk;
|
||||
else
|
||||
system_clk.parent = &extal1_clk;
|
||||
|
||||
/* detect RCLK parent */
|
||||
switch (md_ck & (MD_CK2 | MD_CK1)) {
|
||||
case MD_CK2 | MD_CK1:
|
||||
r_clk.parent = &extal1_div2048_clk;
|
||||
break;
|
||||
case MD_CK2:
|
||||
r_clk.parent = &extal1_div1024_clk;
|
||||
break;
|
||||
case MD_CK1:
|
||||
default:
|
||||
r_clk.parent = &extalr_clk;
|
||||
break;
|
||||
}
|
||||
|
||||
for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
|
||||
ret = clk_register(main_clks[k]);
|
||||
|
||||
if (!ret)
|
||||
ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table);
|
||||
|
||||
if (!ret)
|
||||
ret = sh_clk_div6_register(div6_clks, DIV6_NR);
|
||||
|
||||
if (!ret)
|
||||
ret = sh_clk_div6_reparent_register(div6_reparent_clks,
|
||||
DIV6_REPARENT_NR);
|
||||
|
||||
if (!ret)
|
||||
ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);
|
||||
|
||||
for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++)
|
||||
ret = clk_register(late_main_clks[k]);
|
||||
|
||||
if (!ret)
|
||||
ret = sh_clk_fsidiv_register(fsidivs, FSIDIV_REPARENT_NR);
|
||||
|
||||
clkdev_add_table(lookups, ARRAY_SIZE(lookups));
|
||||
|
||||
if (!ret)
|
||||
shmobile_clk_init();
|
||||
else
|
||||
panic("failed to setup r8a7740 clocks\n");
|
||||
}
|
@ -1,129 +0,0 @@
|
||||
/*
|
||||
* r8a7740 power management support
|
||||
*
|
||||
* Copyright (C) 2012 Renesas Solutions Corp.
|
||||
* Copyright (C) 2012 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
#include <linux/console.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/suspend.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "pm-rmobile.h"
|
||||
|
||||
#define SYSC_BASE IOMEM(0xe6180000)
|
||||
|
||||
#if defined(CONFIG_PM) && !defined(CONFIG_ARCH_MULTIPLATFORM)
|
||||
static int r8a7740_pd_a3sm_suspend(void)
|
||||
{
|
||||
/*
|
||||
* The A3SM domain contains the CPU core and therefore it should
|
||||
* only be turned off if the CPU is not in use.
|
||||
*/
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
static int r8a7740_pd_a3sp_suspend(void)
|
||||
{
|
||||
/*
|
||||
* Serial consoles make use of SCIF hardware located in A3SP,
|
||||
* keep such power domain on if "no_console_suspend" is set.
|
||||
*/
|
||||
return console_suspend_enabled ? 0 : -EBUSY;
|
||||
}
|
||||
|
||||
static int r8a7740_pd_d4_suspend(void)
|
||||
{
|
||||
/*
|
||||
* The D4 domain contains the Coresight-ETM hardware block and
|
||||
* therefore it should only be turned off if the debug module is
|
||||
* not in use.
|
||||
*/
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
static struct rmobile_pm_domain r8a7740_pm_domains[] = {
|
||||
{
|
||||
.genpd.name = "A4LC",
|
||||
.base = SYSC_BASE,
|
||||
.bit_shift = 1,
|
||||
}, {
|
||||
.genpd.name = "A4MP",
|
||||
.base = SYSC_BASE,
|
||||
.bit_shift = 2,
|
||||
}, {
|
||||
.genpd.name = "D4",
|
||||
.base = SYSC_BASE,
|
||||
.bit_shift = 3,
|
||||
.gov = &pm_domain_always_on_gov,
|
||||
.suspend = r8a7740_pd_d4_suspend,
|
||||
}, {
|
||||
.genpd.name = "A4R",
|
||||
.base = SYSC_BASE,
|
||||
.bit_shift = 5,
|
||||
}, {
|
||||
.genpd.name = "A3RV",
|
||||
.base = SYSC_BASE,
|
||||
.bit_shift = 6,
|
||||
}, {
|
||||
.genpd.name = "A4S",
|
||||
.base = SYSC_BASE,
|
||||
.bit_shift = 10,
|
||||
.no_debug = true,
|
||||
}, {
|
||||
.genpd.name = "A3SP",
|
||||
.base = SYSC_BASE,
|
||||
.bit_shift = 11,
|
||||
.gov = &pm_domain_always_on_gov,
|
||||
.no_debug = true,
|
||||
.suspend = r8a7740_pd_a3sp_suspend,
|
||||
}, {
|
||||
.genpd.name = "A3SM",
|
||||
.base = SYSC_BASE,
|
||||
.bit_shift = 12,
|
||||
.gov = &pm_domain_always_on_gov,
|
||||
.suspend = r8a7740_pd_a3sm_suspend,
|
||||
}, {
|
||||
.genpd.name = "A3SG",
|
||||
.base = SYSC_BASE,
|
||||
.bit_shift = 13,
|
||||
}, {
|
||||
.genpd.name = "A4SU",
|
||||
.base = SYSC_BASE,
|
||||
.bit_shift = 20,
|
||||
},
|
||||
};
|
||||
|
||||
void __init r8a7740_init_pm_domains(void)
|
||||
{
|
||||
rmobile_init_domains(r8a7740_pm_domains, ARRAY_SIZE(r8a7740_pm_domains));
|
||||
pm_genpd_add_subdomain_names("A4R", "A3RV");
|
||||
pm_genpd_add_subdomain_names("A4S", "A3SP");
|
||||
pm_genpd_add_subdomain_names("A4S", "A3SM");
|
||||
pm_genpd_add_subdomain_names("A4S", "A3SG");
|
||||
}
|
||||
#endif /* CONFIG_PM && !CONFIG_ARCH_MULTIPLATFORM */
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
static int r8a7740_enter_suspend(suspend_state_t suspend_state)
|
||||
{
|
||||
cpu_do_idle();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void r8a7740_suspend_init(void)
|
||||
{
|
||||
shmobile_suspend_ops.enter = r8a7740_enter_suspend;
|
||||
}
|
||||
#else
|
||||
static void r8a7740_suspend_init(void) {}
|
||||
#endif
|
||||
|
||||
void __init r8a7740_pm_init(void)
|
||||
{
|
||||
r8a7740_suspend_init();
|
||||
}
|
@ -1,58 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 Renesas Solutions Corp.
|
||||
* Copyright (C) 2011 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_R8A7740_H__
|
||||
#define __ASM_R8A7740_H__
|
||||
|
||||
/*
|
||||
* MD_CKx pin
|
||||
*/
|
||||
#define MD_CK2 (1 << 2)
|
||||
#define MD_CK1 (1 << 1)
|
||||
#define MD_CK0 (1 << 0)
|
||||
|
||||
/* DMA slave IDs */
|
||||
enum {
|
||||
SHDMA_SLAVE_INVALID,
|
||||
SHDMA_SLAVE_SDHI0_RX,
|
||||
SHDMA_SLAVE_SDHI0_TX,
|
||||
SHDMA_SLAVE_SDHI1_RX,
|
||||
SHDMA_SLAVE_SDHI1_TX,
|
||||
SHDMA_SLAVE_SDHI2_RX,
|
||||
SHDMA_SLAVE_SDHI2_TX,
|
||||
SHDMA_SLAVE_FSIA_RX,
|
||||
SHDMA_SLAVE_FSIA_TX,
|
||||
SHDMA_SLAVE_FSIB_TX,
|
||||
SHDMA_SLAVE_USBHS_TX,
|
||||
SHDMA_SLAVE_USBHS_RX,
|
||||
SHDMA_SLAVE_MMCIF_TX,
|
||||
SHDMA_SLAVE_MMCIF_RX,
|
||||
};
|
||||
|
||||
extern void r8a7740_meram_workaround(void);
|
||||
extern void r8a7740_init_irq_of(void);
|
||||
extern void r8a7740_map_io(void);
|
||||
extern void r8a7740_add_early_devices(void);
|
||||
extern void r8a7740_add_standard_devices(void);
|
||||
extern void r8a7740_clock_init(u8 md_ck);
|
||||
extern void r8a7740_pinmux_init(void);
|
||||
extern void r8a7740_pm_init(void);
|
||||
|
||||
#if defined(CONFIG_PM) && !defined(CONFIG_ARCH_MULTIPLATFORM)
|
||||
extern void __init r8a7740_init_pm_domains(void);
|
||||
#else
|
||||
static inline void r8a7740_init_pm_domains(void) {}
|
||||
#endif /* CONFIG_PM && !CONFIG_ARCH_MULTIPLATFORM */
|
||||
|
||||
#endif /* __ASM_R8A7740_H__ */
|
@ -13,31 +13,19 @@
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/irqchip/arm-gic.h>
|
||||
#include <linux/platform_data/irq-renesas-intc-irqpin.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/serial_sci.h>
|
||||
#include <linux/sh_dma.h>
|
||||
#include <linux/sh_timer.h>
|
||||
#include <linux/platform_data/sh_ipmmu.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "dma-register.h"
|
||||
#include "irqs.h"
|
||||
#include "pm-rmobile.h"
|
||||
#include "r8a7740.h"
|
||||
|
||||
static struct map_desc r8a7740_io_desc[] __initdata = {
|
||||
/*
|
||||
@ -64,613 +52,12 @@ static struct map_desc r8a7740_io_desc[] __initdata = {
|
||||
#endif
|
||||
};
|
||||
|
||||
void __init r8a7740_map_io(void)
|
||||
static void __init r8a7740_map_io(void)
|
||||
{
|
||||
debug_ll_io_init();
|
||||
iotable_init(r8a7740_io_desc, ARRAY_SIZE(r8a7740_io_desc));
|
||||
}
|
||||
|
||||
/* PFC */
|
||||
static const struct resource pfc_resources[] = {
|
||||
DEFINE_RES_MEM(0xe6050000, 0x8000),
|
||||
DEFINE_RES_MEM(0xe605800c, 0x0020),
|
||||
};
|
||||
|
||||
void __init r8a7740_pinmux_init(void)
|
||||
{
|
||||
platform_device_register_simple("pfc-r8a7740", -1, pfc_resources,
|
||||
ARRAY_SIZE(pfc_resources));
|
||||
}
|
||||
|
||||
static struct renesas_intc_irqpin_config irqpin0_platform_data = {
|
||||
.irq_base = irq_pin(0), /* IRQ0 -> IRQ7 */
|
||||
};
|
||||
|
||||
static struct resource irqpin0_resources[] = {
|
||||
DEFINE_RES_MEM(0xe6900000, 4), /* ICR1A */
|
||||
DEFINE_RES_MEM(0xe6900010, 4), /* INTPRI00A */
|
||||
DEFINE_RES_MEM(0xe6900020, 1), /* INTREQ00A */
|
||||
DEFINE_RES_MEM(0xe6900040, 1), /* INTMSK00A */
|
||||
DEFINE_RES_MEM(0xe6900060, 1), /* INTMSKCLR00A */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ0 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ1 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ2 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ3 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ4 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ5 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ6 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ7 */
|
||||
};
|
||||
|
||||
static struct platform_device irqpin0_device = {
|
||||
.name = "renesas_intc_irqpin",
|
||||
.id = 0,
|
||||
.resource = irqpin0_resources,
|
||||
.num_resources = ARRAY_SIZE(irqpin0_resources),
|
||||
.dev = {
|
||||
.platform_data = &irqpin0_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct renesas_intc_irqpin_config irqpin1_platform_data = {
|
||||
.irq_base = irq_pin(8), /* IRQ8 -> IRQ15 */
|
||||
};
|
||||
|
||||
static struct resource irqpin1_resources[] = {
|
||||
DEFINE_RES_MEM(0xe6900004, 4), /* ICR2A */
|
||||
DEFINE_RES_MEM(0xe6900014, 4), /* INTPRI10A */
|
||||
DEFINE_RES_MEM(0xe6900024, 1), /* INTREQ10A */
|
||||
DEFINE_RES_MEM(0xe6900044, 1), /* INTMSK10A */
|
||||
DEFINE_RES_MEM(0xe6900064, 1), /* INTMSKCLR10A */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ8 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ9 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ10 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ11 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ12 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ13 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ14 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ15 */
|
||||
};
|
||||
|
||||
static struct platform_device irqpin1_device = {
|
||||
.name = "renesas_intc_irqpin",
|
||||
.id = 1,
|
||||
.resource = irqpin1_resources,
|
||||
.num_resources = ARRAY_SIZE(irqpin1_resources),
|
||||
.dev = {
|
||||
.platform_data = &irqpin1_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct renesas_intc_irqpin_config irqpin2_platform_data = {
|
||||
.irq_base = irq_pin(16), /* IRQ16 -> IRQ23 */
|
||||
};
|
||||
|
||||
static struct resource irqpin2_resources[] = {
|
||||
DEFINE_RES_MEM(0xe6900008, 4), /* ICR3A */
|
||||
DEFINE_RES_MEM(0xe6900018, 4), /* INTPRI30A */
|
||||
DEFINE_RES_MEM(0xe6900028, 1), /* INTREQ30A */
|
||||
DEFINE_RES_MEM(0xe6900048, 1), /* INTMSK30A */
|
||||
DEFINE_RES_MEM(0xe6900068, 1), /* INTMSKCLR30A */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ16 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ17 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ18 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ19 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ20 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ21 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ22 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ23 */
|
||||
};
|
||||
|
||||
static struct platform_device irqpin2_device = {
|
||||
.name = "renesas_intc_irqpin",
|
||||
.id = 2,
|
||||
.resource = irqpin2_resources,
|
||||
.num_resources = ARRAY_SIZE(irqpin2_resources),
|
||||
.dev = {
|
||||
.platform_data = &irqpin2_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct renesas_intc_irqpin_config irqpin3_platform_data = {
|
||||
.irq_base = irq_pin(24), /* IRQ24 -> IRQ31 */
|
||||
};
|
||||
|
||||
static struct resource irqpin3_resources[] = {
|
||||
DEFINE_RES_MEM(0xe690000c, 4), /* ICR3A */
|
||||
DEFINE_RES_MEM(0xe690001c, 4), /* INTPRI30A */
|
||||
DEFINE_RES_MEM(0xe690002c, 1), /* INTREQ30A */
|
||||
DEFINE_RES_MEM(0xe690004c, 1), /* INTMSK30A */
|
||||
DEFINE_RES_MEM(0xe690006c, 1), /* INTMSKCLR30A */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ24 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ25 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ26 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ27 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ28 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ29 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ30 */
|
||||
DEFINE_RES_IRQ(gic_spi(149)), /* IRQ31 */
|
||||
};
|
||||
|
||||
static struct platform_device irqpin3_device = {
|
||||
.name = "renesas_intc_irqpin",
|
||||
.id = 3,
|
||||
.resource = irqpin3_resources,
|
||||
.num_resources = ARRAY_SIZE(irqpin3_resources),
|
||||
.dev = {
|
||||
.platform_data = &irqpin3_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* SCIF */
|
||||
#define R8A7740_SCIF(scif_type, index, baseaddr, irq) \
|
||||
static struct plat_sci_port scif##index##_platform_data = { \
|
||||
.type = scif_type, \
|
||||
.flags = UPF_BOOT_AUTOCONF, \
|
||||
.scscr = SCSCR_RE | SCSCR_TE, \
|
||||
}; \
|
||||
\
|
||||
static struct resource scif##index##_resources[] = { \
|
||||
DEFINE_RES_MEM(baseaddr, 0x100), \
|
||||
DEFINE_RES_IRQ(irq), \
|
||||
}; \
|
||||
\
|
||||
static struct platform_device scif##index##_device = { \
|
||||
.name = "sh-sci", \
|
||||
.id = index, \
|
||||
.resource = scif##index##_resources, \
|
||||
.num_resources = ARRAY_SIZE(scif##index##_resources), \
|
||||
.dev = { \
|
||||
.platform_data = &scif##index##_platform_data, \
|
||||
}, \
|
||||
}
|
||||
|
||||
R8A7740_SCIF(PORT_SCIFA, 0, 0xe6c40000, gic_spi(100));
|
||||
R8A7740_SCIF(PORT_SCIFA, 1, 0xe6c50000, gic_spi(101));
|
||||
R8A7740_SCIF(PORT_SCIFA, 2, 0xe6c60000, gic_spi(102));
|
||||
R8A7740_SCIF(PORT_SCIFA, 3, 0xe6c70000, gic_spi(103));
|
||||
R8A7740_SCIF(PORT_SCIFA, 4, 0xe6c80000, gic_spi(104));
|
||||
R8A7740_SCIF(PORT_SCIFA, 5, 0xe6cb0000, gic_spi(105));
|
||||
R8A7740_SCIF(PORT_SCIFA, 6, 0xe6cc0000, gic_spi(106));
|
||||
R8A7740_SCIF(PORT_SCIFA, 7, 0xe6cd0000, gic_spi(107));
|
||||
R8A7740_SCIF(PORT_SCIFB, 8, 0xe6c30000, gic_spi(108));
|
||||
|
||||
/* CMT */
|
||||
static struct sh_timer_config cmt1_platform_data = {
|
||||
.channels_mask = 0x3f,
|
||||
};
|
||||
|
||||
static struct resource cmt1_resources[] = {
|
||||
DEFINE_RES_MEM(0xe6138000, 0x170),
|
||||
DEFINE_RES_IRQ(gic_spi(58)),
|
||||
};
|
||||
|
||||
static struct platform_device cmt1_device = {
|
||||
.name = "sh-cmt-48",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &cmt1_platform_data,
|
||||
},
|
||||
.resource = cmt1_resources,
|
||||
.num_resources = ARRAY_SIZE(cmt1_resources),
|
||||
};
|
||||
|
||||
/* TMU */
|
||||
static struct sh_timer_config tmu0_platform_data = {
|
||||
.channels_mask = 7,
|
||||
};
|
||||
|
||||
static struct resource tmu0_resources[] = {
|
||||
DEFINE_RES_MEM(0xfff80000, 0x2c),
|
||||
DEFINE_RES_IRQ(gic_spi(198)),
|
||||
DEFINE_RES_IRQ(gic_spi(199)),
|
||||
DEFINE_RES_IRQ(gic_spi(200)),
|
||||
};
|
||||
|
||||
static struct platform_device tmu0_device = {
|
||||
.name = "sh-tmu",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &tmu0_platform_data,
|
||||
},
|
||||
.resource = tmu0_resources,
|
||||
.num_resources = ARRAY_SIZE(tmu0_resources),
|
||||
};
|
||||
|
||||
/* IPMMUI (an IPMMU module for ICB/LMB) */
|
||||
static struct resource ipmmu_resources[] = {
|
||||
[0] = {
|
||||
.name = "IPMMUI",
|
||||
.start = 0xfe951000,
|
||||
.end = 0xfe9510ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static const char * const ipmmu_dev_names[] = {
|
||||
"sh_mobile_lcdc_fb.0",
|
||||
"sh_mobile_lcdc_fb.1",
|
||||
"sh_mobile_ceu.0",
|
||||
};
|
||||
|
||||
static struct shmobile_ipmmu_platform_data ipmmu_platform_data = {
|
||||
.dev_names = ipmmu_dev_names,
|
||||
.num_dev_names = ARRAY_SIZE(ipmmu_dev_names),
|
||||
};
|
||||
|
||||
static struct platform_device ipmmu_device = {
|
||||
.name = "ipmmu",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &ipmmu_platform_data,
|
||||
},
|
||||
.resource = ipmmu_resources,
|
||||
.num_resources = ARRAY_SIZE(ipmmu_resources),
|
||||
};
|
||||
|
||||
static struct platform_device *r8a7740_early_devices[] __initdata = {
|
||||
&scif0_device,
|
||||
&scif1_device,
|
||||
&scif2_device,
|
||||
&scif3_device,
|
||||
&scif4_device,
|
||||
&scif5_device,
|
||||
&scif6_device,
|
||||
&scif7_device,
|
||||
&scif8_device,
|
||||
&irqpin0_device,
|
||||
&irqpin1_device,
|
||||
&irqpin2_device,
|
||||
&irqpin3_device,
|
||||
&tmu0_device,
|
||||
&ipmmu_device,
|
||||
&cmt1_device,
|
||||
};
|
||||
|
||||
/* DMA */
|
||||
static const struct sh_dmae_slave_config r8a7740_dmae_slaves[] = {
|
||||
{
|
||||
.slave_id = SHDMA_SLAVE_SDHI0_TX,
|
||||
.addr = 0xe6850030,
|
||||
.chcr = CHCR_TX(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xc1,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI0_RX,
|
||||
.addr = 0xe6850030,
|
||||
.chcr = CHCR_RX(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xc2,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI1_TX,
|
||||
.addr = 0xe6860030,
|
||||
.chcr = CHCR_TX(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xc9,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI1_RX,
|
||||
.addr = 0xe6860030,
|
||||
.chcr = CHCR_RX(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xca,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI2_TX,
|
||||
.addr = 0xe6870030,
|
||||
.chcr = CHCR_TX(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xcd,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_SDHI2_RX,
|
||||
.addr = 0xe6870030,
|
||||
.chcr = CHCR_RX(XMIT_SZ_16BIT),
|
||||
.mid_rid = 0xce,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_FSIA_TX,
|
||||
.addr = 0xfe1f0024,
|
||||
.chcr = CHCR_TX(XMIT_SZ_32BIT),
|
||||
.mid_rid = 0xb1,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_FSIA_RX,
|
||||
.addr = 0xfe1f0020,
|
||||
.chcr = CHCR_RX(XMIT_SZ_32BIT),
|
||||
.mid_rid = 0xb2,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_FSIB_TX,
|
||||
.addr = 0xfe1f0064,
|
||||
.chcr = CHCR_TX(XMIT_SZ_32BIT),
|
||||
.mid_rid = 0xb5,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_MMCIF_TX,
|
||||
.addr = 0xe6bd0034,
|
||||
.chcr = CHCR_TX(XMIT_SZ_32BIT),
|
||||
.mid_rid = 0xd1,
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_MMCIF_RX,
|
||||
.addr = 0xe6bd0034,
|
||||
.chcr = CHCR_RX(XMIT_SZ_32BIT),
|
||||
.mid_rid = 0xd2,
|
||||
},
|
||||
};
|
||||
|
||||
#define DMA_CHANNEL(a, b, c) \
|
||||
{ \
|
||||
.offset = a, \
|
||||
.dmars = b, \
|
||||
.dmars_bit = c, \
|
||||
.chclr_offset = (0x220 - 0x20) + a \
|
||||
}
|
||||
|
||||
static const struct sh_dmae_channel r8a7740_dmae_channels[] = {
|
||||
DMA_CHANNEL(0x00, 0, 0),
|
||||
DMA_CHANNEL(0x10, 0, 8),
|
||||
DMA_CHANNEL(0x20, 4, 0),
|
||||
DMA_CHANNEL(0x30, 4, 8),
|
||||
DMA_CHANNEL(0x50, 8, 0),
|
||||
DMA_CHANNEL(0x60, 8, 8),
|
||||
};
|
||||
|
||||
static struct sh_dmae_pdata dma_platform_data = {
|
||||
.slave = r8a7740_dmae_slaves,
|
||||
.slave_num = ARRAY_SIZE(r8a7740_dmae_slaves),
|
||||
.channel = r8a7740_dmae_channels,
|
||||
.channel_num = ARRAY_SIZE(r8a7740_dmae_channels),
|
||||
.ts_low_shift = TS_LOW_SHIFT,
|
||||
.ts_low_mask = TS_LOW_BIT << TS_LOW_SHIFT,
|
||||
.ts_high_shift = TS_HI_SHIFT,
|
||||
.ts_high_mask = TS_HI_BIT << TS_HI_SHIFT,
|
||||
.ts_shift = dma_ts_shift,
|
||||
.ts_shift_num = ARRAY_SIZE(dma_ts_shift),
|
||||
.dmaor_init = DMAOR_DME,
|
||||
.chclr_present = 1,
|
||||
};
|
||||
|
||||
/* Resource order important! */
|
||||
static struct resource r8a7740_dmae0_resources[] = {
|
||||
{
|
||||
/* Channel registers and DMAOR */
|
||||
.start = 0xfe008020,
|
||||
.end = 0xfe00828f,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
/* DMARSx */
|
||||
.start = 0xfe009000,
|
||||
.end = 0xfe00900b,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "error_irq",
|
||||
.start = gic_spi(34),
|
||||
.end = gic_spi(34),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
{
|
||||
/* IRQ for channels 0-5 */
|
||||
.start = gic_spi(28),
|
||||
.end = gic_spi(33),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
/* Resource order important! */
|
||||
static struct resource r8a7740_dmae1_resources[] = {
|
||||
{
|
||||
/* Channel registers and DMAOR */
|
||||
.start = 0xfe018020,
|
||||
.end = 0xfe01828f,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
/* DMARSx */
|
||||
.start = 0xfe019000,
|
||||
.end = 0xfe01900b,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "error_irq",
|
||||
.start = gic_spi(41),
|
||||
.end = gic_spi(41),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
{
|
||||
/* IRQ for channels 0-5 */
|
||||
.start = gic_spi(35),
|
||||
.end = gic_spi(40),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
/* Resource order important! */
|
||||
static struct resource r8a7740_dmae2_resources[] = {
|
||||
{
|
||||
/* Channel registers and DMAOR */
|
||||
.start = 0xfe028020,
|
||||
.end = 0xfe02828f,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
/* DMARSx */
|
||||
.start = 0xfe029000,
|
||||
.end = 0xfe02900b,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "error_irq",
|
||||
.start = gic_spi(48),
|
||||
.end = gic_spi(48),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
{
|
||||
/* IRQ for channels 0-5 */
|
||||
.start = gic_spi(42),
|
||||
.end = gic_spi(47),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device dma0_device = {
|
||||
.name = "sh-dma-engine",
|
||||
.id = 0,
|
||||
.resource = r8a7740_dmae0_resources,
|
||||
.num_resources = ARRAY_SIZE(r8a7740_dmae0_resources),
|
||||
.dev = {
|
||||
.platform_data = &dma_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device dma1_device = {
|
||||
.name = "sh-dma-engine",
|
||||
.id = 1,
|
||||
.resource = r8a7740_dmae1_resources,
|
||||
.num_resources = ARRAY_SIZE(r8a7740_dmae1_resources),
|
||||
.dev = {
|
||||
.platform_data = &dma_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device dma2_device = {
|
||||
.name = "sh-dma-engine",
|
||||
.id = 2,
|
||||
.resource = r8a7740_dmae2_resources,
|
||||
.num_resources = ARRAY_SIZE(r8a7740_dmae2_resources),
|
||||
.dev = {
|
||||
.platform_data = &dma_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* USB-DMAC */
|
||||
static const struct sh_dmae_channel r8a7740_usb_dma_channels[] = {
|
||||
{
|
||||
.offset = 0,
|
||||
}, {
|
||||
.offset = 0x20,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct sh_dmae_slave_config r8a7740_usb_dma_slaves[] = {
|
||||
{
|
||||
.slave_id = SHDMA_SLAVE_USBHS_TX,
|
||||
.chcr = USBTS_INDEX2VAL(USBTS_XMIT_SZ_8BYTE),
|
||||
}, {
|
||||
.slave_id = SHDMA_SLAVE_USBHS_RX,
|
||||
.chcr = USBTS_INDEX2VAL(USBTS_XMIT_SZ_8BYTE),
|
||||
},
|
||||
};
|
||||
|
||||
static struct sh_dmae_pdata usb_dma_platform_data = {
|
||||
.slave = r8a7740_usb_dma_slaves,
|
||||
.slave_num = ARRAY_SIZE(r8a7740_usb_dma_slaves),
|
||||
.channel = r8a7740_usb_dma_channels,
|
||||
.channel_num = ARRAY_SIZE(r8a7740_usb_dma_channels),
|
||||
.ts_low_shift = USBTS_LOW_SHIFT,
|
||||
.ts_low_mask = USBTS_LOW_BIT << USBTS_LOW_SHIFT,
|
||||
.ts_high_shift = USBTS_HI_SHIFT,
|
||||
.ts_high_mask = USBTS_HI_BIT << USBTS_HI_SHIFT,
|
||||
.ts_shift = dma_usbts_shift,
|
||||
.ts_shift_num = ARRAY_SIZE(dma_usbts_shift),
|
||||
.dmaor_init = DMAOR_DME,
|
||||
.chcr_offset = 0x14,
|
||||
.chcr_ie_bit = 1 << 5,
|
||||
.dmaor_is_32bit = 1,
|
||||
.needs_tend_set = 1,
|
||||
.no_dmars = 1,
|
||||
.slave_only = 1,
|
||||
};
|
||||
|
||||
static struct resource r8a7740_usb_dma_resources[] = {
|
||||
{
|
||||
/* Channel registers and DMAOR */
|
||||
.start = 0xe68a0020,
|
||||
.end = 0xe68a0064 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
/* VCR/SWR/DMICR */
|
||||
.start = 0xe68a0000,
|
||||
.end = 0xe68a0014 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
/* IRQ for channels */
|
||||
.start = gic_spi(49),
|
||||
.end = gic_spi(49),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device usb_dma_device = {
|
||||
.name = "sh-dma-engine",
|
||||
.id = 3,
|
||||
.resource = r8a7740_usb_dma_resources,
|
||||
.num_resources = ARRAY_SIZE(r8a7740_usb_dma_resources),
|
||||
.dev = {
|
||||
.platform_data = &usb_dma_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* I2C */
|
||||
static struct resource i2c0_resources[] = {
|
||||
[0] = {
|
||||
.name = "IIC0",
|
||||
.start = 0xfff20000,
|
||||
.end = 0xfff20425 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = gic_spi(201),
|
||||
.end = gic_spi(204),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource i2c1_resources[] = {
|
||||
[0] = {
|
||||
.name = "IIC1",
|
||||
.start = 0xe6c20000,
|
||||
.end = 0xe6c20425 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = gic_spi(70), /* IIC1_ALI1 */
|
||||
.end = gic_spi(73), /* IIC1_DTEI1 */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device i2c0_device = {
|
||||
.name = "i2c-sh_mobile",
|
||||
.id = 0,
|
||||
.resource = i2c0_resources,
|
||||
.num_resources = ARRAY_SIZE(i2c0_resources),
|
||||
};
|
||||
|
||||
static struct platform_device i2c1_device = {
|
||||
.name = "i2c-sh_mobile",
|
||||
.id = 1,
|
||||
.resource = i2c1_resources,
|
||||
.num_resources = ARRAY_SIZE(i2c1_resources),
|
||||
};
|
||||
|
||||
static struct resource pmu_resources[] = {
|
||||
[0] = {
|
||||
.start = gic_spi(83),
|
||||
.end = gic_spi(83),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device pmu_device = {
|
||||
.name = "armv7-pmu",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(pmu_resources),
|
||||
.resource = pmu_resources,
|
||||
};
|
||||
|
||||
static struct platform_device *r8a7740_late_devices[] __initdata = {
|
||||
&i2c0_device,
|
||||
&i2c1_device,
|
||||
&dma0_device,
|
||||
&dma1_device,
|
||||
&dma2_device,
|
||||
&usb_dma_device,
|
||||
&pmu_device,
|
||||
};
|
||||
|
||||
/*
|
||||
* r8a7740 chip has lasting errata on MERAM buffer.
|
||||
* this is work-around for it.
|
||||
@ -678,7 +65,7 @@ static struct platform_device *r8a7740_late_devices[] __initdata = {
|
||||
* "Media RAM (MERAM)" on r8a7740 documentation
|
||||
*/
|
||||
#define MEBUFCNTR 0xFE950098
|
||||
void __init r8a7740_meram_workaround(void)
|
||||
static void __init r8a7740_meram_workaround(void)
|
||||
{
|
||||
void __iomem *reg;
|
||||
|
||||
@ -689,70 +76,13 @@ void __init r8a7740_meram_workaround(void)
|
||||
}
|
||||
}
|
||||
|
||||
void __init r8a7740_add_standard_devices(void)
|
||||
{
|
||||
static struct pm_domain_device domain_devices[] __initdata = {
|
||||
{ "A4R", &tmu0_device },
|
||||
{ "A4R", &i2c0_device },
|
||||
{ "A4S", &irqpin0_device },
|
||||
{ "A4S", &irqpin1_device },
|
||||
{ "A4S", &irqpin2_device },
|
||||
{ "A4S", &irqpin3_device },
|
||||
{ "A3SP", &scif0_device },
|
||||
{ "A3SP", &scif1_device },
|
||||
{ "A3SP", &scif2_device },
|
||||
{ "A3SP", &scif3_device },
|
||||
{ "A3SP", &scif4_device },
|
||||
{ "A3SP", &scif5_device },
|
||||
{ "A3SP", &scif6_device },
|
||||
{ "A3SP", &scif7_device },
|
||||
{ "A3SP", &scif8_device },
|
||||
{ "A3SP", &i2c1_device },
|
||||
{ "A3SP", &ipmmu_device },
|
||||
{ "A3SP", &dma0_device },
|
||||
{ "A3SP", &dma1_device },
|
||||
{ "A3SP", &dma2_device },
|
||||
{ "A3SP", &usb_dma_device },
|
||||
};
|
||||
|
||||
r8a7740_init_pm_domains();
|
||||
|
||||
/* add devices */
|
||||
platform_add_devices(r8a7740_early_devices,
|
||||
ARRAY_SIZE(r8a7740_early_devices));
|
||||
platform_add_devices(r8a7740_late_devices,
|
||||
ARRAY_SIZE(r8a7740_late_devices));
|
||||
|
||||
/* add devices to PM domain */
|
||||
rmobile_add_devices_to_domains(domain_devices,
|
||||
ARRAY_SIZE(domain_devices));
|
||||
}
|
||||
|
||||
void __init r8a7740_add_early_devices(void)
|
||||
{
|
||||
early_platform_add_devices(r8a7740_early_devices,
|
||||
ARRAY_SIZE(r8a7740_early_devices));
|
||||
|
||||
/* setup early console here as well */
|
||||
shmobile_setup_console();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USE_OF
|
||||
|
||||
void __init r8a7740_init_irq_of(void)
|
||||
static void __init r8a7740_init_irq_of(void)
|
||||
{
|
||||
void __iomem *intc_prio_base = ioremap_nocache(0xe6900010, 0x10);
|
||||
void __iomem *intc_msk_base = ioremap_nocache(0xe6900040, 0x10);
|
||||
void __iomem *pfc_inta_ctrl = ioremap_nocache(0xe605807c, 0x4);
|
||||
|
||||
#ifdef CONFIG_ARCH_SHMOBILE_LEGACY
|
||||
void __iomem *gic_dist_base = ioremap_nocache(0xc2800000, 0x1000);
|
||||
void __iomem *gic_cpu_base = ioremap_nocache(0xc2000000, 0x1000);
|
||||
|
||||
gic_init(0, 29, gic_dist_base, gic_cpu_base);
|
||||
#else
|
||||
irqchip_init();
|
||||
#endif
|
||||
|
||||
/* route signals to GIC */
|
||||
iowrite32(0x0, pfc_inta_ctrl);
|
||||
@ -800,5 +130,3 @@ DT_MACHINE_START(R8A7740_DT, "Generic R8A7740 (Flattened Device Tree)")
|
||||
.init_late = shmobile_init_late,
|
||||
.dt_compat = r8a7740_boards_compat_dt,
|
||||
MACHINE_END
|
||||
|
||||
#endif /* CONFIG_USE_OF */
|
||||
|
Loading…
Reference in New Issue
Block a user