mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
ARM: ep93xx: delete all boardfiles
Delete the ep93xx board files. Signed-off-by: Nikita Shubin <nikita.shubin@maquefel.me> Tested-by: Alexander Sverdlin <alexander.sverdlin@gmail.com> Acked-by: Vinod Koul <vkoul@kernel.org> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
committed by
Arnd Bergmann
parent
a632229be2
commit
e5ef574dda
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,114 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* arch/arm/mach-ep93xx/dma.c
|
||||
*
|
||||
* Platform support code for the EP93xx dmaengine driver.
|
||||
*
|
||||
* Copyright (C) 2011 Mika Westerberg
|
||||
*
|
||||
* This work is based on the original dma-m2p implementation with
|
||||
* following copyrights:
|
||||
*
|
||||
* Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
|
||||
* Copyright (C) 2006 Applied Data Systems
|
||||
* Copyright (C) 2009 Ryan Mallon <rmallon@gmail.com>
|
||||
*/
|
||||
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <linux/platform_data/dma-ep93xx.h>
|
||||
#include "hardware.h"
|
||||
|
||||
#include "soc.h"
|
||||
|
||||
#define DMA_CHANNEL(_name, _base, _irq) \
|
||||
{ .name = (_name), .base = (_base), .irq = (_irq) }
|
||||
|
||||
/*
|
||||
* DMA M2P channels.
|
||||
*
|
||||
* On the EP93xx chip the following peripherals my be allocated to the 10
|
||||
* Memory to Internal Peripheral (M2P) channels (5 transmit + 5 receive).
|
||||
*
|
||||
* I2S contains 3 Tx and 3 Rx DMA Channels
|
||||
* AAC contains 3 Tx and 3 Rx DMA Channels
|
||||
* UART1 contains 1 Tx and 1 Rx DMA Channels
|
||||
* UART2 contains 1 Tx and 1 Rx DMA Channels
|
||||
* UART3 contains 1 Tx and 1 Rx DMA Channels
|
||||
* IrDA contains 1 Tx and 1 Rx DMA Channels
|
||||
*
|
||||
* Registers are mapped statically in ep93xx_map_io().
|
||||
*/
|
||||
static struct ep93xx_dma_chan_data ep93xx_dma_m2p_channels[] = {
|
||||
DMA_CHANNEL("m2p0", EP93XX_DMA_BASE + 0x0000, IRQ_EP93XX_DMAM2P0),
|
||||
DMA_CHANNEL("m2p1", EP93XX_DMA_BASE + 0x0040, IRQ_EP93XX_DMAM2P1),
|
||||
DMA_CHANNEL("m2p2", EP93XX_DMA_BASE + 0x0080, IRQ_EP93XX_DMAM2P2),
|
||||
DMA_CHANNEL("m2p3", EP93XX_DMA_BASE + 0x00c0, IRQ_EP93XX_DMAM2P3),
|
||||
DMA_CHANNEL("m2p4", EP93XX_DMA_BASE + 0x0240, IRQ_EP93XX_DMAM2P4),
|
||||
DMA_CHANNEL("m2p5", EP93XX_DMA_BASE + 0x0200, IRQ_EP93XX_DMAM2P5),
|
||||
DMA_CHANNEL("m2p6", EP93XX_DMA_BASE + 0x02c0, IRQ_EP93XX_DMAM2P6),
|
||||
DMA_CHANNEL("m2p7", EP93XX_DMA_BASE + 0x0280, IRQ_EP93XX_DMAM2P7),
|
||||
DMA_CHANNEL("m2p8", EP93XX_DMA_BASE + 0x0340, IRQ_EP93XX_DMAM2P8),
|
||||
DMA_CHANNEL("m2p9", EP93XX_DMA_BASE + 0x0300, IRQ_EP93XX_DMAM2P9),
|
||||
};
|
||||
|
||||
static struct ep93xx_dma_platform_data ep93xx_dma_m2p_data = {
|
||||
.channels = ep93xx_dma_m2p_channels,
|
||||
.num_channels = ARRAY_SIZE(ep93xx_dma_m2p_channels),
|
||||
};
|
||||
|
||||
static u64 ep93xx_dma_m2p_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device ep93xx_dma_m2p_device = {
|
||||
.name = "ep93xx-dma-m2p",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &ep93xx_dma_m2p_data,
|
||||
.dma_mask = &ep93xx_dma_m2p_mask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* DMA M2M channels.
|
||||
*
|
||||
* There are 2 M2M channels which support memcpy/memset and in addition simple
|
||||
* hardware requests from/to SSP and IDE. We do not implement an external
|
||||
* hardware requests.
|
||||
*
|
||||
* Registers are mapped statically in ep93xx_map_io().
|
||||
*/
|
||||
static struct ep93xx_dma_chan_data ep93xx_dma_m2m_channels[] = {
|
||||
DMA_CHANNEL("m2m0", EP93XX_DMA_BASE + 0x0100, IRQ_EP93XX_DMAM2M0),
|
||||
DMA_CHANNEL("m2m1", EP93XX_DMA_BASE + 0x0140, IRQ_EP93XX_DMAM2M1),
|
||||
};
|
||||
|
||||
static struct ep93xx_dma_platform_data ep93xx_dma_m2m_data = {
|
||||
.channels = ep93xx_dma_m2m_channels,
|
||||
.num_channels = ARRAY_SIZE(ep93xx_dma_m2m_channels),
|
||||
};
|
||||
|
||||
static u64 ep93xx_dma_m2m_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device ep93xx_dma_m2m_device = {
|
||||
.name = "ep93xx-dma-m2m",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &ep93xx_dma_m2m_data,
|
||||
.dma_mask = &ep93xx_dma_m2m_mask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
static int __init ep93xx_dma_init(void)
|
||||
{
|
||||
platform_device_register(&ep93xx_dma_m2p_device);
|
||||
platform_device_register(&ep93xx_dma_m2m_device);
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(ep93xx_dma_init);
|
||||
@@ -1,368 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* arch/arm/mach-ep93xx/edb93xx.c
|
||||
* Cirrus Logic EDB93xx Development Board support.
|
||||
*
|
||||
* EDB93XX, EDB9301, EDB9307A
|
||||
* Copyright (C) 2008-2009 H Hartley Sweeten <hsweeten@visionengravers.com>
|
||||
*
|
||||
* EDB9302
|
||||
* Copyright (C) 2006 George Kashperko <george@chas.com.ua>
|
||||
*
|
||||
* EDB9302A, EDB9315, EDB9315A
|
||||
* Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
|
||||
*
|
||||
* EDB9307
|
||||
* Copyright (C) 2007 Herbert Valerio Riedel <hvr@gnu.org>
|
||||
*
|
||||
* EDB9312
|
||||
* Copyright (C) 2006 Infosys Technologies Limited
|
||||
* Toufeeq Hussain <toufeeq_hussain@infosys.com>
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
|
||||
#include <sound/cs4271.h>
|
||||
|
||||
#include "hardware.h"
|
||||
#include <linux/platform_data/video-ep93xx.h>
|
||||
#include <linux/platform_data/spi-ep93xx.h>
|
||||
#include "gpio-ep93xx.h"
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
#include "soc.h"
|
||||
|
||||
static void __init edb93xx_register_flash(void)
|
||||
{
|
||||
if (machine_is_edb9307() || machine_is_edb9312() ||
|
||||
machine_is_edb9315()) {
|
||||
ep93xx_register_flash(4, EP93XX_CS6_PHYS_BASE, SZ_32M);
|
||||
} else {
|
||||
ep93xx_register_flash(2, EP93XX_CS6_PHYS_BASE, SZ_16M);
|
||||
}
|
||||
}
|
||||
|
||||
static struct ep93xx_eth_data __initdata edb93xx_eth_data = {
|
||||
.phy_id = 1,
|
||||
};
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* EDB93xx i2c peripheral handling
|
||||
*************************************************************************/
|
||||
|
||||
static struct i2c_board_info __initdata edb93xxa_i2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("isl1208", 0x6f),
|
||||
},
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata edb93xx_i2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("ds1337", 0x68),
|
||||
},
|
||||
};
|
||||
|
||||
static void __init edb93xx_register_i2c(void)
|
||||
{
|
||||
if (machine_is_edb9302a() || machine_is_edb9307a() ||
|
||||
machine_is_edb9315a()) {
|
||||
ep93xx_register_i2c(edb93xxa_i2c_board_info,
|
||||
ARRAY_SIZE(edb93xxa_i2c_board_info));
|
||||
} else if (machine_is_edb9302() || machine_is_edb9307()
|
||||
|| machine_is_edb9312() || machine_is_edb9315()) {
|
||||
ep93xx_register_i2c(edb93xx_i2c_board_info,
|
||||
ARRAY_SIZE(edb93xx_i2c_board_info));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* EDB93xx SPI peripheral handling
|
||||
*************************************************************************/
|
||||
static struct cs4271_platform_data edb93xx_cs4271_data = {
|
||||
/* Intentionally left blank */
|
||||
};
|
||||
|
||||
static struct spi_board_info edb93xx_spi_board_info[] __initdata = {
|
||||
{
|
||||
.modalias = "cs4271",
|
||||
.platform_data = &edb93xx_cs4271_data,
|
||||
.max_speed_hz = 6000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.mode = SPI_MODE_3,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table edb93xx_spi_cs_gpio_table = {
|
||||
.dev_id = "spi0",
|
||||
.table = {
|
||||
GPIO_LOOKUP("gpio-ep93xx.0", 6, "cs", GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct ep93xx_spi_info edb93xx_spi_info __initdata = {
|
||||
/* Intentionally left blank */
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table edb93xx_cs4272_edb9301_gpio_table = {
|
||||
.dev_id = "spi0.0", /* CS0 on SPI0 */
|
||||
.table = {
|
||||
GPIO_LOOKUP("A", 1, "reset", GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table edb93xx_cs4272_edb9302_gpio_table = {
|
||||
.dev_id = "spi0.0", /* CS0 on SPI0 */
|
||||
.table = {
|
||||
GPIO_LOOKUP("H", 2, "reset", GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table edb93xx_cs4272_edb9315_gpio_table = {
|
||||
.dev_id = "spi0.0", /* CS0 on SPI0 */
|
||||
.table = {
|
||||
GPIO_LOOKUP("B", 6, "reset", GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static void __init edb93xx_register_spi(void)
|
||||
{
|
||||
if (machine_is_edb9301() || machine_is_edb9302())
|
||||
gpiod_add_lookup_table(&edb93xx_cs4272_edb9301_gpio_table);
|
||||
else if (machine_is_edb9302a() || machine_is_edb9307a())
|
||||
gpiod_add_lookup_table(&edb93xx_cs4272_edb9302_gpio_table);
|
||||
else if (machine_is_edb9315a())
|
||||
gpiod_add_lookup_table(&edb93xx_cs4272_edb9315_gpio_table);
|
||||
|
||||
gpiod_add_lookup_table(&edb93xx_spi_cs_gpio_table);
|
||||
ep93xx_register_spi(&edb93xx_spi_info, edb93xx_spi_board_info,
|
||||
ARRAY_SIZE(edb93xx_spi_board_info));
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* EDB93xx I2S
|
||||
*************************************************************************/
|
||||
static struct platform_device edb93xx_audio_device = {
|
||||
.name = "edb93xx-audio",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static int __init edb93xx_has_audio(void)
|
||||
{
|
||||
return (machine_is_edb9301() || machine_is_edb9302() ||
|
||||
machine_is_edb9302a() || machine_is_edb9307a() ||
|
||||
machine_is_edb9315a());
|
||||
}
|
||||
|
||||
static void __init edb93xx_register_i2s(void)
|
||||
{
|
||||
if (edb93xx_has_audio()) {
|
||||
ep93xx_register_i2s();
|
||||
platform_device_register(&edb93xx_audio_device);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* EDB93xx pwm
|
||||
*************************************************************************/
|
||||
static void __init edb93xx_register_pwm(void)
|
||||
{
|
||||
if (machine_is_edb9301() ||
|
||||
machine_is_edb9302() || machine_is_edb9302a()) {
|
||||
/* EP9301 and EP9302 only have pwm.1 (EGPIO14) */
|
||||
ep93xx_register_pwm(0, 1);
|
||||
} else if (machine_is_edb9307() || machine_is_edb9307a()) {
|
||||
/* EP9307 only has pwm.0 (PWMOUT) */
|
||||
ep93xx_register_pwm(1, 0);
|
||||
} else {
|
||||
/* EP9312 and EP9315 have both */
|
||||
ep93xx_register_pwm(1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* EDB93xx framebuffer
|
||||
*************************************************************************/
|
||||
static struct ep93xxfb_mach_info __initdata edb93xxfb_info = {
|
||||
.flags = 0,
|
||||
};
|
||||
|
||||
static int __init edb93xx_has_fb(void)
|
||||
{
|
||||
/* These platforms have an ep93xx with video capability */
|
||||
return machine_is_edb9307() || machine_is_edb9307a() ||
|
||||
machine_is_edb9312() || machine_is_edb9315() ||
|
||||
machine_is_edb9315a();
|
||||
}
|
||||
|
||||
static void __init edb93xx_register_fb(void)
|
||||
{
|
||||
if (!edb93xx_has_fb())
|
||||
return;
|
||||
|
||||
if (machine_is_edb9307a() || machine_is_edb9315a())
|
||||
edb93xxfb_info.flags |= EP93XXFB_USE_SDCSN0;
|
||||
else
|
||||
edb93xxfb_info.flags |= EP93XXFB_USE_SDCSN3;
|
||||
|
||||
ep93xx_register_fb(&edb93xxfb_info);
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* EDB93xx IDE
|
||||
*************************************************************************/
|
||||
static int __init edb93xx_has_ide(void)
|
||||
{
|
||||
/*
|
||||
* Although EDB9312 and EDB9315 do have IDE capability, they have
|
||||
* INTRQ line wired as pull-up, which makes using IDE interface
|
||||
* problematic.
|
||||
*/
|
||||
return machine_is_edb9312() || machine_is_edb9315() ||
|
||||
machine_is_edb9315a();
|
||||
}
|
||||
|
||||
static void __init edb93xx_register_ide(void)
|
||||
{
|
||||
if (!edb93xx_has_ide())
|
||||
return;
|
||||
|
||||
ep93xx_register_ide();
|
||||
}
|
||||
|
||||
|
||||
static void __init edb93xx_init_machine(void)
|
||||
{
|
||||
ep93xx_init_devices();
|
||||
edb93xx_register_flash();
|
||||
ep93xx_register_eth(&edb93xx_eth_data, 1);
|
||||
edb93xx_register_i2c();
|
||||
edb93xx_register_spi();
|
||||
edb93xx_register_i2s();
|
||||
edb93xx_register_pwm();
|
||||
edb93xx_register_fb();
|
||||
edb93xx_register_ide();
|
||||
ep93xx_register_adc();
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_MACH_EDB9301
|
||||
MACHINE_START(EDB9301, "Cirrus Logic EDB9301 Evaluation Board")
|
||||
/* Maintainer: H Hartley Sweeten <hsweeten@visionengravers.com> */
|
||||
.atag_offset = 0x100,
|
||||
.nr_irqs = NR_EP93XX_IRQS,
|
||||
.map_io = ep93xx_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.init_time = ep93xx_timer_init,
|
||||
.init_machine = edb93xx_init_machine,
|
||||
.restart = ep93xx_restart,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_EDB9302
|
||||
MACHINE_START(EDB9302, "Cirrus Logic EDB9302 Evaluation Board")
|
||||
/* Maintainer: George Kashperko <george@chas.com.ua> */
|
||||
.atag_offset = 0x100,
|
||||
.nr_irqs = NR_EP93XX_IRQS,
|
||||
.map_io = ep93xx_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.init_time = ep93xx_timer_init,
|
||||
.init_machine = edb93xx_init_machine,
|
||||
.restart = ep93xx_restart,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_EDB9302A
|
||||
MACHINE_START(EDB9302A, "Cirrus Logic EDB9302A Evaluation Board")
|
||||
/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
|
||||
.atag_offset = 0x100,
|
||||
.nr_irqs = NR_EP93XX_IRQS,
|
||||
.map_io = ep93xx_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.init_time = ep93xx_timer_init,
|
||||
.init_machine = edb93xx_init_machine,
|
||||
.restart = ep93xx_restart,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_EDB9307
|
||||
MACHINE_START(EDB9307, "Cirrus Logic EDB9307 Evaluation Board")
|
||||
/* Maintainer: Herbert Valerio Riedel <hvr@gnu.org> */
|
||||
.atag_offset = 0x100,
|
||||
.nr_irqs = NR_EP93XX_IRQS,
|
||||
.map_io = ep93xx_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.init_time = ep93xx_timer_init,
|
||||
.init_machine = edb93xx_init_machine,
|
||||
.restart = ep93xx_restart,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_EDB9307A
|
||||
MACHINE_START(EDB9307A, "Cirrus Logic EDB9307A Evaluation Board")
|
||||
/* Maintainer: H Hartley Sweeten <hsweeten@visionengravers.com> */
|
||||
.atag_offset = 0x100,
|
||||
.nr_irqs = NR_EP93XX_IRQS,
|
||||
.map_io = ep93xx_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.init_time = ep93xx_timer_init,
|
||||
.init_machine = edb93xx_init_machine,
|
||||
.restart = ep93xx_restart,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_EDB9312
|
||||
MACHINE_START(EDB9312, "Cirrus Logic EDB9312 Evaluation Board")
|
||||
/* Maintainer: Toufeeq Hussain <toufeeq_hussain@infosys.com> */
|
||||
.atag_offset = 0x100,
|
||||
.nr_irqs = NR_EP93XX_IRQS,
|
||||
.map_io = ep93xx_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.init_time = ep93xx_timer_init,
|
||||
.init_machine = edb93xx_init_machine,
|
||||
.restart = ep93xx_restart,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_EDB9315
|
||||
MACHINE_START(EDB9315, "Cirrus Logic EDB9315 Evaluation Board")
|
||||
/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
|
||||
.atag_offset = 0x100,
|
||||
.nr_irqs = NR_EP93XX_IRQS,
|
||||
.map_io = ep93xx_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.init_time = ep93xx_timer_init,
|
||||
.init_machine = edb93xx_init_machine,
|
||||
.restart = ep93xx_restart,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_EDB9315A
|
||||
MACHINE_START(EDB9315A, "Cirrus Logic EDB9315A Evaluation Board")
|
||||
/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
|
||||
.atag_offset = 0x100,
|
||||
.nr_irqs = NR_EP93XX_IRQS,
|
||||
.map_io = ep93xx_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.init_time = ep93xx_timer_init,
|
||||
.init_machine = edb93xx_init_machine,
|
||||
.restart = ep93xx_restart,
|
||||
MACHINE_END
|
||||
#endif
|
||||
@@ -1,38 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __ASM_ARCH_EP93XX_REGS_H
|
||||
#define __ASM_ARCH_EP93XX_REGS_H
|
||||
|
||||
/*
|
||||
* EP93xx linux memory map:
|
||||
*
|
||||
* virt phys size
|
||||
* fe800000 5M per-platform mappings
|
||||
* fed00000 80800000 2M APB
|
||||
* fef00000 80000000 1M AHB
|
||||
*/
|
||||
|
||||
#define EP93XX_AHB_PHYS_BASE 0x80000000
|
||||
#define EP93XX_AHB_VIRT_BASE 0xfef00000
|
||||
#define EP93XX_AHB_SIZE 0x00100000
|
||||
|
||||
#define EP93XX_AHB_PHYS(x) (EP93XX_AHB_PHYS_BASE + (x))
|
||||
#define EP93XX_AHB_IOMEM(x) IOMEM(EP93XX_AHB_VIRT_BASE + (x))
|
||||
|
||||
#define EP93XX_APB_PHYS_BASE 0x80800000
|
||||
#define EP93XX_APB_VIRT_BASE 0xfed00000
|
||||
#define EP93XX_APB_SIZE 0x00200000
|
||||
|
||||
#define EP93XX_APB_PHYS(x) (EP93XX_APB_PHYS_BASE + (x))
|
||||
#define EP93XX_APB_IOMEM(x) IOMEM(EP93XX_APB_VIRT_BASE + (x))
|
||||
|
||||
/* APB UARTs */
|
||||
#define EP93XX_UART1_PHYS_BASE EP93XX_APB_PHYS(0x000c0000)
|
||||
#define EP93XX_UART1_BASE EP93XX_APB_IOMEM(0x000c0000)
|
||||
|
||||
#define EP93XX_UART2_PHYS_BASE EP93XX_APB_PHYS(0x000d0000)
|
||||
#define EP93XX_UART2_BASE EP93XX_APB_IOMEM(0x000d0000)
|
||||
|
||||
#define EP93XX_UART3_PHYS_BASE EP93XX_APB_PHYS(0x000e0000)
|
||||
#define EP93XX_UART3_BASE EP93XX_APB_IOMEM(0x000e0000)
|
||||
|
||||
#endif
|
||||
@@ -1,111 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Include file for the EP93XX GPIO controller machine specifics */
|
||||
|
||||
#ifndef __GPIO_EP93XX_H
|
||||
#define __GPIO_EP93XX_H
|
||||
|
||||
#include "ep93xx-regs.h"
|
||||
|
||||
#define EP93XX_GPIO_PHYS_BASE EP93XX_APB_PHYS(0x00040000)
|
||||
#define EP93XX_GPIO_BASE EP93XX_APB_IOMEM(0x00040000)
|
||||
#define EP93XX_GPIO_REG(x) (EP93XX_GPIO_BASE + (x))
|
||||
#define EP93XX_GPIO_F_INT_STATUS EP93XX_GPIO_REG(0x5c)
|
||||
#define EP93XX_GPIO_A_INT_STATUS EP93XX_GPIO_REG(0xa0)
|
||||
#define EP93XX_GPIO_B_INT_STATUS EP93XX_GPIO_REG(0xbc)
|
||||
#define EP93XX_GPIO_EEDRIVE EP93XX_GPIO_REG(0xc8)
|
||||
|
||||
/* GPIO port A. */
|
||||
#define EP93XX_GPIO_LINE_A(x) ((x) + 0)
|
||||
#define EP93XX_GPIO_LINE_EGPIO0 EP93XX_GPIO_LINE_A(0)
|
||||
#define EP93XX_GPIO_LINE_EGPIO1 EP93XX_GPIO_LINE_A(1)
|
||||
#define EP93XX_GPIO_LINE_EGPIO2 EP93XX_GPIO_LINE_A(2)
|
||||
#define EP93XX_GPIO_LINE_EGPIO3 EP93XX_GPIO_LINE_A(3)
|
||||
#define EP93XX_GPIO_LINE_EGPIO4 EP93XX_GPIO_LINE_A(4)
|
||||
#define EP93XX_GPIO_LINE_EGPIO5 EP93XX_GPIO_LINE_A(5)
|
||||
#define EP93XX_GPIO_LINE_EGPIO6 EP93XX_GPIO_LINE_A(6)
|
||||
#define EP93XX_GPIO_LINE_EGPIO7 EP93XX_GPIO_LINE_A(7)
|
||||
|
||||
/* GPIO port B. */
|
||||
#define EP93XX_GPIO_LINE_B(x) ((x) + 8)
|
||||
#define EP93XX_GPIO_LINE_EGPIO8 EP93XX_GPIO_LINE_B(0)
|
||||
#define EP93XX_GPIO_LINE_EGPIO9 EP93XX_GPIO_LINE_B(1)
|
||||
#define EP93XX_GPIO_LINE_EGPIO10 EP93XX_GPIO_LINE_B(2)
|
||||
#define EP93XX_GPIO_LINE_EGPIO11 EP93XX_GPIO_LINE_B(3)
|
||||
#define EP93XX_GPIO_LINE_EGPIO12 EP93XX_GPIO_LINE_B(4)
|
||||
#define EP93XX_GPIO_LINE_EGPIO13 EP93XX_GPIO_LINE_B(5)
|
||||
#define EP93XX_GPIO_LINE_EGPIO14 EP93XX_GPIO_LINE_B(6)
|
||||
#define EP93XX_GPIO_LINE_EGPIO15 EP93XX_GPIO_LINE_B(7)
|
||||
|
||||
/* GPIO port C. */
|
||||
#define EP93XX_GPIO_LINE_C(x) ((x) + 40)
|
||||
#define EP93XX_GPIO_LINE_ROW0 EP93XX_GPIO_LINE_C(0)
|
||||
#define EP93XX_GPIO_LINE_ROW1 EP93XX_GPIO_LINE_C(1)
|
||||
#define EP93XX_GPIO_LINE_ROW2 EP93XX_GPIO_LINE_C(2)
|
||||
#define EP93XX_GPIO_LINE_ROW3 EP93XX_GPIO_LINE_C(3)
|
||||
#define EP93XX_GPIO_LINE_ROW4 EP93XX_GPIO_LINE_C(4)
|
||||
#define EP93XX_GPIO_LINE_ROW5 EP93XX_GPIO_LINE_C(5)
|
||||
#define EP93XX_GPIO_LINE_ROW6 EP93XX_GPIO_LINE_C(6)
|
||||
#define EP93XX_GPIO_LINE_ROW7 EP93XX_GPIO_LINE_C(7)
|
||||
|
||||
/* GPIO port D. */
|
||||
#define EP93XX_GPIO_LINE_D(x) ((x) + 24)
|
||||
#define EP93XX_GPIO_LINE_COL0 EP93XX_GPIO_LINE_D(0)
|
||||
#define EP93XX_GPIO_LINE_COL1 EP93XX_GPIO_LINE_D(1)
|
||||
#define EP93XX_GPIO_LINE_COL2 EP93XX_GPIO_LINE_D(2)
|
||||
#define EP93XX_GPIO_LINE_COL3 EP93XX_GPIO_LINE_D(3)
|
||||
#define EP93XX_GPIO_LINE_COL4 EP93XX_GPIO_LINE_D(4)
|
||||
#define EP93XX_GPIO_LINE_COL5 EP93XX_GPIO_LINE_D(5)
|
||||
#define EP93XX_GPIO_LINE_COL6 EP93XX_GPIO_LINE_D(6)
|
||||
#define EP93XX_GPIO_LINE_COL7 EP93XX_GPIO_LINE_D(7)
|
||||
|
||||
/* GPIO port E. */
|
||||
#define EP93XX_GPIO_LINE_E(x) ((x) + 32)
|
||||
#define EP93XX_GPIO_LINE_GRLED EP93XX_GPIO_LINE_E(0)
|
||||
#define EP93XX_GPIO_LINE_RDLED EP93XX_GPIO_LINE_E(1)
|
||||
#define EP93XX_GPIO_LINE_DIORn EP93XX_GPIO_LINE_E(2)
|
||||
#define EP93XX_GPIO_LINE_IDECS1n EP93XX_GPIO_LINE_E(3)
|
||||
#define EP93XX_GPIO_LINE_IDECS2n EP93XX_GPIO_LINE_E(4)
|
||||
#define EP93XX_GPIO_LINE_IDEDA0 EP93XX_GPIO_LINE_E(5)
|
||||
#define EP93XX_GPIO_LINE_IDEDA1 EP93XX_GPIO_LINE_E(6)
|
||||
#define EP93XX_GPIO_LINE_IDEDA2 EP93XX_GPIO_LINE_E(7)
|
||||
|
||||
/* GPIO port F. */
|
||||
#define EP93XX_GPIO_LINE_F(x) ((x) + 16)
|
||||
#define EP93XX_GPIO_LINE_WP EP93XX_GPIO_LINE_F(0)
|
||||
#define EP93XX_GPIO_LINE_MCCD1 EP93XX_GPIO_LINE_F(1)
|
||||
#define EP93XX_GPIO_LINE_MCCD2 EP93XX_GPIO_LINE_F(2)
|
||||
#define EP93XX_GPIO_LINE_MCBVD1 EP93XX_GPIO_LINE_F(3)
|
||||
#define EP93XX_GPIO_LINE_MCBVD2 EP93XX_GPIO_LINE_F(4)
|
||||
#define EP93XX_GPIO_LINE_VS1 EP93XX_GPIO_LINE_F(5)
|
||||
#define EP93XX_GPIO_LINE_READY EP93XX_GPIO_LINE_F(6)
|
||||
#define EP93XX_GPIO_LINE_VS2 EP93XX_GPIO_LINE_F(7)
|
||||
|
||||
/* GPIO port G. */
|
||||
#define EP93XX_GPIO_LINE_G(x) ((x) + 48)
|
||||
#define EP93XX_GPIO_LINE_EECLK EP93XX_GPIO_LINE_G(0)
|
||||
#define EP93XX_GPIO_LINE_EEDAT EP93XX_GPIO_LINE_G(1)
|
||||
#define EP93XX_GPIO_LINE_SLA0 EP93XX_GPIO_LINE_G(2)
|
||||
#define EP93XX_GPIO_LINE_SLA1 EP93XX_GPIO_LINE_G(3)
|
||||
#define EP93XX_GPIO_LINE_DD12 EP93XX_GPIO_LINE_G(4)
|
||||
#define EP93XX_GPIO_LINE_DD13 EP93XX_GPIO_LINE_G(5)
|
||||
#define EP93XX_GPIO_LINE_DD14 EP93XX_GPIO_LINE_G(6)
|
||||
#define EP93XX_GPIO_LINE_DD15 EP93XX_GPIO_LINE_G(7)
|
||||
|
||||
/* GPIO port H. */
|
||||
#define EP93XX_GPIO_LINE_H(x) ((x) + 56)
|
||||
#define EP93XX_GPIO_LINE_DD0 EP93XX_GPIO_LINE_H(0)
|
||||
#define EP93XX_GPIO_LINE_DD1 EP93XX_GPIO_LINE_H(1)
|
||||
#define EP93XX_GPIO_LINE_DD2 EP93XX_GPIO_LINE_H(2)
|
||||
#define EP93XX_GPIO_LINE_DD3 EP93XX_GPIO_LINE_H(3)
|
||||
#define EP93XX_GPIO_LINE_DD4 EP93XX_GPIO_LINE_H(4)
|
||||
#define EP93XX_GPIO_LINE_DD5 EP93XX_GPIO_LINE_H(5)
|
||||
#define EP93XX_GPIO_LINE_DD6 EP93XX_GPIO_LINE_H(6)
|
||||
#define EP93XX_GPIO_LINE_DD7 EP93XX_GPIO_LINE_H(7)
|
||||
|
||||
/* maximum value for gpio line identifiers */
|
||||
#define EP93XX_GPIO_LINE_MAX EP93XX_GPIO_LINE_H(7)
|
||||
|
||||
/* maximum value for irq capable line identifiers */
|
||||
#define EP93XX_GPIO_LINE_MAX_IRQ EP93XX_GPIO_LINE_F(7)
|
||||
|
||||
#endif /* __GPIO_EP93XX_H */
|
||||
@@ -1,25 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* arch/arm/mach-ep93xx/include/mach/hardware.h
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_HARDWARE_H
|
||||
#define __ASM_ARCH_HARDWARE_H
|
||||
|
||||
#include "platform.h"
|
||||
|
||||
/*
|
||||
* The EP93xx has two external crystal oscillators. To generate the
|
||||
* required high-frequency clocks, the processor uses two phase-locked-
|
||||
* loops (PLLs) to multiply the incoming external clock signal to much
|
||||
* higher frequencies that are then divided down by programmable dividers
|
||||
* to produce the needed clocks. The PLLs operate independently of one
|
||||
* another.
|
||||
*/
|
||||
#define EP93XX_EXT_CLK_RATE 14745600
|
||||
#define EP93XX_EXT_RTC_RATE 32768
|
||||
|
||||
#define EP93XX_KEYTCHCLK_DIV4 (EP93XX_EXT_CLK_RATE / 4)
|
||||
#define EP93XX_KEYTCHCLK_DIV16 (EP93XX_EXT_CLK_RATE / 16)
|
||||
|
||||
#endif
|
||||
@@ -1,76 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __ASM_ARCH_IRQS_H
|
||||
#define __ASM_ARCH_IRQS_H
|
||||
|
||||
#define IRQ_EP93XX_VIC0 1
|
||||
|
||||
#define IRQ_EP93XX_COMMRX (IRQ_EP93XX_VIC0 + 2)
|
||||
#define IRQ_EP93XX_COMMTX (IRQ_EP93XX_VIC0 + 3)
|
||||
#define IRQ_EP93XX_TIMER1 (IRQ_EP93XX_VIC0 + 4)
|
||||
#define IRQ_EP93XX_TIMER2 (IRQ_EP93XX_VIC0 + 5)
|
||||
#define IRQ_EP93XX_AACINTR (IRQ_EP93XX_VIC0 + 6)
|
||||
#define IRQ_EP93XX_DMAM2P0 (IRQ_EP93XX_VIC0 + 7)
|
||||
#define IRQ_EP93XX_DMAM2P1 (IRQ_EP93XX_VIC0 + 8)
|
||||
#define IRQ_EP93XX_DMAM2P2 (IRQ_EP93XX_VIC0 + 9)
|
||||
#define IRQ_EP93XX_DMAM2P3 (IRQ_EP93XX_VIC0 + 10)
|
||||
#define IRQ_EP93XX_DMAM2P4 (IRQ_EP93XX_VIC0 + 11)
|
||||
#define IRQ_EP93XX_DMAM2P5 (IRQ_EP93XX_VIC0 + 12)
|
||||
#define IRQ_EP93XX_DMAM2P6 (IRQ_EP93XX_VIC0 + 13)
|
||||
#define IRQ_EP93XX_DMAM2P7 (IRQ_EP93XX_VIC0 + 14)
|
||||
#define IRQ_EP93XX_DMAM2P8 (IRQ_EP93XX_VIC0 + 15)
|
||||
#define IRQ_EP93XX_DMAM2P9 (IRQ_EP93XX_VIC0 + 16)
|
||||
#define IRQ_EP93XX_DMAM2M0 (IRQ_EP93XX_VIC0 + 17)
|
||||
#define IRQ_EP93XX_DMAM2M1 (IRQ_EP93XX_VIC0 + 18)
|
||||
#define IRQ_EP93XX_GPIO0MUX (IRQ_EP93XX_VIC0 + 19)
|
||||
#define IRQ_EP93XX_GPIO1MUX (IRQ_EP93XX_VIC0 + 20)
|
||||
#define IRQ_EP93XX_GPIO2MUX (IRQ_EP93XX_VIC0 + 21)
|
||||
#define IRQ_EP93XX_GPIO3MUX (IRQ_EP93XX_VIC0 + 22)
|
||||
#define IRQ_EP93XX_UART1RX (IRQ_EP93XX_VIC0 + 23)
|
||||
#define IRQ_EP93XX_UART1TX (IRQ_EP93XX_VIC0 + 24)
|
||||
#define IRQ_EP93XX_UART2RX (IRQ_EP93XX_VIC0 + 25)
|
||||
#define IRQ_EP93XX_UART2TX (IRQ_EP93XX_VIC0 + 26)
|
||||
#define IRQ_EP93XX_UART3RX (IRQ_EP93XX_VIC0 + 27)
|
||||
#define IRQ_EP93XX_UART3TX (IRQ_EP93XX_VIC0 + 28)
|
||||
#define IRQ_EP93XX_KEY (IRQ_EP93XX_VIC0 + 29)
|
||||
#define IRQ_EP93XX_TOUCH (IRQ_EP93XX_VIC0 + 30)
|
||||
#define EP93XX_VIC1_VALID_IRQ_MASK 0x7ffffffc
|
||||
|
||||
#define IRQ_EP93XX_VIC1 (IRQ_EP93XX_VIC0 + 32)
|
||||
|
||||
#define IRQ_EP93XX_EXT0 (IRQ_EP93XX_VIC1 + 0)
|
||||
#define IRQ_EP93XX_EXT1 (IRQ_EP93XX_VIC1 + 1)
|
||||
#define IRQ_EP93XX_EXT2 (IRQ_EP93XX_VIC1 + 2)
|
||||
#define IRQ_EP93XX_64HZ (IRQ_EP93XX_VIC1 + 3)
|
||||
#define IRQ_EP93XX_WATCHDOG (IRQ_EP93XX_VIC1 + 4)
|
||||
#define IRQ_EP93XX_RTC (IRQ_EP93XX_VIC1 + 5)
|
||||
#define IRQ_EP93XX_IRDA (IRQ_EP93XX_VIC1 + 6)
|
||||
#define IRQ_EP93XX_ETHERNET (IRQ_EP93XX_VIC1 + 7)
|
||||
#define IRQ_EP93XX_EXT3 (IRQ_EP93XX_VIC1 + 8)
|
||||
#define IRQ_EP93XX_PROG (IRQ_EP93XX_VIC1 + 9)
|
||||
#define IRQ_EP93XX_1HZ (IRQ_EP93XX_VIC1 + 10)
|
||||
#define IRQ_EP93XX_VSYNC (IRQ_EP93XX_VIC1 + 11)
|
||||
#define IRQ_EP93XX_VIDEO_FIFO (IRQ_EP93XX_VIC1 + 12)
|
||||
#define IRQ_EP93XX_SSP1RX (IRQ_EP93XX_VIC1 + 13)
|
||||
#define IRQ_EP93XX_SSP1TX (IRQ_EP93XX_VIC1 + 14)
|
||||
#define IRQ_EP93XX_GPIO4MUX (IRQ_EP93XX_VIC1 + 15)
|
||||
#define IRQ_EP93XX_GPIO5MUX (IRQ_EP93XX_VIC1 + 16)
|
||||
#define IRQ_EP93XX_GPIO6MUX (IRQ_EP93XX_VIC1 + 17)
|
||||
#define IRQ_EP93XX_GPIO7MUX (IRQ_EP93XX_VIC1 + 18)
|
||||
#define IRQ_EP93XX_TIMER3 (IRQ_EP93XX_VIC1 + 19)
|
||||
#define IRQ_EP93XX_UART1 (IRQ_EP93XX_VIC1 + 20)
|
||||
#define IRQ_EP93XX_SSP (IRQ_EP93XX_VIC1 + 21)
|
||||
#define IRQ_EP93XX_UART2 (IRQ_EP93XX_VIC1 + 22)
|
||||
#define IRQ_EP93XX_UART3 (IRQ_EP93XX_VIC1 + 23)
|
||||
#define IRQ_EP93XX_USB (IRQ_EP93XX_VIC1 + 24)
|
||||
#define IRQ_EP93XX_ETHERNET_PME (IRQ_EP93XX_VIC1 + 25)
|
||||
#define IRQ_EP93XX_DSP (IRQ_EP93XX_VIC1 + 26)
|
||||
#define IRQ_EP93XX_GPIO_AB (IRQ_EP93XX_VIC1 + 27)
|
||||
#define IRQ_EP93XX_SAI (IRQ_EP93XX_VIC1 + 28)
|
||||
#define EP93XX_VIC2_VALID_IRQ_MASK 0x1fffffff
|
||||
|
||||
#define NR_EP93XX_IRQS (IRQ_EP93XX_VIC1 + 32 + 24)
|
||||
|
||||
#define EP93XX_BOARD_IRQ(x) (NR_EP93XX_IRQS + (x))
|
||||
#define EP93XX_BOARD_IRQS 32
|
||||
|
||||
#endif
|
||||
@@ -1,42 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* arch/arm/mach-ep93xx/include/mach/platform.h
|
||||
*/
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/platform_data/eth-ep93xx.h>
|
||||
#include <linux/reboot.h>
|
||||
|
||||
struct device;
|
||||
struct i2c_board_info;
|
||||
struct spi_board_info;
|
||||
struct platform_device;
|
||||
struct ep93xxfb_mach_info;
|
||||
struct ep93xx_keypad_platform_data;
|
||||
struct ep93xx_spi_info;
|
||||
|
||||
void ep93xx_map_io(void);
|
||||
void ep93xx_init_irq(void);
|
||||
|
||||
void ep93xx_register_flash(unsigned int width,
|
||||
resource_size_t start, resource_size_t size);
|
||||
|
||||
void ep93xx_register_eth(struct ep93xx_eth_data *data, int copy_addr);
|
||||
void ep93xx_register_i2c(struct i2c_board_info *devices, int num);
|
||||
void ep93xx_register_spi(struct ep93xx_spi_info *info,
|
||||
struct spi_board_info *devices, int num);
|
||||
void ep93xx_register_fb(struct ep93xxfb_mach_info *data);
|
||||
void ep93xx_register_pwm(int pwm0, int pwm1);
|
||||
void ep93xx_register_keypad(struct ep93xx_keypad_platform_data *data);
|
||||
void ep93xx_register_i2s(void);
|
||||
void ep93xx_register_ac97(void);
|
||||
void ep93xx_register_ide(void);
|
||||
void ep93xx_register_adc(void);
|
||||
|
||||
struct device *ep93xx_init_devices(void);
|
||||
extern void ep93xx_timer_init(void);
|
||||
|
||||
void ep93xx_restart(enum reboot_mode, const char *);
|
||||
|
||||
#endif
|
||||
@@ -1,212 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* arch/arm/mach-ep93xx/soc.h
|
||||
*
|
||||
* Copyright (C) 2012 Open Kernel Labs <www.ok-labs.com>
|
||||
* Copyright (C) 2012 Ryan Mallon <rmallon@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef _EP93XX_SOC_H
|
||||
#define _EP93XX_SOC_H
|
||||
|
||||
#include "ep93xx-regs.h"
|
||||
#include "irqs.h"
|
||||
|
||||
/*
|
||||
* EP93xx Physical Memory Map:
|
||||
*
|
||||
* The ASDO pin is sampled at system reset to select a synchronous or
|
||||
* asynchronous boot configuration. When ASDO is "1" (i.e. pulled-up)
|
||||
* the synchronous boot mode is selected. When ASDO is "0" (i.e
|
||||
* pulled-down) the asynchronous boot mode is selected.
|
||||
*
|
||||
* In synchronous boot mode nSDCE3 is decoded starting at physical address
|
||||
* 0x00000000 and nCS0 is decoded starting at 0xf0000000. For asynchronous
|
||||
* boot mode they are swapped with nCS0 decoded at 0x00000000 ann nSDCE3
|
||||
* decoded at 0xf0000000.
|
||||
*
|
||||
* There is known errata for the EP93xx dealing with External Memory
|
||||
* Configurations. Please refer to "AN273: EP93xx Silicon Rev E Design
|
||||
* Guidelines" for more information. This document can be found at:
|
||||
*
|
||||
* http://www.cirrus.com/en/pubs/appNote/AN273REV4.pdf
|
||||
*/
|
||||
|
||||
#define EP93XX_CS0_PHYS_BASE_ASYNC 0x00000000 /* ASDO Pin = 0 */
|
||||
#define EP93XX_SDCE3_PHYS_BASE_SYNC 0x00000000 /* ASDO Pin = 1 */
|
||||
#define EP93XX_CS1_PHYS_BASE 0x10000000
|
||||
#define EP93XX_CS2_PHYS_BASE 0x20000000
|
||||
#define EP93XX_CS3_PHYS_BASE 0x30000000
|
||||
#define EP93XX_PCMCIA_PHYS_BASE 0x40000000
|
||||
#define EP93XX_CS6_PHYS_BASE 0x60000000
|
||||
#define EP93XX_CS7_PHYS_BASE 0x70000000
|
||||
#define EP93XX_SDCE0_PHYS_BASE 0xc0000000
|
||||
#define EP93XX_SDCE1_PHYS_BASE 0xd0000000
|
||||
#define EP93XX_SDCE2_PHYS_BASE 0xe0000000
|
||||
#define EP93XX_SDCE3_PHYS_BASE_ASYNC 0xf0000000 /* ASDO Pin = 0 */
|
||||
#define EP93XX_CS0_PHYS_BASE_SYNC 0xf0000000 /* ASDO Pin = 1 */
|
||||
|
||||
/* AHB peripherals */
|
||||
#define EP93XX_DMA_BASE EP93XX_AHB_IOMEM(0x00000000)
|
||||
|
||||
#define EP93XX_ETHERNET_PHYS_BASE EP93XX_AHB_PHYS(0x00010000)
|
||||
#define EP93XX_ETHERNET_BASE EP93XX_AHB_IOMEM(0x00010000)
|
||||
|
||||
#define EP93XX_USB_PHYS_BASE EP93XX_AHB_PHYS(0x00020000)
|
||||
#define EP93XX_USB_BASE EP93XX_AHB_IOMEM(0x00020000)
|
||||
|
||||
#define EP93XX_RASTER_PHYS_BASE EP93XX_AHB_PHYS(0x00030000)
|
||||
#define EP93XX_RASTER_BASE EP93XX_AHB_IOMEM(0x00030000)
|
||||
|
||||
#define EP93XX_GRAPHICS_ACCEL_BASE EP93XX_AHB_IOMEM(0x00040000)
|
||||
|
||||
#define EP93XX_SDRAM_CONTROLLER_BASE EP93XX_AHB_IOMEM(0x00060000)
|
||||
|
||||
#define EP93XX_PCMCIA_CONTROLLER_BASE EP93XX_AHB_IOMEM(0x00080000)
|
||||
|
||||
#define EP93XX_BOOT_ROM_BASE EP93XX_AHB_IOMEM(0x00090000)
|
||||
|
||||
#define EP93XX_IDE_PHYS_BASE EP93XX_AHB_PHYS(0x000a0000)
|
||||
#define EP93XX_IDE_BASE EP93XX_AHB_IOMEM(0x000a0000)
|
||||
|
||||
#define EP93XX_VIC1_BASE EP93XX_AHB_IOMEM(0x000b0000)
|
||||
|
||||
#define EP93XX_VIC2_BASE EP93XX_AHB_IOMEM(0x000c0000)
|
||||
|
||||
/* APB peripherals */
|
||||
#define EP93XX_TIMER_BASE EP93XX_APB_IOMEM(0x00010000)
|
||||
|
||||
#define EP93XX_I2S_PHYS_BASE EP93XX_APB_PHYS(0x00020000)
|
||||
#define EP93XX_I2S_BASE EP93XX_APB_IOMEM(0x00020000)
|
||||
|
||||
#define EP93XX_SECURITY_BASE EP93XX_APB_IOMEM(0x00030000)
|
||||
|
||||
#define EP93XX_AAC_PHYS_BASE EP93XX_APB_PHYS(0x00080000)
|
||||
#define EP93XX_AAC_BASE EP93XX_APB_IOMEM(0x00080000)
|
||||
|
||||
#define EP93XX_SPI_PHYS_BASE EP93XX_APB_PHYS(0x000a0000)
|
||||
#define EP93XX_SPI_BASE EP93XX_APB_IOMEM(0x000a0000)
|
||||
|
||||
#define EP93XX_IRDA_BASE EP93XX_APB_IOMEM(0x000b0000)
|
||||
|
||||
#define EP93XX_KEY_MATRIX_PHYS_BASE EP93XX_APB_PHYS(0x000f0000)
|
||||
#define EP93XX_KEY_MATRIX_BASE EP93XX_APB_IOMEM(0x000f0000)
|
||||
|
||||
#define EP93XX_ADC_PHYS_BASE EP93XX_APB_PHYS(0x00100000)
|
||||
#define EP93XX_ADC_BASE EP93XX_APB_IOMEM(0x00100000)
|
||||
#define EP93XX_TOUCHSCREEN_BASE EP93XX_APB_IOMEM(0x00100000)
|
||||
|
||||
#define EP93XX_PWM_PHYS_BASE EP93XX_APB_PHYS(0x00110000)
|
||||
#define EP93XX_PWM_BASE EP93XX_APB_IOMEM(0x00110000)
|
||||
|
||||
#define EP93XX_RTC_PHYS_BASE EP93XX_APB_PHYS(0x00120000)
|
||||
#define EP93XX_RTC_BASE EP93XX_APB_IOMEM(0x00120000)
|
||||
|
||||
#define EP93XX_WATCHDOG_PHYS_BASE EP93XX_APB_PHYS(0x00140000)
|
||||
#define EP93XX_WATCHDOG_BASE EP93XX_APB_IOMEM(0x00140000)
|
||||
|
||||
/* System controller */
|
||||
#define EP93XX_SYSCON_BASE EP93XX_APB_IOMEM(0x00130000)
|
||||
#define EP93XX_SYSCON_REG(x) (EP93XX_SYSCON_BASE + (x))
|
||||
#define EP93XX_SYSCON_POWER_STATE EP93XX_SYSCON_REG(0x00)
|
||||
#define EP93XX_SYSCON_PWRCNT EP93XX_SYSCON_REG(0x04)
|
||||
#define EP93XX_SYSCON_PWRCNT_FIR_EN (1<<31)
|
||||
#define EP93XX_SYSCON_PWRCNT_UARTBAUD (1<<29)
|
||||
#define EP93XX_SYSCON_PWRCNT_USH_EN 28
|
||||
#define EP93XX_SYSCON_PWRCNT_DMA_M2M1 27
|
||||
#define EP93XX_SYSCON_PWRCNT_DMA_M2M0 26
|
||||
#define EP93XX_SYSCON_PWRCNT_DMA_M2P8 25
|
||||
#define EP93XX_SYSCON_PWRCNT_DMA_M2P9 24
|
||||
#define EP93XX_SYSCON_PWRCNT_DMA_M2P6 23
|
||||
#define EP93XX_SYSCON_PWRCNT_DMA_M2P7 22
|
||||
#define EP93XX_SYSCON_PWRCNT_DMA_M2P4 21
|
||||
#define EP93XX_SYSCON_PWRCNT_DMA_M2P5 20
|
||||
#define EP93XX_SYSCON_PWRCNT_DMA_M2P2 19
|
||||
#define EP93XX_SYSCON_PWRCNT_DMA_M2P3 18
|
||||
#define EP93XX_SYSCON_PWRCNT_DMA_M2P0 17
|
||||
#define EP93XX_SYSCON_PWRCNT_DMA_M2P1 16
|
||||
#define EP93XX_SYSCON_HALT EP93XX_SYSCON_REG(0x08)
|
||||
#define EP93XX_SYSCON_STANDBY EP93XX_SYSCON_REG(0x0c)
|
||||
#define EP93XX_SYSCON_CLKSET1 EP93XX_SYSCON_REG(0x20)
|
||||
#define EP93XX_SYSCON_CLKSET1_NBYP1 (1<<23)
|
||||
#define EP93XX_SYSCON_CLKSET2 EP93XX_SYSCON_REG(0x24)
|
||||
#define EP93XX_SYSCON_CLKSET2_NBYP2 (1<<19)
|
||||
#define EP93XX_SYSCON_CLKSET2_PLL2_EN (1<<18)
|
||||
#define EP93XX_SYSCON_DEVCFG EP93XX_SYSCON_REG(0x80)
|
||||
#define EP93XX_SYSCON_DEVCFG_SWRST (1<<31)
|
||||
#define EP93XX_SYSCON_DEVCFG_D1ONG (1<<30)
|
||||
#define EP93XX_SYSCON_DEVCFG_D0ONG (1<<29)
|
||||
#define EP93XX_SYSCON_DEVCFG_IONU2 (1<<28)
|
||||
#define EP93XX_SYSCON_DEVCFG_GONK (1<<27)
|
||||
#define EP93XX_SYSCON_DEVCFG_TONG (1<<26)
|
||||
#define EP93XX_SYSCON_DEVCFG_MONG (1<<25)
|
||||
#define EP93XX_SYSCON_DEVCFG_U3EN 24
|
||||
#define EP93XX_SYSCON_DEVCFG_CPENA (1<<23)
|
||||
#define EP93XX_SYSCON_DEVCFG_A2ONG (1<<22)
|
||||
#define EP93XX_SYSCON_DEVCFG_A1ONG (1<<21)
|
||||
#define EP93XX_SYSCON_DEVCFG_U2EN 20
|
||||
#define EP93XX_SYSCON_DEVCFG_EXVC (1<<19)
|
||||
#define EP93XX_SYSCON_DEVCFG_U1EN 18
|
||||
#define EP93XX_SYSCON_DEVCFG_TIN (1<<17)
|
||||
#define EP93XX_SYSCON_DEVCFG_HC3IN (1<<15)
|
||||
#define EP93XX_SYSCON_DEVCFG_HC3EN (1<<14)
|
||||
#define EP93XX_SYSCON_DEVCFG_HC1IN (1<<13)
|
||||
#define EP93XX_SYSCON_DEVCFG_HC1EN (1<<12)
|
||||
#define EP93XX_SYSCON_DEVCFG_HONIDE (1<<11)
|
||||
#define EP93XX_SYSCON_DEVCFG_GONIDE (1<<10)
|
||||
#define EP93XX_SYSCON_DEVCFG_PONG (1<<9)
|
||||
#define EP93XX_SYSCON_DEVCFG_EONIDE (1<<8)
|
||||
#define EP93XX_SYSCON_DEVCFG_I2SONSSP (1<<7)
|
||||
#define EP93XX_SYSCON_DEVCFG_I2SONAC97 (1<<6)
|
||||
#define EP93XX_SYSCON_DEVCFG_RASONP3 (1<<4)
|
||||
#define EP93XX_SYSCON_DEVCFG_RAS (1<<3)
|
||||
#define EP93XX_SYSCON_DEVCFG_ADCPD (1<<2)
|
||||
#define EP93XX_SYSCON_DEVCFG_KEYS (1<<1)
|
||||
#define EP93XX_SYSCON_DEVCFG_SHENA (1<<0)
|
||||
#define EP93XX_SYSCON_VIDCLKDIV EP93XX_SYSCON_REG(0x84)
|
||||
#define EP93XX_SYSCON_CLKDIV_ENABLE 15
|
||||
#define EP93XX_SYSCON_CLKDIV_ESEL (1<<14)
|
||||
#define EP93XX_SYSCON_CLKDIV_PSEL (1<<13)
|
||||
#define EP93XX_SYSCON_CLKDIV_PDIV_SHIFT 8
|
||||
#define EP93XX_SYSCON_I2SCLKDIV EP93XX_SYSCON_REG(0x8c)
|
||||
#define EP93XX_SYSCON_I2SCLKDIV_SENA 31
|
||||
#define EP93XX_SYSCON_I2SCLKDIV_ORIDE (1<<29)
|
||||
#define EP93XX_SYSCON_I2SCLKDIV_SPOL (1<<19)
|
||||
#define EP93XX_I2SCLKDIV_SDIV (1 << 16)
|
||||
#define EP93XX_I2SCLKDIV_LRDIV32 (0 << 17)
|
||||
#define EP93XX_I2SCLKDIV_LRDIV64 (1 << 17)
|
||||
#define EP93XX_I2SCLKDIV_LRDIV128 (2 << 17)
|
||||
#define EP93XX_I2SCLKDIV_LRDIV_MASK (3 << 17)
|
||||
#define EP93XX_SYSCON_KEYTCHCLKDIV EP93XX_SYSCON_REG(0x90)
|
||||
#define EP93XX_SYSCON_KEYTCHCLKDIV_TSEN 31
|
||||
#define EP93XX_SYSCON_KEYTCHCLKDIV_ADIV 16
|
||||
#define EP93XX_SYSCON_KEYTCHCLKDIV_KEN 15
|
||||
#define EP93XX_SYSCON_KEYTCHCLKDIV_KDIV (1<<0)
|
||||
#define EP93XX_SYSCON_SYSCFG EP93XX_SYSCON_REG(0x9c)
|
||||
#define EP93XX_SYSCON_SYSCFG_REV_MASK (0xf0000000)
|
||||
#define EP93XX_SYSCON_SYSCFG_REV_SHIFT (28)
|
||||
#define EP93XX_SYSCON_SYSCFG_SBOOT (1<<8)
|
||||
#define EP93XX_SYSCON_SYSCFG_LCSN7 (1<<7)
|
||||
#define EP93XX_SYSCON_SYSCFG_LCSN6 (1<<6)
|
||||
#define EP93XX_SYSCON_SYSCFG_LASDO (1<<5)
|
||||
#define EP93XX_SYSCON_SYSCFG_LEEDA (1<<4)
|
||||
#define EP93XX_SYSCON_SYSCFG_LEECLK (1<<3)
|
||||
#define EP93XX_SYSCON_SYSCFG_LCSN2 (1<<1)
|
||||
#define EP93XX_SYSCON_SYSCFG_LCSN1 (1<<0)
|
||||
#define EP93XX_SYSCON_SWLOCK EP93XX_SYSCON_REG(0xc0)
|
||||
|
||||
/* EP93xx System Controller software locked register write */
|
||||
void ep93xx_syscon_swlocked_write(unsigned int val, void __iomem *reg);
|
||||
void ep93xx_devcfg_set_clear(unsigned int set_bits, unsigned int clear_bits);
|
||||
|
||||
static inline void ep93xx_devcfg_set_bits(unsigned int bits)
|
||||
{
|
||||
ep93xx_devcfg_set_clear(bits, 0x00);
|
||||
}
|
||||
|
||||
static inline void ep93xx_devcfg_clear_bits(unsigned int bits)
|
||||
{
|
||||
ep93xx_devcfg_set_clear(0x00, bits);
|
||||
}
|
||||
|
||||
#endif /* _EP93XX_SOC_H */
|
||||
@@ -1,143 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/clockchips.h>
|
||||
#include <linux/sched_clock.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include "soc.h"
|
||||
#include "platform.h"
|
||||
|
||||
/*************************************************************************
|
||||
* Timer handling for EP93xx
|
||||
*************************************************************************
|
||||
* The ep93xx has four internal timers. Timers 1, 2 (both 16 bit) and
|
||||
* 3 (32 bit) count down at 508 kHz, are self-reloading, and can generate
|
||||
* an interrupt on underflow. Timer 4 (40 bit) counts down at 983.04 kHz,
|
||||
* is free-running, and can't generate interrupts.
|
||||
*
|
||||
* The 508 kHz timers are ideal for use for the timer interrupt, as the
|
||||
* most common values of HZ divide 508 kHz nicely. We pick the 32 bit
|
||||
* timer (timer 3) to get as long sleep intervals as possible when using
|
||||
* CONFIG_NO_HZ.
|
||||
*
|
||||
* The higher clock rate of timer 4 makes it a better choice than the
|
||||
* other timers for use as clock source and for sched_clock(), providing
|
||||
* a stable 40 bit time base.
|
||||
*************************************************************************
|
||||
*/
|
||||
#define EP93XX_TIMER_REG(x) (EP93XX_TIMER_BASE + (x))
|
||||
#define EP93XX_TIMER1_LOAD EP93XX_TIMER_REG(0x00)
|
||||
#define EP93XX_TIMER1_VALUE EP93XX_TIMER_REG(0x04)
|
||||
#define EP93XX_TIMER1_CONTROL EP93XX_TIMER_REG(0x08)
|
||||
#define EP93XX_TIMER123_CONTROL_ENABLE (1 << 7)
|
||||
#define EP93XX_TIMER123_CONTROL_MODE (1 << 6)
|
||||
#define EP93XX_TIMER123_CONTROL_CLKSEL (1 << 3)
|
||||
#define EP93XX_TIMER1_CLEAR EP93XX_TIMER_REG(0x0c)
|
||||
#define EP93XX_TIMER2_LOAD EP93XX_TIMER_REG(0x20)
|
||||
#define EP93XX_TIMER2_VALUE EP93XX_TIMER_REG(0x24)
|
||||
#define EP93XX_TIMER2_CONTROL EP93XX_TIMER_REG(0x28)
|
||||
#define EP93XX_TIMER2_CLEAR EP93XX_TIMER_REG(0x2c)
|
||||
#define EP93XX_TIMER4_VALUE_LOW EP93XX_TIMER_REG(0x60)
|
||||
#define EP93XX_TIMER4_VALUE_HIGH EP93XX_TIMER_REG(0x64)
|
||||
#define EP93XX_TIMER4_VALUE_HIGH_ENABLE (1 << 8)
|
||||
#define EP93XX_TIMER3_LOAD EP93XX_TIMER_REG(0x80)
|
||||
#define EP93XX_TIMER3_VALUE EP93XX_TIMER_REG(0x84)
|
||||
#define EP93XX_TIMER3_CONTROL EP93XX_TIMER_REG(0x88)
|
||||
#define EP93XX_TIMER3_CLEAR EP93XX_TIMER_REG(0x8c)
|
||||
|
||||
#define EP93XX_TIMER123_RATE 508469
|
||||
#define EP93XX_TIMER4_RATE 983040
|
||||
|
||||
static u64 notrace ep93xx_read_sched_clock(void)
|
||||
{
|
||||
u64 ret;
|
||||
|
||||
ret = readl(EP93XX_TIMER4_VALUE_LOW);
|
||||
ret |= ((u64) (readl(EP93XX_TIMER4_VALUE_HIGH) & 0xff) << 32);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u64 ep93xx_clocksource_read(struct clocksource *c)
|
||||
{
|
||||
u64 ret;
|
||||
|
||||
ret = readl(EP93XX_TIMER4_VALUE_LOW);
|
||||
ret |= ((u64) (readl(EP93XX_TIMER4_VALUE_HIGH) & 0xff) << 32);
|
||||
return (u64) ret;
|
||||
}
|
||||
|
||||
static int ep93xx_clkevt_set_next_event(unsigned long next,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
/* Default mode: periodic, off, 508 kHz */
|
||||
u32 tmode = EP93XX_TIMER123_CONTROL_MODE |
|
||||
EP93XX_TIMER123_CONTROL_CLKSEL;
|
||||
|
||||
/* Clear timer */
|
||||
writel(tmode, EP93XX_TIMER3_CONTROL);
|
||||
|
||||
/* Set next event */
|
||||
writel(next, EP93XX_TIMER3_LOAD);
|
||||
writel(tmode | EP93XX_TIMER123_CONTROL_ENABLE,
|
||||
EP93XX_TIMER3_CONTROL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int ep93xx_clkevt_shutdown(struct clock_event_device *evt)
|
||||
{
|
||||
/* Disable timer */
|
||||
writel(0, EP93XX_TIMER3_CONTROL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct clock_event_device ep93xx_clockevent = {
|
||||
.name = "timer1",
|
||||
.features = CLOCK_EVT_FEAT_ONESHOT,
|
||||
.set_state_shutdown = ep93xx_clkevt_shutdown,
|
||||
.set_state_oneshot = ep93xx_clkevt_shutdown,
|
||||
.tick_resume = ep93xx_clkevt_shutdown,
|
||||
.set_next_event = ep93xx_clkevt_set_next_event,
|
||||
.rating = 300,
|
||||
};
|
||||
|
||||
static irqreturn_t ep93xx_timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct clock_event_device *evt = dev_id;
|
||||
|
||||
/* Writing any value clears the timer interrupt */
|
||||
writel(1, EP93XX_TIMER3_CLEAR);
|
||||
|
||||
evt->event_handler(evt);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
void __init ep93xx_timer_init(void)
|
||||
{
|
||||
int irq = IRQ_EP93XX_TIMER3;
|
||||
unsigned long flags = IRQF_TIMER | IRQF_IRQPOLL;
|
||||
|
||||
/* Enable and register clocksource and sched_clock on timer 4 */
|
||||
writel(EP93XX_TIMER4_VALUE_HIGH_ENABLE,
|
||||
EP93XX_TIMER4_VALUE_HIGH);
|
||||
clocksource_mmio_init(NULL, "timer4",
|
||||
EP93XX_TIMER4_RATE, 200, 40,
|
||||
ep93xx_clocksource_read);
|
||||
sched_clock_register(ep93xx_read_sched_clock, 40,
|
||||
EP93XX_TIMER4_RATE);
|
||||
|
||||
/* Set up clockevent on timer 3 */
|
||||
if (request_irq(irq, ep93xx_timer_interrupt, flags, "ep93xx timer",
|
||||
&ep93xx_clockevent))
|
||||
pr_err("Failed to request irq %d (ep93xx timer)\n", irq);
|
||||
clockevents_config_and_register(&ep93xx_clockevent,
|
||||
EP93XX_TIMER123_RATE,
|
||||
1,
|
||||
0xffffffffU);
|
||||
}
|
||||
@@ -1,422 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* arch/arm/mach-ep93xx/ts72xx.c
|
||||
* Technologic Systems TS72xx SBC support.
|
||||
*
|
||||
* Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/mtd/platnand.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/flash.h>
|
||||
#include <linux/spi/mmc_spi.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/platform_data/spi-ep93xx.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
|
||||
#include "gpio-ep93xx.h"
|
||||
#include "hardware.h"
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
#include "soc.h"
|
||||
#include "ts72xx.h"
|
||||
|
||||
/*************************************************************************
|
||||
* IO map
|
||||
*************************************************************************/
|
||||
static struct map_desc ts72xx_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = (unsigned long)TS72XX_MODEL_VIRT_BASE,
|
||||
.pfn = __phys_to_pfn(TS72XX_MODEL_PHYS_BASE),
|
||||
.length = TS72XX_MODEL_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)TS72XX_OPTIONS_VIRT_BASE,
|
||||
.pfn = __phys_to_pfn(TS72XX_OPTIONS_PHYS_BASE),
|
||||
.length = TS72XX_OPTIONS_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)TS72XX_OPTIONS2_VIRT_BASE,
|
||||
.pfn = __phys_to_pfn(TS72XX_OPTIONS2_PHYS_BASE),
|
||||
.length = TS72XX_OPTIONS2_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)TS72XX_CPLDVER_VIRT_BASE,
|
||||
.pfn = __phys_to_pfn(TS72XX_CPLDVER_PHYS_BASE),
|
||||
.length = TS72XX_CPLDVER_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
}
|
||||
};
|
||||
|
||||
static void __init ts72xx_map_io(void)
|
||||
{
|
||||
ep93xx_map_io();
|
||||
iotable_init(ts72xx_io_desc, ARRAY_SIZE(ts72xx_io_desc));
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* NAND flash
|
||||
*************************************************************************/
|
||||
#define TS72XX_NAND_CONTROL_ADDR_LINE 22 /* 0xN0400000 */
|
||||
#define TS72XX_NAND_BUSY_ADDR_LINE 23 /* 0xN0800000 */
|
||||
|
||||
static void ts72xx_nand_hwcontrol(struct nand_chip *chip,
|
||||
int cmd, unsigned int ctrl)
|
||||
{
|
||||
if (ctrl & NAND_CTRL_CHANGE) {
|
||||
void __iomem *addr = chip->legacy.IO_ADDR_R;
|
||||
unsigned char bits;
|
||||
|
||||
addr += (1 << TS72XX_NAND_CONTROL_ADDR_LINE);
|
||||
|
||||
bits = __raw_readb(addr) & ~0x07;
|
||||
bits |= (ctrl & NAND_NCE) << 2; /* bit 0 -> bit 2 */
|
||||
bits |= (ctrl & NAND_CLE); /* bit 1 -> bit 1 */
|
||||
bits |= (ctrl & NAND_ALE) >> 2; /* bit 2 -> bit 0 */
|
||||
|
||||
__raw_writeb(bits, addr);
|
||||
}
|
||||
|
||||
if (cmd != NAND_CMD_NONE)
|
||||
__raw_writeb(cmd, chip->legacy.IO_ADDR_W);
|
||||
}
|
||||
|
||||
static int ts72xx_nand_device_ready(struct nand_chip *chip)
|
||||
{
|
||||
void __iomem *addr = chip->legacy.IO_ADDR_R;
|
||||
|
||||
addr += (1 << TS72XX_NAND_BUSY_ADDR_LINE);
|
||||
|
||||
return !!(__raw_readb(addr) & 0x20);
|
||||
}
|
||||
|
||||
#define TS72XX_BOOTROM_PART_SIZE (SZ_16K)
|
||||
#define TS72XX_REDBOOT_PART_SIZE (SZ_2M + SZ_1M)
|
||||
|
||||
static struct mtd_partition ts72xx_nand_parts[] = {
|
||||
{
|
||||
.name = "TS-BOOTROM",
|
||||
.offset = 0,
|
||||
.size = TS72XX_BOOTROM_PART_SIZE,
|
||||
.mask_flags = MTD_WRITEABLE, /* force read-only */
|
||||
}, {
|
||||
.name = "Linux",
|
||||
.offset = MTDPART_OFS_RETAIN,
|
||||
.size = TS72XX_REDBOOT_PART_SIZE,
|
||||
/* leave so much for last partition */
|
||||
}, {
|
||||
.name = "RedBoot",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
.mask_flags = MTD_WRITEABLE, /* force read-only */
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_nand_data ts72xx_nand_data = {
|
||||
.chip = {
|
||||
.nr_chips = 1,
|
||||
.chip_offset = 0,
|
||||
.chip_delay = 15,
|
||||
},
|
||||
.ctrl = {
|
||||
.cmd_ctrl = ts72xx_nand_hwcontrol,
|
||||
.dev_ready = ts72xx_nand_device_ready,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource ts72xx_nand_resource[] = {
|
||||
{
|
||||
.start = 0, /* filled in later */
|
||||
.end = 0, /* filled in later */
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device ts72xx_nand_flash = {
|
||||
.name = "gen_nand",
|
||||
.id = -1,
|
||||
.dev.platform_data = &ts72xx_nand_data,
|
||||
.resource = ts72xx_nand_resource,
|
||||
.num_resources = ARRAY_SIZE(ts72xx_nand_resource),
|
||||
};
|
||||
|
||||
static void __init ts72xx_register_flash(struct mtd_partition *parts, int n,
|
||||
resource_size_t start)
|
||||
{
|
||||
/*
|
||||
* TS7200 has NOR flash all other TS72xx board have NAND flash.
|
||||
*/
|
||||
if (board_is_ts7200()) {
|
||||
ep93xx_register_flash(2, EP93XX_CS6_PHYS_BASE, SZ_16M);
|
||||
} else {
|
||||
ts72xx_nand_resource[0].start = start;
|
||||
ts72xx_nand_resource[0].end = start + SZ_16M - 1;
|
||||
|
||||
ts72xx_nand_data.chip.partitions = parts;
|
||||
ts72xx_nand_data.chip.nr_partitions = n;
|
||||
|
||||
platform_device_register(&ts72xx_nand_flash);
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* RTC M48T86
|
||||
*************************************************************************/
|
||||
#define TS72XX_RTC_INDEX_PHYS_BASE (EP93XX_CS1_PHYS_BASE + 0x00800000)
|
||||
#define TS72XX_RTC_DATA_PHYS_BASE (EP93XX_CS1_PHYS_BASE + 0x01700000)
|
||||
|
||||
static struct resource ts72xx_rtc_resources[] = {
|
||||
DEFINE_RES_MEM(TS72XX_RTC_INDEX_PHYS_BASE, 0x01),
|
||||
DEFINE_RES_MEM(TS72XX_RTC_DATA_PHYS_BASE, 0x01),
|
||||
};
|
||||
|
||||
static struct platform_device ts72xx_rtc_device = {
|
||||
.name = "rtc-m48t86",
|
||||
.id = -1,
|
||||
.resource = ts72xx_rtc_resources,
|
||||
.num_resources = ARRAY_SIZE(ts72xx_rtc_resources),
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* Watchdog (in CPLD)
|
||||
*************************************************************************/
|
||||
#define TS72XX_WDT_CONTROL_PHYS_BASE (EP93XX_CS2_PHYS_BASE + 0x03800000)
|
||||
#define TS72XX_WDT_FEED_PHYS_BASE (EP93XX_CS2_PHYS_BASE + 0x03c00000)
|
||||
|
||||
static struct resource ts72xx_wdt_resources[] = {
|
||||
DEFINE_RES_MEM(TS72XX_WDT_CONTROL_PHYS_BASE, 0x01),
|
||||
DEFINE_RES_MEM(TS72XX_WDT_FEED_PHYS_BASE, 0x01),
|
||||
};
|
||||
|
||||
static struct platform_device ts72xx_wdt_device = {
|
||||
.name = "ts72xx-wdt",
|
||||
.id = -1,
|
||||
.resource = ts72xx_wdt_resources,
|
||||
.num_resources = ARRAY_SIZE(ts72xx_wdt_resources),
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* ETH
|
||||
*************************************************************************/
|
||||
static struct ep93xx_eth_data __initdata ts72xx_eth_data = {
|
||||
.phy_id = 1,
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* SPI SD/MMC host
|
||||
*************************************************************************/
|
||||
#define BK3_EN_SDCARD_PHYS_BASE 0x12400000
|
||||
#define BK3_EN_SDCARD_PWR 0x0
|
||||
#define BK3_DIS_SDCARD_PWR 0x0C
|
||||
static void bk3_mmc_spi_setpower(struct device *dev, unsigned int vdd)
|
||||
{
|
||||
void __iomem *pwr_sd = ioremap(BK3_EN_SDCARD_PHYS_BASE, SZ_4K);
|
||||
|
||||
if (!pwr_sd) {
|
||||
pr_err("Failed to enable SD card power!");
|
||||
return;
|
||||
}
|
||||
|
||||
pr_debug("%s: SD card pwr %s VDD:0x%x\n", __func__,
|
||||
!!vdd ? "ON" : "OFF", vdd);
|
||||
|
||||
if (!!vdd)
|
||||
__raw_writeb(BK3_EN_SDCARD_PWR, pwr_sd);
|
||||
else
|
||||
__raw_writeb(BK3_DIS_SDCARD_PWR, pwr_sd);
|
||||
|
||||
iounmap(pwr_sd);
|
||||
}
|
||||
|
||||
static struct mmc_spi_platform_data bk3_spi_mmc_data = {
|
||||
.detect_delay = 500,
|
||||
.powerup_msecs = 100,
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.caps = MMC_CAP_NONREMOVABLE,
|
||||
.setpower = bk3_mmc_spi_setpower,
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* SPI Bus - SD card access
|
||||
*************************************************************************/
|
||||
static struct spi_board_info bk3_spi_board_info[] __initdata = {
|
||||
{
|
||||
.modalias = "mmc_spi",
|
||||
.platform_data = &bk3_spi_mmc_data,
|
||||
.max_speed_hz = 7.4E6,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.mode = SPI_MODE_0,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* This is a stub -> the FGPIO[3] pin is not connected on the schematic
|
||||
* The all work is performed automatically by !SPI_FRAME (SFRM1) and
|
||||
* goes through CPLD
|
||||
*/
|
||||
static struct gpiod_lookup_table bk3_spi_cs_gpio_table = {
|
||||
.dev_id = "spi0",
|
||||
.table = {
|
||||
GPIO_LOOKUP("gpio-ep93xx.5", 3, "cs", GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct ep93xx_spi_info bk3_spi_master __initdata = {
|
||||
.use_dma = 1,
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* TS72XX support code
|
||||
*************************************************************************/
|
||||
#if IS_ENABLED(CONFIG_FPGA_MGR_TS73XX)
|
||||
|
||||
/* Relative to EP93XX_CS1_PHYS_BASE */
|
||||
#define TS73XX_FPGA_LOADER_BASE 0x03c00000
|
||||
|
||||
static struct resource ts73xx_fpga_resources[] = {
|
||||
{
|
||||
.start = EP93XX_CS1_PHYS_BASE + TS73XX_FPGA_LOADER_BASE,
|
||||
.end = EP93XX_CS1_PHYS_BASE + TS73XX_FPGA_LOADER_BASE + 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device ts73xx_fpga_device = {
|
||||
.name = "ts73xx-fpga-mgr",
|
||||
.id = -1,
|
||||
.resource = ts73xx_fpga_resources,
|
||||
.num_resources = ARRAY_SIZE(ts73xx_fpga_resources),
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/*************************************************************************
|
||||
* SPI Bus
|
||||
*************************************************************************/
|
||||
static struct spi_board_info ts72xx_spi_devices[] __initdata = {
|
||||
{
|
||||
.modalias = "tmp122",
|
||||
.max_speed_hz = 2 * 1000 * 1000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table ts72xx_spi_cs_gpio_table = {
|
||||
.dev_id = "spi0",
|
||||
.table = {
|
||||
/* DIO_17 */
|
||||
GPIO_LOOKUP("gpio-ep93xx.5", 2, "cs", GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct ep93xx_spi_info ts72xx_spi_info __initdata = {
|
||||
/* Intentionally left blank */
|
||||
};
|
||||
|
||||
static void __init ts72xx_init_machine(void)
|
||||
{
|
||||
ep93xx_init_devices();
|
||||
ts72xx_register_flash(ts72xx_nand_parts, ARRAY_SIZE(ts72xx_nand_parts),
|
||||
is_ts9420_installed() ?
|
||||
EP93XX_CS7_PHYS_BASE : EP93XX_CS6_PHYS_BASE);
|
||||
platform_device_register(&ts72xx_rtc_device);
|
||||
platform_device_register(&ts72xx_wdt_device);
|
||||
|
||||
ep93xx_register_eth(&ts72xx_eth_data, 1);
|
||||
#if IS_ENABLED(CONFIG_FPGA_MGR_TS73XX)
|
||||
if (board_is_ts7300())
|
||||
platform_device_register(&ts73xx_fpga_device);
|
||||
#endif
|
||||
gpiod_add_lookup_table(&ts72xx_spi_cs_gpio_table);
|
||||
ep93xx_register_spi(&ts72xx_spi_info, ts72xx_spi_devices,
|
||||
ARRAY_SIZE(ts72xx_spi_devices));
|
||||
}
|
||||
|
||||
MACHINE_START(TS72XX, "Technologic Systems TS-72xx SBC")
|
||||
/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
|
||||
.atag_offset = 0x100,
|
||||
.nr_irqs = NR_EP93XX_IRQS,
|
||||
.map_io = ts72xx_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.init_time = ep93xx_timer_init,
|
||||
.init_machine = ts72xx_init_machine,
|
||||
.restart = ep93xx_restart,
|
||||
MACHINE_END
|
||||
|
||||
/*************************************************************************
|
||||
* EP93xx I2S audio peripheral handling
|
||||
*************************************************************************/
|
||||
static struct resource ep93xx_i2s_resource[] = {
|
||||
DEFINE_RES_MEM(EP93XX_I2S_PHYS_BASE, 0x100),
|
||||
DEFINE_RES_IRQ_NAMED(IRQ_EP93XX_SAI, "spilink i2s slave"),
|
||||
};
|
||||
|
||||
static struct platform_device ep93xx_i2s_device = {
|
||||
.name = "ep93xx-spilink-i2s",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(ep93xx_i2s_resource),
|
||||
.resource = ep93xx_i2s_resource,
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* BK3 support code
|
||||
*************************************************************************/
|
||||
static struct mtd_partition bk3_nand_parts[] = {
|
||||
{
|
||||
.name = "System",
|
||||
.offset = 0x00000000,
|
||||
.size = 0x01e00000,
|
||||
}, {
|
||||
.name = "Data",
|
||||
.offset = 0x01e00000,
|
||||
.size = 0x05f20000
|
||||
}, {
|
||||
.name = "RedBoot",
|
||||
.offset = 0x07d20000,
|
||||
.size = 0x002e0000,
|
||||
.mask_flags = MTD_WRITEABLE, /* force RO */
|
||||
},
|
||||
};
|
||||
|
||||
static void __init bk3_init_machine(void)
|
||||
{
|
||||
ep93xx_init_devices();
|
||||
|
||||
ts72xx_register_flash(bk3_nand_parts, ARRAY_SIZE(bk3_nand_parts),
|
||||
EP93XX_CS6_PHYS_BASE);
|
||||
|
||||
ep93xx_register_eth(&ts72xx_eth_data, 1);
|
||||
|
||||
gpiod_add_lookup_table(&bk3_spi_cs_gpio_table);
|
||||
ep93xx_register_spi(&bk3_spi_master, bk3_spi_board_info,
|
||||
ARRAY_SIZE(bk3_spi_board_info));
|
||||
|
||||
/* Configure ep93xx's I2S to use AC97 pins */
|
||||
ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_I2SONAC97);
|
||||
platform_device_register(&ep93xx_i2s_device);
|
||||
}
|
||||
|
||||
MACHINE_START(BK3, "Liebherr controller BK3.1")
|
||||
/* Maintainer: Lukasz Majewski <lukma@denx.de> */
|
||||
.atag_offset = 0x100,
|
||||
.nr_irqs = NR_EP93XX_IRQS,
|
||||
.map_io = ts72xx_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.init_time = ep93xx_timer_init,
|
||||
.init_machine = bk3_init_machine,
|
||||
.restart = ep93xx_restart,
|
||||
MACHINE_END
|
||||
@@ -1,94 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* arch/arm/mach-ep93xx/include/mach/ts72xx.h
|
||||
*/
|
||||
|
||||
/*
|
||||
* TS72xx memory map:
|
||||
*
|
||||
* virt phys size
|
||||
* febff000 22000000 4K model number register (bits 0-2)
|
||||
* febfe000 22400000 4K options register
|
||||
* febfd000 22800000 4K options register #2
|
||||
* febfc000 23400000 4K CPLD version register
|
||||
*/
|
||||
|
||||
#ifndef __TS72XX_H_
|
||||
#define __TS72XX_H_
|
||||
|
||||
#define TS72XX_MODEL_PHYS_BASE 0x22000000
|
||||
#define TS72XX_MODEL_VIRT_BASE IOMEM(0xfebff000)
|
||||
#define TS72XX_MODEL_SIZE 0x00001000
|
||||
|
||||
#define TS72XX_MODEL_TS7200 0x00
|
||||
#define TS72XX_MODEL_TS7250 0x01
|
||||
#define TS72XX_MODEL_TS7260 0x02
|
||||
#define TS72XX_MODEL_TS7300 0x03
|
||||
#define TS72XX_MODEL_TS7400 0x04
|
||||
#define TS72XX_MODEL_MASK 0x07
|
||||
|
||||
|
||||
#define TS72XX_OPTIONS_PHYS_BASE 0x22400000
|
||||
#define TS72XX_OPTIONS_VIRT_BASE IOMEM(0xfebfe000)
|
||||
#define TS72XX_OPTIONS_SIZE 0x00001000
|
||||
|
||||
#define TS72XX_OPTIONS_COM2_RS485 0x02
|
||||
#define TS72XX_OPTIONS_MAX197 0x01
|
||||
|
||||
|
||||
#define TS72XX_OPTIONS2_PHYS_BASE 0x22800000
|
||||
#define TS72XX_OPTIONS2_VIRT_BASE IOMEM(0xfebfd000)
|
||||
#define TS72XX_OPTIONS2_SIZE 0x00001000
|
||||
|
||||
#define TS72XX_OPTIONS2_TS9420 0x04
|
||||
#define TS72XX_OPTIONS2_TS9420_BOOT 0x02
|
||||
|
||||
#define TS72XX_CPLDVER_PHYS_BASE 0x23400000
|
||||
#define TS72XX_CPLDVER_VIRT_BASE IOMEM(0xfebfc000)
|
||||
#define TS72XX_CPLDVER_SIZE 0x00001000
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
static inline int ts72xx_model(void)
|
||||
{
|
||||
return __raw_readb(TS72XX_MODEL_VIRT_BASE) & TS72XX_MODEL_MASK;
|
||||
}
|
||||
|
||||
static inline int board_is_ts7200(void)
|
||||
{
|
||||
return ts72xx_model() == TS72XX_MODEL_TS7200;
|
||||
}
|
||||
|
||||
static inline int board_is_ts7250(void)
|
||||
{
|
||||
return ts72xx_model() == TS72XX_MODEL_TS7250;
|
||||
}
|
||||
|
||||
static inline int board_is_ts7260(void)
|
||||
{
|
||||
return ts72xx_model() == TS72XX_MODEL_TS7260;
|
||||
}
|
||||
|
||||
static inline int board_is_ts7300(void)
|
||||
{
|
||||
return ts72xx_model() == TS72XX_MODEL_TS7300;
|
||||
}
|
||||
|
||||
static inline int board_is_ts7400(void)
|
||||
{
|
||||
return ts72xx_model() == TS72XX_MODEL_TS7400;
|
||||
}
|
||||
|
||||
static inline int is_max197_installed(void)
|
||||
{
|
||||
return !!(__raw_readb(TS72XX_OPTIONS_VIRT_BASE) &
|
||||
TS72XX_OPTIONS_MAX197);
|
||||
}
|
||||
|
||||
static inline int is_ts9420_installed(void)
|
||||
{
|
||||
return !!(__raw_readb(TS72XX_OPTIONS2_VIRT_BASE) &
|
||||
TS72XX_OPTIONS2_TS9420);
|
||||
}
|
||||
#endif
|
||||
#endif /* __TS72XX_H_ */
|
||||
@@ -1,321 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* arch/arm/mach-ep93xx/vision_ep9307.c
|
||||
* Vision Engraving Systems EP9307 SoM support.
|
||||
*
|
||||
* Copyright (C) 2008-2011 Vision Engraving Systems
|
||||
* H Hartley Sweeten <hsweeten@visionengravers.com>
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/platform_data/pca953x.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/flash.h>
|
||||
#include <linux/spi/mmc_spi.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <sound/cs4271.h>
|
||||
|
||||
#include "hardware.h"
|
||||
#include <linux/platform_data/video-ep93xx.h>
|
||||
#include <linux/platform_data/spi-ep93xx.h>
|
||||
#include "gpio-ep93xx.h"
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
#include "soc.h"
|
||||
|
||||
/*************************************************************************
|
||||
* Static I/O mappings for the FPGA
|
||||
*************************************************************************/
|
||||
#define VISION_PHYS_BASE EP93XX_CS7_PHYS_BASE
|
||||
#define VISION_VIRT_BASE 0xfebff000
|
||||
|
||||
static struct map_desc vision_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = VISION_VIRT_BASE,
|
||||
.pfn = __phys_to_pfn(VISION_PHYS_BASE),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init vision_map_io(void)
|
||||
{
|
||||
ep93xx_map_io();
|
||||
|
||||
iotable_init(vision_io_desc, ARRAY_SIZE(vision_io_desc));
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* Ethernet
|
||||
*************************************************************************/
|
||||
static struct ep93xx_eth_data vision_eth_data __initdata = {
|
||||
.phy_id = 1,
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* Framebuffer
|
||||
*************************************************************************/
|
||||
#define VISION_LCD_ENABLE EP93XX_GPIO_LINE_EGPIO1
|
||||
|
||||
static int vision_lcd_setup(struct platform_device *pdev)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = gpio_request_one(VISION_LCD_ENABLE, GPIOF_INIT_HIGH,
|
||||
dev_name(&pdev->dev));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_RAS |
|
||||
EP93XX_SYSCON_DEVCFG_RASONP3 |
|
||||
EP93XX_SYSCON_DEVCFG_EXVC);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void vision_lcd_teardown(struct platform_device *pdev)
|
||||
{
|
||||
gpio_free(VISION_LCD_ENABLE);
|
||||
}
|
||||
|
||||
static void vision_lcd_blank(int blank_mode, struct fb_info *info)
|
||||
{
|
||||
if (blank_mode)
|
||||
gpio_set_value(VISION_LCD_ENABLE, 0);
|
||||
else
|
||||
gpio_set_value(VISION_LCD_ENABLE, 1);
|
||||
}
|
||||
|
||||
static struct ep93xxfb_mach_info ep93xxfb_info __initdata = {
|
||||
.flags = EP93XXFB_USE_SDCSN0 | EP93XXFB_PCLK_FALLING,
|
||||
.setup = vision_lcd_setup,
|
||||
.teardown = vision_lcd_teardown,
|
||||
.blank = vision_lcd_blank,
|
||||
};
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* GPIO Expanders
|
||||
*************************************************************************/
|
||||
#define PCA9539_74_GPIO_BASE (EP93XX_GPIO_LINE_MAX + 1)
|
||||
#define PCA9539_75_GPIO_BASE (PCA9539_74_GPIO_BASE + 16)
|
||||
#define PCA9539_76_GPIO_BASE (PCA9539_75_GPIO_BASE + 16)
|
||||
#define PCA9539_77_GPIO_BASE (PCA9539_76_GPIO_BASE + 16)
|
||||
|
||||
static struct pca953x_platform_data pca953x_74_gpio_data = {
|
||||
.gpio_base = PCA9539_74_GPIO_BASE,
|
||||
.irq_base = EP93XX_BOARD_IRQ(0),
|
||||
};
|
||||
|
||||
static struct pca953x_platform_data pca953x_75_gpio_data = {
|
||||
.gpio_base = PCA9539_75_GPIO_BASE,
|
||||
.irq_base = -1,
|
||||
};
|
||||
|
||||
static struct pca953x_platform_data pca953x_76_gpio_data = {
|
||||
.gpio_base = PCA9539_76_GPIO_BASE,
|
||||
.irq_base = -1,
|
||||
};
|
||||
|
||||
static struct pca953x_platform_data pca953x_77_gpio_data = {
|
||||
.gpio_base = PCA9539_77_GPIO_BASE,
|
||||
.irq_base = -1,
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* I2C Bus
|
||||
*************************************************************************/
|
||||
|
||||
static struct i2c_board_info vision_i2c_info[] __initdata = {
|
||||
{
|
||||
I2C_BOARD_INFO("isl1208", 0x6f),
|
||||
.irq = IRQ_EP93XX_EXT1,
|
||||
}, {
|
||||
I2C_BOARD_INFO("pca9539", 0x74),
|
||||
.platform_data = &pca953x_74_gpio_data,
|
||||
}, {
|
||||
I2C_BOARD_INFO("pca9539", 0x75),
|
||||
.platform_data = &pca953x_75_gpio_data,
|
||||
}, {
|
||||
I2C_BOARD_INFO("pca9539", 0x76),
|
||||
.platform_data = &pca953x_76_gpio_data,
|
||||
}, {
|
||||
I2C_BOARD_INFO("pca9539", 0x77),
|
||||
.platform_data = &pca953x_77_gpio_data,
|
||||
},
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* SPI CS4271 Audio Codec
|
||||
*************************************************************************/
|
||||
static struct cs4271_platform_data vision_cs4271_data = {
|
||||
/* Intentionally left blank */
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* SPI Flash
|
||||
*************************************************************************/
|
||||
static struct mtd_partition vision_spi_flash_partitions[] = {
|
||||
{
|
||||
.name = "SPI bootstrap",
|
||||
.offset = 0,
|
||||
.size = SZ_4K,
|
||||
}, {
|
||||
.name = "Bootstrap config",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_4K,
|
||||
}, {
|
||||
.name = "System config",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct flash_platform_data vision_spi_flash_data = {
|
||||
.name = "SPI Flash",
|
||||
.parts = vision_spi_flash_partitions,
|
||||
.nr_parts = ARRAY_SIZE(vision_spi_flash_partitions),
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* SPI SD/MMC host
|
||||
*************************************************************************/
|
||||
static struct mmc_spi_platform_data vision_spi_mmc_data = {
|
||||
.detect_delay = 100,
|
||||
.powerup_msecs = 100,
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.caps2 = MMC_CAP2_RO_ACTIVE_HIGH,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table vision_spi_mmc_gpio_table = {
|
||||
.dev_id = "mmc_spi.2", /* "mmc_spi @ CS2 */
|
||||
.table = {
|
||||
/* Card detect */
|
||||
GPIO_LOOKUP_IDX("gpio-ep93xx.1", 7, NULL, 0, GPIO_ACTIVE_LOW),
|
||||
/* Write protect */
|
||||
GPIO_LOOKUP_IDX("gpio-ep93xx.5", 0, NULL, 1, GPIO_ACTIVE_HIGH),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* SPI Bus
|
||||
*************************************************************************/
|
||||
static struct spi_board_info vision_spi_board_info[] __initdata = {
|
||||
{
|
||||
.modalias = "cs4271",
|
||||
.platform_data = &vision_cs4271_data,
|
||||
.max_speed_hz = 6000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.mode = SPI_MODE_3,
|
||||
}, {
|
||||
.modalias = "sst25l",
|
||||
.platform_data = &vision_spi_flash_data,
|
||||
.max_speed_hz = 20000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 1,
|
||||
.mode = SPI_MODE_3,
|
||||
}, {
|
||||
.modalias = "mmc_spi",
|
||||
.platform_data = &vision_spi_mmc_data,
|
||||
.max_speed_hz = 20000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 2,
|
||||
.mode = SPI_MODE_3,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table vision_spi_cs4271_gpio_table = {
|
||||
.dev_id = "spi0.0", /* cs4271 @ CS0 */
|
||||
.table = {
|
||||
/* RESET */
|
||||
GPIO_LOOKUP_IDX("H", 2, NULL, 0, GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table vision_spi_cs_gpio_table = {
|
||||
.dev_id = "spi0",
|
||||
.table = {
|
||||
GPIO_LOOKUP_IDX("gpio-ep93xx.0", 6, "cs", 0, GPIO_ACTIVE_LOW),
|
||||
GPIO_LOOKUP_IDX("gpio-ep93xx.0", 7, "cs", 1, GPIO_ACTIVE_LOW),
|
||||
GPIO_LOOKUP_IDX("gpio-ep93xx.6", 2, "cs", 2, GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct ep93xx_spi_info vision_spi_master __initdata = {
|
||||
.use_dma = 1,
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* I2S Audio
|
||||
*************************************************************************/
|
||||
static struct platform_device vision_audio_device = {
|
||||
.name = "edb93xx-audio",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static void __init vision_register_i2s(void)
|
||||
{
|
||||
ep93xx_register_i2s();
|
||||
platform_device_register(&vision_audio_device);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* Machine Initialization
|
||||
*************************************************************************/
|
||||
static void __init vision_init_machine(void)
|
||||
{
|
||||
ep93xx_init_devices();
|
||||
ep93xx_register_flash(2, EP93XX_CS6_PHYS_BASE, SZ_64M);
|
||||
ep93xx_register_eth(&vision_eth_data, 1);
|
||||
ep93xx_register_fb(&ep93xxfb_info);
|
||||
ep93xx_register_pwm(1, 0);
|
||||
|
||||
/*
|
||||
* Request the gpio expander's interrupt gpio line now to prevent
|
||||
* the kernel from doing a WARN in gpiolib:gpio_ensure_requested().
|
||||
*/
|
||||
if (gpio_request_one(EP93XX_GPIO_LINE_F(7), GPIOF_DIR_IN,
|
||||
"pca9539:74"))
|
||||
pr_warn("cannot request interrupt gpio for pca9539:74\n");
|
||||
|
||||
vision_i2c_info[1].irq = gpio_to_irq(EP93XX_GPIO_LINE_F(7));
|
||||
|
||||
ep93xx_register_i2c(vision_i2c_info,
|
||||
ARRAY_SIZE(vision_i2c_info));
|
||||
gpiod_add_lookup_table(&vision_spi_cs4271_gpio_table);
|
||||
gpiod_add_lookup_table(&vision_spi_mmc_gpio_table);
|
||||
gpiod_add_lookup_table(&vision_spi_cs_gpio_table);
|
||||
ep93xx_register_spi(&vision_spi_master, vision_spi_board_info,
|
||||
ARRAY_SIZE(vision_spi_board_info));
|
||||
vision_register_i2s();
|
||||
}
|
||||
|
||||
MACHINE_START(VISION_EP9307, "Vision Engraving Systems EP9307")
|
||||
/* Maintainer: H Hartley Sweeten <hsweeten@visionengravers.com> */
|
||||
.atag_offset = 0x100,
|
||||
.nr_irqs = NR_EP93XX_IRQS + EP93XX_BOARD_IRQS,
|
||||
.map_io = vision_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.init_time = ep93xx_timer_init,
|
||||
.init_machine = vision_init_machine,
|
||||
.restart = ep93xx_restart,
|
||||
MACHINE_END
|
||||
@@ -1,15 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __ASM_MACH_EP93XX_SPI_H
|
||||
#define __ASM_MACH_EP93XX_SPI_H
|
||||
|
||||
struct spi_device;
|
||||
|
||||
/**
|
||||
* struct ep93xx_spi_info - EP93xx specific SPI descriptor
|
||||
* @use_dma: use DMA for the transfers
|
||||
*/
|
||||
struct ep93xx_spi_info {
|
||||
bool use_dma;
|
||||
};
|
||||
|
||||
#endif /* __ASM_MACH_EP93XX_SPI_H */
|
||||
Reference in New Issue
Block a user