summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2017-01-11 19:00:03 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2017-01-11 19:00:03 +0100
commit0c3f4d1da2277ac0cb88dc32ac0de48bc241e01f (patch)
treef70c79b0a9a31967d47f51daedcdf096112afc1c /drivers
parent005a81e1730b09a4842ba1336a5e534162c9b2b3 (diff)
parentf4d4b659e44e9689685d6e4e07dccbcfee17397e (diff)
downloadbarebox-0c3f4d1da2277ac0cb88dc32ac0de48bc241e01f.tar.gz
barebox-0c3f4d1da2277ac0cb88dc32ac0de48bc241e01f.tar.xz
Merge branch 'for-next/imx'
Diffstat (limited to 'drivers')
-rw-r--r--drivers/hab/habv4.c7
-rw-r--r--drivers/mci/imx-esdhc.c2
-rw-r--r--drivers/pwm/core.c4
-rw-r--r--drivers/spi/imx_spi.c8
-rw-r--r--drivers/video/imx-ipu-v3/Kconfig4
-rw-r--r--drivers/video/imx-ipu-v3/Makefile1
-rw-r--r--drivers/video/imx-ipu-v3/imx-pd.c118
-rw-r--r--drivers/video/imx-ipu-v3/ipufb.c5
8 files changed, 146 insertions, 3 deletions
diff --git a/drivers/hab/habv4.c b/drivers/hab/habv4.c
index 91dbb7afa3..ae43bdf0e3 100644
--- a/drivers/hab/habv4.c
+++ b/drivers/hab/habv4.c
@@ -27,6 +27,7 @@
#define HABV4_RVT_IMX28 0xffff8af8
#define HABV4_RVT_IMX6_OLD 0x00000094
#define HABV4_RVT_IMX6_NEW 0x00000098
+#define HABV4_RVT_IMX6UL 0x00000100
enum hab_tag {
HAB_TAG_IVT = 0xd1, /* Image Vector Table */
@@ -227,6 +228,10 @@ int imx6_hab_get_status(void)
if (rvt->header.tag == HAB_TAG_RVT)
return habv4_get_status(rvt);
+ rvt = (void *)HABV4_RVT_IMX6UL;
+ if (rvt->header.tag == HAB_TAG_RVT)
+ return habv4_get_status(rvt);
+
pr_err("ERROR - RVT not found!\n");
return -EINVAL;
@@ -237,4 +242,4 @@ int imx28_hab_get_status(void)
const struct habv4_rvt *rvt = (void *)HABV4_RVT_IMX28;
return habv4_get_status(rvt);
-} \ No newline at end of file
+}
diff --git a/drivers/mci/imx-esdhc.c b/drivers/mci/imx-esdhc.c
index 262a904ace..41f0562e3c 100644
--- a/drivers/mci/imx-esdhc.c
+++ b/drivers/mci/imx-esdhc.c
@@ -648,6 +648,8 @@ static __maybe_unused struct of_device_id fsl_esdhc_compatible[] = {
}, {
.compatible = "fsl,imx6sl-usdhc",
}, {
+ .compatible = "fsl,imx6sx-usdhc",
+ }, {
/* sentinel */
}
};
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index 360520195a..ee65619c4e 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -281,6 +281,8 @@ unsigned int pwm_get_duty_cycle(struct pwm_device *pwm)
*/
int pwm_enable(struct pwm_device *pwm)
{
+ pwm->p_enable = 1;
+
if (!test_and_set_bit(FLAG_ENABLED, &pwm->flags))
return pwm->chip->ops->enable(pwm->chip);
@@ -293,6 +295,8 @@ EXPORT_SYMBOL_GPL(pwm_enable);
*/
void pwm_disable(struct pwm_device *pwm)
{
+ pwm->p_enable = 0;
+
if (test_and_clear_bit(FLAG_ENABLED, &pwm->flags))
pwm->chip->ops->disable(pwm->chip);
}
diff --git a/drivers/spi/imx_spi.c b/drivers/spi/imx_spi.c
index 806ca67bda..876699a02d 100644
--- a/drivers/spi/imx_spi.c
+++ b/drivers/spi/imx_spi.c
@@ -348,6 +348,13 @@ static u32 imx_xchg_single(struct spi_device *spi, u32 tx_val)
return imx_spi_maybe_reverse_bits(spi, rx_val);
}
+static void cspi_2_3_init(struct imx_spi *imx)
+{
+ void __iomem *base = imx->regs;
+
+ writel(0, base + CSPI_2_3_CTRL);
+}
+
static void imx_spi_do_transfer(struct spi_device *spi)
{
struct imx_spi *imx = container_of(spi->master, struct imx_spi, master);
@@ -519,6 +526,7 @@ static __maybe_unused struct spi_imx_devtype_data spi_imx_devtype_data_2_3 = {
.chipselect = cspi_2_3_chipselect,
.do_transfer = cspi_2_3_do_transfer,
.xchg_single = cspi_2_3_xchg_single,
+ .init = cspi_2_3_init,
};
static int imx_spi_dt_probe(struct imx_spi *imx)
diff --git a/drivers/video/imx-ipu-v3/Kconfig b/drivers/video/imx-ipu-v3/Kconfig
index b5ee4efb15..d041237314 100644
--- a/drivers/video/imx-ipu-v3/Kconfig
+++ b/drivers/video/imx-ipu-v3/Kconfig
@@ -16,4 +16,8 @@ config DRIVER_VIDEO_IMX_IPUV3_HDMI
depends on DRIVER_VIDEO_EDID
select OFDEVICE
+config DRIVER_VIDEO_IMX_IPUV3_PARALLEL
+ bool "IPUv3 parallel display support"
+ select OFDEVICE
+
endif
diff --git a/drivers/video/imx-ipu-v3/Makefile b/drivers/video/imx-ipu-v3/Makefile
index 2bc0aec5ae..1f6812021e 100644
--- a/drivers/video/imx-ipu-v3/Makefile
+++ b/drivers/video/imx-ipu-v3/Makefile
@@ -3,3 +3,4 @@ obj-$(CONFIG_DRIVER_VIDEO_IMX_IPUV3) += ipu-dp.o ipuv3-plane.o ipufb.o
obj-$(CONFIG_DRIVER_VIDEO_IMX_IPUV3) += ipu-dc.o
obj-$(CONFIG_DRIVER_VIDEO_IMX_IPUV3_LVDS) += imx-ldb.o
obj-$(CONFIG_DRIVER_VIDEO_IMX_IPUV3_HDMI) += imx-hdmi.o
+obj-$(CONFIG_DRIVER_VIDEO_IMX_IPUV3_PARALLEL) += imx-pd.o
diff --git a/drivers/video/imx-ipu-v3/imx-pd.c b/drivers/video/imx-ipu-v3/imx-pd.c
new file mode 100644
index 0000000000..09d8a3ae2a
--- /dev/null
+++ b/drivers/video/imx-ipu-v3/imx-pd.c
@@ -0,0 +1,118 @@
+/*
+ * i.MX drm driver - parallel display implementation
+ *
+ * Copyright (C) 2016 Philippe Leduc
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <common.h>
+#include <fb.h>
+#include <io.h>
+#include <of_graph.h>
+#include <driver.h>
+#include <malloc.h>
+#include <errno.h>
+#include <init.h>
+#include <video/vpl.h>
+#include <video/media-bus-format.h>
+#include <linux/err.h>
+
+#include "imx-ipu-v3.h"
+
+struct imx_pd {
+ struct device_d *dev;
+ struct display_timings *timings;
+ u32 bus_format;
+ struct vpl vpl;
+};
+
+static int imx_pd_ioctl(struct vpl *vpl, unsigned int port,
+ unsigned int cmd, void *data)
+{
+ struct imx_pd *imx_pd = container_of(vpl, struct imx_pd, vpl);
+ struct ipu_di_mode *mode;
+ struct display_timings *timings;
+
+ switch (cmd) {
+ case IMX_IPU_VPL_DI_MODE:
+ mode = data;
+
+ mode->di_clkflags = IPU_DI_CLKMODE_SYNC;
+ mode->bus_format = imx_pd->bus_format;
+ return 0;
+
+ case VPL_GET_VIDEOMODES:
+ timings = data;
+
+ timings->num_modes = imx_pd->timings->num_modes;
+ timings->native_mode = imx_pd->timings->native_mode;
+ timings->modes = imx_pd->timings->modes;
+ timings->edid = NULL;
+ return 0;
+ }
+
+ return 0;
+}
+
+static int imx_pd_probe(struct device_d *dev)
+{
+ struct device_node *node = dev->device_node;
+ struct imx_pd *imx_pd;
+ const char *fmt;
+ int ret;
+
+ imx_pd = xzalloc(sizeof(*imx_pd));
+ imx_pd->dev = dev;
+
+ ret = of_property_read_string(node, "interface-pix-fmt", &fmt);
+ if (!ret) {
+ if (!strcmp(fmt, "rgb24"))
+ imx_pd->bus_format = MEDIA_BUS_FMT_RGB888_1X24;
+ else if (!strcmp(fmt, "rgb565"))
+ imx_pd->bus_format = MEDIA_BUS_FMT_RGB565_1X16;
+ else if (!strcmp(fmt, "bgr666"))
+ imx_pd->bus_format = MEDIA_BUS_FMT_RGB666_1X18;
+ else {
+ dev_err(dev, "invalid interface-pix-fmt\n");
+ return -EINVAL;
+ }
+ }
+
+ imx_pd->timings = of_get_display_timings(node);
+ if (!imx_pd->timings) {
+ dev_err(dev, "No display timings panel found\n");
+ return -EINVAL;
+ }
+
+ imx_pd->vpl.node = node;
+ imx_pd->vpl.ioctl = &imx_pd_ioctl;
+ ret = vpl_register(&imx_pd->vpl);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
+static struct of_device_id imx_pd_dt_ids[] = {
+ { .compatible = "fsl,imx-parallel-display", },
+ { /* sentinel */ }
+};
+
+static struct driver_d imx_pd_driver = {
+ .probe = imx_pd_probe,
+ .of_compatible = imx_pd_dt_ids,
+ .name = "imx-parallel-display",
+};
+device_platform_driver(imx_pd_driver);
+
+MODULE_DESCRIPTION("i.MX Parallel display driver");
+MODULE_AUTHOR("Philippe Leduc");
+MODULE_LICENSE("GPL");
diff --git a/drivers/video/imx-ipu-v3/ipufb.c b/drivers/video/imx-ipu-v3/ipufb.c
index 63024b546d..343f9e5578 100644
--- a/drivers/video/imx-ipu-v3/ipufb.c
+++ b/drivers/video/imx-ipu-v3/ipufb.c
@@ -128,8 +128,9 @@ int ipu_crtc_mode_set(struct ipufb_info *fbi,
if (mode->sync & FB_SYNC_VERT_HIGH_ACT)
sig_cfg.Vsync_pol = 1;
- sig_cfg.enable_pol = 1;
- sig_cfg.clk_pol = 0;
+ sig_cfg.enable_pol = !(mode->display_flags & DISPLAY_FLAGS_DE_LOW);
+ /* Default to driving pixel data on negative clock edges */
+ sig_cfg.clk_pol = !!(mode->display_flags & DISPLAY_FLAGS_PIXDATA_POSEDGE);
sig_cfg.width = mode->xres;
sig_cfg.height = mode->yres;
sig_cfg.h_start_width = mode->left_margin;