diff options
author | Steve Longerbeam <slongerbeam@gmail.com> | 2014-06-25 21:05:45 -0400 |
---|---|---|
committer | Philipp Zabel <p.zabel@pengutronix.de> | 2014-09-02 08:55:51 -0400 |
commit | 4fd1a07af59bf5e1cfb73f7035bf525522cebc76 (patch) | |
tree | 43246e0bdd5becad59021d39504fef7429621c31 /drivers/gpu | |
parent | 2bcf577eb6361827f8347529803528031033cb83 (diff) |
gpu: ipu-v3: Add ipu_idmac_lock_enable()
Adds ipu_idmac_lock_enable(), which enables or disables channel
burst locking.
Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/ipu-v3/ipu-common.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/drivers/gpu/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c index 0a02465ba102..28be7415a198 100644 --- a/drivers/gpu/ipu-v3/ipu-common.c +++ b/drivers/gpu/ipu-v3/ipu-common.c | |||
@@ -305,6 +305,75 @@ void ipu_idmac_set_double_buffer(struct ipuv3_channel *channel, | |||
305 | } | 305 | } |
306 | EXPORT_SYMBOL_GPL(ipu_idmac_set_double_buffer); | 306 | EXPORT_SYMBOL_GPL(ipu_idmac_set_double_buffer); |
307 | 307 | ||
308 | static const struct { | ||
309 | int chnum; | ||
310 | u32 reg; | ||
311 | int shift; | ||
312 | } idmac_lock_en_info[] = { | ||
313 | { .chnum = 5, .reg = IDMAC_CH_LOCK_EN_1, .shift = 0, }, | ||
314 | { .chnum = 11, .reg = IDMAC_CH_LOCK_EN_1, .shift = 2, }, | ||
315 | { .chnum = 12, .reg = IDMAC_CH_LOCK_EN_1, .shift = 4, }, | ||
316 | { .chnum = 14, .reg = IDMAC_CH_LOCK_EN_1, .shift = 6, }, | ||
317 | { .chnum = 15, .reg = IDMAC_CH_LOCK_EN_1, .shift = 8, }, | ||
318 | { .chnum = 20, .reg = IDMAC_CH_LOCK_EN_1, .shift = 10, }, | ||
319 | { .chnum = 21, .reg = IDMAC_CH_LOCK_EN_1, .shift = 12, }, | ||
320 | { .chnum = 22, .reg = IDMAC_CH_LOCK_EN_1, .shift = 14, }, | ||
321 | { .chnum = 23, .reg = IDMAC_CH_LOCK_EN_1, .shift = 16, }, | ||
322 | { .chnum = 27, .reg = IDMAC_CH_LOCK_EN_1, .shift = 18, }, | ||
323 | { .chnum = 28, .reg = IDMAC_CH_LOCK_EN_1, .shift = 20, }, | ||
324 | { .chnum = 45, .reg = IDMAC_CH_LOCK_EN_2, .shift = 0, }, | ||
325 | { .chnum = 46, .reg = IDMAC_CH_LOCK_EN_2, .shift = 2, }, | ||
326 | { .chnum = 47, .reg = IDMAC_CH_LOCK_EN_2, .shift = 4, }, | ||
327 | { .chnum = 48, .reg = IDMAC_CH_LOCK_EN_2, .shift = 6, }, | ||
328 | { .chnum = 49, .reg = IDMAC_CH_LOCK_EN_2, .shift = 8, }, | ||
329 | { .chnum = 50, .reg = IDMAC_CH_LOCK_EN_2, .shift = 10, }, | ||
330 | }; | ||
331 | |||
332 | int ipu_idmac_lock_enable(struct ipuv3_channel *channel, int num_bursts) | ||
333 | { | ||
334 | struct ipu_soc *ipu = channel->ipu; | ||
335 | unsigned long flags; | ||
336 | u32 bursts, regval; | ||
337 | int i; | ||
338 | |||
339 | switch (num_bursts) { | ||
340 | case 0: | ||
341 | case 1: | ||
342 | bursts = 0x00; /* locking disabled */ | ||
343 | break; | ||
344 | case 2: | ||
345 | bursts = 0x01; | ||
346 | break; | ||
347 | case 4: | ||
348 | bursts = 0x02; | ||
349 | break; | ||
350 | case 8: | ||
351 | bursts = 0x03; | ||
352 | break; | ||
353 | default: | ||
354 | return -EINVAL; | ||
355 | } | ||
356 | |||
357 | for (i = 0; i < ARRAY_SIZE(idmac_lock_en_info); i++) { | ||
358 | if (channel->num == idmac_lock_en_info[i].chnum) | ||
359 | break; | ||
360 | } | ||
361 | if (i >= ARRAY_SIZE(idmac_lock_en_info)) | ||
362 | return -EINVAL; | ||
363 | |||
364 | spin_lock_irqsave(&ipu->lock, flags); | ||
365 | |||
366 | regval = ipu_idmac_read(ipu, idmac_lock_en_info[i].reg); | ||
367 | regval &= ~(0x03 << idmac_lock_en_info[i].shift); | ||
368 | regval |= (bursts << idmac_lock_en_info[i].shift); | ||
369 | ipu_idmac_write(ipu, regval, idmac_lock_en_info[i].reg); | ||
370 | |||
371 | spin_unlock_irqrestore(&ipu->lock, flags); | ||
372 | |||
373 | return 0; | ||
374 | } | ||
375 | EXPORT_SYMBOL_GPL(ipu_idmac_lock_enable); | ||
376 | |||
308 | int ipu_module_enable(struct ipu_soc *ipu, u32 mask) | 377 | int ipu_module_enable(struct ipu_soc *ipu, u32 mask) |
309 | { | 378 | { |
310 | unsigned long lock_flags; | 379 | unsigned long lock_flags; |