net: ethernet: arc: Add support emac for RK3036

The RK3036's GRFs offset are different with RK3066/RK3188, and need to set
mac TX/RX clock before probe emac.

Signed-off-by: Xing Zheng <zhengxing@rock-chips.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Xing Zheng 2016-01-08 09:35:02 +08:00 committed by David S. Miller
parent f4c9d3ee03
commit af72261f33
2 changed files with 9 additions and 3 deletions

View File

@ -34,9 +34,9 @@ config EMAC_ROCKCHIP
select ARC_EMAC_CORE select ARC_EMAC_CORE
depends on OF_IRQ && OF_NET && REGULATOR && HAS_DMA depends on OF_IRQ && OF_NET && REGULATOR && HAS_DMA
---help--- ---help---
Support for Rockchip RK3066/RK3188 EMAC ethernet controllers. Support for Rockchip RK3036/RK3066/RK3188 EMAC ethernet controllers.
This selects Rockchip SoC glue layer support for the This selects Rockchip SoC glue layer support for the
emac device driver. This driver is used for RK3066/RK3188 emac device driver. This driver is used for RK3036/RK3066/RK3188
EMAC ethernet controller. EMAC ethernet controller.
endif # NET_VENDOR_ARC endif # NET_VENDOR_ARC

View File

@ -67,6 +67,11 @@ static void emac_rockchip_set_mac_speed(void *priv, unsigned int speed)
pr_err("unable to apply speed %u to grf (%d)\n", speed, err); pr_err("unable to apply speed %u to grf (%d)\n", speed, err);
} }
static const struct emac_rockchip_soc_data emac_rk3036_emac_data = {
.grf_offset = 0x140, .grf_mode_offset = 8,
.grf_speed_offset = 9, .need_div_macclk = 1,
};
static const struct emac_rockchip_soc_data emac_rk3066_emac_data = { static const struct emac_rockchip_soc_data emac_rk3066_emac_data = {
.grf_offset = 0x154, .grf_mode_offset = 0, .grf_offset = 0x154, .grf_mode_offset = 0,
.grf_speed_offset = 1, .need_div_macclk = 0, .grf_speed_offset = 1, .need_div_macclk = 0,
@ -78,6 +83,7 @@ static const struct emac_rockchip_soc_data emac_rk3188_emac_data = {
}; };
static const struct of_device_id emac_rockchip_dt_ids[] = { static const struct of_device_id emac_rockchip_dt_ids[] = {
{ .compatible = "rockchip,rk3036-emac", .data = &emac_rk3036_emac_data },
{ .compatible = "rockchip,rk3066-emac", .data = &emac_rk3066_emac_data }, { .compatible = "rockchip,rk3066-emac", .data = &emac_rk3066_emac_data },
{ .compatible = "rockchip,rk3188-emac", .data = &emac_rk3188_emac_data }, { .compatible = "rockchip,rk3188-emac", .data = &emac_rk3188_emac_data },
{ /* Sentinel */ } { /* Sentinel */ }
@ -110,7 +116,7 @@ static int emac_rockchip_probe(struct platform_device *pdev)
interface = of_get_phy_mode(dev->of_node); interface = of_get_phy_mode(dev->of_node);
/* RK3066 and RK3188 SoCs only support RMII */ /* RK3036/RK3066/RK3188 SoCs only support RMII */
if (interface != PHY_INTERFACE_MODE_RMII) { if (interface != PHY_INTERFACE_MODE_RMII) {
dev_err(dev, "unsupported phy interface mode %d\n", interface); dev_err(dev, "unsupported phy interface mode %d\n", interface);
err = -ENOTSUPP; err = -ENOTSUPP;