Lines Matching refs:mx3fb
30 #include <linux/platform_data/video-mx3fb.h>
250 struct mx3fb_data *mx3fb;
264 struct mx3fb_data *mx3fb;
273 static void sdc_set_brightness(struct mx3fb_data *mx3fb, uint8_t value);
274 static u32 sdc_get_brightness(struct mx3fb_data *mx3fb);
318 bl = backlight_device_register("mx3fb-bl", fbd->dev, fbd,
343 static u32 mx3fb_read_reg(struct mx3fb_data *mx3fb, unsigned long reg)
345 return __raw_readl(mx3fb->reg_base + reg);
348 static void mx3fb_write_reg(struct mx3fb_data *mx3fb, u32 value, unsigned long reg)
350 __raw_writel(value, mx3fb->reg_base + reg);
365 struct mx3fb_data *mx3fb = fbi->mx3fb;
368 reg = mx3fb_read_reg(mx3fb, SDC_COM_CONF);
370 mx3fb_write_reg(mx3fb, reg | SDC_COM_BG_EN, SDC_COM_CONF);
376 struct mx3fb_data *mx3fb = fbi->mx3fb;
379 reg = mx3fb_read_reg(mx3fb, SDC_COM_CONF);
381 mx3fb_write_reg(mx3fb, reg & ~SDC_COM_BG_EN, SDC_COM_CONF);
388 struct mx3fb_data *mx3fb = mx3_fbi->mx3fb;
395 dev_dbg(mx3fb->dev, "mx3fbi %p, desc %p, sg %p\n", mx3_fbi,
398 dev_dbg(mx3fb->dev, "mx3fbi %p, txd = NULL\n", mx3_fbi);
405 dev_err(mx3fb->dev, "Cannot allocate descriptor on %d\n",
414 dev_dbg(mx3fb->dev, "%d: Submit %p #%d [%c]\n", __LINE__,
418 dev_err(mx3fb->dev, "Cannot enable channel %d\n",
426 dev_dbg(mx3fb->dev, "%d: Re-submit %p #%d [%c]\n", __LINE__,
431 spin_lock_irqsave(&mx3fb->lock, flags);
434 spin_unlock_irqrestore(&mx3fb->lock, flags);
447 struct mx3fb_data *mx3fb = mx3_fbi->mx3fb;
454 spin_lock_irqsave(&mx3fb->lock, flags);
458 spin_unlock_irqrestore(&mx3fb->lock, flags);
467 * @mx3fb: mx3fb context.
473 static int sdc_set_window_pos(struct mx3fb_data *mx3fb, enum ipu_channel channel,
479 x_pos += mx3fb->h_start_width;
480 y_pos += mx3fb->v_start_width;
482 mx3fb_write_reg(mx3fb, (x_pos << 16) | y_pos, SDC_BG_POS);
488 * @mx3fb: mx3fb context.
506 static int sdc_init_panel(struct mx3fb_data *mx3fb, enum ipu_panel panel,
521 dev_dbg(mx3fb->dev, "panel size = %d x %d", width, height);
529 mx3fb_write_reg(mx3fb, reg, SDC_HOR_CONF);
537 mx3fb_write_reg(mx3fb, reg, SDC_VER_CONF);
543 mx3fb->h_start_width = h_start_width;
544 mx3fb->v_start_width = v_start_width;
548 mx3fb_write_reg(mx3fb, 0x00FD0102L, SDC_SHARP_CONF_1);
549 mx3fb_write_reg(mx3fb, 0x00F500F4L, SDC_SHARP_CONF_2);
550 mx3fb_write_reg(mx3fb, SDC_COM_SHARP | SDC_COM_TFT_COLOR, SDC_COM_CONF);
553 mx3fb_write_reg(mx3fb, SDC_COM_TFT_COLOR, SDC_COM_CONF);
566 ipu_clk = clk_get(mx3fb->dev, NULL);
575 dev_dbg(mx3fb->dev,
580 dev_dbg(mx3fb->dev, "pixel clk = %u, divider %u.%u\n",
583 spin_lock_irqsave(&mx3fb->lock, lock_flags);
590 mx3fb_write_reg(mx3fb, (((div / 8) - 1) << 22) | div, DI_DISP3_TIME_CONF);
593 old_conf = mx3fb_read_reg(mx3fb, DI_DISP_IF_CONF) & 0x78FFFFFF;
597 mx3fb_write_reg(mx3fb, old_conf, DI_DISP_IF_CONF);
599 old_conf = mx3fb_read_reg(mx3fb, DI_DISP_SIG_POL) & 0xE0FFFFFF;
605 mx3fb_write_reg(mx3fb, old_conf, DI_DISP_SIG_POL);
607 map = &di_mappings[mx3fb->disp_data_fmt];
608 mx3fb_write_reg(mx3fb, map->b0, DI_DISP3_B0_MAP);
609 mx3fb_write_reg(mx3fb, map->b1, DI_DISP3_B1_MAP);
610 mx3fb_write_reg(mx3fb, map->b2, DI_DISP3_B2_MAP);
612 spin_unlock_irqrestore(&mx3fb->lock, lock_flags);
614 dev_dbg(mx3fb->dev, "DI_DISP_IF_CONF = 0x%08X\n",
615 mx3fb_read_reg(mx3fb, DI_DISP_IF_CONF));
616 dev_dbg(mx3fb->dev, "DI_DISP_SIG_POL = 0x%08X\n",
617 mx3fb_read_reg(mx3fb, DI_DISP_SIG_POL));
618 dev_dbg(mx3fb->dev, "DI_DISP3_TIME_CONF = 0x%08X\n",
619 mx3fb_read_reg(mx3fb, DI_DISP3_TIME_CONF));
626 * @mx3fb: mx3fb context.
632 static int sdc_set_color_key(struct mx3fb_data *mx3fb, enum ipu_channel channel,
638 spin_lock_irqsave(&mx3fb->lock, lock_flags);
640 sdc_conf = mx3fb_read_reg(mx3fb, SDC_COM_CONF);
647 reg = mx3fb_read_reg(mx3fb, SDC_GW_CTRL) & 0xFF000000L;
648 mx3fb_write_reg(mx3fb, reg | (color_key & 0x00FFFFFFL),
655 mx3fb_write_reg(mx3fb, sdc_conf, SDC_COM_CONF);
657 spin_unlock_irqrestore(&mx3fb->lock, lock_flags);
664 * @mx3fb: mx3fb context.
670 static int sdc_set_global_alpha(struct mx3fb_data *mx3fb, bool enable, uint8_t alpha)
675 spin_lock_irqsave(&mx3fb->lock, lock_flags);
678 reg = mx3fb_read_reg(mx3fb, SDC_GW_CTRL) & 0x00FFFFFFL;
679 mx3fb_write_reg(mx3fb, reg | ((uint32_t) alpha << 24), SDC_GW_CTRL);
681 reg = mx3fb_read_reg(mx3fb, SDC_COM_CONF);
682 mx3fb_write_reg(mx3fb, reg | SDC_COM_GLB_A, SDC_COM_CONF);
684 reg = mx3fb_read_reg(mx3fb, SDC_COM_CONF);
685 mx3fb_write_reg(mx3fb, reg & ~SDC_COM_GLB_A, SDC_COM_CONF);
688 spin_unlock_irqrestore(&mx3fb->lock, lock_flags);
693 static u32 sdc_get_brightness(struct mx3fb_data *mx3fb)
697 brightness = mx3fb_read_reg(mx3fb, SDC_PWM_CTRL);
703 static void sdc_set_brightness(struct mx3fb_data *mx3fb, uint8_t value)
705 dev_dbg(mx3fb->dev, "%s: value = %d\n", __func__, value);
707 mx3fb_write_reg(mx3fb, 0x03000000UL | value << 16, SDC_PWM_CTRL);
761 struct mx3fb_data *mx3fb = ichannel->client;
762 struct mx3fb_info *mx3_fbi = mx3fb->fbi->par;
764 dev_dbg(mx3fb->dev, "irq %d callback\n", ichannel->eof_irq);
798 struct mx3fb_data *mx3fb = mx3_fbi->mx3fb;
848 if (sdc_init_panel(mx3fb, mode,
860 "mx3fb: Error initializing panel.\n");
865 sdc_set_window_pos(mx3fb, mx3_fbi->ipu_ch, 0, 0);
905 struct mx3fb_data *mx3fb = mx3_fbi->mx3fb;
909 dev_dbg(mx3fb->dev, "%s [%c]\n", __func__, list_empty(&ichan->queue) ? '-' : '+');
1074 struct mx3fb_data *mx3fb = mx3_fbi->mx3fb;
1093 sdc_set_brightness(mx3fb, 0);
1101 sdc_set_brightness(mx3fb, mx3fb->backlight_level);
1215 * Emulate original mx3fb behaviour: each new call to idmac_tx_submit()
1275 struct mx3fb_data *mx3fb = platform_get_drvdata(pdev);
1276 struct mx3fb_info *mx3_fbi = mx3fb->fbi->par;
1279 fb_set_suspend(mx3fb->fbi, 1);
1284 sdc_set_brightness(mx3fb, 0);
1295 struct mx3fb_data *mx3fb = platform_get_drvdata(pdev);
1296 struct mx3fb_info *mx3_fbi = mx3fb->fbi->par;
1300 sdc_set_brightness(mx3fb, mx3fb->backlight_level);
1304 fb_set_suspend(mx3fb->fbi, 0);
1426 static int init_fb_chan(struct mx3fb_data *mx3fb, struct idmac_channel *ichan)
1428 struct device *dev = mx3fb->dev;
1443 ichan->client = mx3fb;
1480 mx3fb->fbi = fbi;
1483 mx3fb_write_reg(mx3fb, 0x00100010L, DI_HSP_CLK_PER);
1486 sdc_set_brightness(mx3fb, 255);
1487 sdc_set_global_alpha(mx3fb, true, 0xFF);
1488 sdc_set_color_key(mx3fb, IDMAC_SDC_0, false, 0);
1493 mx3fbi->mx3fb = mx3fb;
1496 mx3fb->disp_data_fmt = mx3fb_pdata->disp_data_fmt;
1500 dev_dbg(mx3fb->dev, "disabling irq %d\n", ichan->eof_irq);
1536 dev = rq->mx3fb->dev;
1558 struct mx3fb_data *mx3fb;
1571 mx3fb = devm_kzalloc(&pdev->dev, sizeof(*mx3fb), GFP_KERNEL);
1572 if (!mx3fb)
1575 spin_lock_init(&mx3fb->lock);
1577 mx3fb->reg_base = ioremap(sdc_reg->start, resource_size(sdc_reg));
1578 if (!mx3fb->reg_base) {
1583 pr_debug("Remapped %pR at %p\n", sdc_reg, mx3fb->reg_base);
1588 mx3fb->dev = dev;
1589 platform_set_drvdata(pdev, mx3fb);
1591 rq.mx3fb = mx3fb;
1603 mx3fb->backlight_level = 255;
1605 ret = init_fb_chan(mx3fb, to_idmac_chan(chan));
1609 mx3fb_init_backlight(mx3fb);
1617 iounmap(mx3fb->reg_base);
1619 dev_err(dev, "mx3fb: failed to register fb\n");
1625 struct mx3fb_data *mx3fb = platform_get_drvdata(dev);
1626 struct fb_info *fbi = mx3fb->fbi;
1633 mx3fb_exit_backlight(mx3fb);
1638 iounmap(mx3fb->reg_base);
1653 * Parse user specified options (`video=mx3fb:')
1655 * video=mx3fb:bpp=16
1662 if (fb_get_options("mx3fb", &options))