Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/conf i.MX support merged into GENERIC kernel.
details: https://anonhg.NetBSD.org/src/rev/2774a347336c
branches: trunk
changeset: 972224:2774a347336c
user: hkenken <hkenken%NetBSD.org@localhost>
date: Wed May 20 09:18:25 2020 +0000
description:
i.MX support merged into GENERIC kernel.
diffstat:
sys/arch/arm/imx/fdt/files.imx6 | 21 +-
sys/arch/arm/imx/fdt/imx6_dwhdmi.c | 285 +++++++++++++++++++++++++++++++++++++
sys/arch/arm/imx/fdt/imx6_pwm.c | 142 ++++++++++++++++++
sys/arch/arm/imx/fdt/imx6_spi.c | 6 +-
sys/arch/arm/imx/imxuart.c | 10 +-
sys/arch/evbarm/conf/GENERIC | 21 ++-
sys/arch/evbarm/conf/IMX | 140 ------------------
sys/arch/evbarm/conf/files.generic | 3 +-
sys/arch/evbarm/conf/files.imx | 20 --
sys/arch/evbarm/conf/mk.imx | 34 ----
sys/arch/evbarm/conf/std.imx | 32 ----
sys/conf/files | 4 +-
12 files changed, 470 insertions(+), 248 deletions(-)
diffs (truncated from 992 to 300 lines):
diff -r 7d902d47a0d8 -r 2774a347336c sys/arch/arm/imx/fdt/files.imx6
--- a/sys/arch/arm/imx/fdt/files.imx6 Wed May 20 08:15:26 2020 +0000
+++ b/sys/arch/arm/imx/fdt/files.imx6 Wed May 20 09:18:25 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: files.imx6,v 1.8 2020/01/15 01:09:56 jmcneill Exp $
+# $NetBSD: files.imx6,v 1.9 2020/05/20 09:18:25 hkenken Exp $
#
# Configuration info for the Freescale i.MX6
#
@@ -10,12 +10,11 @@
defflag opt_soc.h SOC_IMX6QDL: SOC_IMX
# Clock
-device imxccm : clk
+device imxccm: clk
attach imxccm at fdt
file arch/arm/imx/imx6_ccm.c imxccm
file arch/arm/imx/fdt/imx6_clk.c imxccm
-
# Common FDT clock framework
define imx_ccm
file arch/arm/imx/fdt/imx_ccm.c imx_ccm
@@ -51,7 +50,7 @@
file arch/arm/imx/fdt/imx6_gpio.c imxgpio
# UART
-device imxuart { } : bus_space_generic
+device imxuart: tty
attach imxuart at fdt with imx6_com
file arch/arm/imx/imxuart.c imxuart needs-flag
file arch/arm/imx/fdt/imx6_com.c imx6_com needs-flag
@@ -84,7 +83,6 @@
attach imx8mqusbphy at fdt
file arch/arm/imx/fdt/imx8mq_usbphy.c imx8mqusbphy
-
# SDMMC
attach sdhc at fdt with imx6_sdhc
file arch/arm/imx/fdt/imx6_sdhc.c imx6_sdhc
@@ -102,9 +100,18 @@
file arch/arm/imx/fdt/imx6_i2c.c imxi2c
# SPI bus controller
-device imxspi : spibus
+device imxspi: spibus
attach imxspi at fdt with imxspi_fdt
-file arch/arm/imx/imxspi.c imxspi
+file arch/arm/imx/imxspi.c imxspi
file arch/arm/imx/fdt/imx6_spi.c imxspi_fdt
defparam opt_imxspi.h IMXSPINSLAVES
+# PWM
+device imxpwm: pwm
+attach imxpwm at fdt with imxpwm_fdt
+file arch/arm/imx/imxpwm.c imxpwm
+file arch/arm/imx/fdt/imx6_pwm.c imxpwm_fdt
+
+# HDMI TX (Designware based)
+attach dwhdmi at fdt with imx6_dwhdmi
+file arch/arm/imx/fdt/imx6_dwhdmi.c imx6_dwhdmi
diff -r 7d902d47a0d8 -r 2774a347336c sys/arch/arm/imx/fdt/imx6_dwhdmi.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/arm/imx/fdt/imx6_dwhdmi.c Wed May 20 09:18:25 2020 +0000
@@ -0,0 +1,285 @@
+/* $NetBSD: imx6_dwhdmi.c,v 1.1 2020/05/20 09:18:25 hkenken Exp $ */
+/*-
+ * Copyright (c) 2020 Genetec Corporation. All rights reserved.
+ * Written by Hashimoto Kenichi for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: imx6_dwhdmi.c,v 1.1 2020/05/20 09:18:25 hkenken Exp $");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/device.h>
+#include <sys/intr.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/conf.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_crtc_helper.h>
+
+#include <dev/fdt/fdtvar.h>
+#include <dev/fdt/fdt_port.h>
+#include <dev/fdt/syscon.h>
+
+#include <dev/ic/dw_hdmi.h>
+
+static const struct dwhdmi_mpll_config imx6_dwhdmi_mpll_config[] = {
+ { 45250, 0x01e0, 0x0000, 0x091c },
+ { 92500, 0x0072, 0x0001, 0x06dc },
+ { 148500, 0x0051, 0x0002, 0x091c },
+ { 216000, 0x00a0, 0x000a, 0x06dc },
+ { 0, 0x0000, 0x0000, 0x0000 },
+};
+
+static const struct dwhdmi_phy_config imx6_dwhdmi_phy_config[] = {
+ { 216000, 0x800d, 0x000a, 0x01ad },
+ { 0, 0x0000, 0x0000, 0x0000 }
+};
+
+enum {
+ DWHDMI_PORT_INPUT = 0,
+ DWHDMI_PORT_OUTPUT = 1,
+};
+
+static const char * const compatible[] = {
+ "fsl,imx6dl-hdmi",
+ "fsl,imx6q-hdmi",
+ NULL
+};
+
+struct imx6_dwhdmi_softc {
+ struct dwhdmi_softc sc_base;
+ int sc_phandle;
+
+ struct fdt_device_ports sc_ports;
+ struct drm_display_mode sc_curmode;
+ struct drm_encoder sc_encoder;
+
+ bool sc_activated;
+};
+
+#define to_imx6_dwhdmi_softc(x) container_of(x, struct imx6_dwhdmi_softc, sc_base)
+#define to_imx6_dwhdmi_encoder(x) container_of(x, struct imx6_dwhdmi_softc, sc_encoder)
+
+static bool
+imx6_dwhdmi_encoder_mode_fixup(struct drm_encoder *encoder,
+ const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode)
+{
+ return true;
+}
+
+static void
+imx6_dwhdmi_encoder_mode_set(struct drm_encoder *encoder,
+ struct drm_display_mode *mode, struct drm_display_mode *adjusted)
+{
+}
+
+static void
+imx6_dwhdmi_encoder_enable(struct drm_encoder *encoder)
+{
+}
+
+static void
+imx6_dwhdmi_encoder_disable(struct drm_encoder *encoder)
+{
+}
+
+static void
+imx6_dwhdmi_encoder_prepare(struct drm_encoder *encoder)
+{
+}
+
+static void
+imx6_dwhdmi_encoder_commit(struct drm_encoder *encoder)
+{
+}
+
+static const struct drm_encoder_funcs imx6_dwhdmi_encoder_funcs = {
+ .destroy = drm_encoder_cleanup,
+};
+
+static const struct drm_encoder_helper_funcs imx6_dwhdmi_encoder_helper_funcs = {
+ .prepare = imx6_dwhdmi_encoder_prepare,
+ .mode_fixup = imx6_dwhdmi_encoder_mode_fixup,
+ .mode_set = imx6_dwhdmi_encoder_mode_set,
+ .enable = imx6_dwhdmi_encoder_enable,
+ .disable = imx6_dwhdmi_encoder_disable,
+ .commit = imx6_dwhdmi_encoder_commit,
+};
+
+static int
+imx6_dwhdmi_ep_activate(device_t dev, struct fdt_endpoint *ep, bool activate)
+{
+ struct imx6_dwhdmi_softc * const sc = device_private(dev);
+ struct fdt_endpoint *in_ep = fdt_endpoint_remote(ep);
+ struct fdt_endpoint *out_ep, *out_rep;
+ struct drm_crtc *crtc;
+ int error;
+
+ if (sc->sc_activated != false) {
+ return 0;
+ }
+
+ if (!activate)
+ return EINVAL;
+
+ if (fdt_endpoint_port_index(ep) != DWHDMI_PORT_INPUT)
+ return EINVAL;
+
+ switch (fdt_endpoint_type(in_ep)) {
+ case EP_DRM_CRTC:
+ crtc = fdt_endpoint_get_data(in_ep);
+ break;
+ default:
+ crtc = NULL;
+ break;
+ }
+
+ if (crtc == NULL)
+ return EINVAL;
+
+ sc->sc_encoder.possible_crtcs = 3; // 1U << drm_crtc_index(crtc); /* XXX */
+ drm_encoder_init(crtc->dev, &sc->sc_encoder, &imx6_dwhdmi_encoder_funcs,
+ DRM_MODE_ENCODER_TMDS);
+ drm_encoder_helper_add(&sc->sc_encoder, &imx6_dwhdmi_encoder_helper_funcs);
+
+ sc->sc_base.sc_connector.base.connector_type = DRM_MODE_CONNECTOR_HDMIA;
+ error = dwhdmi_bind(&sc->sc_base, &sc->sc_encoder);
+ if (error != 0)
+ return error;
+ sc->sc_activated = true;
+
+ out_ep = fdt_endpoint_get_from_index(&sc->sc_ports, DWHDMI_PORT_OUTPUT, 0);
+ if (out_ep != NULL) {
+ /* Ignore downstream connectors, we have our own. */
+ out_rep = fdt_endpoint_remote(out_ep);
+ if (out_rep != NULL && fdt_endpoint_type(out_rep) == EP_DRM_CONNECTOR)
+ return 0;
+
+ error = fdt_endpoint_activate(out_ep, activate);
+ if (error != 0)
+ return error;
+ }
+
+ return 0;
+}
+
+static void *
+imx6_dwhdmi_ep_get_data(device_t dev, struct fdt_endpoint *ep)
+{
+ struct imx6_dwhdmi_softc * const sc = device_private(dev);
+
+ return &sc->sc_encoder;
+}
+
+static audio_dai_tag_t
+imx6_dwhdmi_dai_get_tag(device_t dev, const void *data, size_t len)
+{
+ struct imx6_dwhdmi_softc * const sc = device_private(dev);
+
+ if (len != 4)
+ return NULL;
+
+ return &sc->sc_base.sc_dai;
+}
+
+static struct fdtbus_dai_controller_func imx6_dwhdmi_dai_funcs = {
+ .get_tag = imx6_dwhdmi_dai_get_tag
+};
+
+static int
+imx6_dwhdmi_match(device_t parent, cfdata_t cf, void *aux)
+{
+ struct fdt_attach_args * const faa = aux;
+
+ return of_match_compatible(faa->faa_phandle, compatible);
+}
+
+static void
+imx6_dwhdmi_attach(device_t parent, device_t self, void *aux)
+{
+ struct imx6_dwhdmi_softc * const sc = device_private(self);
+ struct fdt_attach_args * const faa = aux;
+ const int phandle = faa->faa_phandle;
+ bus_addr_t addr;
+ bus_size_t size;
+
+ if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) {
+ aprint_error(": couldn't get registers\n");
+ return;
+ }
+
+ /* Required */
+ if (fdtbus_clock_enable(phandle, "iahb", true) != 0) {
Home |
Main Index |
Thread Index |
Old Index