提交 f4478037 编写于 作者: A Arnd Bergmann

Merge tag 'bk3' of https://github.com/sverdlin/ep93xx into next/soc

Pull "ARM: ep93xx: ts72xx: Add support for BK3 board" from Alexander Sverdlin:

This patch series adds support for Liebherr's BK3 board, being
a derivative of TS72XX design.

* tag 'bk3' of https://github.com/sverdlin/ep93xx:
  ARM: ep93xx: ts72xx: Add support for BK3 board - ts72xx derivative
  ARM: ep93xx: ts72xx: cosmetic: Add some description to ts72xx code
  ARM: ep93xx: ts72xx: Rewrite ts72xx_register_flash() to accept parameters
  ARM: ep93xx: ts72xx: Provide include guards for ts72xx.h file
...@@ -1255,6 +1255,12 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) ...@@ -1255,6 +1255,12 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Supported S: Supported
F: drivers/net/ethernet/cavium/thunder/ F: drivers/net/ethernet/cavium/thunder/
ARM/CIRRUS LOGIC BK3 MACHINE SUPPORT
M: Lukasz Majewski <lukma@denx.de>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained
F: arch/arm/mach-ep93xx/ts72xx.c
ARM/CIRRUS LOGIC CLPS711X ARM ARCHITECTURE ARM/CIRRUS LOGIC CLPS711X ARM ARCHITECTURE
M: Alexander Shiyan <shc_work@mail.ru> M: Alexander Shiyan <shc_work@mail.ru>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
......
...@@ -21,6 +21,13 @@ config MACH_ADSSPHERE ...@@ -21,6 +21,13 @@ config MACH_ADSSPHERE
Say 'Y' here if you want your kernel to support the ADS Say 'Y' here if you want your kernel to support the ADS
Sphere board. Sphere board.
config MACH_BK3
bool "Support Liebherr BK3.1"
select MACH_TS72XX
help
Say 'Y' here if you want your kernel to support the
Liebherr controller BK3.1.
config MACH_EDB93XX config MACH_EDB93XX
bool bool
......
...@@ -19,10 +19,15 @@ ...@@ -19,10 +19,15 @@
#include <linux/mtd/rawnand.h> #include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/spi/spi.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/platform_data/spi-ep93xx.h>
#include <mach/gpio-ep93xx.h> #include <mach/gpio-ep93xx.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/irqs.h>
#include <mach/gpio-ep93xx.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
...@@ -31,6 +36,9 @@ ...@@ -31,6 +36,9 @@
#include "soc.h" #include "soc.h"
#include "ts72xx.h" #include "ts72xx.h"
/*************************************************************************
* IO map
*************************************************************************/
static struct map_desc ts72xx_io_desc[] __initdata = { static struct map_desc ts72xx_io_desc[] __initdata = {
{ {
.virtual = (unsigned long)TS72XX_MODEL_VIRT_BASE, .virtual = (unsigned long)TS72XX_MODEL_VIRT_BASE,
...@@ -47,6 +55,11 @@ static struct map_desc ts72xx_io_desc[] __initdata = { ...@@ -47,6 +55,11 @@ static struct map_desc ts72xx_io_desc[] __initdata = {
.pfn = __phys_to_pfn(TS72XX_OPTIONS2_PHYS_BASE), .pfn = __phys_to_pfn(TS72XX_OPTIONS2_PHYS_BASE),
.length = TS72XX_OPTIONS2_SIZE, .length = TS72XX_OPTIONS2_SIZE,
.type = MT_DEVICE, .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,
} }
}; };
...@@ -123,8 +136,6 @@ static struct platform_nand_data ts72xx_nand_data = { ...@@ -123,8 +136,6 @@ static struct platform_nand_data ts72xx_nand_data = {
.nr_chips = 1, .nr_chips = 1,
.chip_offset = 0, .chip_offset = 0,
.chip_delay = 15, .chip_delay = 15,
.partitions = ts72xx_nand_parts,
.nr_partitions = ARRAY_SIZE(ts72xx_nand_parts),
}, },
.ctrl = { .ctrl = {
.cmd_ctrl = ts72xx_nand_hwcontrol, .cmd_ctrl = ts72xx_nand_hwcontrol,
...@@ -148,8 +159,8 @@ static struct platform_device ts72xx_nand_flash = { ...@@ -148,8 +159,8 @@ static struct platform_device ts72xx_nand_flash = {
.num_resources = ARRAY_SIZE(ts72xx_nand_resource), .num_resources = ARRAY_SIZE(ts72xx_nand_resource),
}; };
void __init ts72xx_register_flash(struct mtd_partition *parts, int n,
static void __init ts72xx_register_flash(void) resource_size_t start)
{ {
/* /*
* TS7200 has NOR flash all other TS72xx board have NAND flash. * TS7200 has NOR flash all other TS72xx board have NAND flash.
...@@ -157,16 +168,12 @@ static void __init ts72xx_register_flash(void) ...@@ -157,16 +168,12 @@ static void __init ts72xx_register_flash(void)
if (board_is_ts7200()) { if (board_is_ts7200()) {
ep93xx_register_flash(2, EP93XX_CS6_PHYS_BASE, SZ_16M); ep93xx_register_flash(2, EP93XX_CS6_PHYS_BASE, SZ_16M);
} else { } else {
resource_size_t start;
if (is_ts9420_installed())
start = EP93XX_CS7_PHYS_BASE;
else
start = EP93XX_CS6_PHYS_BASE;
ts72xx_nand_resource[0].start = start; ts72xx_nand_resource[0].start = start;
ts72xx_nand_resource[0].end = start + SZ_16M - 1; 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); platform_device_register(&ts72xx_nand_flash);
} }
} }
...@@ -207,10 +214,79 @@ static struct platform_device ts72xx_wdt_device = { ...@@ -207,10 +214,79 @@ static struct platform_device ts72xx_wdt_device = {
.num_resources = ARRAY_SIZE(ts72xx_wdt_resources), .num_resources = ARRAY_SIZE(ts72xx_wdt_resources),
}; };
/*************************************************************************
* ETH
*************************************************************************/
static struct ep93xx_eth_data __initdata ts72xx_eth_data = { static struct ep93xx_eth_data __initdata ts72xx_eth_data = {
.phy_id = 1, .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 int bk3_spi_chipselects[] __initdata = {
EP93XX_GPIO_LINE_F(3),
};
static struct ep93xx_spi_info bk3_spi_master __initdata = {
.chipselect = bk3_spi_chipselects,
.num_chipselect = ARRAY_SIZE(bk3_spi_chipselects),
.use_dma = 1,
};
/*************************************************************************
* TS72XX support code
*************************************************************************/
#if IS_ENABLED(CONFIG_FPGA_MGR_TS73XX) #if IS_ENABLED(CONFIG_FPGA_MGR_TS73XX)
/* Relative to EP93XX_CS1_PHYS_BASE */ /* Relative to EP93XX_CS1_PHYS_BASE */
...@@ -257,7 +333,9 @@ static struct ep93xx_spi_info ts72xx_spi_info __initdata = { ...@@ -257,7 +333,9 @@ static struct ep93xx_spi_info ts72xx_spi_info __initdata = {
static void __init ts72xx_init_machine(void) static void __init ts72xx_init_machine(void)
{ {
ep93xx_init_devices(); ep93xx_init_devices();
ts72xx_register_flash(); 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_rtc_device);
platform_device_register(&ts72xx_wdt_device); platform_device_register(&ts72xx_wdt_device);
...@@ -280,3 +358,66 @@ MACHINE_START(TS72XX, "Technologic Systems TS-72xx SBC") ...@@ -280,3 +358,66 @@ MACHINE_START(TS72XX, "Technologic Systems TS-72xx SBC")
.init_late = ep93xx_init_late, .init_late = ep93xx_init_late,
.restart = ep93xx_restart, .restart = ep93xx_restart,
MACHINE_END 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);
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,
.map_io = ts72xx_map_io,
.init_irq = ep93xx_init_irq,
.init_time = ep93xx_timer_init,
.init_machine = bk3_init_machine,
.init_late = ep93xx_init_late,
.restart = ep93xx_restart,
MACHINE_END
...@@ -10,8 +10,12 @@ ...@@ -10,8 +10,12 @@
* febff000 22000000 4K model number register (bits 0-2) * febff000 22000000 4K model number register (bits 0-2)
* febfe000 22400000 4K options register * febfe000 22400000 4K options register
* febfd000 22800000 4K options register #2 * 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_PHYS_BASE 0x22000000
#define TS72XX_MODEL_VIRT_BASE IOMEM(0xfebff000) #define TS72XX_MODEL_VIRT_BASE IOMEM(0xfebff000)
#define TS72XX_MODEL_SIZE 0x00001000 #define TS72XX_MODEL_SIZE 0x00001000
...@@ -39,6 +43,10 @@ ...@@ -39,6 +43,10 @@
#define TS72XX_OPTIONS2_TS9420 0x04 #define TS72XX_OPTIONS2_TS9420 0x04
#define TS72XX_OPTIONS2_TS9420_BOOT 0x02 #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__ #ifndef __ASSEMBLY__
static inline int ts72xx_model(void) static inline int ts72xx_model(void)
...@@ -83,3 +91,4 @@ static inline int is_ts9420_installed(void) ...@@ -83,3 +91,4 @@ static inline int is_ts9420_installed(void)
TS72XX_OPTIONS2_TS9420); TS72XX_OPTIONS2_TS9420);
} }
#endif #endif
#endif /* __TS72XX_H_ */
...@@ -345,6 +345,7 @@ mxlads MACH_MXLADS MXLADS 1851 ...@@ -345,6 +345,7 @@ mxlads MACH_MXLADS MXLADS 1851
linkstation_mini MACH_LINKSTATION_MINI LINKSTATION_MINI 1858 linkstation_mini MACH_LINKSTATION_MINI LINKSTATION_MINI 1858
afeb9260 MACH_AFEB9260 AFEB9260 1859 afeb9260 MACH_AFEB9260 AFEB9260 1859
imx27ipcam MACH_IMX27IPCAM IMX27IPCAM 1871 imx27ipcam MACH_IMX27IPCAM IMX27IPCAM 1871
bk3 MACH_BK3 BK3 1880
rd88f6183ap_ge MACH_RD88F6183AP_GE RD88F6183AP_GE 1894 rd88f6183ap_ge MACH_RD88F6183AP_GE RD88F6183AP_GE 1894
realview_pba8 MACH_REALVIEW_PBA8 REALVIEW_PBA8 1897 realview_pba8 MACH_REALVIEW_PBA8 REALVIEW_PBA8 1897
realview_pbx MACH_REALVIEW_PBX REALVIEW_PBX 1901 realview_pbx MACH_REALVIEW_PBX REALVIEW_PBX 1901
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册