diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2017-01-11 19:00:03 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2017-01-11 19:00:03 +0100 |
commit | 0c3f4d1da2277ac0cb88dc32ac0de48bc241e01f (patch) | |
tree | f70c79b0a9a31967d47f51daedcdf096112afc1c /drivers | |
parent | 005a81e1730b09a4842ba1336a5e534162c9b2b3 (diff) | |
parent | f4d4b659e44e9689685d6e4e07dccbcfee17397e (diff) | |
download | barebox-0c3f4d1da2277ac0cb88dc32ac0de48bc241e01f.tar.gz barebox-0c3f4d1da2277ac0cb88dc32ac0de48bc241e01f.tar.xz |
Merge branch 'for-next/imx'
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/hab/habv4.c | 7 | ||||
-rw-r--r-- | drivers/mci/imx-esdhc.c | 2 | ||||
-rw-r--r-- | drivers/pwm/core.c | 4 | ||||
-rw-r--r-- | drivers/spi/imx_spi.c | 8 | ||||
-rw-r--r-- | drivers/video/imx-ipu-v3/Kconfig | 4 | ||||
-rw-r--r-- | drivers/video/imx-ipu-v3/Makefile | 1 | ||||
-rw-r--r-- | drivers/video/imx-ipu-v3/imx-pd.c | 118 | ||||
-rw-r--r-- | drivers/video/imx-ipu-v3/ipufb.c | 5 |
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; |