|
|
@@ -112,8 +112,6 @@ struct ipu_dc_priv {
|
|
|
struct ipu_dc channels[IPU_DC_NUM_CHANNELS];
|
|
|
struct mutex mutex;
|
|
|
struct completion comp;
|
|
|
- int dc_irq;
|
|
|
- int dp_irq;
|
|
|
int use_count;
|
|
|
};
|
|
|
|
|
|
@@ -262,47 +260,13 @@ void ipu_dc_enable_channel(struct ipu_dc *dc)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(ipu_dc_enable_channel);
|
|
|
|
|
|
-static irqreturn_t dc_irq_handler(int irq, void *dev_id)
|
|
|
-{
|
|
|
- struct ipu_dc *dc = dev_id;
|
|
|
- u32 reg;
|
|
|
-
|
|
|
- reg = readl(dc->base + DC_WR_CH_CONF);
|
|
|
- reg &= ~DC_WR_CH_CONF_PROG_TYPE_MASK;
|
|
|
- writel(reg, dc->base + DC_WR_CH_CONF);
|
|
|
-
|
|
|
- /* The Freescale BSP kernel clears DIx_COUNTER_RELEASE here */
|
|
|
-
|
|
|
- complete(&dc->priv->comp);
|
|
|
- return IRQ_HANDLED;
|
|
|
-}
|
|
|
-
|
|
|
void ipu_dc_disable_channel(struct ipu_dc *dc)
|
|
|
{
|
|
|
- struct ipu_dc_priv *priv = dc->priv;
|
|
|
- int irq;
|
|
|
- unsigned long ret;
|
|
|
u32 val;
|
|
|
|
|
|
- /* TODO: Handle MEM_FG_SYNC differently from MEM_BG_SYNC */
|
|
|
- if (dc->chno == 1)
|
|
|
- irq = priv->dc_irq;
|
|
|
- else if (dc->chno == 5)
|
|
|
- irq = priv->dp_irq;
|
|
|
- else
|
|
|
- return;
|
|
|
-
|
|
|
- init_completion(&priv->comp);
|
|
|
- enable_irq(irq);
|
|
|
- ret = wait_for_completion_timeout(&priv->comp, msecs_to_jiffies(50));
|
|
|
- disable_irq(irq);
|
|
|
- if (ret == 0) {
|
|
|
- dev_warn(priv->dev, "DC stop timeout after 50 ms\n");
|
|
|
-
|
|
|
- val = readl(dc->base + DC_WR_CH_CONF);
|
|
|
- val &= ~DC_WR_CH_CONF_PROG_TYPE_MASK;
|
|
|
- writel(val, dc->base + DC_WR_CH_CONF);
|
|
|
- }
|
|
|
+ val = readl(dc->base + DC_WR_CH_CONF);
|
|
|
+ val &= ~DC_WR_CH_CONF_PROG_TYPE_MASK;
|
|
|
+ writel(val, dc->base + DC_WR_CH_CONF);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(ipu_dc_disable_channel);
|
|
|
|
|
|
@@ -389,7 +353,7 @@ int ipu_dc_init(struct ipu_soc *ipu, struct device *dev,
|
|
|
struct ipu_dc_priv *priv;
|
|
|
static int channel_offsets[] = { 0, 0x1c, 0x38, 0x54, 0x58, 0x5c,
|
|
|
0x78, 0, 0x94, 0xb4};
|
|
|
- int i, ret;
|
|
|
+ int i;
|
|
|
|
|
|
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
|
|
if (!priv)
|
|
|
@@ -410,23 +374,6 @@ int ipu_dc_init(struct ipu_soc *ipu, struct device *dev,
|
|
|
priv->channels[i].base = priv->dc_reg + channel_offsets[i];
|
|
|
}
|
|
|
|
|
|
- priv->dc_irq = ipu_map_irq(ipu, IPU_IRQ_DC_FC_1);
|
|
|
- if (!priv->dc_irq)
|
|
|
- return -EINVAL;
|
|
|
- ret = devm_request_irq(dev, priv->dc_irq, dc_irq_handler, 0, NULL,
|
|
|
- &priv->channels[1]);
|
|
|
- if (ret < 0)
|
|
|
- return ret;
|
|
|
- disable_irq(priv->dc_irq);
|
|
|
- priv->dp_irq = ipu_map_irq(ipu, IPU_IRQ_DP_SF_END);
|
|
|
- if (!priv->dp_irq)
|
|
|
- return -EINVAL;
|
|
|
- ret = devm_request_irq(dev, priv->dp_irq, dc_irq_handler, 0, NULL,
|
|
|
- &priv->channels[5]);
|
|
|
- if (ret < 0)
|
|
|
- return ret;
|
|
|
- disable_irq(priv->dp_irq);
|
|
|
-
|
|
|
writel(DC_WR_CH_CONF_WORD_SIZE_24 | DC_WR_CH_CONF_DISP_ID_PARALLEL(1) |
|
|
|
DC_WR_CH_CONF_PROG_DI_ID,
|
|
|
priv->channels[1].base + DC_WR_CH_CONF);
|