Lines Matching refs:ipu

22 #include <linux/dma/ipu-dma.h>
36 * struct ipu *ipu = to_ipu(to_idmac(ichan->dma_chan.device));
39 static struct ipu ipu_data;
41 #define to_ipu(id) container_of(id, struct ipu, idmac)
43 static u32 __idmac_read_icreg(struct ipu *ipu, unsigned long reg)
45 return __raw_readl(ipu->reg_ic + reg);
48 #define idmac_read_icreg(ipu, reg) __idmac_read_icreg(ipu, reg - IC_CONF)
50 static void __idmac_write_icreg(struct ipu *ipu, u32 value, unsigned long reg)
52 __raw_writel(value, ipu->reg_ic + reg);
55 #define idmac_write_icreg(ipu, v, reg) __idmac_write_icreg(ipu, v, reg - IC_CONF)
57 static u32 idmac_read_ipureg(struct ipu *ipu, unsigned long reg)
59 return __raw_readl(ipu->reg_ipu + reg);
62 static void idmac_write_ipureg(struct ipu *ipu, u32 value, unsigned long reg)
64 __raw_writel(value, ipu->reg_ipu + reg);
70 static void dump_idmac_reg(struct ipu *ipu)
72 dev_dbg(ipu->dev, "IDMAC_CONF 0x%x, IC_CONF 0x%x, IDMAC_CHA_EN 0x%x, "
74 idmac_read_icreg(ipu, IDMAC_CONF),
75 idmac_read_icreg(ipu, IC_CONF),
76 idmac_read_icreg(ipu, IDMAC_CHA_EN),
77 idmac_read_icreg(ipu, IDMAC_CHA_PRI),
78 idmac_read_icreg(ipu, IDMAC_CHA_BUSY));
79 dev_dbg(ipu->dev, "BUF0_RDY 0x%x, BUF1_RDY 0x%x, CUR_BUF 0x%x, "
81 idmac_read_ipureg(ipu, IPU_CHA_BUF0_RDY),
82 idmac_read_ipureg(ipu, IPU_CHA_BUF1_RDY),
83 idmac_read_ipureg(ipu, IPU_CHA_CUR_BUF),
84 idmac_read_ipureg(ipu, IPU_CHA_DB_MODE_SEL),
85 idmac_read_ipureg(ipu, IPU_TASKS_STAT));
113 static void ipu_ic_enable_task(struct ipu *ipu, enum ipu_channel channel)
127 ic_conf = idmac_read_icreg(ipu, IC_CONF) | mask;
128 idmac_write_icreg(ipu, ic_conf, IC_CONF);
132 static void ipu_ic_disable_task(struct ipu *ipu, enum ipu_channel channel)
146 ic_conf = idmac_read_icreg(ipu, IC_CONF) & ~mask;
147 idmac_write_icreg(ipu, ic_conf, IC_CONF);
150 static uint32_t ipu_channel_status(struct ipu *ipu, enum ipu_channel channel)
153 uint32_t task_stat_reg = idmac_read_ipureg(ipu, IPU_TASKS_STAT);
415 "mx3 ipu: unimplemented pixel format %d\n", pixel_fmt);
508 static int ipu_ic_init_prpenc(struct ipu *ipu,
536 dev_err(ipu->dev, "Colourspace conversion unsupported!\n");
540 idmac_write_icreg(ipu, reg, IC_PRP_ENC_RSC);
542 ic_conf = idmac_read_icreg(ipu, IC_CONF);
549 idmac_write_icreg(ipu, ic_conf, IC_CONF);
560 static void ipu_channel_set_priority(struct ipu *ipu, enum ipu_channel channel,
563 u32 reg = idmac_read_icreg(ipu, IDMAC_CHA_PRI);
570 idmac_write_icreg(ipu, reg, IDMAC_CHA_PRI);
572 dump_idmac_reg(ipu);
604 struct ipu *ipu = to_ipu(idmac);
609 spin_lock_irqsave(&ipu->lock, flags);
612 idmac_write_ipureg(ipu, 1UL << channel, IPU_CHA_CUR_BUF);
620 ipu_channel_set_priority(ipu, channel, true);
625 reg = idmac_read_icreg(ipu, IDMAC_CHA_EN);
627 idmac_write_icreg(ipu, reg | (1UL << channel), IDMAC_CHA_EN);
629 ipu_ic_enable_task(ipu, channel);
631 spin_unlock_irqrestore(&ipu->lock, flags);
659 struct ipu *ipu = to_ipu(idmac);
668 dev_err(ipu->dev,
676 dev_err(ipu->dev, "Stride must be 8 pixel multiple\n");
685 spin_lock_irqsave(&ipu->lock, flags);
689 reg = idmac_read_ipureg(ipu, IPU_CHA_DB_MODE_SEL);
696 idmac_write_ipureg(ipu, reg, IPU_CHA_DB_MODE_SEL);
700 spin_unlock_irqrestore(&ipu->lock, flags);
824 struct ipu *ipu = to_ipu(idmac);
868 /* ipu->lock can be taken under ichan->lock, but not v.v. */
890 dump_idmac_reg(ipu);
955 struct ipu *ipu = to_ipu(idmac);
958 dev_dbg(ipu->dev, "init channel = %d\n", channel);
964 spin_lock_irqsave(&ipu->lock, flags);
969 reg = idmac_read_icreg(ipu, IC_CONF);
970 idmac_write_icreg(ipu, reg & ~IC_CONF_CSI_MEM_WR_EN, IC_CONF);
974 reg = idmac_read_ipureg(ipu, IPU_FS_PROC_FLOW);
975 idmac_write_ipureg(ipu, reg & ~FS_ENC_IN_VALID, IPU_FS_PROC_FLOW);
976 ret = ipu_ic_init_prpenc(ipu, params, true);
985 ipu->channel_init_mask |= 1L << channel;
988 ipu_conf = idmac_read_ipureg(ipu, IPU_CONF) |
990 idmac_write_ipureg(ipu, ipu_conf, IPU_CONF);
992 spin_unlock_irqrestore(&ipu->lock, flags);
997 dump_idmac_reg(ipu);
1014 struct ipu *ipu = to_ipu(idmac);
1016 spin_lock_irqsave(&ipu->lock, flags);
1018 if (!(ipu->channel_init_mask & chan_mask)) {
1019 dev_err(ipu->dev, "Channel already uninitialized %d\n",
1021 spin_unlock_irqrestore(&ipu->lock, flags);
1026 reg = idmac_read_ipureg(ipu, IPU_CHA_DB_MODE_SEL);
1027 idmac_write_ipureg(ipu, reg & ~chan_mask, IPU_CHA_DB_MODE_SEL);
1033 reg = idmac_read_icreg(ipu, IC_CONF);
1034 idmac_write_icreg(ipu, reg & ~(IC_CONF_RWS_EN | IC_CONF_PRPENC_EN),
1038 reg = idmac_read_icreg(ipu, IC_CONF);
1039 idmac_write_icreg(ipu, reg & ~(IC_CONF_PRPENC_EN | IC_CONF_PRPENC_CSC1),
1048 ipu->channel_init_mask &= ~(1L << channel);
1050 ipu_conf = idmac_read_ipureg(ipu, IPU_CONF) &
1052 idmac_write_ipureg(ipu, ipu_conf, IPU_CONF);
1054 spin_unlock_irqrestore(&ipu->lock, flags);
1073 struct ipu *ipu = to_ipu(idmac);
1082 while ((idmac_read_icreg(ipu, IDMAC_CHA_BUSY) & chan_mask) ||
1083 (ipu_channel_status(ipu, channel) == TASK_STAT_ACTIVE)) {
1088 dev_dbg(ipu->dev,
1092 idmac_read_ipureg(ipu, IPU_CHA_BUF0_RDY),
1093 idmac_read_ipureg(ipu, IPU_CHA_BUF1_RDY),
1094 idmac_read_icreg(ipu, IDMAC_CHA_BUSY),
1095 idmac_read_ipureg(ipu, IPU_TASKS_STAT));
1099 dev_dbg(ipu->dev, "timeout = %d * 10ms\n", 40 - timeout);
1109 spin_lock_irqsave(&ipu->lock, flags);
1112 ipu_ic_disable_task(ipu, channel);
1115 reg = idmac_read_icreg(ipu, IDMAC_CHA_EN);
1116 idmac_write_icreg(ipu, reg & ~chan_mask, IDMAC_CHA_EN);
1118 spin_unlock_irqrestore(&ipu->lock, flags);
1304 struct ipu *ipu = from_tasklet(ipu, t, tasklet);
1308 struct idmac_channel *ichan = ipu->channel + i;
1381 struct ipu *ipu = to_ipu(idmac);
1385 spin_lock_irqsave(&ipu->lock, flags);
1387 spin_unlock_irqrestore(&ipu->lock, flags);
1401 struct ipu *ipu = to_ipu(idmac);
1407 spin_lock_irqsave(&ipu->lock, flags);
1408 ipu_ic_disable_task(ipu, chan->chan_id);
1417 spin_unlock_irqrestore(&ipu->lock, flags);
1430 struct ipu *ipu = to_ipu(idmac);
1437 tasklet_disable(&ipu->tasklet);
1457 tasklet_enable(&ipu->tasklet);
1608 static int __init ipu_idmac_init(struct ipu *ipu)
1610 struct idmac *idmac = &ipu->idmac;
1618 dma->dev = ipu->dev;
1631 struct idmac_channel *ichan = ipu->channel + i;
1647 idmac_write_icreg(ipu, 0x00000070, IDMAC_CONF);
1652 static void ipu_idmac_exit(struct ipu *ipu)
1655 struct idmac *idmac = &ipu->idmac;
1658 struct idmac_channel *ichan = ipu->channel + i;
1768 struct ipu *ipu = platform_get_drvdata(pdev);
1770 ipu_idmac_exit(ipu);
1771 ipu_irq_detach_irq(ipu, pdev);
1772 clk_disable_unprepare(ipu->ipu_clk);
1773 clk_put(ipu->ipu_clk);
1774 iounmap(ipu->reg_ic);
1775 iounmap(ipu->reg_ipu);
1776 tasklet_kill(&ipu->tasklet);
1787 .name = "ipu-core",
1801 MODULE_ALIAS("platform:ipu-core");