Commit 0cc8674f authored by Andrew Victor's avatar Andrew Victor Committed by Jeff Garzik

AT91: MACB support

The Atmel MACB Ethernet peripheral is also integrated in the AT91SAM9260
and AT91SAM9263 processors.  The differences from the AVR32 version are:
      * Single peripheral clock.
      * MII/RMII selection bit is inverted.
      * Clock enable bit.

Original patch from Patrice Vilchez.
Signed-off-by: default avatarAndrew Victor <andrew@sanpeople.com>
Signed-off-by: default avatarHaavard Skinnemoen <hskinnemoen@atmel.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 683349a3
...@@ -190,7 +190,7 @@ config MII ...@@ -190,7 +190,7 @@ config MII
config MACB config MACB
tristate "Atmel MACB support" tristate "Atmel MACB support"
depends on NET_ETHERNET && AVR32 depends on NET_ETHERNET && (AVR32 || ARCH_AT91SAM9260 || ARCH_AT91SAM9263)
select MII select MII
help help
The Atmel MACB ethernet interface is found on many AT32 and AT91 The Atmel MACB ethernet interface is found on many AT32 and AT91
......
...@@ -1046,6 +1046,14 @@ static int __devinit macb_probe(struct platform_device *pdev) ...@@ -1046,6 +1046,14 @@ static int __devinit macb_probe(struct platform_device *pdev)
spin_lock_init(&bp->lock); spin_lock_init(&bp->lock);
#if defined(CONFIG_ARCH_AT91)
bp->pclk = clk_get(&pdev->dev, "macb_clk");
if (IS_ERR(bp->pclk)) {
dev_err(&pdev->dev, "failed to get macb_clk\n");
goto err_out_free_dev;
}
clk_enable(bp->pclk);
#else
bp->pclk = clk_get(&pdev->dev, "pclk"); bp->pclk = clk_get(&pdev->dev, "pclk");
if (IS_ERR(bp->pclk)) { if (IS_ERR(bp->pclk)) {
dev_err(&pdev->dev, "failed to get pclk\n"); dev_err(&pdev->dev, "failed to get pclk\n");
...@@ -1059,6 +1067,7 @@ static int __devinit macb_probe(struct platform_device *pdev) ...@@ -1059,6 +1067,7 @@ static int __devinit macb_probe(struct platform_device *pdev)
clk_enable(bp->pclk); clk_enable(bp->pclk);
clk_enable(bp->hclk); clk_enable(bp->hclk);
#endif
bp->regs = ioremap(regs->start, regs->end - regs->start + 1); bp->regs = ioremap(regs->start, regs->end - regs->start + 1);
if (!bp->regs) { if (!bp->regs) {
...@@ -1119,9 +1128,17 @@ static int __devinit macb_probe(struct platform_device *pdev) ...@@ -1119,9 +1128,17 @@ static int __devinit macb_probe(struct platform_device *pdev)
pdata = pdev->dev.platform_data; pdata = pdev->dev.platform_data;
if (pdata && pdata->is_rmii) if (pdata && pdata->is_rmii)
#if defined(CONFIG_ARCH_AT91)
macb_writel(bp, USRIO, (MACB_BIT(RMII) | MACB_BIT(CLKEN)) );
#else
macb_writel(bp, USRIO, 0); macb_writel(bp, USRIO, 0);
#endif
else else
#if defined(CONFIG_ARCH_AT91)
macb_writel(bp, USRIO, MACB_BIT(CLKEN));
#else
macb_writel(bp, USRIO, MACB_BIT(MII)); macb_writel(bp, USRIO, MACB_BIT(MII));
#endif
bp->tx_pending = DEF_TX_RING_PENDING; bp->tx_pending = DEF_TX_RING_PENDING;
...@@ -1148,9 +1165,11 @@ static int __devinit macb_probe(struct platform_device *pdev) ...@@ -1148,9 +1165,11 @@ static int __devinit macb_probe(struct platform_device *pdev)
err_out_iounmap: err_out_iounmap:
iounmap(bp->regs); iounmap(bp->regs);
err_out_disable_clocks: err_out_disable_clocks:
#ifndef CONFIG_ARCH_AT91
clk_disable(bp->hclk); clk_disable(bp->hclk);
clk_disable(bp->pclk);
clk_put(bp->hclk); clk_put(bp->hclk);
#endif
clk_disable(bp->pclk);
err_out_put_pclk: err_out_put_pclk:
clk_put(bp->pclk); clk_put(bp->pclk);
err_out_free_dev: err_out_free_dev:
...@@ -1173,9 +1192,11 @@ static int __devexit macb_remove(struct platform_device *pdev) ...@@ -1173,9 +1192,11 @@ static int __devexit macb_remove(struct platform_device *pdev)
unregister_netdev(dev); unregister_netdev(dev);
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
iounmap(bp->regs); iounmap(bp->regs);
#ifndef CONFIG_ARCH_AT91
clk_disable(bp->hclk); clk_disable(bp->hclk);
clk_disable(bp->pclk);
clk_put(bp->hclk); clk_put(bp->hclk);
#endif
clk_disable(bp->pclk);
clk_put(bp->pclk); clk_put(bp->pclk);
free_netdev(dev); free_netdev(dev);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
......
...@@ -200,7 +200,7 @@ ...@@ -200,7 +200,7 @@
#define MACB_SOF_OFFSET 30 #define MACB_SOF_OFFSET 30
#define MACB_SOF_SIZE 2 #define MACB_SOF_SIZE 2
/* Bitfields in USRIO */ /* Bitfields in USRIO (AVR32) */
#define MACB_MII_OFFSET 0 #define MACB_MII_OFFSET 0
#define MACB_MII_SIZE 1 #define MACB_MII_SIZE 1
#define MACB_EAM_OFFSET 1 #define MACB_EAM_OFFSET 1
...@@ -210,6 +210,12 @@ ...@@ -210,6 +210,12 @@
#define MACB_TX_PAUSE_ZERO_OFFSET 3 #define MACB_TX_PAUSE_ZERO_OFFSET 3
#define MACB_TX_PAUSE_ZERO_SIZE 1 #define MACB_TX_PAUSE_ZERO_SIZE 1
/* Bitfields in USRIO (AT91) */
#define MACB_RMII_OFFSET 0
#define MACB_RMII_SIZE 1
#define MACB_CLKEN_OFFSET 1
#define MACB_CLKEN_SIZE 1
/* Bitfields in WOL */ /* Bitfields in WOL */
#define MACB_IP_OFFSET 0 #define MACB_IP_OFFSET 0
#define MACB_IP_SIZE 16 #define MACB_IP_SIZE 16
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment