[PATCH 4/4] bsp/beagle: Ported Beagle pinmux driver to RTEMS

G S Niteesh Babu niteesh.gs at gmail.com
Sat Mar 13 11:02:03 UTC 2021


The following files have been ported
1) ti_pinmux.c
2) ti_pinmux.h
3) am335x_scm_padconf.c
4) am335x_scm_padconf.h

Update #3784
---
 bsps/arm/beagle/start/bspstart.c              |  31 +++++
 bsps/include/arm/ti/ti_pinmux.h               |   9 +-
 .../sys/arm/ti/am335x/am335x_scm_padconf.c    |   4 +
 bsps/shared/freebsd/sys/arm/ti/ti_pinmux.c    | 115 +++++++++++++++++-
 spec/build/bsps/obj.yml                       |   6 +
 5 files changed, 163 insertions(+), 2 deletions(-)

diff --git a/bsps/arm/beagle/start/bspstart.c b/bsps/arm/beagle/start/bspstart.c
index 0a6f1b4a64..a0736294c9 100644
--- a/bsps/arm/beagle/start/bspstart.c
+++ b/bsps/arm/beagle/start/bspstart.c
@@ -20,6 +20,8 @@
 #include <bsp/i2c.h>
 #include <rtems/sysinit.h>
 #include "bsp-soc-detect.h"
+#include <arm/ti/ti_pinmux.h>
+#include <ofw/ofw.h>
 
 #include "bspdebug.h"
 
@@ -55,6 +57,29 @@ uint32_t bsp_fdt_map_intr(const uint32_t *intr, size_t icells)
   return intr[0];
 }
 
+static void traverse_fdt_nodes( phandle_t node )
+{
+
+  for (node = rtems_ofw_child(node); node != 0; node = rtems_ofw_peer(node)) {
+    traverse_fdt_nodes(node);
+
+    if (!rtems_ofw_node_status(node))
+      continue;
+
+    /*
+     * Put all driver initialization functions here
+     */
+    beagle_pinmux_init(node);
+  }
+}
+
+static void bbb_drivers_initialize(void)
+{
+  phandle_t node = rtems_ofw_peer(0);
+
+  traverse_fdt_nodes(node);
+}
+
 static void bbb_i2c_0_initialize(void)
 {
   int err;
@@ -73,3 +98,9 @@ RTEMS_SYSINIT_ITEM(
   RTEMS_SYSINIT_LAST,
   RTEMS_SYSINIT_ORDER_LAST_BUT_5
 );
+
+RTEMS_SYSINIT_ITEM(
+	bbb_drivers_initialize,
+	RTEMS_SYSINIT_BSP_PRE_DRIVERS,
+	RTEMS_SYSINIT_ORDER_LAST
+);
diff --git a/bsps/include/arm/ti/ti_pinmux.h b/bsps/include/arm/ti/ti_pinmux.h
index 52409df61d..208e327c2b 100644
--- a/bsps/include/arm/ti/ti_pinmux.h
+++ b/bsps/include/arm/ti/ti_pinmux.h
@@ -42,6 +42,9 @@
  */
 #ifndef _TI_PINMUX_H_
 #define _TI_PINMUX_H_
+#ifdef __rtems__
+#include <ofw/ofw.h>
+#endif /* __rtems__ */
 
 struct ti_pinmux_padconf {
 	uint16_t    reg_off;
@@ -63,12 +66,16 @@ struct ti_pinmux_device {
 	const struct ti_pinmux_padconf	*padconf;
 };
 
+#ifndef __rtems__
 struct ti_pinmux_softc {
 	device_t		sc_dev;
 	struct resource *	sc_res[4];
 	bus_space_tag_t		sc_bst;
 	bus_space_handle_t	sc_bsh;
 };
+#else /* __rtems__ */
+void beagle_pinmux_init(phandle_t node);
+#endif /* __rtems__ */
 
 int ti_pinmux_padconf_set(const char *padname, const char *muxmode, 
     unsigned int state);
@@ -77,4 +84,4 @@ int ti_pinmux_padconf_get(const char *padname, const char **muxmode,
 int ti_pinmux_padconf_set_gpiomode(uint32_t gpio, unsigned int state);
 int ti_pinmux_padconf_get_gpiomode(uint32_t gpio, unsigned int *state);
 
-#endif /* _TI_SCM_H_ */
\ No newline at end of file
+#endif /* _TI_SCM_H_ */
diff --git a/bsps/shared/freebsd/sys/arm/ti/am335x/am335x_scm_padconf.c b/bsps/shared/freebsd/sys/arm/ti/am335x/am335x_scm_padconf.c
index 44a36a754b..e5cb1801e1 100644
--- a/bsps/shared/freebsd/sys/arm/ti/am335x/am335x_scm_padconf.c
+++ b/bsps/shared/freebsd/sys/arm/ti/am335x/am335x_scm_padconf.c
@@ -27,9 +27,12 @@
  */
 
 #include <sys/cdefs.h>
+#ifndef __rtems__
 __FBSDID("$FreeBSD$");
+#endif /* __rtems__ */
 
 #include <sys/param.h>
+#ifndef __rtems__
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/module.h>
@@ -45,6 +48,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/gpio.h>
 
 #include <arm/ti/tivar.h>
+#endif /* __rtems__ */
 #include <arm/ti/ti_pinmux.h>
 
 #include <arm/ti/am335x/am335x_scm_padconf.h>
diff --git a/bsps/shared/freebsd/sys/arm/ti/ti_pinmux.c b/bsps/shared/freebsd/sys/arm/ti/ti_pinmux.c
index 7adbcbb365..cec30d2cc5 100644
--- a/bsps/shared/freebsd/sys/arm/ti/ti_pinmux.c
+++ b/bsps/shared/freebsd/sys/arm/ti/ti_pinmux.c
@@ -34,9 +34,12 @@
  * Exposes pinmux module to pinctrl-compatible interface
  */
 #include <sys/cdefs.h>
+#ifndef __rtems__
 __FBSDID("$FreeBSD$");
+#endif /* __rtems__ */
 
 #include <sys/param.h>
+#ifndef __rtems__
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/module.h>
@@ -55,22 +58,52 @@ __FBSDID("$FreeBSD$");
 #include <dev/fdt/fdt_pinctrl.h>
 
 #include <arm/ti/omap4/omap4_scm_padconf.h>
+#else /* __rtems__ */
+#include <ofw/ofw_compat.h>
+#endif /* __rtems__ */
 #include <arm/ti/am335x/am335x_scm_padconf.h>
 #include <arm/ti/ti_cpuid.h>
+#ifndef __rtems__
 #include "ti_pinmux.h"
+#else /* __rtems__ */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <libfdt.h>
+#include <rtems/bspIo.h>
+#include <rtems/sysinit.h>
+#include <arm/ti/ti_pinmux.h>
+#endif /* __rtems__ */
 
 struct pincfg {
 	uint32_t reg;
 	uint32_t conf;
 };
 
+#ifndef __rtems__
 static struct resource_spec ti_pinmux_res_spec[] = {
 	{ SYS_RES_MEMORY,	0,	RF_ACTIVE },	/* Control memory window */
 	{ -1, 0 }
 };
+#endif /* __rtems__ */
+
+#ifdef __rtems__
+struct ti_pinmux_softc {
+#ifndef __rtems__
+	device_t		sc_dev;
+	struct resource *	sc_res[4];
+	bus_space_tag_t		sc_bst;
+	bus_space_handle_t	sc_bsh;
+#else /* __rtems__ */
+	int			sc_bst;
+	uintptr_t		sc_bsh;
+#endif /* __rtems__ */
+};
+#endif /* __rtems__ */
 
 static struct ti_pinmux_softc *ti_pinmux_sc;
 
+#ifndef __rtems__
 #define	ti_pinmux_read_2(sc, reg)		\
     bus_space_read_2((sc)->sc_bst, (sc)->sc_bsh, (reg))
 #define	ti_pinmux_write_2(sc, reg, val)		\
@@ -79,6 +112,19 @@ static struct ti_pinmux_softc *ti_pinmux_sc;
     bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, (reg))
 #define	ti_pinmux_write_4(sc, reg, val)		\
     bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, (reg), (val))
+#else /* __rtems__ */
+static uint16_t
+ti_pinmux_read_2(struct ti_pinmux_softc *sc, uintptr_t ofs) {
+	uintptr_t bsh = sc->sc_bsh;
+	return *(uint16_t volatile *)(bsh + ofs);
+}
+static void
+ti_pinmux_write_2(struct ti_pinmux_softc *sc, uintptr_t ofs, uint16_t val) {
+	uintptr_t bsh = sc->sc_bsh;
+	uint16_t volatile *bsp = (uint16_t volatile *)(bsh + ofs);
+	*bsp = val;
+}
+#endif /* __rtems__ */
 
 
 /**
@@ -149,16 +195,22 @@ ti_pinmux_padconf_set_internal(struct ti_pinmux_softc *sc,
 
 	/* couldn't find the mux mode */
 	if (mode >= 8) {
+#ifndef __rtems__
 		printf("Invalid mode \"%s\"\n", muxmode);
+#else /* __rtems__ */
+		printk("Invalid mode \"%s\"\n", muxmode);
+#endif /* __rtems__ */
 		return (EINVAL);
 	}
 
 	/* set the mux mode */
 	reg_val |= (uint16_t)(mode & ti_pinmux_dev->padconf_muxmode_mask);
 
+#ifndef __rtems__
 	if (bootverbose)
 		device_printf(sc->sc_dev, "setting internal %x for %s\n",
 		    reg_val, muxmode);
+#endif /* __rtems__ */
 	/* write the register value (16-bit writes) */
 	ti_pinmux_write_2(sc, padconf->reg_off, reg_val);
 
@@ -331,14 +383,20 @@ ti_pinmux_padconf_get_gpiomode(uint32_t gpio, unsigned int *state)
 }
 
 static int
+#ifndef __rtems__
 ti_pinmux_configure_pins(device_t dev, phandle_t cfgxref)
+#else /* __rtems__ */
+ti_pinmux_configure_pins(struct ti_pinmux_softc *sc, phandle_t cfgxref)
+#endif /* __rtems__ */
 {
 	struct pincfg *cfgtuples, *cfg;
 	phandle_t cfgnode;
 	int i, ntuples;
+#ifndef __rtems__
 	static struct ti_pinmux_softc *sc;
 
 	sc = device_get_softc(dev);
+#endif /* __rtems__ */
 	cfgnode = OF_node_from_xref(cfgxref);
 	ntuples = OF_getencprop_alloc_multi(cfgnode, "pinctrl-single,pins",
 	    sizeof(*cfgtuples), (void **)&cfgtuples);
@@ -350,12 +408,14 @@ ti_pinmux_configure_pins(device_t dev, phandle_t cfgxref)
 		return (0); /* Empty property is not an error. */
 
 	for (i = 0, cfg = cfgtuples; i < ntuples; i++, cfg++) {
+#ifndef __rtems__
 		if (bootverbose) {
 			char name[32];
 			OF_getprop(cfgnode, "name", &name, sizeof(name));
 			printf("%16s: muxreg 0x%04x muxval 0x%02x\n",
 			    name, cfg->reg, cfg->conf);
 		}
+#endif /* __rtems__ */
 
 		/* write the register value (16-bit writes) */
 		ti_pinmux_write_2(sc, cfg->reg, cfg->conf);
@@ -370,6 +430,7 @@ ti_pinmux_configure_pins(device_t dev, phandle_t cfgxref)
  * Device part of OMAP SCM driver
  */
 
+#ifndef __rtems__
 static int
 ti_pinmux_probe(device_t dev)
 {
@@ -404,7 +465,27 @@ ti_pinmux_probe(device_t dev)
 	device_set_desc(dev, "TI Pinmux Module");
 	return (BUS_PROBE_DEFAULT);
 }
+#endif /* __rtems__ */
+
+static void
+beagle_pinctrl_configure_children(struct ti_pinmux_softc *sc, phandle_t parent)
+{
+	phandle_t node;
+	int len;
+	uint32_t phandle;
+
+	for (node = OF_child(parent); node != 0; node = OF_peer(node)) {
+		if (rtems_ofw_node_status(node)) {
+			beagle_pinctrl_configure_children(sc, node);
+			len = OF_getencprop(node, "pinctrl-0", &phandle, sizeof(phandle));
+			if (len == sizeof(phandle)) {
+				ti_pinmux_configure_pins(sc, phandle);
+			}
+		}
+	}
+}
 
+#ifndef __rtems__
 /**
  *	ti_pinmux_attach - attaches the pinmux to the simplebus
  *	@dev: new device
@@ -440,7 +521,38 @@ ti_pinmux_attach(device_t dev)
 
 	return (0);
 }
+#endif
+
+void
+beagle_pinmux_init(phandle_t node)
+{
+	static struct ti_pinmux_softc pinmux_softc;
+	rtems_ofw_memory_area reg;
+	int rv;
+
+	if (!rtems_ofw_is_node_compatible(node, "pinctrl-single"))
+		return ;
+
+	switch (ti_chip()) {
+	case CHIP_AM335X:
+		ti_pinmux_dev = &ti_am335x_pinmux_dev;
+		break;
+	default:
+		printk("Unknown CPU in pinmux\n");
+		return ;
+	}
+
+	rv = rtems_ofw_get_reg(node, &reg, sizeof(reg));
+	if (rv == -1) {
+		printk("pinmux_init: rtems_ofw_get_reg failed %d\n", rv);
+		return ;
+	}
+	pinmux_softc.sc_bsh = reg.start;
+
+	beagle_pinctrl_configure_children(&pinmux_softc, OF_peer(0));
+}
 
+#ifndef __rtems__
 static device_method_t ti_pinmux_methods[] = {
 	DEVMETHOD(device_probe,		ti_pinmux_probe),
 	DEVMETHOD(device_attach,	ti_pinmux_attach),
@@ -458,4 +570,5 @@ static driver_t ti_pinmux_driver = {
 
 static devclass_t ti_pinmux_devclass;
 
-DRIVER_MODULE(ti_pinmux, simplebus, ti_pinmux_driver, ti_pinmux_devclass, 0, 0);
\ No newline at end of file
+DRIVER_MODULE(ti_pinmux, simplebus, ti_pinmux_driver, ti_pinmux_devclass, 0, 0);
+#endif /* __rtems__ */
diff --git a/spec/build/bsps/obj.yml b/spec/build/bsps/obj.yml
index 6d2bef84d8..906d9aadc0 100644
--- a/spec/build/bsps/obj.yml
+++ b/spec/build/bsps/obj.yml
@@ -60,6 +60,10 @@ install:
   source:
   - bsps/include/rtems/zilog/z8036.h
   - bsps/include/rtems/zilog/z8530.h
+- destination: ${BSP_INCLUDEDIR}/arm/ti
+  source:
+  - bsps/include/arm/ti/ti_pinmux.h
+  - bsps/include/arm/ti/ti_cpuid.h
 links:
 - role: build-dependency
   uid: objmpci
@@ -101,4 +105,6 @@ source:
 - bsps/shared/ofw/ofw.c
 - bsps/shared/rtems-version.c
 - bsps/shared/start/bootcard.c
+- bsps/shared/freebsd/sys/arm/ti/ti_pinmux.c
+- bsps/shared/freebsd/sys/arm/ti/am335x/am335x_scm_padconf.c
 type: build
-- 
2.17.1



More information about the devel mailing list