Import MoCA 2.10.4.6
From MoCA_2.10.4.6.tar:
bmoca/3.3/bmoca.c
bmoca/3.8/bmoca.c
include/linux/bmoca.h
bmoca-6802.c is missing in this latest release.
Change-Id: I694aa63398b16a89b2408245fc78fd629b865498
diff --git a/3.3/bmoca.c b/3.3/bmoca.c
index 0e55484..b36c551 100644
--- a/3.3/bmoca.c
+++ b/3.3/bmoca.c
@@ -1445,6 +1445,8 @@
u32 mask = 0;
int ret, stopped = 0;
+ mutex_lock(&priv->dev_mutex);
+
if (priv->enabled) {
mask = moca_irq_status(priv, FLUSH_IRQ);
if (mask & M2H_DMA) {
@@ -1464,6 +1466,7 @@
}
if (mask == 0) {
+ mutex_unlock(&priv->dev_mutex);
moca_enable_irq(priv);
return;
}
@@ -1472,14 +1475,13 @@
M2H_REQ_CPU0 | M2H_RESP_CPU0)) {
if (moca_get_mbx_offset(priv)) {
/* mbx interrupt but mbx_offset is bogus?? */
+ mutex_unlock(&priv->dev_mutex);
moca_enable_irq(priv);
return;
}
}
}
- mutex_lock(&priv->dev_mutex);
-
if (!priv->running) {
stopped = 1;
} else {
diff --git a/3.8/bmoca.c b/3.8/bmoca.c
index 08812d9..b55a926 100644
--- a/3.8/bmoca.c
+++ b/3.8/bmoca.c
@@ -1332,6 +1332,8 @@
u32 mask = 0;
int ret, stopped = 0;
+ mutex_lock(&priv->dev_mutex);
+
if (priv->enabled) {
mask = moca_irq_status(priv, FLUSH_IRQ);
if (mask & M2H_DMA) {
@@ -1350,6 +1352,7 @@
}
if (mask == 0) {
+ mutex_unlock(&priv->dev_mutex);
moca_enable_irq(priv);
return;
}
@@ -1358,14 +1361,13 @@
M2H_REQ_CPU0 | M2H_RESP_CPU0)) {
if (moca_get_mbx_offset(priv)) {
/* mbx interrupt but mbx_offset is bogus?? */
+ mutex_unlock(&priv->dev_mutex);
moca_enable_irq(priv);
return;
}
}
}
- mutex_lock(&priv->dev_mutex);
-
if (!priv->running) {
stopped = 1;
} else {
diff --git a/bmoca-6802.c b/bmoca-6802.c
deleted file mode 100644
index c46e323..0000000
--- a/bmoca-6802.c
+++ /dev/null
@@ -1,1165 +0,0 @@
-/*
- <:copyright-BRCM:2013:DUAL/GPL:standard
-
- Copyright (c) 2013 Broadcom Corporation
- All Rights Reserved
-
- Unless you and Broadcom execute a separate written software license
- agreement governing use of this software, this software is licensed
- to you under the terms of the GNU General Public License version 2
- (the "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
- with the following added to such license:
-
- As a special exception, the copyright holders of this software give
- you permission to link this software with independent modules, and
- to copy and distribute the resulting executable under terms of your
- choice, provided that you also meet, for each linked independent
- module, the terms and conditions of the license of that module.
- An independent module is a module which is not derived from this
- software. The special exception does not apply to any modifications
- of the software.
-
- Not withstanding the above, under no circumstances may you combine
- this software in any way with any other Broadcom software provided
- under a license other than the GPL, without Broadcom's express prior
- written consent.
-
- :>
-
-*/
-
-#include "bbsi.h"
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)
-#else
-typedef unsigned long uintptr_t;
-#endif // LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)
-
-#define MOCA_RD(x) ((((struct moca_platform_data *)priv->pdev->dev.platform_data)->use_spi == 0) ? \
- (*((volatile uint32_t *)((unsigned long)(x)))) : \
- ((uint32_t)kerSysBcmSpiSlaveReadReg32(((struct moca_platform_data *)priv->pdev->dev.platform_data)->devId, (uint32_t)(x))))
-
-#define MOCA_RD8(x, y) ((((struct moca_platform_data *)priv->pdev->dev.platform_data)->use_spi == 0) ? \
- (*(y) = *((volatile unsigned char *)((unsigned long)(x)))) : \
- (kerSysBcmSpiSlaveRead(((struct moca_platform_data *)priv->pdev->dev.platform_data)->devId, (unsigned long)(x), y, 1)))
-
-#define MOCA_WR(x,y) do { ((((struct moca_platform_data *)priv->pdev->dev.platform_data)->use_spi == 0) ? \
- (*((volatile uint32_t *)((unsigned long)(x)))) = (y) : \
- kerSysBcmSpiSlaveWriteReg32(((struct moca_platform_data *)priv->pdev->dev.platform_data)->devId, (uint32_t)(x), (y))); } while(0)
-
-#define MOCA_WR8(x,y) do { ((((struct moca_platform_data *)priv->pdev->dev.platform_data)->use_spi == 0) ? \
- (*((volatile unsigned char *)((unsigned long)(x)))) = (unsigned char)(y) : \
- kerSysBcmSpiSlaveWrite(((struct moca_platform_data *)priv->pdev->dev.platform_data)->devId, (unsigned long)(x), (y), 1)); } while(0)
-
-#define MOCA_WR16(x,y) do { ((((struct moca_platform_data *)priv->pdev->dev.platform_data)->use_spi == 0) ? \
- (*((volatile unsigned short *)((unsigned long)(x)))) = (unsigned short)(y) : \
- kerSysBcmSpiSlaveWrite(((struct moca_platform_data *)priv->pdev->dev.platform_data)->devId, (unsigned long)(x), (y), 2)); } while(0)
-
-#define MOCA_WR_BLOCK(addr, src, len) do { kerSysBcmSpiSlaveWriteBuf(((struct moca_platform_data *)priv->pdev->dev.platform_data)->devId, addr, src, len, 4); } while(0)
-#define MOCA_RD_BLOCK(addr, dst, len) do { kerSysBcmSpiSlaveReadBuf(((struct moca_platform_data *)priv->pdev->dev.platform_data)->devId, addr, dst, len, 4); } while(0)
-
-
-#define I2C_RD(x) MOCA_RD(x)
-#define I2C_WR(x, y) MOCA_WR(x, y)
-
-#define MOCA_BPCM_NUM 5
-#define MOCA_BPCM_ZONES_NUM 8
-
-#define MOCA_CPU_CLOCK_NUM 1
-#define MOCA_PHY_CLOCK_NUM 2
-
-typedef enum _PMB_COMMAND_E_
-{
- PMB_COMMAND_PHY1_ON=0,
- PMB_COMMAND_PARTIAL_ON,
- PMB_COMMAND_PHY1_OFF,
- PMB_COMMAND_ALL_OFF,
-
- PMB_COMMAND_LAST
-} PMB_COMMAND_E;
-
-typedef enum _PMB_GIVE_OWNERSHIP_E_
-{
- PMB_GIVE_OWNERSHIP_2_HOST = 0,
- PMB_GIVE_OWNERSHIP_2_FW,
-
- PMB_GET_OWNERSHIP_LAST
-} PMB_GIVE_OWNERSHIP_E;
-
-struct moca_680x_clk
-{
- struct device *dev;
- uint32_t clock_num;
-};
-
-static uint32_t zone_all_off_bitmask[MOCA_BPCM_NUM] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
-static uint32_t zone_partial_on_bitmask[MOCA_BPCM_NUM] = { 0x41, 0xFC, 0xFF, 0xFF, 0x00 };
-static uint32_t zone_phy1_bitmask[MOCA_BPCM_NUM] = { 0x00, 0x00, 0x00, 0x00, 0xFF };
-
-
-static void bogus_release(struct device *dev)
-{
-}
-
-static struct moca_platform_data moca_lan_data = {
- .macaddr_hi = 0x00000102,
- .macaddr_lo = 0x03040000,
-
- .bcm3450_i2c_base = 0x10406200,
- .bcm3450_i2c_addr = 0x70,
- .hw_rev = HWREV_MOCA_20_GEN22,
- .rf_band = MOCA_BAND_EXT_D,
- .chip_id = 0,
- .use_dma = 0,
- .use_spi = 1,
- .devId = MOCA_DEVICE_ID_UNREGISTERED, // Filled in dynamically
-#ifdef CONFIG_SMP
- .smp_processor_id = 1,
-#endif
-};
-
-static struct resource moca_lan_resources[] = {
- [0] = {
- .start = 0x10600000,
- .end = 0x107ffd97,
- .flags = IORESOURCE_MEM,
- },
- [1] = { /* Not used for 6802, define for bmoca */
- .start = 0,
- .end = 0,
- .flags = IORESOURCE_IRQ,
- }
-};
-
-static struct platform_device moca_lan_plat_dev = {
- .name = "bmoca",
- .id = 0,
- .num_resources = ARRAY_SIZE(moca_lan_resources),
- .resource = moca_lan_resources,
- .dev = {
- .platform_data = &moca_lan_data,
- .release = bogus_release,
- },
-};
-
-static struct moca_platform_data moca_wan_data = {
- .macaddr_hi = 0x00000102,
- .macaddr_lo = 0x03040000,
-
- .bcm3450_i2c_base = 0x10406200,
- .bcm3450_i2c_addr = 0x70,
- .hw_rev = HWREV_MOCA_20_GEN22,
- .chip_id = 0,
-
- .rf_band = MOCA_BAND_EXT_D,
-
- .use_dma = 0,
- .use_spi = 1,
- .devId = MOCA_DEVICE_ID_UNREGISTERED, // Filled in dynamically
-
-#ifdef CONFIG_SMP
- .smp_processor_id = 1,
-#endif
-};
-
-static struct resource moca_wan_resources[] = {
- [0] = {
- .start = 0x10600000,
- .end = 0x107ffd97,
- .flags = IORESOURCE_MEM,
- },
- [1] = { /* Not used for 6802, define for bmoca */
- .start = 0,
- .end = 0,
- .flags = IORESOURCE_IRQ,
- }
-};
-
-static struct platform_device moca_wan_plat_dev = {
- .name = "bmoca",
- .id = 1,
- .num_resources = ARRAY_SIZE(moca_wan_resources),
- .resource = moca_wan_resources,
- .dev = {
- .platform_data = &moca_wan_data,
- .release = bogus_release,
- },
-};
-
-static void moca_enable_irq(struct moca_priv_data *priv)
-{
- kerSysMocaHostIntrEnable(((struct moca_platform_data *)priv->pdev->dev.platform_data)->devId);
-}
-
-static void moca_disable_irq(struct moca_priv_data *priv)
-{
- kerSysMocaHostIntrDisable(((struct moca_platform_data *)priv->pdev->dev.platform_data)->devId);
-}
-
-static void moca_pmb_busy_wait(struct moca_priv_data *priv)
-{
- #if 0
- uint32_t data;
-
- /* Possible time saver: The register access time over SPI may
- always be enough to guarantee that the write will complete
- in time without having to check the status. */
- do
- {
- data = MOCA_RD(priv->base + priv->regs->pmb_master_status);
- } while (data & 0x1);
- #endif
-}
-
-void moca_pmb_delay(struct moca_priv_data *priv)
-{
- unsigned int data;
- int i, j;
-
- MOCA_WR(priv->base + priv->regs->pmb_master_wdata_offset, 0xFF444000);
-
- for (i = 0; i < MOCA_BPCM_NUM; i++)
- {
- for (j = 0; j < MOCA_BPCM_ZONES_NUM; j++)
- {
- data = 0x100012 + j*4 + i*0x1000; ;
- MOCA_WR(priv->base + priv->regs->pmb_master_cmd_offset, data);
- moca_pmb_busy_wait(priv);
- }
- }
-}
-
-static void moca_pmb_control(struct moca_priv_data *priv, PMB_COMMAND_E cmd)
-{
- int i, j;
- uint32_t * p_zone_control;
- uint32_t data;
-
- switch (cmd)
- {
- case PMB_COMMAND_ALL_OFF:
- // Turn off zone command
- MOCA_WR(priv->base + priv->regs->pmb_master_wdata_offset, 0xA00);
- p_zone_control = &zone_all_off_bitmask[0];
- break;
-
- case PMB_COMMAND_PHY1_OFF:
- // Turn off zone command
- MOCA_WR(priv->base + priv->regs->pmb_master_wdata_offset, 0xA00);
- p_zone_control = &zone_phy1_bitmask[0];
- break;
-
- case PMB_COMMAND_PHY1_ON:
- // Turn on zone command
- MOCA_WR(priv->base + priv->regs->pmb_master_wdata_offset, 0xC00);
- p_zone_control = &zone_phy1_bitmask[0];
- break;
-
- case PMB_COMMAND_PARTIAL_ON:
- // Turn on zone command
- MOCA_WR(priv->base + priv->regs->pmb_master_wdata_offset, 0xC00);
- p_zone_control = &zone_partial_on_bitmask[0];
- break;
-
-
- default:
- printk(KERN_WARNING "%s: illegal cmd: %08x\n",
- __FUNCTION__, cmd);
- return;
- }
-
- for (i = 0; i < MOCA_BPCM_NUM; i++)
- {
- for (j = 0; j < MOCA_BPCM_ZONES_NUM; j++)
- {
- if (*p_zone_control & (1 << j))
- {
- // zone address in bpcms
- data = (0x1 << 20) + 16 + (i * 4096) + (j * 4);
- MOCA_WR(priv->base + priv->regs->pmb_master_cmd_offset, data);
- moca_pmb_busy_wait(priv);
- }
- }
- p_zone_control++;
- }
-
-}
-
-static void moca_pmb_give_cntrl(struct moca_priv_data *priv, PMB_GIVE_OWNERSHIP_E cmd)
-{
- int i;
- uint32_t data;
-
- /* Pass control over the memories to the FW */
- MOCA_WR(priv->base + priv->regs->pmb_master_wdata_offset, cmd);
- for (i = 0; i < 3; i++)
- {
- data = 0x100002 + i*0x1000;
- MOCA_WR(priv->base + priv->regs->pmb_master_cmd_offset, data);
- moca_pmb_busy_wait(priv);
- }
- moca_pmb_busy_wait(priv);
-}
-
-static void moca_hw_reset(struct moca_priv_data *priv)
-{
-// unsigned long flags;
-// uint32_t chipid;
-
-
- /* disable and clear all interrupts */
- MOCA_WR(priv->base + priv->regs->l2_mask_set_offset, 0xffffffff);
- MOCA_RD(priv->base + priv->regs->l2_mask_set_offset);
-
- /* assert resets */
-
- /* reset CPU first, both CPUs for MoCA 20 HW */
- if (priv->hw_rev == HWREV_MOCA_20_GEN22)
- MOCA_SET(priv->base + priv->regs->sw_reset_offset, 5);
- else
- MOCA_SET(priv->base + priv->regs->sw_reset_offset, 1);
-
- MOCA_RD(priv->base + priv->regs->sw_reset_offset);
-
- udelay(20);
-
- /* reset everything else except clocks */
- MOCA_SET(priv->base + priv->regs->sw_reset_offset,
- ~((1 << 3) | (1 << 7) | (1 << 15) | (1 << 16)));
- MOCA_RD(priv->base + priv->regs->sw_reset_offset);
-
- udelay(20);
-
- /* disable clocks */
- MOCA_SET(priv->base + priv->regs->sw_reset_offset,
- ~((1 << 3) | (1 << 15) | (1 << 16)));
- MOCA_RD(priv->base + priv->regs->sw_reset_offset);
-
- MOCA_WR(priv->base + priv->regs->l2_clear_offset, 0xffffffff);
- MOCA_RD(priv->base + priv->regs->l2_clear_offset);
-
- /* Power down all zones */
- // The host can't give to itself permission.
- moca_pmb_control(priv, PMB_COMMAND_ALL_OFF);
-
- /* Power down all SYS_CTRL memories */
- MOCA_WR(0x10100068, 1); // CLKGEN_PLL_SYS1_PLL_PWRDN
- MOCA_SET(0x1010000c, 1); // CLKGEN_PLL_SYS0_PLL_CHANNEL_CTRL_CH_3
-
-}
-
-static unsigned int moca_get_phy_freq(struct moca_priv_data *priv)
-{
- unsigned int x = MOCA_RD(0x10100044); // CLKGEN_PLL_SYS1_PLL_CHANNEL_CTRL_CH_2
-
- x = (x >> 1) & 0xFF; // Get the MDIV_CH2 field
-
- return( 2400 / x);
-}
-
-
-static void moca_ps_PowerCtrlPHY1(struct moca_priv_data *priv, PMB_COMMAND_E cmd)
-{
- uint32_t pll_ctrl_3, pll_ctrl_5, sw_reset;
- pll_ctrl_3 = MOCA_RD (0x10100048);
- pll_ctrl_5 = MOCA_RD (0x10100050);
- sw_reset = MOCA_RD (priv->base + priv->regs->sw_reset_offset);
-
- // enable PLL
- MOCA_UNSET(0x10100048, 1); // CLKGEN_PLL_SYS1_PLL_CHANNEL_CTRL_CH_3
- MOCA_UNSET(0x10100050, 1); // CLKGEN_PLL_SYS1_PLL_CHANNEL_CTRL_CH_5
-
- udelay(1);
-
- // de assert moca_phy1_disable_clk
- MOCA_UNSET(priv->base + priv->regs->sw_reset_offset, (1 << 9));
-
- moca_pmb_control(priv, cmd);
-
- MOCA_WR (0x10100048, pll_ctrl_3);
- MOCA_WR (0x10100050, pll_ctrl_5);
-
- udelay(1);
-
- MOCA_WR (priv->base + priv->regs->sw_reset_offset, sw_reset);
-}
-
-
-static void moca_gphy_init(struct moca_priv_data *priv)
-{
- struct moca_platform_data * pMocaData = (struct moca_platform_data *)priv->pdev->dev.platform_data;
- u32 port_mode;
- u32 rgmii0_on;
- u32 rgmii1_on;
- u32 gphy_enabled = 0;
-
- port_mode = MOCA_RD(0x10800000) & 0x3;
- rgmii0_on = MOCA_RD(0x1080000c) & 0x1;
- rgmii1_on = MOCA_RD(0x10800018) & 0x1;
-
- if ((pMocaData->chip_id & 0xFFFEFFF0) == 0x680200C0)
- {
- if ((port_mode == 0) ||
- ((port_mode == 1) && rgmii0_on) ||
- ((port_mode == 2) && rgmii1_on))
- {
- gphy_enabled = 1;
- }
- }
- else
- {
- if ((port_mode == 0) ||
- ((port_mode != 3) && rgmii1_on))
- {
- gphy_enabled = 1;
- }
- }
-
- if (gphy_enabled)
- {
- MOCA_UNSET(0x10800004, 0xF);
- msleep(10);
- MOCA_WR(0x1040431c, 0xFFFFFFFF);
- }
-}
-
-/* called any time we start/restart/stop MoCA */
-static void moca_hw_init(struct moca_priv_data *priv, int action)
-{
- u32 mask;
- u32 temp;
- u32 data;
- u32 count = 0;
- struct moca_platform_data * pMocaData = (struct moca_platform_data *)priv->pdev->dev.platform_data;
-
- if (action == MOCA_ENABLE && !priv->enabled) {
- clk_enable(priv->clk);
-
- MOCA_WR(0x1040431c, ~(1 << 26)); // SUN_TOP_CTRL_SW_INIT_0_CLEAR --> Do this at start of sequence, don't touch gphy_sw_init
- udelay(20);
- moca_gphy_init(priv);
-
- priv->enabled = 1;
- }
-
- /* clock not enabled, register accesses will fail with bus error */
- if (!priv->enabled)
- return;
-
- moca_hw_reset(priv);
- udelay(1);
-
- if (action == MOCA_ENABLE) {
-
- /* Power up all zones */
- moca_pmb_control(priv, PMB_COMMAND_PARTIAL_ON);
-
- MOCA_UNSET(0x1010000c, 1); // CLKGEN_PLL_SYS0_PLL_CHANNEL_CTRL_CH_3
-
- MOCA_WR(0x1010006C, 1); // CLKGEN_PLL_SYS1_PLL_RESET
- MOCA_WR(0x10100068, 0); // CLKGEN_PLL_SYS1_PLL_PWRDN
- data = 0;
- while ((data & 0x1) == 0)
- {
- /* This typically is only read once */
- data = MOCA_RD(0x10100060); // CLKGEN_PLL_SYS1_PLL_LOCK_STATUS
-
- if (count++ > 10)
- break;
- }
- MOCA_WR(0x1010006C, 0); // CLKGEN_PLL_SYS1_PLL_RESET
-
- if (priv->bonded_mode) {
- MOCA_UNSET(0x10100048, 1); // CLKGEN_PLL_SYS1_PLL_CHANNEL_CTRL_CH_3
- MOCA_UNSET(0x10100050, 1); // CLKGEN_PLL_SYS1_PLL_CHANNEL_CTRL_CH_5
- } else {
- MOCA_SET(0x10100048, 1); // CLKGEN_PLL_SYS1_PLL_CHANNEL_CTRL_CH_3
- MOCA_SET(0x10100050, 1); // CLKGEN_PLL_SYS1_PLL_CHANNEL_CTRL_CH_5
- }
- udelay(1);
-
- /* deassert moca_sys_reset, system clock, phy0, phy0 clock */
- mask = (1 << 1) | (1 << 7) | (1 << 4) | (1 << 8);
-
- /* deassert phy1 and phy1 clock in bonded mode */
- if (priv->bonded_mode)
- mask |= (1 << 5) | (1 << 9);
-
- MOCA_UNSET(priv->base + priv->regs->sw_reset_offset, mask);
- MOCA_RD(priv->base + priv->regs->sw_reset_offset);
-
- // Before power off the memories, moca_phy1_disable_clk.
- if (priv->bonded_mode==0)
- moca_ps_PowerCtrlPHY1(priv, PMB_COMMAND_PHY1_OFF);
- else
- moca_ps_PowerCtrlPHY1(priv, PMB_COMMAND_PHY1_ON);
-
-
- moca_pmb_give_cntrl(priv, PMB_GIVE_OWNERSHIP_2_FW);
-
- /* Check for 6802/6803 A0 chip only with Xtal mod */
- if ((pMocaData->chip_id & 0xFFFEFFFF) == 0x680200A0)
- {
- data = MOCA_RD(0x1040401c);
- if ((data & 0x7) == 0x2) {
- /* 25MHz */
- printk("MoCA running with 25MHz XTAL\n");
- MOCA_WR(priv->base + priv->regs->host2moca_mmp_outbox_0_offset, 1);
- } else {
- printk("MoCA == 50MHz XTAL\n");
- /* 50MHz clock change only */
- MOCA_WR(priv->base + priv->regs->host2moca_mmp_outbox_0_offset, 0);
- //Note: The re-configuration is in NDIV_INT, not PDIV.
- //`CLKGEN_REG_START + `CLKGEN_PLL_SYS1_PLL_DIV (32'h10100058) [09:00] = 10d48
- temp = MOCA_RD(0x10100058);
- temp = (temp & 0xFFFFFC00) + 48;
- MOCA_WR(0x10100058, temp);
-
- //`CLKGEN_REG_START + `CLKGEN_PLL_SYS0_PLL_DIV (32'h10100018) [09:00] = 10d40
- temp = MOCA_RD(0x10100018);
- temp = (temp & 0xFFFFFC00) + 40;
- MOCA_WR(0x10100018, temp);
-
- //`CLKGEN_REG_START + `CLKGEN_PLL_SYS1_PLL_CHANNEL_CTRL_CH_4 (32'h1010004C) [08:01] = 8d48
- temp = MOCA_RD(0x1010004c);
- temp = (temp & 0xFFFFFE01) + (48 << 1);
- MOCA_WR(0x1010004c, temp);
-
- //`CLKGEN_REG_START + `CLKGEN_PLL_SYS1_PLL_CHANNEL_CTRL_CH_5 (32'h10100050) [08:01] = 8d48
- temp = MOCA_RD(0x10100050);
- temp = (temp & 0xFFFFFE01) + (48 << 1);
- MOCA_WR(0x10100050, temp);
-
- // Then Restart the PLL.
-
- //`CLKGEN_REG_START + `CLKGEN_PLL_SYS0_PLL_RESET (32'h1010002C) [0] = 1b1
- MOCA_SET(0x1010002c, 1);
- //`CLKGEN_REG_START + `CLKGEN_PLL_SYS1_PLL_RESET (32'h1010006C) [0] = 1b1
- MOCA_SET(0x1010006c, 1);
-
- udelay(1);
-
- //`CLKGEN_REG_START + `CLKGEN_PLL_SYS0_PLL_RESET (32'h1010002C) [0] = 1b0
- MOCA_UNSET(0x1010002c, 1);
- //`CLKGEN_REG_START + `CLKGEN_PLL_SYS1_PLL_RESET (32'h1010006C) [0] = 1b0
- MOCA_UNSET(0x1010006c, 1);
- }
- }
-
- // CLKGEN_PLL_SYS1_PLL_SSC_MODE_CONTROL_HIGH
- data = MOCA_RD(0x10100070);
- data = (data & 0xFFFF0000) | 0x7dd;
- MOCA_WR(0x10100070, data);
-
- // CLKGEN_PLL_SYS1_PLL_SSC_MODE_CONTROL_LOW
- data = MOCA_RD(0x10100074);
- data = (data & 0xffc00000) | 0x3d71;
- MOCA_WR(0x10100074, data);
-
- // CLKGEN_PLL_SYS1_PLL_SSC_MODE_CONTROL_LOW
- MOCA_SET(0x10100074, (1 << 22));
- }
-
-
- if (priv->hw_rev <= HWREV_MOCA_20_GEN21) {
- /* clear junk out of GP0/GP1 */
- MOCA_WR(priv->base + priv->regs->gp0_offset, 0xffffffff);
- MOCA_WR(priv->base + priv->regs->gp1_offset, 0x0);
- /* set up activity LED for 50% duty cycle */
- MOCA_WR(priv->base + priv->regs->led_ctrl_offset,
- 0x40004000);
- }
-
- /* enable DMA completion interrupts */
- mask = M2H_REQ | M2H_RESP | M2H_ASSERT | M2H_WDT_CPU1 |
- M2H_NEXTCHUNK | M2H_DMA;
-
- if (priv->hw_rev >= HWREV_MOCA_20_GEN21)
- mask |= M2H_WDT_CPU0 | M2H_NEXTCHUNK_CPU0 |
- M2H_REQ_CPU0 | M2H_RESP_CPU0 | M2H_ASSERT_CPU0;
-
- MOCA_WR(priv->base + priv->regs->ringbell_offset, 0);
- MOCA_WR(priv->base + priv->regs->l2_mask_clear_offset, mask);
- MOCA_RD(priv->base + priv->regs->l2_mask_clear_offset);
-
-
- /* Set pinmuxing for MoCA interrupt and flow control */
- MOCA_UNSET(0x10404110, 0xF00000FF);
- MOCA_SET(0x10404110, 0x10000022);
-
- /* Set pinmuxing for MoCA IIC control */
- if (((pMocaData->chip_id & 0xFFFFFFF0) == 0x680200C0) ||
- ((pMocaData->chip_id & 0xFFFFFFF0) == 0x680300C0))
- {
- MOCA_UNSET(0x10404100, 0xFF); // pin muxing
- MOCA_SET(0x10404100, 0x22); // pin muxing
- }
-
- MOCA_WR(0x100b0318, 2);
-
- if (action == MOCA_DISABLE && priv->enabled) {
- priv->enabled = 0;
- clk_disable(priv->clk);
- }
-}
-
-static void moca_ringbell(struct moca_priv_data *priv, uint32_t mask)
-{
- MOCA_WR(priv->base + priv->regs->ringbell_offset, mask);
-}
-
-static uint32_t moca_start_mips(struct moca_priv_data *priv, unsigned int cpu)
-{
- if (priv->hw_rev == HWREV_MOCA_20_GEN22) {
- if (cpu == 1)
- MOCA_UNSET(priv->base + priv->regs->sw_reset_offset,
- (1 << 0));
- else {
- moca_mmp_init(priv, 1);
- MOCA_UNSET(priv->base + priv->regs->sw_reset_offset,
- (1 << 2));
- }
- } else
- MOCA_UNSET(priv->base + priv->regs->sw_reset_offset, (1 << 0));
- MOCA_RD(priv->base + priv->regs->sw_reset_offset);
-
- return(0);
-}
-
-static void moca_m2m_xfer(struct moca_priv_data *priv,
- uint32_t dst, uint32_t src, uint32_t ctl)
-{
- uint32_t status;
-
- MOCA_WR(priv->base + priv->regs->m2m_src_offset, src);
- MOCA_WR(priv->base + priv->regs->m2m_dst_offset, dst);
- MOCA_WR(priv->base + priv->regs->m2m_status_offset, 0);
- MOCA_RD(priv->base + priv->regs->m2m_status_offset);
- MOCA_WR(priv->base + priv->regs->m2m_cmd_offset, ctl);
-
- do {
- status = MOCA_RD(priv->base + priv->regs->m2m_status_offset);
- } while(status == 0);
-
-}
-
-static void moca_write_mem(struct moca_priv_data *priv,
- uint32_t dst_offset, void *src, unsigned int len)
-{
- struct moca_platform_data *pd = priv->pdev->dev.platform_data;
-
- if((dst_offset >= priv->regs->cntl_mem_offset+priv->regs->cntl_mem_size) ||
- ((dst_offset + len) > priv->regs->cntl_mem_offset+priv->regs->cntl_mem_size)) {
- printk(KERN_WARNING "%s: copy past end of cntl memory: %08x\n",
- __FUNCTION__, dst_offset);
- return;
- }
-
- if ( 1 == pd->use_dma )
- {
- dma_addr_t pa;
-
- pa = dma_map_single(&priv->pdev->dev, src, len, DMA_TO_DEVICE);
- mutex_lock(&priv->copy_mutex);
- moca_m2m_xfer(priv, dst_offset + priv->regs->data_mem_offset, (uint32_t)pa, len | M2M_WRITE);
- mutex_unlock(&priv->copy_mutex);
- dma_unmap_single(&priv->pdev->dev, pa, len, DMA_TO_DEVICE);
- }
- else
- {
- uintptr_t addr = (uintptr_t)priv->base + priv->regs->data_mem_offset + dst_offset;
- uint32_t *data = src;
- int i;
-
- mutex_lock(&priv->copy_mutex);
- if (((struct moca_platform_data *)priv->pdev->dev.platform_data)->use_spi == 1)
- {
- src = data;
- MOCA_WR_BLOCK(addr, src, len);
- }
- else
- {
- for(i = 0; i < len; i += 4, addr += 4, data++)
- MOCA_WR(addr, *data);
- MOCA_RD(addr - 4); /* flush write */
- }
-
- mutex_unlock(&priv->copy_mutex);
- }
-}
-
-static void moca_read_mem(struct moca_priv_data *priv,
- void *dst, uint32_t src_offset, unsigned int len)
-{
- struct moca_platform_data *pd = priv->pdev->dev.platform_data;
-
- if((src_offset >= priv->regs->cntl_mem_offset+priv->regs->cntl_mem_size) ||
- ((src_offset + len) > priv->regs->cntl_mem_offset+priv->regs->cntl_mem_size)) {
- printk(KERN_WARNING "%s: copy past end of cntl memory: %08x\n",
- __FUNCTION__, src_offset);
- return;
- }
-
- if ( 1 == pd->use_dma )
- {
- dma_addr_t pa;
-
- pa = dma_map_single(&priv->pdev->dev, dst, len, DMA_FROM_DEVICE);
- mutex_lock(&priv->copy_mutex);
- moca_m2m_xfer(priv, (uint32_t)pa, src_offset + priv->regs->data_mem_offset, len | M2M_READ);
- mutex_unlock(&priv->copy_mutex);
- dma_unmap_single(&priv->pdev->dev, pa, len, DMA_FROM_DEVICE);
- }
- else
- {
- uintptr_t addr = priv->regs->data_mem_offset + src_offset;
- uint32_t *data = dst;
- int i;
-
- mutex_lock(&priv->copy_mutex);
- if (((struct moca_platform_data *)priv->pdev->dev.platform_data)->use_spi == 1)
- {
- MOCA_RD_BLOCK((uintptr_t)priv->base + addr, dst, len);
- }
- else
- {
- for(i = 0; i < len; i += 4, addr += 4, data++)
- *data = MOCA_RD((uintptr_t)priv->base + addr);
- }
- mutex_unlock(&priv->copy_mutex);
- }
-}
-
-static void moca_write_sg(struct moca_priv_data *priv,
- uint32_t dst_offset, struct scatterlist *sg, int nents)
-{
- int j;
- uintptr_t addr = priv->regs->data_mem_offset + dst_offset;
- struct moca_platform_data *pd = priv->pdev->dev.platform_data;
-
- dma_map_sg(&priv->pdev->dev, sg, nents, DMA_TO_DEVICE);
-
- mutex_lock(&priv->copy_mutex);
- for(j = 0; j < nents; j++)
- {
- if ( 1 == pd->use_dma )
- {
- // printk("XXX copying page %d, PA %08x\n", j, (int)sg[j].dma_address);
- moca_m2m_xfer(priv, addr, (uint32_t)sg[j].dma_address,
- sg[j].length | M2M_WRITE);
-
- addr += sg[j].length;
- }
- else
- {
- unsigned long *data = (void *)phys_to_virt(sg[j].dma_address);
- //printk("%s: Writing 0x%lx to addr 0x%08lx (len = %d)\n", __FUNCTION__, *data, ((unsigned long)priv->base) + addr, sg[j].length);
- MOCA_WR_BLOCK(((unsigned long)priv->base) + addr, data, sg[j].length);
- addr += sg[j].length;
- }
- }
- mutex_unlock(&priv->copy_mutex);
-
- dma_unmap_sg(&priv->pdev->dev, sg, nents, DMA_TO_DEVICE);
-}
-
-/* NOTE: this function is not tested */
-#if 0
-static void moca_read_sg(struct moca_priv_data *priv,
- uint32_t src_offset, struct scatterlist *sg, int nents)
-{
- int j;
- uintptr_t addr = priv->data_mem_offset + src_offset;
-
- dma_map_sg(&priv->pdev->dev, sg, nents, DMA_FROM_DEVICE);
-
- mutex_lock(&priv->copy_mutex);
- for(j = 0; j < nents; j++) {
-#if 0 //USE_DMA
- printk("XXX copying page %d, PA %08x\n", j, (int)sg[j].dma_address);
- moca_m2m_xfer(priv, addr, (uint32_t)sg[j].dma_address,
- sg[j].length | M2M_READ);
-
- addr += sg[j].length;
-#else
- uint32_t *data = (void *)phys_to_virt(sg[j].dma_address);
- unsigned int len = sg[j].length;
- int i;
-
- for(i = 0; i < len; i += 4, addr += 4, data++) {
- *data = cpu_to_be32(
- MOCA_RD((uintptr_t)priv->base + addr));
- //printk("MoCA READ: AD 0x%x = 0x%x (0x%x)\n", (priv->base + addr), MOCA_RD((uintptr_t)priv->base + addr), *data);
- }
-#endif
- }
- mutex_unlock(&priv->copy_mutex);
-
- dma_unmap_sg(&priv->pdev->dev, sg, nents, DMA_FROM_DEVICE);
-}
-#endif
-
-static void moca_read_mac_addr(struct moca_priv_data *priv, uint32_t * hi, uint32_t * lo)
-{
- struct net_device * pdev ;
- char mocaName[7] ;
-
- if (priv == NULL)
- sprintf (mocaName, "moca%u", 0) ;
- else
- sprintf (mocaName, "moca%u", ((struct moca_platform_data *)priv->pdev->dev.platform_data)->devId) ;
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
- pdev = dev_get_by_name ( &init_net, mocaName ) ;
-#else
- pdev = dev_get_by_name ( mocaName ) ;
-#endif
-
- if ((pdev != NULL) && (lo != NULL) && (hi != NULL)) {
- mac_to_u32(hi, lo, pdev->dev_addr);
- }
-}
-
-
-#if defined(DSL_MOCA)
-
-/*
- * This helper function was added to allow the enet driver to compile in
- * consumer environment for 68xx profiles.
- */
-void moca_get_fc_bits(void * arg, unsigned long *moca_fc_reg)
-{
- struct moca_priv_data * priv;
- struct moca_platform_data * pMocaData;
- unsigned long flags;
-
- if (arg == NULL) {
- return;
- }
-
- priv = (struct moca_priv_data *) arg;
- pMocaData = (struct moca_platform_data *)priv->pdev->dev.platform_data;
-
- *moca_fc_reg = 0;
- if (priv != NULL)
- {
- /* We can't read moca core regs unless the core's clocks are on. */
- spin_lock_irqsave(&priv->clock_lock, flags);
- if (priv->running) {
- *moca_fc_reg = MOCA_RD(priv->base+priv->regs->sideband_gmii_fc_offset);
- }
- spin_unlock_irqrestore(&priv->clock_lock, flags);
- }
-}
-
-#endif /* DSL_MOCA */
-
-
-//extern void bcmenet_register_moca_fc_bits_cb(void cb(void *, unsigned long *), int isWan, void * arg);
-
-static void moca_mem_init_680xC0( struct moca_priv_data *priv )
-{
- // De-assert reset (all memories are OFF by default Force_SP_off =1, Force_Rf_off =1)
- MOCA_UNSET(priv->base + priv->regs->sw_reset_offset, ((1 << 15) | (1 << 16)));
-
- moca_pmb_delay(priv);
- moca_pmb_control(priv, PMB_COMMAND_ALL_OFF);
-
- //Write Force_SP_on =0, Force_SP_off =0, Force_RF_on =0, Force_RF_off =0
- MOCA_UNSET(priv->base + 0x001ffd14, ((1 << 10) | (1 << 11)));
- moca_pmb_control(priv, PMB_COMMAND_PARTIAL_ON);
-}
-
-static int hw_specific_init( struct moca_priv_data *priv )
-{
-#ifdef DSL_MOCA
- struct moca_platform_data *pMocaData;
-
- pMocaData = (struct moca_platform_data *)priv->pdev->dev.platform_data;
-
- /* fill in the hw_rev field */
- pMocaData->chip_id = MOCA_RD(0x10404004) + 0xA0;
- if ((pMocaData->chip_id & 0xFFFE0000) != 0x68020000) { /* 6802 or 6803 */
- printk(KERN_ERR "bmoca: No MoCA chip found\n");
- return -EFAULT;
- }
-
- if (((pMocaData->chip_id & 0xFFFFFFF0) == 0x680200C0) || ((pMocaData->chip_id & 0xFFFFFFF0) == 0x680300C0))
- {
- priv->i2c_base = NULL;
-
- /* Initialize 680x CO memory */
- moca_mem_init_680xC0(priv);
- }
-
- pMocaData->hw_rev = HWREV_MOCA_20_GEN22;
-
- /* Power down all LEAP memories */
- MOCA_WR(0x101000e4, 0x6); // CLKGEN_LEAP_TOP_INST_DATA
- MOCA_WR(0x101000e8, 0x6); // CLKGEN_LEAP_TOP_INST_HAB
- MOCA_WR(0x101000ec, 0x6); // CLKGEN_LEAP_TOP_INST_PROG0
- MOCA_WR(0x101000f0, 0x6); // CLKGEN_LEAP_TOP_INST_PROG1
- MOCA_WR(0x101000f4, 0x6); // CLKGEN_LEAP_TOP_INST_PROG2
- MOCA_WR(0x101000f8, 0x6); // CLKGEN_LEAP_TOP_INST_ROM
- MOCA_WR(0x101000fc, 0x6); // CLKGEN_LEAP_TOP_INST_SHARED
- MOCA_WR(0x10100164, 0x3); // CLKGEN_SYS_CTRL_INST_POWER_SWITCH_MEMORY
-
-// bcmenet_register_moca_fc_bits_cb(
-// moca_get_fc_bits, pMocaData->use_spi ? 1 : 0, (void *)priv);
-#endif
-
- return 0;
-}
-
-static int moca_platform_dev_register(void)
-{
- struct moca_platform_data *pMocaData;
- struct platform_device *pPlatformDev;
- BP_MOCA_INFO mocaInfo[BP_MOCA_MAX_NUM];
- int mocaChipNum = BP_MOCA_MAX_NUM;
- int i;
- int ret = 0;
-
- BpGetMocaInfo(mocaInfo, &mocaChipNum);
-
- for (i = 0; i < mocaChipNum; i++) {
- switch (mocaInfo[i].type) {
- case BP_MOCA_TYPE_WAN:
- pMocaData = &moca_wan_data;
- pPlatformDev = &moca_wan_plat_dev;
- break;
-
- case BP_MOCA_TYPE_LAN:
- pMocaData = &moca_lan_data;
- pPlatformDev = &moca_lan_plat_dev;
- break;
-
- default:
- printk(KERN_ERR "bmoca: unrecognized MoCA type %d\n",
- mocaInfo[i].type);
- return(-1);
- break;
- }
-
- ret = platform_device_register(pPlatformDev);
- if (ret < 0) {
- return(ret);
- }
- else {
- pMocaData->devId = i;
-
- /* Map the board params RF Band to the bmoca.h value */
- switch (mocaInfo[i].rfBand)
- {
- case BP_MOCA_RF_BAND_D_LOW:
- pMocaData->rf_band = MOCA_BAND_D_LOW;
- break;
- case BP_MOCA_RF_BAND_D_HIGH:
- pMocaData->rf_band = MOCA_BAND_D_HIGH;
- break;
- case BP_MOCA_RF_BAND_EXT_D:
- pMocaData->rf_band = MOCA_BAND_EXT_D;
- break;
- case BP_MOCA_RF_BAND_E:
- pMocaData->rf_band = MOCA_BAND_E;
- break;
- case BP_MOCA_RF_BAND_F:
- pMocaData->rf_band = MOCA_BAND_F;
- break;
- default:
- /* Do nothing */
- break;
- }
- printk(KERN_INFO "bmoca: Found MoCA device %d/%d RF Band %d\n",
- i, mocaChipNum, mocaInfo[i].rfBand);
- }
- }
-
- return(ret);
-}
-
-static void moca_platform_dev_unregister(void)
-{
- if (moca_lan_data.devId != MOCA_DEVICE_ID_UNREGISTERED)
- platform_device_unregister(&moca_lan_plat_dev);
-
- if (moca_wan_data.devId != MOCA_DEVICE_ID_UNREGISTERED)
- platform_device_unregister(&moca_wan_plat_dev);
-}
-
-static void moca_3450_write(struct moca_priv_data *priv, u8 addr, u32 data)
-{
- /* comment out for now. We don't use i2c on the 63268BHR board */
-#ifdef MOCA_3450_USE_I2C
- if (((struct moca_platform_data *)priv->pdev->dev.platform_data)->use_spi == 0)
- bcm3450_write_reg(addr, data);
- else
-#endif
- {
- if (priv->i2c_base != NULL)
- moca_3450_write_i2c(priv, addr, data);
- }
-}
-
-static u32 moca_3450_read(struct moca_priv_data *priv, u8 addr)
-{
- /* comment out for now. We don't use i2c on the 63268BHR board */
-#ifdef MOCA_3450_USE_I2C
- if (((struct moca_platform_data *)priv->pdev->dev.platform_data)->use_spi == 0)
- return(bcm3450_read_reg(addr));
- else
-#endif
- {
- if (priv->i2c_base != NULL)
- return(moca_3450_read_i2c(priv, addr));
- else
- return(0xffffffff);
- }
-}
-
-/*
- * PM STUBS
- */
-
-struct clk *clk_get(struct device *dev, const char *id)
-{
- // We're not actually using the "struct clk" for anything
- // We'll use our own structure
- struct moca_680x_clk * pclk = kzalloc(sizeof(struct moca_680x_clk), GFP_KERNEL);
-
- pclk->dev = dev;
-
- if (!strcmp(id, "moca-cpu"))
- pclk->clock_num = MOCA_CPU_CLOCK_NUM;
- else if (!strcmp(id, "moca-phy"))
- pclk->clock_num = MOCA_PHY_CLOCK_NUM;
- else
- {
- kfree(pclk);
- return(NULL);
- }
-
- return((struct clk *)pclk);
-}
-
-int clk_enable(struct clk *clk)
-{
- return 0;
-}
-
-void clk_disable(struct clk *clk)
-{
-}
-
-void clk_put(struct clk *clk)
-{
- kfree((struct moca_680x_clk *)clk);
-}
-
-struct moca_6802c0_clock_params
-{
- uint32_t cpu_hz;
- uint32_t pdiv;
- uint32_t ndiv;
- uint32_t pll_mdivs[6];
-};
-
-#define NUM_6802C0_CLOCK_OPTIONS 2
-struct moca_6802c0_clock_params moca_6802c0_clock_params[NUM_6802C0_CLOCK_OPTIONS] =
-{
- { // VCO of 2100, default
- 420000000, // cpu_hz
- 1, // pdiv
- 42, // ndiv
- {5, 21, 7, 7, 42, 42} // pll_mdivs[6]
- },
- { // VCO of 2400
- 400000000, // cpu_hz
- 1, // pdiv
- 48, // ndiv
- {6, 24, 8, 8, 48, 48} // pll_mdivs[6]
- },
-};
-
-int clk_set_rate(struct clk *clk, unsigned long rate)
-{
- // The MOCA_RD/MOCA_WR macros need a valid 'priv->pdev->dev'
- struct moca_priv_data dummy_priv;
- struct platform_device dummy_pd;
- struct moca_priv_data *priv = &dummy_priv;
- struct moca_680x_clk * pclk = (struct moca_680x_clk *) clk;
- struct moca_platform_data * pMocaData = (struct moca_platform_data *)pclk->dev->platform_data;
- struct moca_6802c0_clock_params * p_clock_data = &moca_6802c0_clock_params[0];
- uint32_t i;
- uint32_t addr;
- uint32_t data;
- int ret = -1;
-
- priv->pdev = &dummy_pd;
- priv->pdev->dev = *pclk->dev;
-
- if (pclk->clock_num == MOCA_CPU_CLOCK_NUM)
- {
- if ((pMocaData->chip_id & 0xFFFFFFF0) == 0x680200C0)
- {
- for (i = 0; i < NUM_6802C0_CLOCK_OPTIONS; i++)
- {
- if (moca_6802c0_clock_params[i].cpu_hz == rate)
- {
- p_clock_data = &moca_6802c0_clock_params[i];
- ret = 0;
- }
- }
-
- // 1. Set POST_DIVIDER_HOLD_CHx (bit [12] in each PLL_CHANNEL_CTRL_CH_x
- // register) // this will zero the output channels
- for (addr = 0x1010003c; addr <= 0x10100050; addr += 4)
- {
- MOCA_SET(addr, (1 << 12));
- }
-
- //2. Program new PDIV/NDIV value, this will lose lock and
- // trigger a new PLL lock process for a new VCO frequency
- MOCA_WR(0x10100058, ((p_clock_data->pdiv << 10) | p_clock_data->ndiv));
-
- //3. Wait >10 usec for lock time // max lock time per data sheet is 460/Fref,
- // Or alternatively monitor CLKGEN_PLL_SYS*_PLL_LOCK_STATUS to check if PLL has locked
- data = 0;
- i = 0;
- while ((data & 0x1) == 0)
- {
- /* This typically is only read once */
- data = MOCA_RD(0x10100060); // CLKGEN_PLL_SYS1_PLL_LOCK_STATUS
-
- if (i++ > 10)
- {
- printk("MoCA SYS1 PLL NOT LOCKED!\n");
- break;
- }
- }
-
- //4. Configure new MDIV value along with set POST_DIVIDER_LOAD_EN_CHx
- // (bit [13]=1, while keep bit[12]=1) in each PLL_CHANNEL_CTRL_CH_x register
- i = 0;
- for (addr = 0x1010003c; addr <= 0x10100050; addr += 4)
- {
- data = MOCA_RD(addr);
- data |= (1 << 13);
- data &= ~(0xFF << 1);
- data |= (p_clock_data->pll_mdivs[i] << 1);
- MOCA_WR(addr, data);
- i++;
- }
-
- //5. Clear bits [12] and bit [13] in each PLL_CHANNEL_CTRL_CH_x
- for (addr = 0x1010003c; addr <= 0x10100050; addr += 4)
- {
- MOCA_UNSET(addr, ((1 << 13) | (1 << 12)));
- }
-
- }
- }
-
- return(ret);
-}
-
diff --git a/bmoca.c b/bmoca.c
deleted file mode 120000
index 621a8ab..0000000
--- a/bmoca.c
+++ /dev/null
@@ -1 +0,0 @@
-3.3/bmoca.c
\ No newline at end of file