Skip to content

Commit 40c79ce

Browse files
Wei Fangdavem330
authored andcommitted
net: fec: add stop mode support for imx8 platform
The current driver support stop mode by calling machine api. The patch add dts support to set GPR register for stop request. imx8mq enter stop/exit stop mode by setting GPR bit, which can be accessed by A core. imx8qm enter stop/exit stop mode by calling IMX_SC ipc APIs that communicate with M core ipc service, and the M core set the related GPR bit at last. Signed-off-by: Wei Fang <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e26c258 commit 40c79ce

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

drivers/net/ethernet/freescale/fec.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
#include <linux/net_tstamp.h>
1919
#include <linux/ptp_clock_kernel.h>
2020
#include <linux/timecounter.h>
21+
#include <dt-bindings/firmware/imx/rsrc.h>
22+
#include <linux/firmware/imx/sci.h>
2123

2224
#if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
2325
defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_ARM) || \
@@ -641,6 +643,8 @@ struct fec_enet_private {
641643
u8 at_inc_corr;
642644
} ptp_saved_state;
643645

646+
struct imx_sc_ipc *ipc_handle;
647+
644648
u64 ethtool_stats[];
645649
};
646650

drivers/net/ethernet/freescale/fec_main.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,6 +1181,34 @@ fec_restart(struct net_device *ndev)
11811181

11821182
}
11831183

1184+
static int fec_enet_ipc_handle_init(struct fec_enet_private *fep)
1185+
{
1186+
if (!(of_machine_is_compatible("fsl,imx8qm") ||
1187+
of_machine_is_compatible("fsl,imx8qxp") ||
1188+
of_machine_is_compatible("fsl,imx8dxl")))
1189+
return 0;
1190+
1191+
return imx_scu_get_handle(&fep->ipc_handle);
1192+
}
1193+
1194+
static void fec_enet_ipg_stop_set(struct fec_enet_private *fep, bool enabled)
1195+
{
1196+
struct device_node *np = fep->pdev->dev.of_node;
1197+
u32 rsrc_id, val;
1198+
int idx;
1199+
1200+
if (!np || !fep->ipc_handle)
1201+
return;
1202+
1203+
idx = of_alias_get_id(np, "ethernet");
1204+
if (idx < 0)
1205+
idx = 0;
1206+
rsrc_id = idx ? IMX_SC_R_ENET_1 : IMX_SC_R_ENET_0;
1207+
1208+
val = enabled ? 1 : 0;
1209+
imx_sc_misc_set_control(fep->ipc_handle, rsrc_id, IMX_SC_C_IPG_STOP, val);
1210+
}
1211+
11841212
static void fec_enet_stop_mode(struct fec_enet_private *fep, bool enabled)
11851213
{
11861214
struct fec_platform_data *pdata = fep->pdev->dev.platform_data;
@@ -1196,6 +1224,8 @@ static void fec_enet_stop_mode(struct fec_enet_private *fep, bool enabled)
11961224
BIT(stop_gpr->bit), 0);
11971225
} else if (pdata && pdata->sleep_mode_enable) {
11981226
pdata->sleep_mode_enable(enabled);
1227+
} else {
1228+
fec_enet_ipg_stop_set(fep, enabled);
11991229
}
12001230
}
12011231

@@ -3851,6 +3881,10 @@ fec_probe(struct platform_device *pdev)
38513881
!of_property_read_bool(np, "fsl,err006687-workaround-present"))
38523882
fep->quirks |= FEC_QUIRK_ERR006687;
38533883

3884+
ret = fec_enet_ipc_handle_init(fep);
3885+
if (ret)
3886+
goto failed_ipc_init;
3887+
38543888
if (of_get_property(np, "fsl,magic-packet", NULL))
38553889
fep->wol_flag |= FEC_WOL_HAS_MAGIC_PACKET;
38563890

@@ -4048,6 +4082,7 @@ fec_probe(struct platform_device *pdev)
40484082
of_phy_deregister_fixed_link(np);
40494083
of_node_put(phy_node);
40504084
failed_stop_mode:
4085+
failed_ipc_init:
40514086
failed_phy:
40524087
dev_id--;
40534088
failed_ioremap:

0 commit comments

Comments
 (0)