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 <w...@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
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to