svn commit: r323410 - in stable/11/sys: arm/freescale/imx dev/ffec
Ian Lepore
ian at FreeBSD.org
Mon Sep 11 01:01:02 UTC 2017
Author: ian
Date: Mon Sep 11 01:01:00 2017
New Revision: 323410
URL: https://svnweb.freebsd.org/changeset/base/323410
Log:
MFC r316664, r316670, r316972, r316996, r317033:
Add imx6ul support (applies to all files).
Add code/constants for detecting imx6ul (ultralite) chips, a species of
imx6 based on a single cortex-a7 core. Other changes to imx6 drivers
and support code are needed to fully support the imx6ul.
if_ffec: Add imx6ul SoC support, and get the PHY number from the FDT data.
If there is no phy-handle property, fall back to using MII_PHY_ANY.
This still doesn't support an mdio bus with multiple PHYs on it, or the
possibility that the PHY being used by this instance of ffec is on the
mdio bus of some other instance (which is now a possibility with imx6ul).
Adding that support will require changes in fdt_get_phyaddr(), which is
currently making some assumptions that don't work with modern fdt data.
Modified:
stable/11/sys/arm/freescale/imx/imx6_machdep.c
stable/11/sys/arm/freescale/imx/imx6_usbphy.c
stable/11/sys/arm/freescale/imx/imx_gpt.c
stable/11/sys/arm/freescale/imx/imx_iomux.c
stable/11/sys/arm/freescale/imx/imx_machdep.h
stable/11/sys/dev/ffec/if_ffec.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/arm/freescale/imx/imx6_machdep.c
==============================================================================
--- stable/11/sys/arm/freescale/imx/imx6_machdep.c Mon Sep 11 00:55:18 2017 (r323409)
+++ stable/11/sys/arm/freescale/imx/imx6_machdep.c Mon Sep 11 01:01:00 2017 (r323410)
@@ -99,8 +99,8 @@ fix_fdt_interrupt_data(void)
gicnode = OF_finddevice("/soc/interrupt-controller at 00a01000");
if (gicnode == -1) {
gicnode = OF_finddevice("/interrupt-controller at 00a01000");
- if (gicnode == -1)
- return;
+ if (gicnode == -1)
+ return;
}
gicxref = OF_xref_from_node(gicnode);
@@ -233,6 +233,7 @@ u_int imx_soc_type()
#define HWSOC_MX6DL 0x61
#define HWSOC_MX6SOLO 0x62
#define HWSOC_MX6Q 0x63
+#define HWSOC_MX6UL 0x64
if (soctype != 0)
return (soctype);
@@ -271,6 +272,9 @@ u_int imx_soc_type()
case HWSOC_MX6Q :
soctype = IMXSOC_6Q;
break;
+ case HWSOC_MX6UL:
+ soctype = IMXSOC_6UL;
+ break;
default:
printf("imx_soc_type: Don't understand hwsoc 0x%02x, "
"digprog 0x%08x; assuming IMXSOC_6Q\n", hwsoc, digprog);
@@ -317,3 +321,4 @@ static platform_method_t imx6_methods[] = {
FDT_PLATFORM_DEF2(imx6, imx6s, "i.MX6 Solo", 0, "fsl,imx6s", 0);
FDT_PLATFORM_DEF2(imx6, imx6d, "i.MX6 Dual", 0, "fsl,imx6dl", 0);
FDT_PLATFORM_DEF2(imx6, imx6q, "i.MX6 Quad", 0, "fsl,imx6q", 0);
+FDT_PLATFORM_DEF2(imx6, imx6ul, "i.MX6 UltraLite", 0, "fsl,imx6ul", 0);
Modified: stable/11/sys/arm/freescale/imx/imx6_usbphy.c
==============================================================================
--- stable/11/sys/arm/freescale/imx/imx6_usbphy.c Mon Sep 11 00:55:18 2017 (r323409)
+++ stable/11/sys/arm/freescale/imx/imx6_usbphy.c Mon Sep 11 01:01:00 2017 (r323410)
@@ -68,6 +68,12 @@ struct usbphy_softc {
u_int phy_num;
};
+static struct ofw_compat_data compat_data[] = {
+ {"fsl,imx6q-usbphy", true},
+ {"fsl,imx6ul-usbphy", true},
+ {NULL, false}
+};
+
static int
usbphy_detach(device_t dev)
{
@@ -167,7 +173,7 @@ usbphy_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (ofw_bus_is_compatible(dev, "fsl,imx6q-usbphy") == 0)
+ if (!ofw_bus_search_compatible(dev, compat_data)->ocd_data)
return (ENXIO);
device_set_desc(dev, "Freescale i.MX6 USB PHY");
Modified: stable/11/sys/arm/freescale/imx/imx_gpt.c
==============================================================================
--- stable/11/sys/arm/freescale/imx/imx_gpt.c Mon Sep 11 00:55:18 2017 (r323409)
+++ stable/11/sys/arm/freescale/imx/imx_gpt.c Mon Sep 11 01:01:00 2017 (r323410)
@@ -112,6 +112,7 @@ static struct resource_spec imx_gpt_spec[] = {
static struct ofw_compat_data compat_data[] = {
{"fsl,imx6dl-gpt", 1},
{"fsl,imx6q-gpt", 1},
+ {"fsl,imx6ul-gpt", 1},
{"fsl,imx53-gpt", 1},
{"fsl,imx51-gpt", 1},
{"fsl,imx31-gpt", 1},
@@ -125,6 +126,15 @@ imx_gpt_probe(device_t dev)
{
if (!ofw_bus_status_okay(dev))
+ return (ENXIO);
+
+ /*
+ * We only support a single unit, because the only thing this driver
+ * does with the complex timer hardware is supply the system
+ * timecounter and eventtimer. There is nothing useful we can do with
+ * the additional device instances that exist in some chips.
+ */
+ if (device_get_unit(dev) > 0)
return (ENXIO);
if (ofw_bus_search_compatible(dev, compat_data)->ocd_data != 0) {
Modified: stable/11/sys/arm/freescale/imx/imx_iomux.c
==============================================================================
--- stable/11/sys/arm/freescale/imx/imx_iomux.c Mon Sep 11 00:55:18 2017 (r323409)
+++ stable/11/sys/arm/freescale/imx/imx_iomux.c Mon Sep 11 01:01:00 2017 (r323410)
@@ -80,6 +80,7 @@ static struct ofw_compat_data compat_data[] = {
{"fsl,imx6dl-iomuxc", true},
{"fsl,imx6q-iomuxc", true},
{"fsl,imx6sl-iomuxc", true},
+ {"fsl,imx6ul-iomuxc", true},
{"fsl,imx6sx-iomuxc", true},
{"fsl,imx53-iomuxc", true},
{"fsl,imx51-iomuxc", true},
@@ -223,6 +224,9 @@ iomux_attach(device_t dev)
case IMXSOC_6SL:
case IMXSOC_6Q:
sc->last_gpreg = 13;
+ break;
+ case IMXSOC_6UL:
+ sc->last_gpreg = 14;
break;
default:
device_printf(dev, "Unknown SoC type\n");
Modified: stable/11/sys/arm/freescale/imx/imx_machdep.h
==============================================================================
--- stable/11/sys/arm/freescale/imx/imx_machdep.h Mon Sep 11 00:55:18 2017 (r323409)
+++ stable/11/sys/arm/freescale/imx/imx_machdep.h Mon Sep 11 01:01:00 2017 (r323410)
@@ -55,6 +55,7 @@ void imx_wdog_init_last_reset(vm_offset_t _wdsr_phys);
#define IMXSOC_6DL 0x61000000
#define IMXSOC_6S 0x62000000
#define IMXSOC_6Q 0x63000000
+#define IMXSOC_6UL 0x64000000
#define IMXSOC_FAMSHIFT 28
u_int imx_soc_type(void);
Modified: stable/11/sys/dev/ffec/if_ffec.c
==============================================================================
--- stable/11/sys/dev/ffec/if_ffec.c Mon Sep 11 00:55:18 2017 (r323409)
+++ stable/11/sys/dev/ffec/if_ffec.c Mon Sep 11 01:01:00 2017 (r323410)
@@ -78,6 +78,7 @@ __FBSDID("$FreeBSD$");
#include <net/if_var.h>
#include <net/if_vlan_var.h>
+#include <dev/fdt/fdt_common.h>
#include <dev/ffec/if_ffecreg.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
@@ -113,6 +114,7 @@ static struct ofw_compat_data compat_data[] = {
{"fsl,imx51-fec", FECTYPE_GENERIC},
{"fsl,imx53-fec", FECTYPE_IMX53},
{"fsl,imx6q-fec", FECTYPE_IMX6 | FECFLAG_GBE},
+ {"fsl,imx6ul-fec", FECTYPE_IMX6},
{"fsl,mvf600-fec", FECTYPE_MVF},
{"fsl,mvf-fec", FECTYPE_MVF},
{NULL, FECTYPE_NONE},
@@ -1424,8 +1426,9 @@ ffec_attach(device_t dev)
struct ffec_softc *sc;
struct ifnet *ifp = NULL;
struct mbuf *m;
+ void *dummy;
phandle_t ofw_node;
- int error, rid;
+ int error, phynum, rid;
uint8_t eaddr[ETHER_ADDR_LEN];
char phy_conn_name[32];
uint32_t idx, mscr;
@@ -1695,8 +1698,11 @@ ffec_attach(device_t dev)
ffec_miigasket_setup(sc);
/* Attach the mii driver. */
+ if (fdt_get_phyaddr(ofw_node, dev, &phynum, &dummy) != 0) {
+ phynum = MII_PHY_ANY;
+ }
error = mii_attach(dev, &sc->miibus, ifp, ffec_media_change,
- ffec_media_status, BMSR_DEFCAPMASK, MII_PHY_ANY, MII_OFFSET_ANY,
+ ffec_media_status, BMSR_DEFCAPMASK, phynum, MII_OFFSET_ANY,
(sc->fectype & FECTYPE_MVF) ? MIIF_FORCEANEG : 0);
if (error != 0) {
device_printf(dev, "PHY attach failed\n");
More information about the svn-src-stable
mailing list