forked from Minki/linux
7b9334215f
The Broadcom BCM3368 Cable Modem SoC is extremely similar to the existing BCM63xx DSL SoCs, in particular BCM6358, therefore little effort in the existing code base is required to get it supported. This patch adds support for the following on-chip peripherals: - two UARTS - GPIO - Ethernet - SPI - PCI - NOR Flash The most noticeable difference with 3368 is that it has its peripheral register at 0xfff8_0000 we check that separately in ioremap.h. Since 3368 is identical to 6358 for its clock and reset bits, we use them verbatim. Signed-off-by: Florian Fainelli <florian@openwrt.org> Cc: linux-mips@linux-mips.org Cc: cernekee@gmail.com Cc: jogo@openwrt.org Patchwork: https://patchwork.linux-mips.org/patch/5499/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
103 lines
2.6 KiB
C
103 lines
2.6 KiB
C
/*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
* Copyright (C) 2009-2011 Florian Fainelli <florian@openwrt.org>
|
|
* Copyright (C) 2010 Tanguy Bouzeloc <tanguy.bouzeloc@efixo.com>
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/export.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/err.h>
|
|
#include <linux/clk.h>
|
|
|
|
#include <bcm63xx_cpu.h>
|
|
#include <bcm63xx_dev_spi.h>
|
|
#include <bcm63xx_regs.h>
|
|
|
|
#ifdef BCMCPU_RUNTIME_DETECT
|
|
/*
|
|
* register offsets
|
|
*/
|
|
static const unsigned long bcm6348_regs_spi[] = {
|
|
__GEN_SPI_REGS_TABLE(6348)
|
|
};
|
|
|
|
static const unsigned long bcm6358_regs_spi[] = {
|
|
__GEN_SPI_REGS_TABLE(6358)
|
|
};
|
|
|
|
const unsigned long *bcm63xx_regs_spi;
|
|
EXPORT_SYMBOL(bcm63xx_regs_spi);
|
|
|
|
static __init void bcm63xx_spi_regs_init(void)
|
|
{
|
|
if (BCMCPU_IS_6338() || BCMCPU_IS_6348())
|
|
bcm63xx_regs_spi = bcm6348_regs_spi;
|
|
if (BCMCPU_IS_3368() || BCMCPU_IS_6358() ||
|
|
BCMCPU_IS_6362() || BCMCPU_IS_6368())
|
|
bcm63xx_regs_spi = bcm6358_regs_spi;
|
|
}
|
|
#else
|
|
static __init void bcm63xx_spi_regs_init(void) { }
|
|
#endif
|
|
|
|
static struct resource spi_resources[] = {
|
|
{
|
|
.start = -1, /* filled at runtime */
|
|
.end = -1, /* filled at runtime */
|
|
.flags = IORESOURCE_MEM,
|
|
},
|
|
{
|
|
.start = -1, /* filled at runtime */
|
|
.flags = IORESOURCE_IRQ,
|
|
},
|
|
};
|
|
|
|
static struct bcm63xx_spi_pdata spi_pdata = {
|
|
.bus_num = 0,
|
|
.num_chipselect = 8,
|
|
};
|
|
|
|
static struct platform_device bcm63xx_spi_device = {
|
|
.name = "bcm63xx-spi",
|
|
.id = -1,
|
|
.num_resources = ARRAY_SIZE(spi_resources),
|
|
.resource = spi_resources,
|
|
.dev = {
|
|
.platform_data = &spi_pdata,
|
|
},
|
|
};
|
|
|
|
int __init bcm63xx_spi_register(void)
|
|
{
|
|
if (BCMCPU_IS_6328() || BCMCPU_IS_6345())
|
|
return -ENODEV;
|
|
|
|
spi_resources[0].start = bcm63xx_regset_address(RSET_SPI);
|
|
spi_resources[0].end = spi_resources[0].start;
|
|
spi_resources[1].start = bcm63xx_get_irq_number(IRQ_SPI);
|
|
|
|
if (BCMCPU_IS_6338() || BCMCPU_IS_6348()) {
|
|
spi_resources[0].end += BCM_6348_RSET_SPI_SIZE - 1;
|
|
spi_pdata.fifo_size = SPI_6348_MSG_DATA_SIZE;
|
|
spi_pdata.msg_type_shift = SPI_6348_MSG_TYPE_SHIFT;
|
|
spi_pdata.msg_ctl_width = SPI_6348_MSG_CTL_WIDTH;
|
|
}
|
|
|
|
if (BCMCPU_IS_3368() || BCMCPU_IS_6358() || BCMCPU_IS_6362() ||
|
|
BCMCPU_IS_6368()) {
|
|
spi_resources[0].end += BCM_6358_RSET_SPI_SIZE - 1;
|
|
spi_pdata.fifo_size = SPI_6358_MSG_DATA_SIZE;
|
|
spi_pdata.msg_type_shift = SPI_6358_MSG_TYPE_SHIFT;
|
|
spi_pdata.msg_ctl_width = SPI_6358_MSG_CTL_WIDTH;
|
|
}
|
|
|
|
bcm63xx_spi_regs_init();
|
|
|
|
return platform_device_register(&bcm63xx_spi_device);
|
|
}
|