linux/drivers/gpu/drm/imx/imx-tve.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * i.MX drm driver - Television Encoder (TVEv2)
   4 *
   5 * Copyright (C) 2013 Philipp Zabel, Pengutronix
   6 */
   7
   8#include <linux/clk-provider.h>
   9#include <linux/clk.h>
  10#include <linux/component.h>
  11#include <linux/i2c.h>
  12#include <linux/module.h>
  13#include <linux/platform_device.h>
  14#include <linux/regmap.h>
  15#include <linux/regulator/consumer.h>
  16#include <linux/spinlock.h>
  17#include <linux/videodev2.h>
  18
  19#include <video/imx-ipu-v3.h>
  20
  21#include <drm/drm_atomic_helper.h>
  22#include <drm/drm_fb_helper.h>
  23#include <drm/drm_probe_helper.h>
  24#include <drm/drm_simple_kms_helper.h>
  25
  26#include "imx-drm.h"
  27
  28#define TVE_COM_CONF_REG        0x00
  29#define TVE_TVDAC0_CONT_REG     0x28
  30#define TVE_TVDAC1_CONT_REG     0x2c
  31#define TVE_TVDAC2_CONT_REG     0x30
  32#define TVE_CD_CONT_REG         0x34
  33#define TVE_INT_CONT_REG        0x64
  34#define TVE_STAT_REG            0x68
  35#define TVE_TST_MODE_REG        0x6c
  36#define TVE_MV_CONT_REG         0xdc
  37
  38/* TVE_COM_CONF_REG */
  39#define TVE_SYNC_CH_2_EN        BIT(22)
  40#define TVE_SYNC_CH_1_EN        BIT(21)
  41#define TVE_SYNC_CH_0_EN        BIT(20)
  42#define TVE_TV_OUT_MODE_MASK    (0x7 << 12)
  43#define TVE_TV_OUT_DISABLE      (0x0 << 12)
  44#define TVE_TV_OUT_CVBS_0       (0x1 << 12)
  45#define TVE_TV_OUT_CVBS_2       (0x2 << 12)
  46#define TVE_TV_OUT_CVBS_0_2     (0x3 << 12)
  47#define TVE_TV_OUT_SVIDEO_0_1   (0x4 << 12)
  48#define TVE_TV_OUT_SVIDEO_0_1_CVBS2_2   (0x5 << 12)
  49#define TVE_TV_OUT_YPBPR        (0x6 << 12)
  50#define TVE_TV_OUT_RGB          (0x7 << 12)
  51#define TVE_TV_STAND_MASK       (0xf << 8)
  52#define TVE_TV_STAND_HD_1080P30 (0xc << 8)
  53#define TVE_P2I_CONV_EN         BIT(7)
  54#define TVE_INP_VIDEO_FORM      BIT(6)
  55#define TVE_INP_YCBCR_422       (0x0 << 6)
  56#define TVE_INP_YCBCR_444       (0x1 << 6)
  57#define TVE_DATA_SOURCE_MASK    (0x3 << 4)
  58#define TVE_DATA_SOURCE_BUS1    (0x0 << 4)
  59#define TVE_DATA_SOURCE_BUS2    (0x1 << 4)
  60#define TVE_DATA_SOURCE_EXT     (0x2 << 4)
  61#define TVE_DATA_SOURCE_TESTGEN (0x3 << 4)
  62#define TVE_IPU_CLK_EN_OFS      3
  63#define TVE_IPU_CLK_EN          BIT(3)
  64#define TVE_DAC_SAMP_RATE_OFS   1
  65#define TVE_DAC_SAMP_RATE_WIDTH 2
  66#define TVE_DAC_SAMP_RATE_MASK  (0x3 << 1)
  67#define TVE_DAC_FULL_RATE       (0x0 << 1)
  68#define TVE_DAC_DIV2_RATE       (0x1 << 1)
  69#define TVE_DAC_DIV4_RATE       (0x2 << 1)
  70#define TVE_EN                  BIT(0)
  71
  72/* TVE_TVDACx_CONT_REG */
  73#define TVE_TVDAC_GAIN_MASK     (0x3f << 0)
  74
  75/* TVE_CD_CONT_REG */
  76#define TVE_CD_CH_2_SM_EN       BIT(22)
  77#define TVE_CD_CH_1_SM_EN       BIT(21)
  78#define TVE_CD_CH_0_SM_EN       BIT(20)
  79#define TVE_CD_CH_2_LM_EN       BIT(18)
  80#define TVE_CD_CH_1_LM_EN       BIT(17)
  81#define TVE_CD_CH_0_LM_EN       BIT(16)
  82#define TVE_CD_CH_2_REF_LVL     BIT(10)
  83#define TVE_CD_CH_1_REF_LVL     BIT(9)
  84#define TVE_CD_CH_0_REF_LVL     BIT(8)
  85#define TVE_CD_EN               BIT(0)
  86
  87/* TVE_INT_CONT_REG */
  88#define TVE_FRAME_END_IEN       BIT(13)
  89#define TVE_CD_MON_END_IEN      BIT(2)
  90#define TVE_CD_SM_IEN           BIT(1)
  91#define TVE_CD_LM_IEN           BIT(0)
  92
  93/* TVE_TST_MODE_REG */
  94#define TVE_TVDAC_TEST_MODE_MASK        (0x7 << 0)
  95
  96#define IMX_TVE_DAC_VOLTAGE     2750000
  97
  98enum {
  99        TVE_MODE_TVOUT,
 100        TVE_MODE_VGA,
 101};
 102
 103struct imx_tve {
 104        struct drm_connector connector;
 105        struct drm_encoder encoder;
 106        struct device *dev;
 107        spinlock_t lock;        /* register lock */
 108        bool enabled;
 109        int mode;
 110        int di_hsync_pin;
 111        int di_vsync_pin;
 112
 113        struct regmap *regmap;
 114        struct regulator *dac_reg;
 115        struct i2c_adapter *ddc;
 116        struct clk *clk;
 117        struct clk *di_sel_clk;
 118        struct clk_hw clk_hw_di;
 119        struct clk *di_clk;
 120};
 121
 122static inline struct imx_tve *con_to_tve(struct drm_connector *c)
 123{
 124        return container_of(c, struct imx_tve, connector);
 125}
 126
 127static inline struct imx_tve *enc_to_tve(struct drm_encoder *e)
 128{
 129        return container_of(e, struct imx_tve, encoder);
 130}
 131
 132static void tve_lock(void *__tve)
 133__acquires(&tve->lock)
 134{
 135        struct imx_tve *tve = __tve;
 136
 137        spin_lock(&tve->lock);
 138}
 139
 140static void tve_unlock(void *__tve)
 141__releases(&tve->lock)
 142{
 143        struct imx_tve *tve = __tve;
 144
 145        spin_unlock(&tve->lock);
 146}
 147
 148static void tve_enable(struct imx_tve *tve)
 149{
 150        if (!tve->enabled) {
 151                tve->enabled = true;
 152                clk_prepare_enable(tve->clk);
 153                regmap_update_bits(tve->regmap, TVE_COM_CONF_REG,
 154                                   TVE_EN, TVE_EN);
 155        }
 156
 157        /* clear interrupt status register */
 158        regmap_write(tve->regmap, TVE_STAT_REG, 0xffffffff);
 159
 160        /* cable detection irq disabled in VGA mode, enabled in TVOUT mode */
 161        if (tve->mode == TVE_MODE_VGA)
 162                regmap_write(tve->regmap, TVE_INT_CONT_REG, 0);
 163        else
 164                regmap_write(tve->regmap, TVE_INT_CONT_REG,
 165                             TVE_CD_SM_IEN |
 166                             TVE_CD_LM_IEN |
 167                             TVE_CD_MON_END_IEN);
 168}
 169
 170static void tve_disable(struct imx_tve *tve)
 171{
 172        if (tve->enabled) {
 173                tve->enabled = false;
 174                regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, TVE_EN, 0);
 175                clk_disable_unprepare(tve->clk);
 176        }
 177}
 178
 179static int tve_setup_tvout(struct imx_tve *tve)
 180{
 181        return -ENOTSUPP;
 182}
 183
 184static int tve_setup_vga(struct imx_tve *tve)
 185{
 186        unsigned int mask;
 187        unsigned int val;
 188        int ret;
 189
 190        /* set gain to (1 + 10/128) to provide 0.7V peak-to-peak amplitude */
 191        ret = regmap_update_bits(tve->regmap, TVE_TVDAC0_CONT_REG,
 192                                 TVE_TVDAC_GAIN_MASK, 0x0a);
 193        if (ret)
 194                return ret;
 195
 196        ret = regmap_update_bits(tve->regmap, TVE_TVDAC1_CONT_REG,
 197                                 TVE_TVDAC_GAIN_MASK, 0x0a);
 198        if (ret)
 199                return ret;
 200
 201        ret = regmap_update_bits(tve->regmap, TVE_TVDAC2_CONT_REG,
 202                                 TVE_TVDAC_GAIN_MASK, 0x0a);
 203        if (ret)
 204                return ret;
 205
 206        /* set configuration register */
 207        mask = TVE_DATA_SOURCE_MASK | TVE_INP_VIDEO_FORM;
 208        val  = TVE_DATA_SOURCE_BUS2 | TVE_INP_YCBCR_444;
 209        mask |= TVE_TV_STAND_MASK       | TVE_P2I_CONV_EN;
 210        val  |= TVE_TV_STAND_HD_1080P30 | 0;
 211        mask |= TVE_TV_OUT_MODE_MASK | TVE_SYNC_CH_0_EN;
 212        val  |= TVE_TV_OUT_RGB       | TVE_SYNC_CH_0_EN;
 213        ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, mask, val);
 214        if (ret)
 215                return ret;
 216
 217        /* set test mode (as documented) */
 218        return regmap_update_bits(tve->regmap, TVE_TST_MODE_REG,
 219                                 TVE_TVDAC_TEST_MODE_MASK, 1);
 220}
 221
 222static int imx_tve_connector_get_modes(struct drm_connector *connector)
 223{
 224        struct imx_tve *tve = con_to_tve(connector);
 225        struct edid *edid;
 226        int ret = 0;
 227
 228        if (!tve->ddc)
 229                return 0;
 230
 231        edid = drm_get_edid(connector, tve->ddc);
 232        if (edid) {
 233                drm_connector_update_edid_property(connector, edid);
 234                ret = drm_add_edid_modes(connector, edid);
 235                kfree(edid);
 236        }
 237
 238        return ret;
 239}
 240
 241static int imx_tve_connector_mode_valid(struct drm_connector *connector,
 242                                        struct drm_display_mode *mode)
 243{
 244        struct imx_tve *tve = con_to_tve(connector);
 245        unsigned long rate;
 246
 247        /* pixel clock with 2x oversampling */
 248        rate = clk_round_rate(tve->clk, 2000UL * mode->clock) / 2000;
 249        if (rate == mode->clock)
 250                return MODE_OK;
 251
 252        /* pixel clock without oversampling */
 253        rate = clk_round_rate(tve->clk, 1000UL * mode->clock) / 1000;
 254        if (rate == mode->clock)
 255                return MODE_OK;
 256
 257        dev_warn(tve->dev, "ignoring mode %dx%d\n",
 258                 mode->hdisplay, mode->vdisplay);
 259
 260        return MODE_BAD;
 261}
 262
 263static void imx_tve_encoder_mode_set(struct drm_encoder *encoder,
 264                                     struct drm_display_mode *orig_mode,
 265                                     struct drm_display_mode *mode)
 266{
 267        struct imx_tve *tve = enc_to_tve(encoder);
 268        unsigned long rounded_rate;
 269        unsigned long rate;
 270        int div = 1;
 271        int ret;
 272
 273        /*
 274         * FIXME
 275         * we should try 4k * mode->clock first,
 276         * and enable 4x oversampling for lower resolutions
 277         */
 278        rate = 2000UL * mode->clock;
 279        clk_set_rate(tve->clk, rate);
 280        rounded_rate = clk_get_rate(tve->clk);
 281        if (rounded_rate >= rate)
 282                div = 2;
 283        clk_set_rate(tve->di_clk, rounded_rate / div);
 284
 285        ret = clk_set_parent(tve->di_sel_clk, tve->di_clk);
 286        if (ret < 0) {
 287                dev_err(tve->dev, "failed to set di_sel parent to tve_di: %d\n",
 288                        ret);
 289        }
 290
 291        regmap_update_bits(tve->regmap, TVE_COM_CONF_REG,
 292                           TVE_IPU_CLK_EN, TVE_IPU_CLK_EN);
 293
 294        if (tve->mode == TVE_MODE_VGA)
 295                ret = tve_setup_vga(tve);
 296        else
 297                ret = tve_setup_tvout(tve);
 298        if (ret)
 299                dev_err(tve->dev, "failed to set configuration: %d\n", ret);
 300}
 301
 302static void imx_tve_encoder_enable(struct drm_encoder *encoder)
 303{
 304        struct imx_tve *tve = enc_to_tve(encoder);
 305
 306        tve_enable(tve);
 307}
 308
 309static void imx_tve_encoder_disable(struct drm_encoder *encoder)
 310{
 311        struct imx_tve *tve = enc_to_tve(encoder);
 312
 313        tve_disable(tve);
 314}
 315
 316static int imx_tve_atomic_check(struct drm_encoder *encoder,
 317                                struct drm_crtc_state *crtc_state,
 318                                struct drm_connector_state *conn_state)
 319{
 320        struct imx_crtc_state *imx_crtc_state = to_imx_crtc_state(crtc_state);
 321        struct imx_tve *tve = enc_to_tve(encoder);
 322
 323        imx_crtc_state->bus_format = MEDIA_BUS_FMT_GBR888_1X24;
 324        imx_crtc_state->di_hsync_pin = tve->di_hsync_pin;
 325        imx_crtc_state->di_vsync_pin = tve->di_vsync_pin;
 326
 327        return 0;
 328}
 329
 330static const struct drm_connector_funcs imx_tve_connector_funcs = {
 331        .fill_modes = drm_helper_probe_single_connector_modes,
 332        .destroy = imx_drm_connector_destroy,
 333        .reset = drm_atomic_helper_connector_reset,
 334        .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
 335        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
 336};
 337
 338static const struct drm_connector_helper_funcs imx_tve_connector_helper_funcs = {
 339        .get_modes = imx_tve_connector_get_modes,
 340        .mode_valid = imx_tve_connector_mode_valid,
 341};
 342
 343static const struct drm_encoder_helper_funcs imx_tve_encoder_helper_funcs = {
 344        .mode_set = imx_tve_encoder_mode_set,
 345        .enable = imx_tve_encoder_enable,
 346        .disable = imx_tve_encoder_disable,
 347        .atomic_check = imx_tve_atomic_check,
 348};
 349
 350static irqreturn_t imx_tve_irq_handler(int irq, void *data)
 351{
 352        struct imx_tve *tve = data;
 353        unsigned int val;
 354
 355        regmap_read(tve->regmap, TVE_STAT_REG, &val);
 356
 357        /* clear interrupt status register */
 358        regmap_write(tve->regmap, TVE_STAT_REG, 0xffffffff);
 359
 360        return IRQ_HANDLED;
 361}
 362
 363static unsigned long clk_tve_di_recalc_rate(struct clk_hw *hw,
 364                                            unsigned long parent_rate)
 365{
 366        struct imx_tve *tve = container_of(hw, struct imx_tve, clk_hw_di);
 367        unsigned int val;
 368        int ret;
 369
 370        ret = regmap_read(tve->regmap, TVE_COM_CONF_REG, &val);
 371        if (ret < 0)
 372                return 0;
 373
 374        switch (val & TVE_DAC_SAMP_RATE_MASK) {
 375        case TVE_DAC_DIV4_RATE:
 376                return parent_rate / 4;
 377        case TVE_DAC_DIV2_RATE:
 378                return parent_rate / 2;
 379        case TVE_DAC_FULL_RATE:
 380        default:
 381                return parent_rate;
 382        }
 383
 384        return 0;
 385}
 386
 387static long clk_tve_di_round_rate(struct clk_hw *hw, unsigned long rate,
 388                                  unsigned long *prate)
 389{
 390        unsigned long div;
 391
 392        div = *prate / rate;
 393        if (div >= 4)
 394                return *prate / 4;
 395        else if (div >= 2)
 396                return *prate / 2;
 397        return *prate;
 398}
 399
 400static int clk_tve_di_set_rate(struct clk_hw *hw, unsigned long rate,
 401                               unsigned long parent_rate)
 402{
 403        struct imx_tve *tve = container_of(hw, struct imx_tve, clk_hw_di);
 404        unsigned long div;
 405        u32 val;
 406        int ret;
 407
 408        div = parent_rate / rate;
 409        if (div >= 4)
 410                val = TVE_DAC_DIV4_RATE;
 411        else if (div >= 2)
 412                val = TVE_DAC_DIV2_RATE;
 413        else
 414                val = TVE_DAC_FULL_RATE;
 415
 416        ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG,
 417                                 TVE_DAC_SAMP_RATE_MASK, val);
 418
 419        if (ret < 0) {
 420                dev_err(tve->dev, "failed to set divider: %d\n", ret);
 421                return ret;
 422        }
 423
 424        return 0;
 425}
 426
 427static const struct clk_ops clk_tve_di_ops = {
 428        .round_rate = clk_tve_di_round_rate,
 429        .set_rate = clk_tve_di_set_rate,
 430        .recalc_rate = clk_tve_di_recalc_rate,
 431};
 432
 433static int tve_clk_init(struct imx_tve *tve, void __iomem *base)
 434{
 435        const char *tve_di_parent[1];
 436        struct clk_init_data init = {
 437                .name = "tve_di",
 438                .ops = &clk_tve_di_ops,
 439                .num_parents = 1,
 440                .flags = 0,
 441        };
 442
 443        tve_di_parent[0] = __clk_get_name(tve->clk);
 444        init.parent_names = (const char **)&tve_di_parent;
 445
 446        tve->clk_hw_di.init = &init;
 447        tve->di_clk = clk_register(tve->dev, &tve->clk_hw_di);
 448        if (IS_ERR(tve->di_clk)) {
 449                dev_err(tve->dev, "failed to register TVE output clock: %ld\n",
 450                        PTR_ERR(tve->di_clk));
 451                return PTR_ERR(tve->di_clk);
 452        }
 453
 454        return 0;
 455}
 456
 457static int imx_tve_register(struct drm_device *drm, struct imx_tve *tve)
 458{
 459        int encoder_type;
 460        int ret;
 461
 462        encoder_type = tve->mode == TVE_MODE_VGA ?
 463                                DRM_MODE_ENCODER_DAC : DRM_MODE_ENCODER_TVDAC;
 464
 465        ret = imx_drm_encoder_parse_of(drm, &tve->encoder, tve->dev->of_node);
 466        if (ret)
 467                return ret;
 468
 469        drm_encoder_helper_add(&tve->encoder, &imx_tve_encoder_helper_funcs);
 470        drm_simple_encoder_init(drm, &tve->encoder, encoder_type);
 471
 472        drm_connector_helper_add(&tve->connector,
 473                        &imx_tve_connector_helper_funcs);
 474        drm_connector_init_with_ddc(drm, &tve->connector,
 475                                    &imx_tve_connector_funcs,
 476                                    DRM_MODE_CONNECTOR_VGA,
 477                                    tve->ddc);
 478
 479        drm_connector_attach_encoder(&tve->connector, &tve->encoder);
 480
 481        return 0;
 482}
 483
 484static void imx_tve_disable_regulator(void *data)
 485{
 486        struct imx_tve *tve = data;
 487
 488        regulator_disable(tve->dac_reg);
 489}
 490
 491static bool imx_tve_readable_reg(struct device *dev, unsigned int reg)
 492{
 493        return (reg % 4 == 0) && (reg <= 0xdc);
 494}
 495
 496static struct regmap_config tve_regmap_config = {
 497        .reg_bits = 32,
 498        .val_bits = 32,
 499        .reg_stride = 4,
 500
 501        .readable_reg = imx_tve_readable_reg,
 502
 503        .lock = tve_lock,
 504        .unlock = tve_unlock,
 505
 506        .max_register = 0xdc,
 507};
 508
 509static const char * const imx_tve_modes[] = {
 510        [TVE_MODE_TVOUT]  = "tvout",
 511        [TVE_MODE_VGA] = "vga",
 512};
 513
 514static const int of_get_tve_mode(struct device_node *np)
 515{
 516        const char *bm;
 517        int ret, i;
 518
 519        ret = of_property_read_string(np, "fsl,tve-mode", &bm);
 520        if (ret < 0)
 521                return ret;
 522
 523        for (i = 0; i < ARRAY_SIZE(imx_tve_modes); i++)
 524                if (!strcasecmp(bm, imx_tve_modes[i]))
 525                        return i;
 526
 527        return -EINVAL;
 528}
 529
 530static int imx_tve_bind(struct device *dev, struct device *master, void *data)
 531{
 532        struct platform_device *pdev = to_platform_device(dev);
 533        struct drm_device *drm = data;
 534        struct device_node *np = dev->of_node;
 535        struct device_node *ddc_node;
 536        struct imx_tve *tve;
 537        struct resource *res;
 538        void __iomem *base;
 539        unsigned int val;
 540        int irq;
 541        int ret;
 542
 543        tve = dev_get_drvdata(dev);
 544        memset(tve, 0, sizeof(*tve));
 545
 546        tve->dev = dev;
 547        spin_lock_init(&tve->lock);
 548
 549        ddc_node = of_parse_phandle(np, "ddc-i2c-bus", 0);
 550        if (ddc_node) {
 551                tve->ddc = of_find_i2c_adapter_by_node(ddc_node);
 552                of_node_put(ddc_node);
 553        }
 554
 555        tve->mode = of_get_tve_mode(np);
 556        if (tve->mode != TVE_MODE_VGA) {
 557                dev_err(dev, "only VGA mode supported, currently\n");
 558                return -EINVAL;
 559        }
 560
 561        if (tve->mode == TVE_MODE_VGA) {
 562                ret = of_property_read_u32(np, "fsl,hsync-pin",
 563                                           &tve->di_hsync_pin);
 564
 565                if (ret < 0) {
 566                        dev_err(dev, "failed to get hsync pin\n");
 567                        return ret;
 568                }
 569
 570                ret = of_property_read_u32(np, "fsl,vsync-pin",
 571                                           &tve->di_vsync_pin);
 572
 573                if (ret < 0) {
 574                        dev_err(dev, "failed to get vsync pin\n");
 575                        return ret;
 576                }
 577        }
 578
 579        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 580        base = devm_ioremap_resource(dev, res);
 581        if (IS_ERR(base))
 582                return PTR_ERR(base);
 583
 584        tve_regmap_config.lock_arg = tve;
 585        tve->regmap = devm_regmap_init_mmio_clk(dev, "tve", base,
 586                                                &tve_regmap_config);
 587        if (IS_ERR(tve->regmap)) {
 588                dev_err(dev, "failed to init regmap: %ld\n",
 589                        PTR_ERR(tve->regmap));
 590                return PTR_ERR(tve->regmap);
 591        }
 592
 593        irq = platform_get_irq(pdev, 0);
 594        if (irq < 0)
 595                return irq;
 596
 597        ret = devm_request_threaded_irq(dev, irq, NULL,
 598                                        imx_tve_irq_handler, IRQF_ONESHOT,
 599                                        "imx-tve", tve);
 600        if (ret < 0) {
 601                dev_err(dev, "failed to request irq: %d\n", ret);
 602                return ret;
 603        }
 604
 605        tve->dac_reg = devm_regulator_get(dev, "dac");
 606        if (!IS_ERR(tve->dac_reg)) {
 607                if (regulator_get_voltage(tve->dac_reg) != IMX_TVE_DAC_VOLTAGE)
 608                        dev_warn(dev, "dac voltage is not %d uV\n", IMX_TVE_DAC_VOLTAGE);
 609                ret = regulator_enable(tve->dac_reg);
 610                if (ret)
 611                        return ret;
 612                ret = devm_add_action_or_reset(dev, imx_tve_disable_regulator, tve);
 613                if (ret)
 614                        return ret;
 615        }
 616
 617        tve->clk = devm_clk_get(dev, "tve");
 618        if (IS_ERR(tve->clk)) {
 619                dev_err(dev, "failed to get high speed tve clock: %ld\n",
 620                        PTR_ERR(tve->clk));
 621                return PTR_ERR(tve->clk);
 622        }
 623
 624        /* this is the IPU DI clock input selector, can be parented to tve_di */
 625        tve->di_sel_clk = devm_clk_get(dev, "di_sel");
 626        if (IS_ERR(tve->di_sel_clk)) {
 627                dev_err(dev, "failed to get ipu di mux clock: %ld\n",
 628                        PTR_ERR(tve->di_sel_clk));
 629                return PTR_ERR(tve->di_sel_clk);
 630        }
 631
 632        ret = tve_clk_init(tve, base);
 633        if (ret < 0)
 634                return ret;
 635
 636        ret = regmap_read(tve->regmap, TVE_COM_CONF_REG, &val);
 637        if (ret < 0) {
 638                dev_err(dev, "failed to read configuration register: %d\n",
 639                        ret);
 640                return ret;
 641        }
 642        if (val != 0x00100000) {
 643                dev_err(dev, "configuration register default value indicates this is not a TVEv2\n");
 644                return -ENODEV;
 645        }
 646
 647        /* disable cable detection for VGA mode */
 648        ret = regmap_write(tve->regmap, TVE_CD_CONT_REG, 0);
 649        if (ret)
 650                return ret;
 651
 652        ret = imx_tve_register(drm, tve);
 653        if (ret)
 654                return ret;
 655
 656        return 0;
 657}
 658
 659static const struct component_ops imx_tve_ops = {
 660        .bind   = imx_tve_bind,
 661};
 662
 663static int imx_tve_probe(struct platform_device *pdev)
 664{
 665        struct imx_tve *tve;
 666
 667        tve = devm_kzalloc(&pdev->dev, sizeof(*tve), GFP_KERNEL);
 668        if (!tve)
 669                return -ENOMEM;
 670
 671        platform_set_drvdata(pdev, tve);
 672
 673        return component_add(&pdev->dev, &imx_tve_ops);
 674}
 675
 676static int imx_tve_remove(struct platform_device *pdev)
 677{
 678        component_del(&pdev->dev, &imx_tve_ops);
 679        return 0;
 680}
 681
 682static const struct of_device_id imx_tve_dt_ids[] = {
 683        { .compatible = "fsl,imx53-tve", },
 684        { /* sentinel */ }
 685};
 686MODULE_DEVICE_TABLE(of, imx_tve_dt_ids);
 687
 688static struct platform_driver imx_tve_driver = {
 689        .probe          = imx_tve_probe,
 690        .remove         = imx_tve_remove,
 691        .driver         = {
 692                .of_match_table = imx_tve_dt_ids,
 693                .name   = "imx-tve",
 694        },
 695};
 696
 697module_platform_driver(imx_tve_driver);
 698
 699MODULE_DESCRIPTION("i.MX Television Encoder driver");
 700MODULE_AUTHOR("Philipp Zabel, Pengutronix");
 701MODULE_LICENSE("GPL");
 702MODULE_ALIAS("platform:imx-tve");
 703