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/ipu-v3 | |
| 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/ipu-v3')
| -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; |
