svn commit: r291405 - in head/sys: arm/samsung/exynos boot/kshim boot/usb

Zbigniew Bodek zbb at FreeBSD.org
Fri Nov 27 18:22:07 UTC 2015


Author: zbb
Date: Fri Nov 27 18:22:04 2015
New Revision: 291405
URL: https://svnweb.freebsd.org/changeset/base/291405

Log:
  Add support for exynos5_ehci in loader
  
  Create new driver which initializes Arndale PHY and calls ehci_init
  
  Reviewed by:   hselasky
  Submitted by:  Wojciech Macek <wma at semihalf.com>
  Obtained from: Semihalf
  Sponsored by:  Juniper Networks Inc.
  Differential Revision: https://reviews.freebsd.org/D4192

Modified:
  head/sys/arm/samsung/exynos/exynos5_combiner.c
  head/sys/arm/samsung/exynos/exynos5_ehci.c
  head/sys/arm/samsung/exynos/exynos5_pad.c
  head/sys/boot/kshim/bsd_global.h
  head/sys/boot/kshim/bsd_kernel.c
  head/sys/boot/kshim/bsd_kernel.h
  head/sys/boot/usb/usbcore.mk

Modified: head/sys/arm/samsung/exynos/exynos5_combiner.c
==============================================================================
--- head/sys/arm/samsung/exynos/exynos5_combiner.c	Fri Nov 27 18:20:21 2015	(r291404)
+++ head/sys/arm/samsung/exynos/exynos5_combiner.c	Fri Nov 27 18:22:04 2015	(r291405)
@@ -28,7 +28,9 @@
  * Samsung Exynos 5 Interrupt Combiner
  * Chapter 7, Exynos 5 Dual User's Manual Public Rev 1.00
  */
-
+#ifdef USB_GLOBAL_INCLUDE_FILE
+#include USB_GLOBAL_INCLUDE_FILE
+#else
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
@@ -50,6 +52,7 @@ __FBSDID("$FreeBSD$");
 #include <machine/bus.h>
 #include <machine/cpu.h>
 #include <machine/intr.h>
+#endif
 
 #include <arm/samsung/exynos/exynos5_common.h>
 #include <arm/samsung/exynos/exynos5_combiner.h>

Modified: head/sys/arm/samsung/exynos/exynos5_ehci.c
==============================================================================
--- head/sys/arm/samsung/exynos/exynos5_ehci.c	Fri Nov 27 18:20:21 2015	(r291404)
+++ head/sys/arm/samsung/exynos/exynos5_ehci.c	Fri Nov 27 18:22:04 2015	(r291405)
@@ -24,6 +24,9 @@
  * SUCH DAMAGE.
  */
 
+#ifdef USB_GLOBAL_INCLUDE_FILE
+#include USB_GLOBAL_INCLUDE_FILE
+#else
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
@@ -59,6 +62,7 @@ __FBSDID("$FreeBSD$");
 #include "gpio_if.h"
 
 #include "opt_platform.h"
+#endif
 
 /* GPIO control */
 #define	GPIO_OUTPUT	1

Modified: head/sys/arm/samsung/exynos/exynos5_pad.c
==============================================================================
--- head/sys/arm/samsung/exynos/exynos5_pad.c	Fri Nov 27 18:20:21 2015	(r291404)
+++ head/sys/arm/samsung/exynos/exynos5_pad.c	Fri Nov 27 18:22:04 2015	(r291405)
@@ -28,7 +28,9 @@
  * Samsung Exynos 5 Pad Control
  * Chapter 4, Exynos 5 Dual User's Manual Public Rev 1.00
  */
-
+#ifdef USB_GLOBAL_INCLUDE_FILE
+#include USB_GLOBAL_INCLUDE_FILE
+#else
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
@@ -55,6 +57,7 @@ __FBSDID("$FreeBSD$");
 #include <machine/intr.h>
 
 #include "gpio_if.h"
+#endif
 
 #include <arm/samsung/exynos/exynos5_combiner.h>
 #include <arm/samsung/exynos/exynos5_pad.h>

Modified: head/sys/boot/kshim/bsd_global.h
==============================================================================
--- head/sys/boot/kshim/bsd_global.h	Fri Nov 27 18:20:21 2015	(r291404)
+++ head/sys/boot/kshim/bsd_global.h	Fri Nov 27 18:22:04 2015	(r291405)
@@ -29,6 +29,8 @@
 
 #include <bsd_kernel.h>
 
+#include <sys/gpio.h>
+
 #define	USB_DEBUG_VAR usb_debug
 #include <dev/usb/usb_freebsd_loader.h>
 #include <dev/usb/usb_endian.h>
@@ -59,6 +61,8 @@
 #include <dev/usb/usb_generic.h>
 #include <dev/usb/quirk/usb_quirk.h>
 #include <dev/usb/template/usb_template.h>
+#include <dev/usb/controller/ehci.h>
+#include <dev/usb/controller/ehcireg.h>
 
 extern struct usb_process usb_process[USB_PROC_MAX];
 

Modified: head/sys/boot/kshim/bsd_kernel.c
==============================================================================
--- head/sys/boot/kshim/bsd_kernel.c	Fri Nov 27 18:20:21 2015	(r291404)
+++ head/sys/boot/kshim/bsd_kernel.c	Fri Nov 27 18:22:04 2015	(r291405)
@@ -35,6 +35,10 @@ static device_t usb_pci_root;
  *------------------------------------------------------------------------*/
 
 struct mtx Giant;
+int (*bus_alloc_resource_any_cb)(struct resource *res, device_t dev,
+    int type, int *rid, unsigned int flags);
+int (*ofw_bus_status_ok_cb)(device_t dev);
+int (*ofw_bus_is_compatible_cb)(device_t dev, char *name);
 
 static void
 mtx_system_init(void *arg)
@@ -43,6 +47,146 @@ mtx_system_init(void *arg)
 }
 SYSINIT(mtx_system_init, SI_SUB_LOCK, SI_ORDER_MIDDLE, mtx_system_init, NULL);
 
+struct resource *
+bus_alloc_resource_any(device_t dev, int type, int *rid, unsigned int flags)
+{
+	struct resource *res;
+	int ret = EINVAL;
+
+	res = malloc(sizeof(*res), XXX, XXX);
+	if (res == NULL)
+		return (NULL);
+
+	res->__r_i = malloc(sizeof(struct resource_i), XXX, XXX);
+	if (res->__r_i == NULL) {
+		free(res, XXX);
+		return (NULL);
+	}
+
+	if (bus_alloc_resource_any_cb != NULL)
+		ret = (*bus_alloc_resource_any_cb)(res, dev, type, rid, flags);
+	if (ret == 0)
+		return (res);
+
+	free(res->__r_i, XXX);
+	free(res, XXX);
+	return (NULL);
+}
+
+int
+bus_alloc_resources(device_t dev, struct resource_spec *rs,
+    struct resource **res)
+{
+	int i;
+
+	for (i = 0; rs[i].type != -1; i++)
+		res[i] = NULL;
+	for (i = 0; rs[i].type != -1; i++) {
+		res[i] = bus_alloc_resource_any(dev,
+		    rs[i].type, &rs[i].rid, rs[i].flags);
+		if (res[i] == NULL && !(rs[i].flags & RF_OPTIONAL)) {
+			bus_release_resources(dev, rs, res);
+			return (ENXIO);
+		}
+	}
+	return (0);
+}
+
+void
+bus_release_resources(device_t dev, const struct resource_spec *rs,
+    struct resource **res)
+{
+	int i;
+
+	for (i = 0; rs[i].type != -1; i++)
+		if (res[i] != NULL) {
+			bus_release_resource(
+			    dev, rs[i].type, rs[i].rid, res[i]);
+			res[i] = NULL;
+		}
+}
+
+int
+bus_setup_intr(device_t dev, struct resource *r, int flags,
+    driver_filter_t filter, driver_intr_t handler, void *arg, void **cookiep)
+{
+
+	dev->dev_irq_filter = filter;
+	dev->dev_irq_fn = handler;
+	dev->dev_irq_arg = arg;
+
+	return (0);
+}
+
+int
+bus_teardown_intr(device_t dev, struct resource *r, void *cookie)
+{
+
+	dev->dev_irq_filter = NULL;
+	dev->dev_irq_fn = NULL;
+	dev->dev_irq_arg = NULL;
+
+	return (0);
+}
+
+int
+bus_release_resource(device_t dev, int type, int rid, struct resource *r)
+{
+	/* Resource releasing is not supported */
+	return (EINVAL);
+}
+
+int
+bus_generic_attach(device_t dev)
+{
+	device_t child;
+
+	TAILQ_FOREACH(child, &dev->dev_children, dev_link) {
+		device_probe_and_attach(child);
+	}
+
+	return (0);
+}
+
+bus_space_tag_t
+rman_get_bustag(struct resource *r)
+{
+
+	return (r->r_bustag);
+}
+
+bus_space_handle_t
+rman_get_bushandle(struct resource *r)
+{
+
+	return (r->r_bushandle);
+}
+
+u_long
+rman_get_size(struct resource *r)
+{
+
+	return (r->__r_i->r_end - r->__r_i->r_start + 1);
+}
+
+int
+ofw_bus_status_okay(device_t dev)
+{
+	if (ofw_bus_status_ok_cb == NULL)
+		return (0);
+
+	return ((*ofw_bus_status_ok_cb)(dev));
+}
+
+int
+ofw_bus_is_compatible(device_t dev, char *name)
+{
+	if (ofw_bus_is_compatible_cb == NULL)
+		return (0);
+
+	return ((*ofw_bus_is_compatible_cb)(dev, name));
+}
+
 void
 mtx_init(struct mtx *mtx, const char *name, const char *type, int opt)
 {
@@ -873,7 +1017,7 @@ devclass_find(const char *classname)
 	const struct module_data *mod;
 
 	TAILQ_FOREACH(mod, &module_head, entry) {
-		if (devclass_equal(mod->mod_name, classname))
+		if (devclass_equal(mod->driver->name, classname))
 			return (mod->devclass_pp[0]);
 	}
 	return (NULL);

Modified: head/sys/boot/kshim/bsd_kernel.h
==============================================================================
--- head/sys/boot/kshim/bsd_kernel.h	Fri Nov 27 18:20:21 2015	(r291404)
+++ head/sys/boot/kshim/bsd_kernel.h	Fri Nov 27 18:22:04 2015	(r291405)
@@ -109,6 +109,7 @@ SYSINIT_ENTRY(uniq##_entry, "sysuninit",
 #define	WITNESS_WARN(...)
 #define	cold 0
 #define	BUS_PROBE_GENERIC 0
+#define	BUS_PROBE_DEFAULT (-20)
 #define	CALLOUT_RETURNUNLOCKED 0x1
 #undef ffs
 #define	ffs(x) __builtin_ffs(x)
@@ -138,6 +139,10 @@ SYSINIT_ENTRY(uniq##_entry, "sysuninit",
   (((usb_handle_request_t *)(device_get_method(dev, "usb_handle_request")))(dev,## __VA_ARGS__))
 #define	USB_TAKE_CONTROLLER(dev, ...) \
   (((usb_take_controller_t *)(device_get_method(dev, "usb_take_controller")))(dev,## __VA_ARGS__))
+#define	GPIO_PIN_SET(dev, ...) \
+  (((gpio_pin_set_t *)(device_get_method(dev, "gpio_pin_set")))(dev,## __VA_ARGS__))
+#define	GPIO_PIN_SETFLAGS(dev, ...) \
+  (((gpio_pin_setflags_t *)(device_get_method(dev, "gpio_pin_setflags")))(dev,## __VA_ARGS__))
 
 enum {
 	SI_SUB_DUMMY = 0x0000000,
@@ -302,6 +307,8 @@ typedef int device_resume_t (device_t de
 typedef int device_shutdown_t (device_t dev);
 typedef int device_probe_t (device_t dev);
 typedef int device_suspend_t (device_t dev);
+typedef int gpio_pin_set_t (device_t dev, uint32_t, unsigned int);
+typedef int gpio_pin_setflags_t (device_t dev, uint32_t, uint32_t);
 
 typedef int bus_child_location_str_t (device_t parent, device_t child, char *buf, size_t buflen);
 typedef int bus_child_pnpinfo_str_t (device_t parent, device_t child, char *buf, size_t buflen);
@@ -498,4 +505,78 @@ struct selinfo {
 extern const void *sysinit_data[];
 extern const void *sysuninit_data[];
 
+/* Resources */
+
+enum intr_type {
+	INTR_TYPE_TTY = 1,
+	INTR_TYPE_BIO = 2,
+	INTR_TYPE_NET = 4,
+	INTR_TYPE_CAM = 8,
+	INTR_TYPE_MISC = 16,
+	INTR_TYPE_CLK = 32,
+	INTR_TYPE_AV = 64,
+	INTR_EXCL = 256,		/* exclusive interrupt */
+	INTR_MPSAFE = 512,		/* this interrupt is SMP safe */
+	INTR_ENTROPY = 1024,		/* this interrupt provides entropy */
+	INTR_MD1 = 4096,		/* flag reserved for MD use */
+	INTR_MD2 = 8192,		/* flag reserved for MD use */
+	INTR_MD3 = 16384,		/* flag reserved for MD use */
+	INTR_MD4 = 32768		/* flag reserved for MD use */
+};
+
+struct resource_i {
+	u_long		r_start;	/* index of the first entry in this resource */
+	u_long		r_end;		/* index of the last entry (inclusive) */
+};
+
+struct resource {
+	struct resource_i	*__r_i;
+	bus_space_tag_t		r_bustag; /* bus_space tag */
+	bus_space_handle_t	r_bushandle;	/* bus_space handle */
+};
+
+struct resource_spec {
+	int	type;
+	int	rid;
+	int	flags;
+};
+
+#define	SYS_RES_IRQ	1	/* interrupt lines */
+#define	SYS_RES_DRQ	2	/* isa dma lines */
+#define	SYS_RES_MEMORY	3	/* i/o memory */
+#define	SYS_RES_IOPORT	4	/* i/o ports */
+
+#define	RF_ALLOCATED	0x0001	/* resource has been reserved */
+#define	RF_ACTIVE	0x0002	/* resource allocation has been activated */
+#define	RF_SHAREABLE	0x0004	/* resource permits contemporaneous sharing */
+#define	RF_SPARE1	0x0008
+#define	RF_SPARE2	0x0010
+#define	RF_FIRSTSHARE	0x0020	/* first in sharing list */
+#define	RF_PREFETCHABLE	0x0040	/* resource is prefetchable */
+#define	RF_OPTIONAL	0x0080	/* for bus_alloc_resources() */
+
+int bus_alloc_resources(device_t, struct resource_spec *, struct resource **);
+int bus_release_resource(device_t, int, int, struct resource *);
+void bus_release_resources(device_t, const struct resource_spec *,
+    struct resource **);
+struct resource *bus_alloc_resource_any(device_t, int, int *, unsigned int);
+int bus_generic_attach(device_t);
+bus_space_tag_t rman_get_bustag(struct resource *);
+bus_space_handle_t rman_get_bushandle(struct resource *);
+u_long rman_get_size(struct resource *);
+int bus_setup_intr(device_t, struct resource *, int, driver_filter_t,
+    driver_intr_t, void *, void **);
+int bus_teardown_intr(device_t, struct resource *, void *);
+int ofw_bus_status_okay(device_t);
+int ofw_bus_is_compatible(device_t, char *);
+
+extern int (*bus_alloc_resource_any_cb)(struct resource *res, device_t dev,
+    int type, int *rid, unsigned int flags);
+extern int (*ofw_bus_status_ok_cb)(device_t dev);
+extern int (*ofw_bus_is_compatible_cb)(device_t dev, char *name);
+
+#ifndef strlcpy
+#define	strlcpy(d,s,n) snprintf((d),(n),"%s",(s))
+#endif
+
 #endif					/* _BSD_KERNEL_H_ */

Modified: head/sys/boot/usb/usbcore.mk
==============================================================================
--- head/sys/boot/usb/usbcore.mk	Fri Nov 27 18:20:21 2015	(r291404)
+++ head/sys/boot/usb/usbcore.mk	Fri Nov 27 18:22:04 2015	(r291405)
@@ -34,6 +34,12 @@
 USBCOREDIR:=	${.PARSEDIR}
 S=${USBCOREDIR}/../..
 
+MACHDEP_DIRS=
+
+.if defined(HAVE_EXYNOS_EHCI)
+MACHDEP_DIRS+=	${S}/arm/samsung/exynos
+.endif
+
 .PATH: \
 	${USBCOREDIR} \
 	${USBCOREDIR}/storage \
@@ -41,7 +47,8 @@ S=${USBCOREDIR}/../..
 	${S}/dev/usb/controller \
 	${S}/dev/usb/serial \
 	${S}/dev/usb/storage \
-	${S}/dev/usb/template
+	${S}/dev/usb/template \
+	${MACHDEP_DIRS}
 .undef S
 
 USB_POOL_SIZE?=	131072
@@ -91,6 +98,14 @@ CFLAGS += -DUSB_PCI_PROBE_LIST="\"ehci\"
 KSRCS+=	ehci.c
 .endif
 
+.if defined(HAVE_EXYNOS_EHCI)
+CFLAGS += -DUSB_PCI_PROBE_LIST="\"combiner\", \"pad\", \"ehci\""
+KSRCS+=	ehci.c
+KSRCS+=	exynos5_combiner.c
+KSRCS+=	exynos5_pad.c
+KSRCS+=	exynos5_ehci.c
+.endif
+
 .if defined(HAVE_OHCI)
 CFLAGS += -DUSB_PCI_PROBE_LIST="\"ohci\""
 KSRCS+=	ohci.c


More information about the svn-src-head mailing list