Commit f932449c authored by Paul Cercueil's avatar Paul Cercueil Committed by Thomas Bogendoerfer

MIPS: ingenic: Drop obsolete code, merge the rest in setup.c

Drop a bootload of 10-years-old dirty code, that is not used anymore, as
it has been replaced with clean code over the ages.

Merge the very few bits left inside setup.c, so that everything is clean
and tidy now.
Signed-off-by: default avatarPaul Cercueil <paul@crapouillou.net>
Signed-off-by: default avatarThomas Bogendoerfer <tsbogend@alpha.franken.de>
parent 8827af94
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __ASM_MACH_JZ4740_BASE_H__
#define __ASM_MACH_JZ4740_BASE_H__
#define JZ4740_CPM_BASE_ADDR 0x10000000
#define JZ4740_INTC_BASE_ADDR 0x10001000
#define JZ4740_WDT_BASE_ADDR 0x10002000
#define JZ4740_TCU_BASE_ADDR 0x10002010
#define JZ4740_RTC_BASE_ADDR 0x10003000
#define JZ4740_GPIO_BASE_ADDR 0x10010000
#define JZ4740_AIC_BASE_ADDR 0x10020000
#define JZ4740_MSC_BASE_ADDR 0x10021000
#define JZ4740_UART0_BASE_ADDR 0x10030000
#define JZ4740_UART1_BASE_ADDR 0x10031000
#define JZ4740_I2C_BASE_ADDR 0x10042000
#define JZ4740_SSI_BASE_ADDR 0x10043000
#define JZ4740_SADC_BASE_ADDR 0x10070000
#define JZ4740_EMC_BASE_ADDR 0x13010000
#define JZ4740_DMAC_BASE_ADDR 0x13020000
#define JZ4740_UHC_BASE_ADDR 0x13030000
#define JZ4740_UDC_BASE_ADDR 0x13040000
#define JZ4740_LCD_BASE_ADDR 0x13050000
#define JZ4740_SLCD_BASE_ADDR 0x13050000
#define JZ4740_CIM_BASE_ADDR 0x13060000
#define JZ4740_IPU_BASE_ADDR 0x13080000
#endif
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de>
* JZ7420/JZ4740 DMA definitions
*/
#ifndef __ASM_MACH_JZ4740_DMA_H__
#define __ASM_MACH_JZ4740_DMA_H__
enum jz4740_dma_request_type {
JZ4740_DMA_TYPE_AUTO_REQUEST = 8,
JZ4740_DMA_TYPE_UART_TRANSMIT = 20,
JZ4740_DMA_TYPE_UART_RECEIVE = 21,
JZ4740_DMA_TYPE_SPI_TRANSMIT = 22,
JZ4740_DMA_TYPE_SPI_RECEIVE = 23,
JZ4740_DMA_TYPE_MMC_TRANSMIT = 26,
JZ4740_DMA_TYPE_MMC_RECEIVE = 27,
JZ4740_DMA_TYPE_TCU = 28,
JZ4740_DMA_TYPE_SADC = 29,
JZ4740_DMA_TYPE_SLCD = 30,
};
#endif /* __ASM_JZ4740_DMA_H__ */
...@@ -8,49 +8,6 @@ ...@@ -8,49 +8,6 @@
#define __ASM_MACH_JZ4740_IRQ_H__ #define __ASM_MACH_JZ4740_IRQ_H__
#define MIPS_CPU_IRQ_BASE 0 #define MIPS_CPU_IRQ_BASE 0
#define JZ4740_IRQ_BASE 8 #define NR_IRQS 256
#ifdef CONFIG_MACH_JZ4740
# define NR_INTC_IRQS 32
#else
# define NR_INTC_IRQS 64
#endif
/* 1st-level interrupts */
#define JZ4740_IRQ(x) (JZ4740_IRQ_BASE + (x))
#define JZ4740_IRQ_I2C JZ4740_IRQ(1)
#define JZ4740_IRQ_UHC JZ4740_IRQ(3)
#define JZ4740_IRQ_UART1 JZ4740_IRQ(8)
#define JZ4740_IRQ_UART0 JZ4740_IRQ(9)
#define JZ4740_IRQ_SADC JZ4740_IRQ(12)
#define JZ4740_IRQ_MSC JZ4740_IRQ(14)
#define JZ4740_IRQ_RTC JZ4740_IRQ(15)
#define JZ4740_IRQ_SSI JZ4740_IRQ(16)
#define JZ4740_IRQ_CIM JZ4740_IRQ(17)
#define JZ4740_IRQ_AIC JZ4740_IRQ(18)
#define JZ4740_IRQ_ETH JZ4740_IRQ(19)
#define JZ4740_IRQ_DMAC JZ4740_IRQ(20)
#define JZ4740_IRQ_TCU2 JZ4740_IRQ(21)
#define JZ4740_IRQ_TCU1 JZ4740_IRQ(22)
#define JZ4740_IRQ_TCU0 JZ4740_IRQ(23)
#define JZ4740_IRQ_UDC JZ4740_IRQ(24)
#define JZ4740_IRQ_GPIO3 JZ4740_IRQ(25)
#define JZ4740_IRQ_GPIO2 JZ4740_IRQ(26)
#define JZ4740_IRQ_GPIO1 JZ4740_IRQ(27)
#define JZ4740_IRQ_GPIO0 JZ4740_IRQ(28)
#define JZ4740_IRQ_IPU JZ4740_IRQ(29)
#define JZ4740_IRQ_LCD JZ4740_IRQ(30)
#define JZ4780_IRQ_TCU2 JZ4740_IRQ(25)
/* 2nd-level interrupts */
#define JZ4740_IRQ_DMA(x) (JZ4740_IRQ(NR_INTC_IRQS) + (x))
#define JZ4740_IRQ_INTC_GPIO(x) (JZ4740_IRQ_GPIO0 - (x))
#define JZ4740_IRQ_GPIO(x) (JZ4740_IRQ(NR_INTC_IRQS + 16) + (x))
#define JZ4740_IRQ_ADC_BASE JZ4740_IRQ(NR_INTC_IRQS + 144)
#define NR_IRQS (JZ4740_IRQ_ADC_BASE + 6)
#endif #endif
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de>
* JZ4740 platform timer support
*/
#ifndef __ASM_MACH_JZ4740_TIMER
#define __ASM_MACH_JZ4740_TIMER
#define JZ_REG_TIMER_STOP 0x0C
#define JZ_REG_TIMER_STOP_SET 0x1C
#define JZ_REG_TIMER_STOP_CLEAR 0x2C
#define JZ_REG_TIMER_ENABLE 0x00
#define JZ_REG_TIMER_ENABLE_SET 0x04
#define JZ_REG_TIMER_ENABLE_CLEAR 0x08
#define JZ_REG_TIMER_FLAG 0x10
#define JZ_REG_TIMER_FLAG_SET 0x14
#define JZ_REG_TIMER_FLAG_CLEAR 0x18
#define JZ_REG_TIMER_MASK 0x20
#define JZ_REG_TIMER_MASK_SET 0x24
#define JZ_REG_TIMER_MASK_CLEAR 0x28
#define JZ_REG_TIMER_DFR(x) (((x) * 0x10) + 0x30)
#define JZ_REG_TIMER_DHR(x) (((x) * 0x10) + 0x34)
#define JZ_REG_TIMER_CNT(x) (((x) * 0x10) + 0x38)
#define JZ_REG_TIMER_CTRL(x) (((x) * 0x10) + 0x3C)
#define JZ_TIMER_IRQ_HALF(x) BIT((x) + 0x10)
#define JZ_TIMER_IRQ_FULL(x) BIT(x)
#define JZ_TIMER_CTRL_PWM_ABBRUPT_SHUTDOWN BIT(9)
#define JZ_TIMER_CTRL_PWM_ACTIVE_LOW BIT(8)
#define JZ_TIMER_CTRL_PWM_ENABLE BIT(7)
#define JZ_TIMER_CTRL_PRESCALE_MASK 0x1c
#define JZ_TIMER_CTRL_PRESCALE_OFFSET 0x3
#define JZ_TIMER_CTRL_PRESCALE_1 (0 << 3)
#define JZ_TIMER_CTRL_PRESCALE_4 (1 << 3)
#define JZ_TIMER_CTRL_PRESCALE_16 (2 << 3)
#define JZ_TIMER_CTRL_PRESCALE_64 (3 << 3)
#define JZ_TIMER_CTRL_PRESCALE_256 (4 << 3)
#define JZ_TIMER_CTRL_PRESCALE_1024 (5 << 3)
#define JZ_TIMER_CTRL_PRESCALER(x) ((x) << JZ_TIMER_CTRL_PRESCALE_OFFSET)
#define JZ_TIMER_CTRL_SRC_EXT BIT(2)
#define JZ_TIMER_CTRL_SRC_RTC BIT(1)
#define JZ_TIMER_CTRL_SRC_PCLK BIT(0)
extern void __iomem *jz4740_timer_base;
void __init jz4740_timer_init(void);
void jz4740_timer_enable_watchdog(void);
void jz4740_timer_disable_watchdog(void);
static inline void jz4740_timer_stop(unsigned int timer)
{
writel(BIT(timer), jz4740_timer_base + JZ_REG_TIMER_STOP_SET);
}
static inline void jz4740_timer_start(unsigned int timer)
{
writel(BIT(timer), jz4740_timer_base + JZ_REG_TIMER_STOP_CLEAR);
}
static inline bool jz4740_timer_is_enabled(unsigned int timer)
{
return readb(jz4740_timer_base + JZ_REG_TIMER_ENABLE) & BIT(timer);
}
static inline void jz4740_timer_enable(unsigned int timer)
{
writeb(BIT(timer), jz4740_timer_base + JZ_REG_TIMER_ENABLE_SET);
}
static inline void jz4740_timer_disable(unsigned int timer)
{
writeb(BIT(timer), jz4740_timer_base + JZ_REG_TIMER_ENABLE_CLEAR);
}
static inline void jz4740_timer_set_period(unsigned int timer, uint16_t period)
{
writew(period, jz4740_timer_base + JZ_REG_TIMER_DFR(timer));
}
static inline void jz4740_timer_set_duty(unsigned int timer, uint16_t duty)
{
writew(duty, jz4740_timer_base + JZ_REG_TIMER_DHR(timer));
}
static inline void jz4740_timer_set_count(unsigned int timer, uint16_t count)
{
writew(count, jz4740_timer_base + JZ_REG_TIMER_CNT(timer));
}
static inline uint16_t jz4740_timer_get_count(unsigned int timer)
{
return readw(jz4740_timer_base + JZ_REG_TIMER_CNT(timer));
}
static inline void jz4740_timer_ack_full(unsigned int timer)
{
writel(JZ_TIMER_IRQ_FULL(timer), jz4740_timer_base + JZ_REG_TIMER_FLAG_CLEAR);
}
static inline void jz4740_timer_irq_full_enable(unsigned int timer)
{
writel(JZ_TIMER_IRQ_FULL(timer), jz4740_timer_base + JZ_REG_TIMER_FLAG_CLEAR);
writel(JZ_TIMER_IRQ_FULL(timer), jz4740_timer_base + JZ_REG_TIMER_MASK_CLEAR);
}
static inline void jz4740_timer_irq_full_disable(unsigned int timer)
{
writel(JZ_TIMER_IRQ_FULL(timer), jz4740_timer_base + JZ_REG_TIMER_MASK_SET);
}
static inline void jz4740_timer_set_ctrl(unsigned int timer, uint16_t ctrl)
{
writew(ctrl, jz4740_timer_base + JZ_REG_TIMER_CTRL(timer));
}
static inline uint16_t jz4740_timer_get_ctrl(unsigned int timer)
{
return readw(jz4740_timer_base + JZ_REG_TIMER_CTRL(timer));
}
#endif
...@@ -4,11 +4,6 @@ ...@@ -4,11 +4,6 @@
# #
# Object file lists. # Object file lists.
obj-y += setup.o
obj-y += prom.o time.o reset.o setup.o timer.o
CFLAGS_setup.o = -I$(src)/../../../scripts/dtc/libfdt CFLAGS_setup.o = -I$(src)/../../../scripts/dtc/libfdt
# PM support
obj-$(CONFIG_PM) += pm.o
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de>
* JZ4740 SoC power management support
*/
#include <linux/init.h>
#include <linux/pm.h>
#include <linux/delay.h>
#include <linux/suspend.h>
static int jz4740_pm_enter(suspend_state_t state)
{
__asm__(".set\tmips3\n\t"
"wait\n\t"
".set\tmips0");
return 0;
}
static const struct platform_suspend_ops jz4740_pm_ops = {
.valid = suspend_valid_only_mem,
.enter = jz4740_pm_enter,
};
static int __init jz4740_pm_init(void)
{
suspend_set_ops(&jz4740_pm_ops);
return 0;
}
late_initcall(jz4740_pm_init);
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de>
* JZ4740 SoC prom code
*/
#include <linux/init.h>
#include <asm/bootinfo.h>
#include <asm/fw/fw.h>
void __init prom_init(void)
{
fw_init_cmdline();
}
void __init prom_free_prom_memory(void)
{
}
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de>
*/
#include <asm/reboot.h>
#include "reset.h"
static void jz4740_halt(void)
{
while (1) {
__asm__(".set push;\n"
".set mips3;\n"
"wait;\n"
".set pop;\n"
);
}
}
void jz4740_reset_init(void)
{
_machine_halt = jz4740_halt;
}
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __MIPS_JZ4740_RESET_H__
#define __MIPS_JZ4740_RESET_H__
extern void jz4740_reset_init(void);
#endif
...@@ -5,17 +5,21 @@ ...@@ -5,17 +5,21 @@
* JZ4740 setup code * JZ4740 setup code
*/ */
#include <linux/clk-provider.h>
#include <linux/clocksource.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/irqchip.h> #include <linux/irqchip.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/libfdt.h> #include <linux/libfdt.h>
#include <linux/of_fdt.h> #include <linux/of_fdt.h>
#include <linux/pm.h>
#include <linux/suspend.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#include <asm/fw/fw.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/reboot.h>
#include "reset.h"
#define JZ4740_EMC_BASE_ADDR 0x13010000 #define JZ4740_EMC_BASE_ADDR 0x13010000
...@@ -61,8 +65,6 @@ void __init plat_mem_setup(void) ...@@ -61,8 +65,6 @@ void __init plat_mem_setup(void)
int offset; int offset;
void *dtb; void *dtb;
jz4740_reset_init();
if (__dtb_start != __dtb_end) if (__dtb_start != __dtb_end)
dtb = __dtb_start; dtb = __dtb_start;
else else
...@@ -105,3 +107,56 @@ void __init arch_init_irq(void) ...@@ -105,3 +107,56 @@ void __init arch_init_irq(void)
{ {
irqchip_init(); irqchip_init();
} }
void __init plat_time_init(void)
{
of_clk_init(NULL);
timer_probe();
}
void __init prom_init(void)
{
fw_init_cmdline();
}
void __init prom_free_prom_memory(void)
{
}
static void jz4740_wait_instr(void)
{
__asm__(".set push;\n"
".set mips3;\n"
"wait;\n"
".set pop;\n"
);
}
static void jz4740_halt(void)
{
for (;;)
jz4740_wait_instr();
}
static int __maybe_unused jz4740_pm_enter(suspend_state_t state)
{
jz4740_wait_instr();
return 0;
}
static const struct platform_suspend_ops jz4740_pm_ops __maybe_unused = {
.valid = suspend_valid_only_mem,
.enter = jz4740_pm_enter,
};
static int __init jz4740_pm_init(void)
{
if (IS_ENABLED(CONFIG_PM_SLEEP))
suspend_set_ops(&jz4740_pm_ops);
_machine_halt = jz4740_halt;
return 0;
}
late_initcall(jz4740_pm_init);
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de>
* JZ4740 platform time support
*/
#include <linux/clocksource.h>
#include <linux/of_clk.h>
#include <asm/mach-jz4740/timer.h>
void __init plat_time_init(void)
{
of_clk_init(NULL);
jz4740_timer_init();
timer_probe();
}
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de>
* JZ4740 platform timer support
*/
#include <linux/export.h>
#include <linux/io.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <asm/mach-jz4740/base.h>
#include <asm/mach-jz4740/timer.h>
void __iomem *jz4740_timer_base;
EXPORT_SYMBOL_GPL(jz4740_timer_base);
void jz4740_timer_enable_watchdog(void)
{
writel(BIT(16), jz4740_timer_base + JZ_REG_TIMER_STOP_CLEAR);
}
EXPORT_SYMBOL_GPL(jz4740_timer_enable_watchdog);
void jz4740_timer_disable_watchdog(void)
{
writel(BIT(16), jz4740_timer_base + JZ_REG_TIMER_STOP_SET);
}
EXPORT_SYMBOL_GPL(jz4740_timer_disable_watchdog);
void __init jz4740_timer_init(void)
{
jz4740_timer_base = ioremap(JZ4740_TCU_BASE_ADDR, 0x100);
if (!jz4740_timer_base)
panic("Failed to ioremap timer registers");
/* Disable all timer clocks except for those used as system timers */
writel(0x000100fc, jz4740_timer_base + JZ_REG_TIMER_STOP_SET);
/* Timer irqs are unmasked by default, mask them */
writel(0x00ff00ff, jz4740_timer_base + JZ_REG_TIMER_MASK_SET);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment