Lines Matching +full:src +full:-
1 // SPDX-License-Identifier: GPL-2.0-only
24 static int src_default_config_memrd(struct src *src);
25 static int src_default_config_memwr(struct src *src);
26 static int src_default_config_arcrw(struct src *src);
28 static int (*src_default_config[3])(struct src *) = {
34 static int src_set_state(struct src *src, unsigned int state) in src_set_state() argument
38 hw = src->rsc.hw; in src_set_state()
39 hw->src_set_state(src->rsc.ctrl_blk, state); in src_set_state()
44 static int src_set_bm(struct src *src, unsigned int bm) in src_set_bm() argument
48 hw = src->rsc.hw; in src_set_bm()
49 hw->src_set_bm(src->rsc.ctrl_blk, bm); in src_set_bm()
54 static int src_set_sf(struct src *src, unsigned int sf) in src_set_sf() argument
58 hw = src->rsc.hw; in src_set_sf()
59 hw->src_set_sf(src->rsc.ctrl_blk, sf); in src_set_sf()
64 static int src_set_pm(struct src *src, unsigned int pm) in src_set_pm() argument
68 hw = src->rsc.hw; in src_set_pm()
69 hw->src_set_pm(src->rsc.ctrl_blk, pm); in src_set_pm()
74 static int src_set_rom(struct src *src, unsigned int rom) in src_set_rom() argument
78 hw = src->rsc.hw; in src_set_rom()
79 hw->src_set_rom(src->rsc.ctrl_blk, rom); in src_set_rom()
84 static int src_set_vo(struct src *src, unsigned int vo) in src_set_vo() argument
88 hw = src->rsc.hw; in src_set_vo()
89 hw->src_set_vo(src->rsc.ctrl_blk, vo); in src_set_vo()
94 static int src_set_st(struct src *src, unsigned int st) in src_set_st() argument
98 hw = src->rsc.hw; in src_set_st()
99 hw->src_set_st(src->rsc.ctrl_blk, st); in src_set_st()
104 static int src_set_bp(struct src *src, unsigned int bp) in src_set_bp() argument
108 hw = src->rsc.hw; in src_set_bp()
109 hw->src_set_bp(src->rsc.ctrl_blk, bp); in src_set_bp()
114 static int src_set_cisz(struct src *src, unsigned int cisz) in src_set_cisz() argument
118 hw = src->rsc.hw; in src_set_cisz()
119 hw->src_set_cisz(src->rsc.ctrl_blk, cisz); in src_set_cisz()
124 static int src_set_ca(struct src *src, unsigned int ca) in src_set_ca() argument
128 hw = src->rsc.hw; in src_set_ca()
129 hw->src_set_ca(src->rsc.ctrl_blk, ca); in src_set_ca()
134 static int src_set_sa(struct src *src, unsigned int sa) in src_set_sa() argument
138 hw = src->rsc.hw; in src_set_sa()
139 hw->src_set_sa(src->rsc.ctrl_blk, sa); in src_set_sa()
144 static int src_set_la(struct src *src, unsigned int la) in src_set_la() argument
148 hw = src->rsc.hw; in src_set_la()
149 hw->src_set_la(src->rsc.ctrl_blk, la); in src_set_la()
154 static int src_set_pitch(struct src *src, unsigned int pitch) in src_set_pitch() argument
158 hw = src->rsc.hw; in src_set_pitch()
159 hw->src_set_pitch(src->rsc.ctrl_blk, pitch); in src_set_pitch()
164 static int src_set_clear_zbufs(struct src *src) in src_set_clear_zbufs() argument
168 hw = src->rsc.hw; in src_set_clear_zbufs()
169 hw->src_set_clear_zbufs(src->rsc.ctrl_blk, 1); in src_set_clear_zbufs()
174 static int src_commit_write(struct src *src) in src_commit_write() argument
180 hw = src->rsc.hw; in src_commit_write()
181 src->rsc.ops->master(&src->rsc); in src_commit_write()
182 if (src->rsc.msr > 1) { in src_commit_write()
184 dirty = hw->src_get_dirty(src->rsc.ctrl_blk) & conj_mask; in src_commit_write()
186 hw->src_commit_write(hw, src->rsc.ops->index(&src->rsc), in src_commit_write()
187 src->rsc.ctrl_blk); in src_commit_write()
190 if (MEMWR == src->mode) in src_commit_write()
193 for (i = 1; i < src->rsc.msr; i++) { in src_commit_write()
194 src->rsc.ops->next_conj(&src->rsc); in src_commit_write()
195 hw->src_set_dirty(src->rsc.ctrl_blk, dirty); in src_commit_write()
196 hw->src_commit_write(hw, src->rsc.ops->index(&src->rsc), in src_commit_write()
197 src->rsc.ctrl_blk); in src_commit_write()
199 src->rsc.ops->master(&src->rsc); in src_commit_write()
204 static int src_get_ca(struct src *src) in src_get_ca() argument
208 hw = src->rsc.hw; in src_get_ca()
209 return hw->src_get_ca(hw, src->rsc.ops->index(&src->rsc), in src_get_ca()
210 src->rsc.ctrl_blk); in src_get_ca()
213 static int src_init(struct src *src) in src_init() argument
215 src_default_config[src->mode](src); in src_init()
220 static struct src *src_next_interleave(struct src *src) in src_next_interleave() argument
222 return src->intlv; in src_next_interleave()
225 static int src_default_config_memrd(struct src *src) in src_default_config_memrd() argument
227 struct hw *hw = src->rsc.hw; in src_default_config_memrd()
230 hw->src_set_state(src->rsc.ctrl_blk, SRC_STATE_OFF); in src_default_config_memrd()
231 hw->src_set_bm(src->rsc.ctrl_blk, 1); in src_default_config_memrd()
232 for (rsr = 0, msr = src->rsc.msr; msr > 1; msr >>= 1) in src_default_config_memrd()
235 hw->src_set_rsr(src->rsc.ctrl_blk, rsr); in src_default_config_memrd()
236 hw->src_set_sf(src->rsc.ctrl_blk, SRC_SF_S16); in src_default_config_memrd()
237 hw->src_set_wr(src->rsc.ctrl_blk, 0); in src_default_config_memrd()
238 hw->src_set_pm(src->rsc.ctrl_blk, 0); in src_default_config_memrd()
239 hw->src_set_rom(src->rsc.ctrl_blk, 0); in src_default_config_memrd()
240 hw->src_set_vo(src->rsc.ctrl_blk, 0); in src_default_config_memrd()
241 hw->src_set_st(src->rsc.ctrl_blk, 0); in src_default_config_memrd()
242 hw->src_set_ilsz(src->rsc.ctrl_blk, src->multi - 1); in src_default_config_memrd()
243 hw->src_set_cisz(src->rsc.ctrl_blk, 0x80); in src_default_config_memrd()
244 hw->src_set_sa(src->rsc.ctrl_blk, 0x0); in src_default_config_memrd()
245 hw->src_set_la(src->rsc.ctrl_blk, 0x1000); in src_default_config_memrd()
246 hw->src_set_ca(src->rsc.ctrl_blk, 0x80); in src_default_config_memrd()
247 hw->src_set_pitch(src->rsc.ctrl_blk, 0x1000000); in src_default_config_memrd()
248 hw->src_set_clear_zbufs(src->rsc.ctrl_blk, 1); in src_default_config_memrd()
250 src->rsc.ops->master(&src->rsc); in src_default_config_memrd()
251 hw->src_commit_write(hw, src->rsc.ops->index(&src->rsc), in src_default_config_memrd()
252 src->rsc.ctrl_blk); in src_default_config_memrd()
254 for (msr = 1; msr < src->rsc.msr; msr++) { in src_default_config_memrd()
255 src->rsc.ops->next_conj(&src->rsc); in src_default_config_memrd()
256 hw->src_set_pitch(src->rsc.ctrl_blk, 0x1000000); in src_default_config_memrd()
257 hw->src_commit_write(hw, src->rsc.ops->index(&src->rsc), in src_default_config_memrd()
258 src->rsc.ctrl_blk); in src_default_config_memrd()
260 src->rsc.ops->master(&src->rsc); in src_default_config_memrd()
265 static int src_default_config_memwr(struct src *src) in src_default_config_memwr() argument
267 struct hw *hw = src->rsc.hw; in src_default_config_memwr()
269 hw->src_set_state(src->rsc.ctrl_blk, SRC_STATE_OFF); in src_default_config_memwr()
270 hw->src_set_bm(src->rsc.ctrl_blk, 1); in src_default_config_memwr()
271 hw->src_set_rsr(src->rsc.ctrl_blk, 0); in src_default_config_memwr()
272 hw->src_set_sf(src->rsc.ctrl_blk, SRC_SF_S16); in src_default_config_memwr()
273 hw->src_set_wr(src->rsc.ctrl_blk, 1); in src_default_config_memwr()
274 hw->src_set_pm(src->rsc.ctrl_blk, 0); in src_default_config_memwr()
275 hw->src_set_rom(src->rsc.ctrl_blk, 0); in src_default_config_memwr()
276 hw->src_set_vo(src->rsc.ctrl_blk, 0); in src_default_config_memwr()
277 hw->src_set_st(src->rsc.ctrl_blk, 0); in src_default_config_memwr()
278 hw->src_set_ilsz(src->rsc.ctrl_blk, 0); in src_default_config_memwr()
279 hw->src_set_cisz(src->rsc.ctrl_blk, 0x80); in src_default_config_memwr()
280 hw->src_set_sa(src->rsc.ctrl_blk, 0x0); in src_default_config_memwr()
281 hw->src_set_la(src->rsc.ctrl_blk, 0x1000); in src_default_config_memwr()
282 hw->src_set_ca(src->rsc.ctrl_blk, 0x80); in src_default_config_memwr()
283 hw->src_set_pitch(src->rsc.ctrl_blk, 0x1000000); in src_default_config_memwr()
284 hw->src_set_clear_zbufs(src->rsc.ctrl_blk, 1); in src_default_config_memwr()
286 src->rsc.ops->master(&src->rsc); in src_default_config_memwr()
287 hw->src_commit_write(hw, src->rsc.ops->index(&src->rsc), in src_default_config_memwr()
288 src->rsc.ctrl_blk); in src_default_config_memwr()
293 static int src_default_config_arcrw(struct src *src) in src_default_config_arcrw() argument
295 struct hw *hw = src->rsc.hw; in src_default_config_arcrw()
299 hw->src_set_state(src->rsc.ctrl_blk, SRC_STATE_OFF); in src_default_config_arcrw()
300 hw->src_set_bm(src->rsc.ctrl_blk, 0); in src_default_config_arcrw()
301 for (rsr = 0, msr = src->rsc.msr; msr > 1; msr >>= 1) in src_default_config_arcrw()
304 hw->src_set_rsr(src->rsc.ctrl_blk, rsr); in src_default_config_arcrw()
305 hw->src_set_sf(src->rsc.ctrl_blk, SRC_SF_F32); in src_default_config_arcrw()
306 hw->src_set_wr(src->rsc.ctrl_blk, 0); in src_default_config_arcrw()
307 hw->src_set_pm(src->rsc.ctrl_blk, 0); in src_default_config_arcrw()
308 hw->src_set_rom(src->rsc.ctrl_blk, 0); in src_default_config_arcrw()
309 hw->src_set_vo(src->rsc.ctrl_blk, 0); in src_default_config_arcrw()
310 hw->src_set_st(src->rsc.ctrl_blk, 0); in src_default_config_arcrw()
311 hw->src_set_ilsz(src->rsc.ctrl_blk, 0); in src_default_config_arcrw()
312 hw->src_set_cisz(src->rsc.ctrl_blk, 0x80); in src_default_config_arcrw()
313 hw->src_set_sa(src->rsc.ctrl_blk, 0x0); in src_default_config_arcrw()
314 /*hw->src_set_sa(src->rsc.ctrl_blk, 0x100);*/ in src_default_config_arcrw()
315 hw->src_set_la(src->rsc.ctrl_blk, 0x1000); in src_default_config_arcrw()
316 /*hw->src_set_la(src->rsc.ctrl_blk, 0x03ffffe0);*/ in src_default_config_arcrw()
317 hw->src_set_ca(src->rsc.ctrl_blk, 0x80); in src_default_config_arcrw()
318 hw->src_set_pitch(src->rsc.ctrl_blk, 0x1000000); in src_default_config_arcrw()
319 hw->src_set_clear_zbufs(src->rsc.ctrl_blk, 1); in src_default_config_arcrw()
321 dirty = hw->src_get_dirty(src->rsc.ctrl_blk); in src_default_config_arcrw()
322 src->rsc.ops->master(&src->rsc); in src_default_config_arcrw()
323 for (msr = 0; msr < src->rsc.msr; msr++) { in src_default_config_arcrw()
324 hw->src_set_dirty(src->rsc.ctrl_blk, dirty); in src_default_config_arcrw()
325 hw->src_commit_write(hw, src->rsc.ops->index(&src->rsc), in src_default_config_arcrw()
326 src->rsc.ctrl_blk); in src_default_config_arcrw()
327 src->rsc.ops->next_conj(&src->rsc); in src_default_config_arcrw()
329 src->rsc.ops->master(&src->rsc); in src_default_config_arcrw()
356 src_rsc_init(struct src *src, u32 idx, in src_rsc_init() argument
361 struct src *p; in src_rsc_init()
363 n = (MEMRD == desc->mode) ? desc->multi : 1; in src_rsc_init()
364 for (i = 0, p = src; i < n; i++, p++) { in src_rsc_init()
365 err = rsc_init(&p->rsc, idx + i, SRC, desc->msr, mgr->mgr.hw); in src_rsc_init()
369 /* Initialize src specific rsc operations */ in src_rsc_init()
370 p->ops = &src_rsc_ops; in src_rsc_init()
371 p->multi = (0 == i) ? desc->multi : 1; in src_rsc_init()
372 p->mode = desc->mode; in src_rsc_init()
373 src_default_config[desc->mode](p); in src_rsc_init()
374 mgr->src_enable(mgr, p); in src_rsc_init()
375 p->intlv = p + 1; in src_rsc_init()
377 (--p)->intlv = NULL; /* Set @intlv of the last SRC to NULL */ in src_rsc_init()
379 mgr->commit_write(mgr); in src_rsc_init()
384 for (i--, p--; i >= 0; i--, p--) { in src_rsc_init()
385 mgr->src_disable(mgr, p); in src_rsc_init()
386 rsc_uninit(&p->rsc); in src_rsc_init()
388 mgr->commit_write(mgr); in src_rsc_init()
392 static int src_rsc_uninit(struct src *src, struct src_mgr *mgr) in src_rsc_uninit() argument
395 struct src *p; in src_rsc_uninit()
397 n = (MEMRD == src->mode) ? src->multi : 1; in src_rsc_uninit()
398 for (i = 0, p = src; i < n; i++, p++) { in src_rsc_uninit()
399 mgr->src_disable(mgr, p); in src_rsc_uninit()
400 rsc_uninit(&p->rsc); in src_rsc_uninit()
401 p->multi = 0; in src_rsc_uninit()
402 p->ops = NULL; in src_rsc_uninit()
403 p->mode = NUM_SRCMODES; in src_rsc_uninit()
404 p->intlv = NULL; in src_rsc_uninit()
406 mgr->commit_write(mgr); in src_rsc_uninit()
412 get_src_rsc(struct src_mgr *mgr, const struct src_desc *desc, struct src **rsrc) in get_src_rsc()
416 struct src *src; in get_src_rsc() local
421 /* Check whether there are sufficient src resources to meet request. */ in get_src_rsc()
422 spin_lock_irqsave(&mgr->mgr_lock, flags); in get_src_rsc()
423 if (MEMRD == desc->mode) in get_src_rsc()
424 err = mgr_get_resource(&mgr->mgr, desc->multi, &idx); in get_src_rsc()
426 err = mgr_get_resource(&mgr->mgr, 1, &idx); in get_src_rsc()
428 spin_unlock_irqrestore(&mgr->mgr_lock, flags); in get_src_rsc()
430 dev_err(mgr->card->dev, in get_src_rsc()
431 "Can't meet SRC resource request!\n"); in get_src_rsc()
435 /* Allocate mem for master src resource */ in get_src_rsc()
436 if (MEMRD == desc->mode) in get_src_rsc()
437 src = kcalloc(desc->multi, sizeof(*src), GFP_KERNEL); in get_src_rsc()
439 src = kzalloc(sizeof(*src), GFP_KERNEL); in get_src_rsc()
441 if (!src) { in get_src_rsc()
442 err = -ENOMEM; in get_src_rsc()
446 err = src_rsc_init(src, idx, desc, mgr); in get_src_rsc()
450 *rsrc = src; in get_src_rsc()
455 kfree(src); in get_src_rsc()
457 spin_lock_irqsave(&mgr->mgr_lock, flags); in get_src_rsc()
458 if (MEMRD == desc->mode) in get_src_rsc()
459 mgr_put_resource(&mgr->mgr, desc->multi, idx); in get_src_rsc()
461 mgr_put_resource(&mgr->mgr, 1, idx); in get_src_rsc()
463 spin_unlock_irqrestore(&mgr->mgr_lock, flags); in get_src_rsc()
467 static int put_src_rsc(struct src_mgr *mgr, struct src *src) in put_src_rsc() argument
471 spin_lock_irqsave(&mgr->mgr_lock, flags); in put_src_rsc()
472 src->rsc.ops->master(&src->rsc); in put_src_rsc()
473 if (MEMRD == src->mode) in put_src_rsc()
474 mgr_put_resource(&mgr->mgr, src->multi, in put_src_rsc()
475 src->rsc.ops->index(&src->rsc)); in put_src_rsc()
477 mgr_put_resource(&mgr->mgr, 1, src->rsc.ops->index(&src->rsc)); in put_src_rsc()
479 spin_unlock_irqrestore(&mgr->mgr_lock, flags); in put_src_rsc()
480 src_rsc_uninit(src, mgr); in put_src_rsc()
481 kfree(src); in put_src_rsc()
486 static int src_enable_s(struct src_mgr *mgr, struct src *src) in src_enable_s() argument
488 struct hw *hw = mgr->mgr.hw; in src_enable_s()
491 src->rsc.ops->master(&src->rsc); in src_enable_s()
492 for (i = 0; i < src->rsc.msr; i++) { in src_enable_s()
493 hw->src_mgr_enbs_src(mgr->mgr.ctrl_blk, in src_enable_s()
494 src->rsc.ops->index(&src->rsc)); in src_enable_s()
495 src->rsc.ops->next_conj(&src->rsc); in src_enable_s()
497 src->rsc.ops->master(&src->rsc); in src_enable_s()
502 static int src_enable(struct src_mgr *mgr, struct src *src) in src_enable() argument
504 struct hw *hw = mgr->mgr.hw; in src_enable()
507 src->rsc.ops->master(&src->rsc); in src_enable()
508 for (i = 0; i < src->rsc.msr; i++) { in src_enable()
509 hw->src_mgr_enb_src(mgr->mgr.ctrl_blk, in src_enable()
510 src->rsc.ops->index(&src->rsc)); in src_enable()
511 src->rsc.ops->next_conj(&src->rsc); in src_enable()
513 src->rsc.ops->master(&src->rsc); in src_enable()
518 static int src_disable(struct src_mgr *mgr, struct src *src) in src_disable() argument
520 struct hw *hw = mgr->mgr.hw; in src_disable()
523 src->rsc.ops->master(&src->rsc); in src_disable()
524 for (i = 0; i < src->rsc.msr; i++) { in src_disable()
525 hw->src_mgr_dsb_src(mgr->mgr.ctrl_blk, in src_disable()
526 src->rsc.ops->index(&src->rsc)); in src_disable()
527 src->rsc.ops->next_conj(&src->rsc); in src_disable()
529 src->rsc.ops->master(&src->rsc); in src_disable()
536 struct hw *hw = mgr->mgr.hw; in src_mgr_commit_write()
538 hw->src_mgr_commit_write(hw, mgr->mgr.ctrl_blk); in src_mgr_commit_write()
551 return -ENOMEM; in src_mgr_create()
553 err = rsc_mgr_init(&src_mgr->mgr, SRC, SRC_RESOURCE_NUM, hw); in src_mgr_create()
557 spin_lock_init(&src_mgr->mgr_lock); in src_mgr_create()
558 conj_mask = hw->src_dirty_conj_mask(); in src_mgr_create()
560 src_mgr->get_src = get_src_rsc; in src_mgr_create()
561 src_mgr->put_src = put_src_rsc; in src_mgr_create()
562 src_mgr->src_enable_s = src_enable_s; in src_mgr_create()
563 src_mgr->src_enable = src_enable; in src_mgr_create()
564 src_mgr->src_disable = src_disable; in src_mgr_create()
565 src_mgr->commit_write = src_mgr_commit_write; in src_mgr_create()
566 src_mgr->card = hw->card; in src_mgr_create()
568 /* Disable all SRC resources. */ in src_mgr_create()
570 hw->src_mgr_dsb_src(src_mgr->mgr.ctrl_blk, i); in src_mgr_create()
572 hw->src_mgr_commit_write(hw, src_mgr->mgr.ctrl_blk); in src_mgr_create()
586 rsc_mgr_uninit(&src_mgr->mgr); in src_mgr_destroy()
596 rsc->conj = 0; in srcimp_master()
597 rsc->idx = container_of(rsc, struct srcimp, rsc)->idx[0]; in srcimp_master()
602 rsc->conj++; in srcimp_next_conj()
607 return container_of(rsc, struct srcimp, rsc)->idx[rsc->conj]; in srcimp_index()
617 static int srcimp_map(struct srcimp *srcimp, struct src *src, struct rsc *input) in srcimp_map() argument
622 srcimp->rsc.ops->master(&srcimp->rsc); in srcimp_map()
623 src->rsc.ops->master(&src->rsc); in srcimp_map()
624 input->ops->master(input); in srcimp_map()
627 for (i = 0; i < srcimp->rsc.msr; i++) { in srcimp_map()
628 entry = &srcimp->imappers[i]; in srcimp_map()
629 entry->slot = input->ops->output_slot(input); in srcimp_map()
630 entry->user = src->rsc.ops->index(&src->rsc); in srcimp_map()
631 entry->addr = srcimp->rsc.ops->index(&srcimp->rsc); in srcimp_map()
632 srcimp->mgr->imap_add(srcimp->mgr, entry); in srcimp_map()
633 srcimp->mapped |= (0x1 << i); in srcimp_map()
635 srcimp->rsc.ops->next_conj(&srcimp->rsc); in srcimp_map()
636 input->ops->next_conj(input); in srcimp_map()
639 srcimp->rsc.ops->master(&srcimp->rsc); in srcimp_map()
640 input->ops->master(input); in srcimp_map()
650 for (i = 0; i < srcimp->rsc.msr; i++) { in srcimp_unmap()
651 if (srcimp->mapped & (0x1 << i)) { in srcimp_unmap()
652 srcimp->mgr->imap_delete(srcimp->mgr, in srcimp_unmap()
653 &srcimp->imappers[i]); in srcimp_unmap()
654 srcimp->mapped &= ~(0x1 << i); in srcimp_unmap()
672 err = rsc_init(&srcimp->rsc, srcimp->idx[0], in srcimp_rsc_init()
673 SRCIMP, desc->msr, mgr->mgr.hw); in srcimp_rsc_init()
678 srcimp->imappers = kcalloc(desc->msr, sizeof(struct imapper), in srcimp_rsc_init()
680 if (!srcimp->imappers) { in srcimp_rsc_init()
681 err = -ENOMEM; in srcimp_rsc_init()
686 srcimp->rsc.ops = &srcimp_basic_rsc_ops; in srcimp_rsc_init()
687 srcimp->ops = &srcimp_ops; in srcimp_rsc_init()
688 srcimp->mgr = mgr; in srcimp_rsc_init()
690 srcimp->rsc.ops->master(&srcimp->rsc); in srcimp_rsc_init()
695 rsc_uninit(&srcimp->rsc); in srcimp_rsc_init()
701 kfree(srcimp->imappers); in srcimp_rsc_uninit()
702 srcimp->imappers = NULL; in srcimp_rsc_uninit()
703 srcimp->ops = NULL; in srcimp_rsc_uninit()
704 srcimp->mgr = NULL; in srcimp_rsc_uninit()
705 rsc_uninit(&srcimp->rsc); in srcimp_rsc_uninit()
724 return -ENOMEM; in get_srcimp_rsc()
728 spin_lock_irqsave(&mgr->mgr_lock, flags); in get_srcimp_rsc()
729 for (i = 0; i < desc->msr; i++) { in get_srcimp_rsc()
730 err = mgr_get_resource(&mgr->mgr, 1, &idx); in get_srcimp_rsc()
734 srcimp->idx[i] = idx; in get_srcimp_rsc()
736 spin_unlock_irqrestore(&mgr->mgr_lock, flags); in get_srcimp_rsc()
738 dev_err(mgr->card->dev, in get_srcimp_rsc()
752 spin_lock_irqsave(&mgr->mgr_lock, flags); in get_srcimp_rsc()
753 for (i--; i >= 0; i--) in get_srcimp_rsc()
754 mgr_put_resource(&mgr->mgr, 1, srcimp->idx[i]); in get_srcimp_rsc()
756 spin_unlock_irqrestore(&mgr->mgr_lock, flags); in get_srcimp_rsc()
766 spin_lock_irqsave(&mgr->mgr_lock, flags); in put_srcimp_rsc()
767 for (i = 0; i < srcimp->rsc.msr; i++) in put_srcimp_rsc()
768 mgr_put_resource(&mgr->mgr, 1, srcimp->idx[i]); in put_srcimp_rsc()
770 spin_unlock_irqrestore(&mgr->mgr_lock, flags); in put_srcimp_rsc()
779 struct rsc_mgr *mgr = &((struct srcimp_mgr *)data)->mgr; in srcimp_map_op()
780 struct hw *hw = mgr->hw; in srcimp_map_op()
782 hw->srcimp_mgr_set_imaparc(mgr->ctrl_blk, entry->slot); in srcimp_map_op()
783 hw->srcimp_mgr_set_imapuser(mgr->ctrl_blk, entry->user); in srcimp_map_op()
784 hw->srcimp_mgr_set_imapnxt(mgr->ctrl_blk, entry->next); in srcimp_map_op()
785 hw->srcimp_mgr_set_imapaddr(mgr->ctrl_blk, entry->addr); in srcimp_map_op()
786 hw->srcimp_mgr_commit_write(mgr->hw, mgr->ctrl_blk); in srcimp_map_op()
796 spin_lock_irqsave(&mgr->imap_lock, flags); in srcimp_imap_add()
797 if ((0 == entry->addr) && (mgr->init_imap_added)) { in srcimp_imap_add()
798 input_mapper_delete(&mgr->imappers, in srcimp_imap_add()
799 mgr->init_imap, srcimp_map_op, mgr); in srcimp_imap_add()
800 mgr->init_imap_added = 0; in srcimp_imap_add()
802 err = input_mapper_add(&mgr->imappers, entry, srcimp_map_op, mgr); in srcimp_imap_add()
803 spin_unlock_irqrestore(&mgr->imap_lock, flags); in srcimp_imap_add()
813 spin_lock_irqsave(&mgr->imap_lock, flags); in srcimp_imap_delete()
814 err = input_mapper_delete(&mgr->imappers, entry, srcimp_map_op, mgr); in srcimp_imap_delete()
815 if (list_empty(&mgr->imappers)) { in srcimp_imap_delete()
816 input_mapper_add(&mgr->imappers, mgr->init_imap, in srcimp_imap_delete()
818 mgr->init_imap_added = 1; in srcimp_imap_delete()
820 spin_unlock_irqrestore(&mgr->imap_lock, flags); in srcimp_imap_delete()
834 return -ENOMEM; in srcimp_mgr_create()
836 err = rsc_mgr_init(&srcimp_mgr->mgr, SRCIMP, SRCIMP_RESOURCE_NUM, hw); in srcimp_mgr_create()
840 spin_lock_init(&srcimp_mgr->mgr_lock); in srcimp_mgr_create()
841 spin_lock_init(&srcimp_mgr->imap_lock); in srcimp_mgr_create()
842 INIT_LIST_HEAD(&srcimp_mgr->imappers); in srcimp_mgr_create()
845 err = -ENOMEM; in srcimp_mgr_create()
848 entry->slot = entry->addr = entry->next = entry->user = 0; in srcimp_mgr_create()
849 list_add(&entry->list, &srcimp_mgr->imappers); in srcimp_mgr_create()
850 srcimp_mgr->init_imap = entry; in srcimp_mgr_create()
851 srcimp_mgr->init_imap_added = 1; in srcimp_mgr_create()
853 srcimp_mgr->get_srcimp = get_srcimp_rsc; in srcimp_mgr_create()
854 srcimp_mgr->put_srcimp = put_srcimp_rsc; in srcimp_mgr_create()
855 srcimp_mgr->imap_add = srcimp_imap_add; in srcimp_mgr_create()
856 srcimp_mgr->imap_delete = srcimp_imap_delete; in srcimp_mgr_create()
857 srcimp_mgr->card = hw->card; in srcimp_mgr_create()
864 rsc_mgr_uninit(&srcimp_mgr->mgr); in srcimp_mgr_create()
875 /* free src input mapper list */ in srcimp_mgr_destroy()
876 spin_lock_irqsave(&srcimp_mgr->imap_lock, flags); in srcimp_mgr_destroy()
877 free_input_mapper_list(&srcimp_mgr->imappers); in srcimp_mgr_destroy()
878 spin_unlock_irqrestore(&srcimp_mgr->imap_lock, flags); in srcimp_mgr_destroy()
880 rsc_mgr_uninit(&srcimp_mgr->mgr); in srcimp_mgr_destroy()