blob: 3becdb2deb46c8dbfb3faa4e2916e1cdf41bc6d3 [file] [log] [blame]
Andrew Victord4b77802006-03-24 11:50:17 +02001/*
2 * Ethernet driver for the Atmel AT91RM9200 (Thunder)
3 *
4 * Copyright (C) 2003 SAN People (Pty) Ltd
5 *
6 * Based on an earlier Atmel EMAC macrocell driver by Atmel and Lineo Inc.
7 * Initial version by Rick Bronson 01/11/2003
8 *
Andrew Victord4b77802006-03-24 11:50:17 +02009 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version
12 * 2 of the License, or (at your option) any later version.
13 */
14
15#include <linux/module.h>
16#include <linux/init.h>
Alexey Dobriyana6b7a402011-06-06 10:43:46 +000017#include <linux/interrupt.h>
Andrew Victord4b77802006-03-24 11:50:17 +020018#include <linux/netdevice.h>
19#include <linux/etherdevice.h>
20#include <linux/skbuff.h>
21#include <linux/dma-mapping.h>
22#include <linux/ethtool.h>
Jamie Iles84e0cdb2011-03-08 20:17:06 +000023#include <linux/platform_data/macb.h>
Andrew Victord4b77802006-03-24 11:50:17 +020024#include <linux/platform_device.h>
25#include <linux/clk.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090026#include <linux/gfp.h>
Andrew Victorc5f0f832012-04-26 00:30:42 +000027#include <linux/phy.h>
Joachim Eastwood63973462012-10-18 11:01:18 +000028#include <linux/io.h>
Jean-Christophe PLAGNIOL-VILLARD96f63602012-11-04 21:34:51 +000029#include <linux/of.h>
30#include <linux/of_device.h>
31#include <linux/of_net.h>
Jean-Christophe PLAGNIOL-VILLARDdea09242012-11-04 21:34:52 +000032#include <linux/pinctrl/consumer.h>
Andrew Victord4b77802006-03-24 11:50:17 +020033
Joachim Eastwoodbc3bbef2012-10-18 11:01:07 +000034#include "macb.h"
Andrew Victord4b77802006-03-24 11:50:17 +020035
Joachim Eastwood04879e52012-10-18 11:01:17 +000036/* 1518 rounded up */
37#define MAX_RBUFF_SZ 0x600
38/* max number of receive buffers */
39#define MAX_RX_DESCR 9
40
Joachim Eastwood50b5ca12012-11-07 08:14:57 +000041/* Initialize and start the Receiver and Transmit subsystems */
Joachim Eastwood04879e52012-10-18 11:01:17 +000042static int at91ether_start(struct net_device *dev)
Andrew Victord4b77802006-03-24 11:50:17 +020043{
Joachim Eastwoodb85008b2012-10-18 11:01:10 +000044 struct macb *lp = netdev_priv(dev);
Joachim Eastwood04879e52012-10-18 11:01:17 +000045 dma_addr_t addr;
Joachim Eastwood50b5ca12012-11-07 08:14:57 +000046 u32 ctl;
Joachim Eastwood04879e52012-10-18 11:01:17 +000047 int i;
Andrew Victord4b77802006-03-24 11:50:17 +020048
Joachim Eastwood04879e52012-10-18 11:01:17 +000049 lp->rx_ring = dma_alloc_coherent(&lp->pdev->dev,
Havard Skinnemoen55054a12012-10-31 06:04:55 +000050 MAX_RX_DESCR * sizeof(struct macb_dma_desc),
Joachim Eastwood04879e52012-10-18 11:01:17 +000051 &lp->rx_ring_dma, GFP_KERNEL);
52 if (!lp->rx_ring) {
Joachim Eastwooded2b97d2012-11-07 08:14:56 +000053 netdev_err(dev, "unable to alloc rx ring DMA buffer\n");
Joachim Eastwood04879e52012-10-18 11:01:17 +000054 return -ENOMEM;
55 }
Andrew Victord4b77802006-03-24 11:50:17 +020056
Joachim Eastwood04879e52012-10-18 11:01:17 +000057 lp->rx_buffers = dma_alloc_coherent(&lp->pdev->dev,
58 MAX_RX_DESCR * MAX_RBUFF_SZ,
59 &lp->rx_buffers_dma, GFP_KERNEL);
60 if (!lp->rx_buffers) {
Joachim Eastwooded2b97d2012-11-07 08:14:56 +000061 netdev_err(dev, "unable to alloc rx data DMA buffer\n");
Joachim Eastwood04879e52012-10-18 11:01:17 +000062
63 dma_free_coherent(&lp->pdev->dev,
Havard Skinnemoen55054a12012-10-31 06:04:55 +000064 MAX_RX_DESCR * sizeof(struct macb_dma_desc),
Joachim Eastwood04879e52012-10-18 11:01:17 +000065 lp->rx_ring, lp->rx_ring_dma);
66 lp->rx_ring = NULL;
67 return -ENOMEM;
68 }
69
70 addr = lp->rx_buffers_dma;
Andrew Victord4b77802006-03-24 11:50:17 +020071 for (i = 0; i < MAX_RX_DESCR; i++) {
Joachim Eastwood04879e52012-10-18 11:01:17 +000072 lp->rx_ring[i].addr = addr;
73 lp->rx_ring[i].ctrl = 0;
74 addr += MAX_RBUFF_SZ;
Andrew Victord4b77802006-03-24 11:50:17 +020075 }
76
77 /* Set the Wrap bit on the last descriptor */
Joachim Eastwood04879e52012-10-18 11:01:17 +000078 lp->rx_ring[MAX_RX_DESCR - 1].addr |= MACB_BIT(RX_WRAP);
Andrew Victord4b77802006-03-24 11:50:17 +020079
80 /* Reset buffer index */
Joachim Eastwood04879e52012-10-18 11:01:17 +000081 lp->rx_tail = 0;
Andrew Victord4b77802006-03-24 11:50:17 +020082
83 /* Program address of descriptor list in Rx Buffer Queue register */
Joachim Eastwood04879e52012-10-18 11:01:17 +000084 macb_writel(lp, RBQP, lp->rx_ring_dma);
Andrew Victord4b77802006-03-24 11:50:17 +020085
86 /* Enable Receive and Transmit */
Joachim Eastwoodf8bded32012-10-18 11:01:08 +000087 ctl = macb_readl(lp, NCR);
88 macb_writel(lp, NCR, ctl | MACB_BIT(RE) | MACB_BIT(TE));
Joachim Eastwood04879e52012-10-18 11:01:17 +000089
90 return 0;
Andrew Victord4b77802006-03-24 11:50:17 +020091}
92
Joachim Eastwood50b5ca12012-11-07 08:14:57 +000093/* Open the ethernet interface */
Andrew Victord4b77802006-03-24 11:50:17 +020094static int at91ether_open(struct net_device *dev)
95{
Joachim Eastwoodb85008b2012-10-18 11:01:10 +000096 struct macb *lp = netdev_priv(dev);
Joachim Eastwood50b5ca12012-11-07 08:14:57 +000097 u32 ctl;
Joachim Eastwood04879e52012-10-18 11:01:17 +000098 int ret;
Andrew Victord4b77802006-03-24 11:50:17 +020099
Andrew Victord4b77802006-03-24 11:50:17 +0200100 /* Clear internal statistics */
Joachim Eastwoodf8bded32012-10-18 11:01:08 +0000101 ctl = macb_readl(lp, NCR);
102 macb_writel(lp, NCR, ctl | MACB_BIT(CLRSTAT));
Andrew Victord4b77802006-03-24 11:50:17 +0200103
Joachim Eastwood34232472012-11-07 08:14:53 +0000104 macb_set_hwaddr(lp);
Andrew Victord4b77802006-03-24 11:50:17 +0200105
Joachim Eastwood04879e52012-10-18 11:01:17 +0000106 ret = at91ether_start(dev);
107 if (ret)
108 return ret;
109
Andrew Victord4b77802006-03-24 11:50:17 +0200110 /* Enable MAC interrupts */
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000111 macb_writel(lp, IER, MACB_BIT(RCOMP) |
112 MACB_BIT(RXUBR) |
113 MACB_BIT(ISR_TUND) |
114 MACB_BIT(ISR_RLE) |
115 MACB_BIT(TCOMP) |
116 MACB_BIT(ISR_ROVR) |
117 MACB_BIT(HRESP));
Andrew Victord4b77802006-03-24 11:50:17 +0200118
Joachim Eastwood5e32353d2012-10-18 11:01:14 +0000119 /* schedule a link state check */
120 phy_start(lp->phy_dev);
121
Andrew Victord4b77802006-03-24 11:50:17 +0200122 netif_start_queue(dev);
Joachim Eastwood5e32353d2012-10-18 11:01:14 +0000123
Andrew Victord4b77802006-03-24 11:50:17 +0200124 return 0;
125}
126
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000127/* Close the interface */
Andrew Victord4b77802006-03-24 11:50:17 +0200128static int at91ether_close(struct net_device *dev)
129{
Joachim Eastwoodb85008b2012-10-18 11:01:10 +0000130 struct macb *lp = netdev_priv(dev);
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000131 u32 ctl;
Andrew Victord4b77802006-03-24 11:50:17 +0200132
133 /* Disable Receiver and Transmitter */
Joachim Eastwoodf8bded32012-10-18 11:01:08 +0000134 ctl = macb_readl(lp, NCR);
135 macb_writel(lp, NCR, ctl & ~(MACB_BIT(TE) | MACB_BIT(RE)));
Andrew Victord4b77802006-03-24 11:50:17 +0200136
Andrew Victord4b77802006-03-24 11:50:17 +0200137 /* Disable MAC interrupts */
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000138 macb_writel(lp, IDR, MACB_BIT(RCOMP) |
139 MACB_BIT(RXUBR) |
140 MACB_BIT(ISR_TUND) |
141 MACB_BIT(ISR_RLE) |
142 MACB_BIT(TCOMP) |
143 MACB_BIT(ISR_ROVR) |
144 MACB_BIT(HRESP));
Andrew Victord4b77802006-03-24 11:50:17 +0200145
146 netif_stop_queue(dev);
147
Joachim Eastwood04879e52012-10-18 11:01:17 +0000148 dma_free_coherent(&lp->pdev->dev,
Havard Skinnemoen55054a12012-10-31 06:04:55 +0000149 MAX_RX_DESCR * sizeof(struct macb_dma_desc),
Joachim Eastwood04879e52012-10-18 11:01:17 +0000150 lp->rx_ring, lp->rx_ring_dma);
151 lp->rx_ring = NULL;
152
153 dma_free_coherent(&lp->pdev->dev,
154 MAX_RX_DESCR * MAX_RBUFF_SZ,
155 lp->rx_buffers, lp->rx_buffers_dma);
156 lp->rx_buffers = NULL;
157
Andrew Victord4b77802006-03-24 11:50:17 +0200158 return 0;
159}
160
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000161/* Transmit packet */
Alexander Beregalov531c6802009-04-09 17:27:00 +0000162static int at91ether_start_xmit(struct sk_buff *skb, struct net_device *dev)
Andrew Victord4b77802006-03-24 11:50:17 +0200163{
Joachim Eastwoodb85008b2012-10-18 11:01:10 +0000164 struct macb *lp = netdev_priv(dev);
Andrew Victord4b77802006-03-24 11:50:17 +0200165
Joachim Eastwoodf8bded32012-10-18 11:01:08 +0000166 if (macb_readl(lp, TSR) & MACB_BIT(RM9200_BNQ)) {
Andrew Victord4b77802006-03-24 11:50:17 +0200167 netif_stop_queue(dev);
168
169 /* Store packet information (to free when Tx completed) */
170 lp->skb = skb;
171 lp->skb_length = skb->len;
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000172 lp->skb_physaddr = dma_map_single(NULL, skb->data, skb->len,
173 DMA_TO_DEVICE);
Andrew Victord4b77802006-03-24 11:50:17 +0200174
175 /* Set address of the data in the Transmit Address register */
Joachim Eastwoodf8bded32012-10-18 11:01:08 +0000176 macb_writel(lp, TAR, lp->skb_physaddr);
Andrew Victord4b77802006-03-24 11:50:17 +0200177 /* Set length of the packet in the Transmit Control register */
Joachim Eastwoodf8bded32012-10-18 11:01:08 +0000178 macb_writel(lp, TCR, skb->len);
Andrew Victord4b77802006-03-24 11:50:17 +0200179
Andrew Victord4b77802006-03-24 11:50:17 +0200180 } else {
Joachim Eastwooded2b97d2012-11-07 08:14:56 +0000181 netdev_err(dev, "%s called, but device is busy!\n", __func__);
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000182 return NETDEV_TX_BUSY;
Andrew Victord4b77802006-03-24 11:50:17 +0200183 }
184
Patrick McHardy6ed10652009-06-23 06:03:08 +0000185 return NETDEV_TX_OK;
Andrew Victord4b77802006-03-24 11:50:17 +0200186}
187
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000188/* Extract received frame from buffer descriptors and sent to upper layers.
Andrew Victord4b77802006-03-24 11:50:17 +0200189 * (Called from interrupt context)
190 */
191static void at91ether_rx(struct net_device *dev)
192{
Joachim Eastwoodb85008b2012-10-18 11:01:10 +0000193 struct macb *lp = netdev_priv(dev);
Andrew Victord4b77802006-03-24 11:50:17 +0200194 unsigned char *p_recv;
195 struct sk_buff *skb;
196 unsigned int pktlen;
197
Joachim Eastwood04879e52012-10-18 11:01:17 +0000198 while (lp->rx_ring[lp->rx_tail].addr & MACB_BIT(RX_USED)) {
199 p_recv = lp->rx_buffers + lp->rx_tail * MAX_RBUFF_SZ;
200 pktlen = MACB_BF(RX_FRMLEN, lp->rx_ring[lp->rx_tail].ctrl);
Pradeep A Dalvi1d266432012-02-05 02:49:09 +0000201 skb = netdev_alloc_skb(dev, pktlen + 2);
Joachim Eastwood04879e52012-10-18 11:01:17 +0000202 if (skb) {
Andrew Victord4b77802006-03-24 11:50:17 +0200203 skb_reserve(skb, 2);
204 memcpy(skb_put(skb, pktlen), p_recv, pktlen);
205
Andrew Victord4b77802006-03-24 11:50:17 +0200206 skb->protocol = eth_type_trans(skb, dev);
Joachim Eastwood2ea32ee2012-11-07 08:14:54 +0000207 lp->stats.rx_packets++;
208 lp->stats.rx_bytes += pktlen;
Andrew Victord4b77802006-03-24 11:50:17 +0200209 netif_rx(skb);
Joachim Eastwood04879e52012-10-18 11:01:17 +0000210 } else {
Joachim Eastwood2ea32ee2012-11-07 08:14:54 +0000211 lp->stats.rx_dropped++;
Joachim Eastwood04879e52012-10-18 11:01:17 +0000212 netdev_notice(dev, "Memory squeeze, dropping packet.\n");
Andrew Victord4b77802006-03-24 11:50:17 +0200213 }
214
Joachim Eastwood04879e52012-10-18 11:01:17 +0000215 if (lp->rx_ring[lp->rx_tail].ctrl & MACB_BIT(RX_MHASH_MATCH))
Joachim Eastwood2ea32ee2012-11-07 08:14:54 +0000216 lp->stats.multicast++;
Andrew Victord4b77802006-03-24 11:50:17 +0200217
Joachim Eastwood04879e52012-10-18 11:01:17 +0000218 /* reset ownership bit */
219 lp->rx_ring[lp->rx_tail].addr &= ~MACB_BIT(RX_USED);
220
221 /* wrap after last buffer */
222 if (lp->rx_tail == MAX_RX_DESCR - 1)
223 lp->rx_tail = 0;
Andrew Victord4b77802006-03-24 11:50:17 +0200224 else
Joachim Eastwood04879e52012-10-18 11:01:17 +0000225 lp->rx_tail++;
Andrew Victord4b77802006-03-24 11:50:17 +0200226 }
227}
228
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000229/* MAC interrupt handler */
David Howells7d12e782006-10-05 14:55:46 +0100230static irqreturn_t at91ether_interrupt(int irq, void *dev_id)
Andrew Victord4b77802006-03-24 11:50:17 +0200231{
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000232 struct net_device *dev = dev_id;
Joachim Eastwoodb85008b2012-10-18 11:01:10 +0000233 struct macb *lp = netdev_priv(dev);
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000234 u32 intstatus, ctl;
Andrew Victord4b77802006-03-24 11:50:17 +0200235
236 /* MAC Interrupt Status register indicates what interrupts are pending.
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000237 * It is automatically cleared once read.
238 */
Joachim Eastwoodf8bded32012-10-18 11:01:08 +0000239 intstatus = macb_readl(lp, ISR);
Andrew Victord4b77802006-03-24 11:50:17 +0200240
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000241 /* Receive complete */
242 if (intstatus & MACB_BIT(RCOMP))
Andrew Victord4b77802006-03-24 11:50:17 +0200243 at91ether_rx(dev);
244
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000245 /* Transmit complete */
246 if (intstatus & MACB_BIT(TCOMP)) {
247 /* The TCOM bit is set even if the transmission failed */
Joachim Eastwoodbc3bbef2012-10-18 11:01:07 +0000248 if (intstatus & (MACB_BIT(ISR_TUND) | MACB_BIT(ISR_RLE)))
Joachim Eastwood2ea32ee2012-11-07 08:14:54 +0000249 lp->stats.tx_errors++;
Andrew Victord4b77802006-03-24 11:50:17 +0200250
251 if (lp->skb) {
252 dev_kfree_skb_irq(lp->skb);
253 lp->skb = NULL;
254 dma_unmap_single(NULL, lp->skb_physaddr, lp->skb_length, DMA_TO_DEVICE);
Joachim Eastwood2ea32ee2012-11-07 08:14:54 +0000255 lp->stats.tx_packets++;
256 lp->stats.tx_bytes += lp->skb_length;
Andrew Victord4b77802006-03-24 11:50:17 +0200257 }
258 netif_wake_queue(dev);
259 }
260
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000261 /* Work-around for EMAC Errata section 41.3.1 */
Joachim Eastwoodbc3bbef2012-10-18 11:01:07 +0000262 if (intstatus & MACB_BIT(RXUBR)) {
Joachim Eastwoodf8bded32012-10-18 11:01:08 +0000263 ctl = macb_readl(lp, NCR);
264 macb_writel(lp, NCR, ctl & ~MACB_BIT(RE));
265 macb_writel(lp, NCR, ctl | MACB_BIT(RE));
Andrew Victord4b77802006-03-24 11:50:17 +0200266 }
267
Joachim Eastwoodbc3bbef2012-10-18 11:01:07 +0000268 if (intstatus & MACB_BIT(ISR_ROVR))
Joachim Eastwooded2b97d2012-11-07 08:14:56 +0000269 netdev_err(dev, "ROVR error\n");
Andrew Victord4b77802006-03-24 11:50:17 +0200270
271 return IRQ_HANDLED;
272}
273
Andrew Victor51cc2102006-12-05 15:33:05 +0200274#ifdef CONFIG_NET_POLL_CONTROLLER
275static void at91ether_poll_controller(struct net_device *dev)
276{
277 unsigned long flags;
278
279 local_irq_save(flags);
280 at91ether_interrupt(dev->irq, dev);
281 local_irq_restore(flags);
282}
283#endif
284
Alexander Beregalov531c6802009-04-09 17:27:00 +0000285static const struct net_device_ops at91ether_netdev_ops = {
286 .ndo_open = at91ether_open,
287 .ndo_stop = at91ether_close,
288 .ndo_start_xmit = at91ether_start_xmit,
Joachim Eastwood2ea32ee2012-11-07 08:14:54 +0000289 .ndo_get_stats = macb_get_stats,
Joachim Eastwoode0da1f12012-10-18 11:01:15 +0000290 .ndo_set_rx_mode = macb_set_rx_mode,
Joachim Eastwood34232472012-11-07 08:14:53 +0000291 .ndo_set_mac_address = eth_mac_addr,
Joachim Eastwood5e32353d2012-10-18 11:01:14 +0000292 .ndo_do_ioctl = macb_ioctl,
Alexander Beregalov531c6802009-04-09 17:27:00 +0000293 .ndo_validate_addr = eth_validate_addr,
294 .ndo_change_mtu = eth_change_mtu,
295#ifdef CONFIG_NET_POLL_CONTROLLER
296 .ndo_poll_controller = at91ether_poll_controller,
297#endif
298};
299
Jean-Christophe PLAGNIOL-VILLARD96f63602012-11-04 21:34:51 +0000300#if defined(CONFIG_OF)
301static const struct of_device_id at91ether_dt_ids[] = {
302 { .compatible = "cdns,at91rm9200-emac" },
303 { .compatible = "cdns,emac" },
304 { /* sentinel */ }
305};
306
307MODULE_DEVICE_TABLE(of, at91ether_dt_ids);
308
309static int at91ether_get_phy_mode_dt(struct platform_device *pdev)
310{
311 struct device_node *np = pdev->dev.of_node;
312
313 if (np)
314 return of_get_phy_mode(np);
315
316 return -ENODEV;
317}
318
319static int at91ether_get_hwaddr_dt(struct macb *bp)
320{
321 struct device_node *np = bp->pdev->dev.of_node;
322
323 if (np) {
324 const char *mac = of_get_mac_address(np);
325 if (mac) {
326 memcpy(bp->dev->dev_addr, mac, ETH_ALEN);
327 return 0;
328 }
329 }
330
331 return -ENODEV;
332}
333#else
334static int at91ether_get_phy_mode_dt(struct platform_device *pdev)
335{
336 return -ENODEV;
337}
338static int at91ether_get_hwaddr_dt(struct macb *bp)
339{
340 return -ENODEV;
341}
342#endif
343
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000344/* Detect MAC & PHY and perform ethernet interface initialization */
Andrew Victorc5f0f832012-04-26 00:30:42 +0000345static int __init at91ether_probe(struct platform_device *pdev)
346{
347 struct macb_platform_data *board_data = pdev->dev.platform_data;
348 struct resource *regs;
349 struct net_device *dev;
Joachim Eastwood5e32353d2012-10-18 11:01:14 +0000350 struct phy_device *phydev;
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000351 struct pinctrl *pinctrl;
Joachim Eastwoodb85008b2012-10-18 11:01:10 +0000352 struct macb *lp;
Andrew Victorc5f0f832012-04-26 00:30:42 +0000353 int res;
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000354 u32 reg;
Andrew Victorc5f0f832012-04-26 00:30:42 +0000355
356 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
357 if (!regs)
358 return -ENOENT;
359
Jean-Christophe PLAGNIOL-VILLARDdea09242012-11-04 21:34:52 +0000360 pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
361 if (IS_ERR(pinctrl)) {
362 res = PTR_ERR(pinctrl);
363 if (res == -EPROBE_DEFER)
364 return res;
365
366 dev_warn(&pdev->dev, "No pinctrl provided\n");
367 }
368
Joachim Eastwoodb85008b2012-10-18 11:01:10 +0000369 dev = alloc_etherdev(sizeof(struct macb));
Andrew Victorc5f0f832012-04-26 00:30:42 +0000370 if (!dev)
371 return -ENOMEM;
372
373 lp = netdev_priv(dev);
Joachim Eastwood5e32353d2012-10-18 11:01:14 +0000374 lp->pdev = pdev;
375 lp->dev = dev;
Andrew Victorc5f0f832012-04-26 00:30:42 +0000376 spin_lock_init(&lp->lock);
377
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000378 /* physical base address */
379 dev->base_addr = regs->start;
Joachim Eastwood63973462012-10-18 11:01:18 +0000380 lp->regs = devm_ioremap(&pdev->dev, regs->start, resource_size(regs));
Joachim Eastwoodf8bded32012-10-18 11:01:08 +0000381 if (!lp->regs) {
Andrew Victorc5f0f832012-04-26 00:30:42 +0000382 res = -ENOMEM;
383 goto err_free_dev;
384 }
385
386 /* Clock */
Joachim Eastwood63973462012-10-18 11:01:18 +0000387 lp->pclk = devm_clk_get(&pdev->dev, "ether_clk");
Joachim Eastwood54f14e42012-10-18 11:01:11 +0000388 if (IS_ERR(lp->pclk)) {
389 res = PTR_ERR(lp->pclk);
Joachim Eastwood63973462012-10-18 11:01:18 +0000390 goto err_free_dev;
Andrew Victorc5f0f832012-04-26 00:30:42 +0000391 }
Joachim Eastwood54f14e42012-10-18 11:01:11 +0000392 clk_enable(lp->pclk);
Andrew Victorc5f0f832012-04-26 00:30:42 +0000393
394 /* Install the interrupt handler */
395 dev->irq = platform_get_irq(pdev, 0);
Joachim Eastwood63973462012-10-18 11:01:18 +0000396 res = devm_request_irq(&pdev->dev, dev->irq, at91ether_interrupt, 0, dev->name, dev);
397 if (res)
Andrew Victorc5f0f832012-04-26 00:30:42 +0000398 goto err_disable_clock;
Andrew Victorc5f0f832012-04-26 00:30:42 +0000399
Andrew Victorc5f0f832012-04-26 00:30:42 +0000400 ether_setup(dev);
401 dev->netdev_ops = &at91ether_netdev_ops;
Joachim Eastwood5e32353d2012-10-18 11:01:14 +0000402 dev->ethtool_ops = &macb_ethtool_ops;
Andrew Victorc5f0f832012-04-26 00:30:42 +0000403 platform_set_drvdata(pdev, dev);
404 SET_NETDEV_DEV(dev, &pdev->dev);
405
Jean-Christophe PLAGNIOL-VILLARD96f63602012-11-04 21:34:51 +0000406 res = at91ether_get_hwaddr_dt(lp);
407 if (res < 0)
Joachim Eastwood34232472012-11-07 08:14:53 +0000408 macb_get_hwaddr(lp);
Andrew Victorc5f0f832012-04-26 00:30:42 +0000409
Jean-Christophe PLAGNIOL-VILLARD96f63602012-11-04 21:34:51 +0000410 res = at91ether_get_phy_mode_dt(pdev);
411 if (res < 0) {
412 if (board_data && board_data->is_rmii)
413 lp->phy_interface = PHY_INTERFACE_MODE_RMII;
414 else
415 lp->phy_interface = PHY_INTERFACE_MODE_MII;
416 } else {
417 lp->phy_interface = res;
418 }
419
Joachim Eastwoodf8bded32012-10-18 11:01:08 +0000420 macb_writel(lp, NCR, 0);
Andrew Victorc5f0f832012-04-26 00:30:42 +0000421
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000422 reg = MACB_BF(CLK, MACB_CLK_DIV32) | MACB_BIT(BIG);
Jean-Christophe PLAGNIOL-VILLARD96f63602012-11-04 21:34:51 +0000423 if (lp->phy_interface == PHY_INTERFACE_MODE_RMII)
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000424 reg |= MACB_BIT(RM9200_RMII);
425
426 macb_writel(lp, NCFGR, reg);
Andrew Victorc5f0f832012-04-26 00:30:42 +0000427
Andrew Victorc5f0f832012-04-26 00:30:42 +0000428 /* Register the network interface */
429 res = register_netdev(dev);
430 if (res)
Joachim Eastwood63973462012-10-18 11:01:18 +0000431 goto err_disable_clock;
Andrew Victorc5f0f832012-04-26 00:30:42 +0000432
Joachim Eastwood5e32353d2012-10-18 11:01:14 +0000433 if (macb_mii_init(lp) != 0)
434 goto err_out_unregister_netdev;
435
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000436 /* will be enabled in open() */
437 netif_carrier_off(dev);
Andrew Victorc5f0f832012-04-26 00:30:42 +0000438
Joachim Eastwood5e32353d2012-10-18 11:01:14 +0000439 phydev = lp->phy_dev;
440 netdev_info(dev, "attached PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n",
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000441 phydev->drv->name, dev_name(&phydev->dev),
442 phydev->irq);
Andrew Victorc5f0f832012-04-26 00:30:42 +0000443
444 /* Display ethernet banner */
Joachim Eastwooded2b97d2012-11-07 08:14:56 +0000445 netdev_info(dev, "AT91 ethernet at 0x%08lx int=%d (%pM)\n",
446 dev->base_addr, dev->irq, dev->dev_addr);
Andrew Victorc5f0f832012-04-26 00:30:42 +0000447
448 return 0;
449
Joachim Eastwood5e32353d2012-10-18 11:01:14 +0000450err_out_unregister_netdev:
451 unregister_netdev(dev);
Andrew Victorc5f0f832012-04-26 00:30:42 +0000452err_disable_clock:
Joachim Eastwood54f14e42012-10-18 11:01:11 +0000453 clk_disable(lp->pclk);
Andrew Victorc5f0f832012-04-26 00:30:42 +0000454err_free_dev:
455 free_netdev(dev);
456 return res;
Andrew Victord4b77802006-03-24 11:50:17 +0200457}
458
Bill Pemberton37a5b3d2012-12-03 09:23:57 -0500459static int at91ether_remove(struct platform_device *pdev)
Andrew Victord4b77802006-03-24 11:50:17 +0200460{
Andrew Victorc57ee092006-12-05 15:09:16 +0200461 struct net_device *dev = platform_get_drvdata(pdev);
Joachim Eastwoodb85008b2012-10-18 11:01:10 +0000462 struct macb *lp = netdev_priv(dev);
Andrew Victord4b77802006-03-24 11:50:17 +0200463
Joachim Eastwood5e32353d2012-10-18 11:01:14 +0000464 if (lp->phy_dev)
465 phy_disconnect(lp->phy_dev);
David Brownell71527ef2008-10-27 14:11:34 -0700466
Joachim Eastwood5e32353d2012-10-18 11:01:14 +0000467 mdiobus_unregister(lp->mii_bus);
468 kfree(lp->mii_bus->irq);
469 mdiobus_free(lp->mii_bus);
Andrew Victorc57ee092006-12-05 15:09:16 +0200470 unregister_netdev(dev);
Joachim Eastwood5e32353d2012-10-18 11:01:14 +0000471 clk_disable(lp->pclk);
Andrew Victorc57ee092006-12-05 15:09:16 +0200472 free_netdev(dev);
Joachim Eastwood5e32353d2012-10-18 11:01:14 +0000473 platform_set_drvdata(pdev, NULL);
474
Andrew Victord4b77802006-03-24 11:50:17 +0200475 return 0;
476}
477
Andrew Victor00e5edc2006-06-20 12:19:13 +0200478#ifdef CONFIG_PM
Andrew Victor00e5edc2006-06-20 12:19:13 +0200479static int at91ether_suspend(struct platform_device *pdev, pm_message_t mesg)
480{
Andrew Victor00e5edc2006-06-20 12:19:13 +0200481 struct net_device *net_dev = platform_get_drvdata(pdev);
Joachim Eastwoodb85008b2012-10-18 11:01:10 +0000482 struct macb *lp = netdev_priv(net_dev);
Andrew Victor00e5edc2006-06-20 12:19:13 +0200483
484 if (netif_running(net_dev)) {
Andrew Victor00e5edc2006-06-20 12:19:13 +0200485 netif_stop_queue(net_dev);
486 netif_device_detach(net_dev);
487
Joachim Eastwood54f14e42012-10-18 11:01:11 +0000488 clk_disable(lp->pclk);
Andrew Victor00e5edc2006-06-20 12:19:13 +0200489 }
490 return 0;
491}
492
493static int at91ether_resume(struct platform_device *pdev)
494{
Andrew Victor00e5edc2006-06-20 12:19:13 +0200495 struct net_device *net_dev = platform_get_drvdata(pdev);
Joachim Eastwoodb85008b2012-10-18 11:01:10 +0000496 struct macb *lp = netdev_priv(net_dev);
Andrew Victor00e5edc2006-06-20 12:19:13 +0200497
498 if (netif_running(net_dev)) {
Joachim Eastwood54f14e42012-10-18 11:01:11 +0000499 clk_enable(lp->pclk);
Andrew Victor00e5edc2006-06-20 12:19:13 +0200500
501 netif_device_attach(net_dev);
502 netif_start_queue(net_dev);
Andrew Victor00e5edc2006-06-20 12:19:13 +0200503 }
504 return 0;
505}
Andrew Victor00e5edc2006-06-20 12:19:13 +0200506#else
507#define at91ether_suspend NULL
508#define at91ether_resume NULL
509#endif
510
Andrew Victord4b77802006-03-24 11:50:17 +0200511static struct platform_driver at91ether_driver = {
Bill Pemberton37a5b3d2012-12-03 09:23:57 -0500512 .remove = at91ether_remove,
Andrew Victor00e5edc2006-06-20 12:19:13 +0200513 .suspend = at91ether_suspend,
514 .resume = at91ether_resume,
Andrew Victord4b77802006-03-24 11:50:17 +0200515 .driver = {
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000516 .name = "at91_ether",
Andrew Victord4b77802006-03-24 11:50:17 +0200517 .owner = THIS_MODULE,
Jean-Christophe PLAGNIOL-VILLARD96f63602012-11-04 21:34:51 +0000518 .of_match_table = of_match_ptr(at91ether_dt_ids),
Andrew Victord4b77802006-03-24 11:50:17 +0200519 },
520};
521
522static int __init at91ether_init(void)
523{
Uwe Kleine-König78a9c9c2009-07-21 10:11:39 +0000524 return platform_driver_probe(&at91ether_driver, at91ether_probe);
Andrew Victord4b77802006-03-24 11:50:17 +0200525}
526
527static void __exit at91ether_exit(void)
528{
529 platform_driver_unregister(&at91ether_driver);
530}
531
532module_init(at91ether_init)
533module_exit(at91ether_exit)
534
535MODULE_LICENSE("GPL");
536MODULE_DESCRIPTION("AT91RM9200 EMAC Ethernet driver");
537MODULE_AUTHOR("Andrew Victor");
Joachim Eastwood50b5ca12012-11-07 08:14:57 +0000538MODULE_ALIAS("platform:at91_ether");