|
@@ -51,8 +51,7 @@ static void platform_bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value)
|
|
|
|
|
|
static bool platform_bgmac_clk_enabled(struct bgmac *bgmac)
|
|
|
{
|
|
|
- if ((bgmac_idm_read(bgmac, BCMA_IOCTL) &
|
|
|
- (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC)) != BCMA_IOCTL_CLK)
|
|
|
+ if ((bgmac_idm_read(bgmac, BCMA_IOCTL) & BGMAC_CLK_EN) != BGMAC_CLK_EN)
|
|
|
return false;
|
|
|
if (bgmac_idm_read(bgmac, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
|
|
|
return false;
|
|
@@ -61,15 +60,25 @@ static bool platform_bgmac_clk_enabled(struct bgmac *bgmac)
|
|
|
|
|
|
static void platform_bgmac_clk_enable(struct bgmac *bgmac, u32 flags)
|
|
|
{
|
|
|
- bgmac_idm_write(bgmac, BCMA_IOCTL,
|
|
|
- (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC | flags));
|
|
|
- bgmac_idm_read(bgmac, BCMA_IOCTL);
|
|
|
+ u32 val;
|
|
|
|
|
|
- bgmac_idm_write(bgmac, BCMA_RESET_CTL, 0);
|
|
|
- bgmac_idm_read(bgmac, BCMA_RESET_CTL);
|
|
|
- udelay(1);
|
|
|
+ /* The Reset Control register only contains a single bit to show if the
|
|
|
+ * controller is currently in reset. Do a sanity check here, just in
|
|
|
+ * case the bootloader happened to leave the device in reset.
|
|
|
+ */
|
|
|
+ val = bgmac_idm_read(bgmac, BCMA_RESET_CTL);
|
|
|
+ if (val) {
|
|
|
+ bgmac_idm_write(bgmac, BCMA_RESET_CTL, 0);
|
|
|
+ bgmac_idm_read(bgmac, BCMA_RESET_CTL);
|
|
|
+ udelay(1);
|
|
|
+ }
|
|
|
|
|
|
- bgmac_idm_write(bgmac, BCMA_IOCTL, (BCMA_IOCTL_CLK | flags));
|
|
|
+ val = bgmac_idm_read(bgmac, BCMA_IOCTL);
|
|
|
+ /* Some bits of BCMA_IOCTL set by HW/ATF and should not change */
|
|
|
+ val |= flags & ~(BGMAC_AWCACHE | BGMAC_ARCACHE | BGMAC_AWUSER |
|
|
|
+ BGMAC_ARUSER);
|
|
|
+ val |= BGMAC_CLK_EN;
|
|
|
+ bgmac_idm_write(bgmac, BCMA_IOCTL, val);
|
|
|
bgmac_idm_read(bgmac, BCMA_IOCTL);
|
|
|
udelay(1);
|
|
|
}
|