Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
06d123e0
Commit
06d123e0
authored
Dec 16, 2011
by
Arnd Bergmann
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'at91/macb' into next/drivers
parents
4966eba0
2839038b
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
129 additions
and
18 deletions
+129
-18
Documentation/devicetree/bindings/net/macb.txt
Documentation/devicetree/bindings/net/macb.txt
+25
-0
arch/arm/boot/dts/at91sam9g20.dtsi
arch/arm/boot/dts/at91sam9g20.dtsi
+7
-0
arch/arm/boot/dts/at91sam9g45.dtsi
arch/arm/boot/dts/at91sam9g45.dtsi
+7
-0
arch/arm/boot/dts/at91sam9m10g45ek.dts
arch/arm/boot/dts/at91sam9m10g45ek.dts
+5
-0
arch/arm/boot/dts/usb_a9g20.dts
arch/arm/boot/dts/usb_a9g20.dts
+5
-0
drivers/net/ethernet/cadence/at91_ether.c
drivers/net/ethernet/cadence/at91_ether.c
+13
-10
drivers/net/ethernet/cadence/macb.c
drivers/net/ethernet/cadence/macb.c
+65
-8
drivers/net/ethernet/cadence/macb.h
drivers/net/ethernet/cadence/macb.h
+2
-0
No files found.
Documentation/devicetree/bindings/net/macb.txt
0 → 100644
View file @
06d123e0
* Cadence MACB/GEM Ethernet controller
Required properties:
- compatible: Should be "cdns,[<chip>-]{macb|gem}"
Use "cdns,at91sam9260-macb" Atmel at91sam9260 and at91sam9263 SoCs.
Use "cdns,at32ap7000-macb" for other 10/100 usage or use the generic form: "cdns,macb".
Use "cnds,pc302-gem" for Picochip picoXcell pc302 and later devices based on
the Cadence GEM, or the generic form: "cdns,gem".
- reg: Address and length of the register set for the device
- interrupts: Should contain macb interrupt
- phy-mode: String, operation mode of the PHY interface.
Supported values are: "mii", "rmii", "gmii", "rgmii".
Optional properties:
- local-mac-address: 6 bytes, mac address
Examples:
macb0: ethernet@fffc4000 {
compatible = "cdns,at32ap7000-macb";
reg = <0xfffc4000 0x4000>;
interrupts = <21>;
phy-mode = "rmii";
local-mac-address = [3a 0e 03 04 05 06];
};
arch/arm/boot/dts/at91sam9g20.dtsi
View file @
06d123e0
...
...
@@ -114,6 +114,13 @@ usart5: serial@fffd8000 {
atmel
,
use
-
dma
-
tx
;
status
=
"disabled"
;
};
macb0
:
ethernet
@
fffc4000
{
compatible
=
"cdns,at32ap7000-macb"
,
"cdns,macb"
;
reg
=
<
0xfffc4000
0x100
>;
interrupts
=
<
21
>;
status
=
"disabled"
;
};
};
};
};
arch/arm/boot/dts/at91sam9g45.dtsi
View file @
06d123e0
...
...
@@ -101,6 +101,13 @@ usart3: serial@fff98000 {
atmel
,
use
-
dma
-
tx
;
status
=
"disabled"
;
};
macb0
:
ethernet
@
fffbc000
{
compatible
=
"cdns,at32ap7000-macb"
,
"cdns,macb"
;
reg
=
<
0xfffbc000
0x100
>;
interrupts
=
<
25
>;
status
=
"disabled"
;
};
};
};
};
arch/arm/boot/dts/at91sam9m10g45ek.dts
View file @
06d123e0
...
...
@@ -30,6 +30,11 @@ dbgu: serial@ffffee00 {
usart1
:
serial
@
fff90000
{
status
=
"okay"
;
};
macb0
:
ethernet
@
fffbc000
{
phy
-
mode
=
"rmii"
;
status
=
"okay"
;
};
};
};
};
arch/arm/boot/dts/usb_a9g20.dts
View file @
06d123e0
...
...
@@ -25,6 +25,11 @@ apb {
dbgu
:
serial
@
fffff200
{
status
=
"okay"
;
};
macb0
:
ethernet
@
fffc4000
{
phy
-
mode
=
"rmii"
;
status
=
"okay"
;
};
};
};
};
drivers/net/ethernet/cadence/at91_ether.c
View file @
06d123e0
...
...
@@ -256,8 +256,7 @@ static void enable_phyirq(struct net_device *dev)
unsigned
int
dsintr
,
irq_number
;
int
status
;
irq_number
=
lp
->
board_data
.
phy_irq_pin
;
if
(
!
irq_number
)
{
if
(
!
gpio_is_valid
(
lp
->
board_data
.
phy_irq_pin
))
{
/*
* PHY doesn't have an IRQ pin (RTL8201, DP83847, AC101L),
* or board does not have it connected.
...
...
@@ -266,6 +265,7 @@ static void enable_phyirq(struct net_device *dev)
return
;
}
irq_number
=
lp
->
board_data
.
phy_irq_pin
;
status
=
request_irq
(
irq_number
,
at91ether_phy_interrupt
,
0
,
dev
->
name
,
dev
);
if
(
status
)
{
printk
(
KERN_ERR
"at91_ether: PHY IRQ %d request failed - status %d!
\n
"
,
irq_number
,
status
);
...
...
@@ -320,8 +320,7 @@ static void disable_phyirq(struct net_device *dev)
unsigned
int
dsintr
;
unsigned
int
irq_number
;
irq_number
=
lp
->
board_data
.
phy_irq_pin
;
if
(
!
irq_number
)
{
if
(
!
gpio_is_valid
(
lp
->
board_data
.
phy_irq_pin
))
{
del_timer_sync
(
&
lp
->
check_timer
);
return
;
}
...
...
@@ -366,6 +365,7 @@ static void disable_phyirq(struct net_device *dev)
disable_mdi
();
spin_unlock_irq
(
&
lp
->
lock
);
irq_number
=
lp
->
board_data
.
phy_irq_pin
;
free_irq
(
irq_number
,
dev
);
/* Free interrupt handler */
}
...
...
@@ -1078,7 +1078,7 @@ static int __init at91ether_setup(unsigned long phy_type, unsigned short phy_add
netif_carrier_off
(
dev
);
/* will be enabled in open() */
/* If board has no PHY IRQ, use a timer to poll the PHY */
if
(
!
lp
->
board_data
.
phy_irq_pin
)
{
if
(
!
gpio_is_valid
(
lp
->
board_data
.
phy_irq_pin
)
)
{
init_timer
(
&
lp
->
check_timer
);
lp
->
check_timer
.
data
=
(
unsigned
long
)
dev
;
lp
->
check_timer
.
function
=
at91ether_check_link
;
...
...
@@ -1170,7 +1170,8 @@ static int __devexit at91ether_remove(struct platform_device *pdev)
struct
net_device
*
dev
=
platform_get_drvdata
(
pdev
);
struct
at91_private
*
lp
=
netdev_priv
(
dev
);
if
(
lp
->
board_data
.
phy_irq_pin
>=
32
)
if
(
gpio_is_valid
(
lp
->
board_data
.
phy_irq_pin
)
&&
lp
->
board_data
.
phy_irq_pin
>=
32
)
gpio_free
(
lp
->
board_data
.
phy_irq_pin
);
unregister_netdev
(
dev
);
...
...
@@ -1189,11 +1190,12 @@ static int at91ether_suspend(struct platform_device *pdev, pm_message_t mesg)
{
struct
net_device
*
net_dev
=
platform_get_drvdata
(
pdev
);
struct
at91_private
*
lp
=
netdev_priv
(
net_dev
);
int
phy_irq
=
lp
->
board_data
.
phy_irq_pin
;
if
(
netif_running
(
net_dev
))
{
if
(
phy_irq
)
if
(
gpio_is_valid
(
lp
->
board_data
.
phy_irq_pin
))
{
int
phy_irq
=
lp
->
board_data
.
phy_irq_pin
;
disable_irq
(
phy_irq
);
}
netif_stop_queue
(
net_dev
);
netif_device_detach
(
net_dev
);
...
...
@@ -1207,7 +1209,6 @@ static int at91ether_resume(struct platform_device *pdev)
{
struct
net_device
*
net_dev
=
platform_get_drvdata
(
pdev
);
struct
at91_private
*
lp
=
netdev_priv
(
net_dev
);
int
phy_irq
=
lp
->
board_data
.
phy_irq_pin
;
if
(
netif_running
(
net_dev
))
{
clk_enable
(
lp
->
ether_clk
);
...
...
@@ -1215,8 +1216,10 @@ static int at91ether_resume(struct platform_device *pdev)
netif_device_attach
(
net_dev
);
netif_start_queue
(
net_dev
);
if
(
phy_irq
)
if
(
gpio_is_valid
(
lp
->
board_data
.
phy_irq_pin
))
{
int
phy_irq
=
lp
->
board_data
.
phy_irq_pin
;
enable_irq
(
phy_irq
);
}
}
return
0
;
}
...
...
drivers/net/ethernet/cadence/macb.c
View file @
06d123e0
...
...
@@ -23,6 +23,8 @@
#include <linux/platform_data/macb.h>
#include <linux/platform_device.h>
#include <linux/phy.h>
#include <linux/of_device.h>
#include <linux/of_net.h>
#include "macb.h"
...
...
@@ -191,7 +193,6 @@ static int macb_mii_probe(struct net_device *dev)
{
struct
macb
*
bp
=
netdev_priv
(
dev
);
struct
phy_device
*
phydev
;
struct
macb_platform_data
*
pdata
;
int
ret
;
phydev
=
phy_find_first
(
bp
->
mii_bus
);
...
...
@@ -200,14 +201,11 @@ static int macb_mii_probe(struct net_device *dev)
return
-
1
;
}
pdata
=
bp
->
pdev
->
dev
.
platform_data
;
/* TODO : add pin_irq */
/* attach the mac to the phy */
ret
=
phy_connect_direct
(
dev
,
phydev
,
&
macb_handle_link_change
,
0
,
pdata
&&
pdata
->
is_rmii
?
PHY_INTERFACE_MODE_RMII
:
PHY_INTERFACE_MODE_MII
);
bp
->
phy_interface
);
if
(
ret
)
{
netdev_err
(
dev
,
"Could not attach to PHY
\n
"
);
return
ret
;
...
...
@@ -1244,6 +1242,52 @@ static const struct net_device_ops macb_netdev_ops = {
#endif
};
#if defined(CONFIG_OF)
static
const
struct
of_device_id
macb_dt_ids
[]
=
{
{
.
compatible
=
"cdns,at32ap7000-macb"
},
{
.
compatible
=
"cdns,at91sam9260-macb"
},
{
.
compatible
=
"cdns,macb"
},
{
.
compatible
=
"cdns,pc302-gem"
},
{
.
compatible
=
"cdns,gem"
},
{
/* sentinel */
}
};
MODULE_DEVICE_TABLE
(
of
,
macb_dt_ids
);
static
int
__devinit
macb_get_phy_mode_dt
(
struct
platform_device
*
pdev
)
{
struct
device_node
*
np
=
pdev
->
dev
.
of_node
;
if
(
np
)
return
of_get_phy_mode
(
np
);
return
-
ENODEV
;
}
static
int
__devinit
macb_get_hwaddr_dt
(
struct
macb
*
bp
)
{
struct
device_node
*
np
=
bp
->
pdev
->
dev
.
of_node
;
if
(
np
)
{
const
char
*
mac
=
of_get_mac_address
(
np
);
if
(
mac
)
{
memcpy
(
bp
->
dev
->
dev_addr
,
mac
,
ETH_ALEN
);
return
0
;
}
}
return
-
ENODEV
;
}
#else
static
int
__devinit
macb_get_phy_mode_dt
(
struct
platform_device
*
pdev
)
{
return
-
ENODEV
;
}
static
int
__devinit
macb_get_hwaddr_dt
(
struct
macb
*
bp
)
{
return
-
ENODEV
;
}
#endif
static
int
__init
macb_probe
(
struct
platform_device
*
pdev
)
{
struct
macb_platform_data
*
pdata
;
...
...
@@ -1318,10 +1362,22 @@ static int __init macb_probe(struct platform_device *pdev)
config
|=
macb_dbw
(
bp
);
macb_writel
(
bp
,
NCFGR
,
config
);
macb_get_hwaddr
(
bp
);
pdata
=
pdev
->
dev
.
platform_data
;
err
=
macb_get_hwaddr_dt
(
bp
);
if
(
err
<
0
)
macb_get_hwaddr
(
bp
);
err
=
macb_get_phy_mode_dt
(
pdev
);
if
(
err
<
0
)
{
pdata
=
pdev
->
dev
.
platform_data
;
if
(
pdata
&&
pdata
->
is_rmii
)
bp
->
phy_interface
=
PHY_INTERFACE_MODE_RMII
;
else
bp
->
phy_interface
=
PHY_INTERFACE_MODE_MII
;
}
else
{
bp
->
phy_interface
=
err
;
}
if
(
pdata
&&
pdata
->
is_rmii
)
if
(
bp
->
phy_interface
==
PHY_INTERFACE_MODE_RMII
)
#if defined(CONFIG_ARCH_AT91)
macb_or_gem_writel
(
bp
,
USRIO
,
(
MACB_BIT
(
RMII
)
|
MACB_BIT
(
CLKEN
)));
...
...
@@ -1444,6 +1500,7 @@ static struct platform_driver macb_driver = {
.
driver
=
{
.
name
=
"macb"
,
.
owner
=
THIS_MODULE
,
.
of_match_table
=
of_match_ptr
(
macb_dt_ids
),
},
};
...
...
drivers/net/ethernet/cadence/macb.h
View file @
06d123e0
...
...
@@ -532,6 +532,8 @@ struct macb {
unsigned
int
link
;
unsigned
int
speed
;
unsigned
int
duplex
;
phy_interface_t
phy_interface
;
};
static
inline
bool
macb_is_gem
(
struct
macb
*
bp
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment