22 #include <linux/slab.h>
23 #include <linux/kernel.h>
25 #define DAIO_OUT_MAX SPDIFOO
37 [
LINEO1] = {.left = 0x00, .right = 0x01},
38 [
LINEO2] = {.left = 0x18, .right = 0x19},
39 [
LINEO3] = {.left = 0x08, .right = 0x09},
40 [
LINEO4] = {.left = 0x10, .right = 0x11},
41 [
LINEIM] = {.left = 0x1b5, .right = 0x1bd},
42 [
SPDIFOO] = {.left = 0x20, .right = 0x21},
43 [
SPDIFIO] = {.left = 0x15, .right = 0x1d},
44 [
SPDIFI1] = {.left = 0x95, .right = 0x9d},
48 [
LINEO1] = {.left = 0x40, .right = 0x41},
49 [
LINEO2] = {.left = 0x60, .right = 0x61},
50 [
LINEO3] = {.left = 0x50, .right = 0x51},
51 [
LINEO4] = {.left = 0x70, .right = 0x71},
52 [
LINEIM] = {.left = 0x45, .right = 0xc5},
53 [
MIC] = {.left = 0x55, .right = 0xd5},
54 [
SPDIFOO] = {.left = 0x00, .right = 0x01},
55 [
SPDIFIO] = {.left = 0x05, .right = 0x85},
58 static int daio_master(
struct rsc *
rsc)
66 static int daio_index(
const struct rsc *
rsc)
71 static int daio_out_next_conj(
struct rsc *
rsc)
73 return rsc->
conj += 2;
76 static int daio_in_next_conj_20k1(
struct rsc *
rsc)
78 return rsc->
conj += 0x200;
81 static int daio_in_next_conj_20k2(
struct rsc *
rsc)
83 return rsc->
conj += 0x100;
86 static struct rsc_ops daio_out_rsc_ops = {
87 .master = daio_master,
88 .next_conj = daio_out_next_conj,
93 static struct rsc_ops daio_in_rsc_ops_20k1 = {
94 .master = daio_master,
95 .next_conj = daio_in_next_conj_20k1,
97 .output_slot = daio_index,
100 static struct rsc_ops daio_in_rsc_ops_20k2 = {
101 .master = daio_master,
102 .next_conj = daio_in_next_conj_20k2,
104 .output_slot = daio_index,
107 static unsigned int daio_device_index(
enum DAIOTYP type,
struct hw *
hw)
141 static int dao_spdif_get_spos(
struct dao *
dao,
unsigned int *spos)
143 ((
struct hw *)dao->
hw)->dao_get_spos(dao->
ctrl_blk, spos);
147 static int dao_spdif_set_spos(
struct dao *dao,
unsigned int spos)
149 ((
struct hw *)dao->
hw)->dao_set_spos(dao->
ctrl_blk, spos);
155 ((
struct hw *)dao->
hw)->dao_commit_write(dao->
hw,
160 static int dao_set_left_input(
struct dao *dao,
struct rsc *
input)
170 dao->
ops->clear_left_input(dao);
172 input->
ops->master(input);
173 daio->
rscl.ops->master(&daio->
rscl);
174 for (i = 0; i < daio->
rscl.msr; i++, entry++) {
175 entry->
slot = input->
ops->output_slot(input);
177 dao->
mgr->imap_add(dao->
mgr, entry);
180 input->
ops->next_conj(input);
181 daio->
rscl.ops->next_conj(&daio->
rscl);
183 input->
ops->master(input);
184 daio->
rscl.ops->master(&daio->
rscl);
189 static int dao_set_right_input(
struct dao *dao,
struct rsc *input)
192 struct daio *daio = &dao->
daio;
199 dao->
ops->clear_right_input(dao);
201 input->
ops->master(input);
202 daio->
rscr.ops->master(&daio->
rscr);
203 for (i = 0; i < daio->
rscr.msr; i++, entry++) {
204 entry->
slot = input->
ops->output_slot(input);
206 dao->
mgr->imap_add(dao->
mgr, entry);
209 input->
ops->next_conj(input);
210 daio->
rscr.ops->next_conj(&daio->
rscr);
212 input->
ops->master(input);
213 daio->
rscr.ops->master(&daio->
rscr);
218 static int dao_clear_left_input(
struct dao *dao)
221 struct daio *daio = &dao->
daio;
228 dao->
mgr->imap_delete(dao->
mgr, entry);
230 for (i = 1; i < daio->
rscl.msr; i++) {
232 dao->
mgr->imap_delete(dao->
mgr, entry);
242 static int dao_clear_right_input(
struct dao *dao)
245 struct daio *daio = &dao->
daio;
252 dao->
mgr->imap_delete(dao->
mgr, entry);
254 for (i = 1; i < daio->
rscr.msr; i++) {
256 dao->
mgr->imap_delete(dao->
mgr, entry);
267 .set_spos = dao_spdif_set_spos,
268 .commit_write = dao_commit_write,
269 .get_spos = dao_spdif_get_spos,
270 .reinit = dao_rsc_reinit,
271 .set_left_input = dao_set_left_input,
272 .set_right_input = dao_set_right_input,
273 .clear_left_input = dao_clear_left_input,
274 .clear_right_input = dao_clear_right_input,
277 static int dai_set_srt_srcl(
struct dai *
dai,
struct rsc *
src)
279 src->
ops->master(src);
280 ((
struct hw *)dai->
hw)->dai_srt_set_srcm(dai->
ctrl_blk,
281 src->
ops->index(src));
285 static int dai_set_srt_srcr(
struct dai *dai,
struct rsc *src)
287 src->
ops->master(src);
288 ((
struct hw *)dai->
hw)->dai_srt_set_srco(dai->
ctrl_blk,
289 src->
ops->index(src));
293 static int dai_set_srt_msr(
struct dai *dai,
unsigned int msr)
297 for (rsr = 0; msr > 1; msr >>= 1)
300 ((
struct hw *)dai->
hw)->dai_srt_set_rsr(dai->
ctrl_blk, rsr);
304 static int dai_set_enb_src(
struct dai *dai,
unsigned int enb)
306 ((
struct hw *)dai->
hw)->dai_srt_set_ec(dai->
ctrl_blk, enb);
310 static int dai_set_enb_srt(
struct dai *dai,
unsigned int enb)
312 ((
struct hw *)dai->
hw)->dai_srt_set_et(dai->
ctrl_blk, enb);
318 ((
struct hw *)dai->
hw)->dai_commit_write(dai->
hw,
324 .set_srt_srcl = dai_set_srt_srcl,
325 .set_srt_srcr = dai_set_srt_srcr,
326 .set_srt_msr = dai_set_srt_msr,
327 .set_enb_src = dai_set_enb_src,
328 .set_enb_srt = dai_set_enb_srt,
329 .commit_write = dai_commit_write,
332 static int daio_rsc_init(
struct daio *daio,
337 unsigned int idx_l, idx_r;
361 daio->
rscl.ops = daio->
rscr.ops = &daio_out_rsc_ops;
365 daio->
rscl.ops = daio->
rscr.ops = &daio_in_rsc_ops_20k1;
368 daio->
rscl.ops = daio->
rscr.ops = &daio_in_rsc_ops_20k2;
383 static int daio_rsc_uninit(
struct daio *daio)
391 static int dao_rsc_init(
struct dao *dao,
395 struct hw *hw = mgr->
mgr.hw;
399 err = daio_rsc_init(&dao->
daio, desc, mgr->
mgr.hw);
416 daio_device_index(dao->
daio.type, hw));
421 daio_device_index(dao->
daio.type, hw), conf);
423 daio_device_index(dao->
daio.type, hw));
432 daio_rsc_uninit(&dao->
daio);
436 static int dao_rsc_uninit(
struct dao *dao)
440 dao_clear_left_input(dao);
443 dao_clear_right_input(dao);
448 ((
struct hw *)dao->
hw)->dao_put_ctrl_blk(dao->
ctrl_blk);
450 daio_rsc_uninit(&dao->
daio);
455 static int dao_rsc_reinit(
struct dao *dao,
const struct dao_desc *desc)
464 return dao_rsc_init(dao, &dsc, mgr);
467 static int dai_rsc_init(
struct dai *dai,
472 struct hw *hw = mgr->
mgr.hw;
473 unsigned int rsr, msr;
475 err = daio_rsc_init(&dai->
daio, desc, mgr->
mgr.hw);
480 dai->
hw = mgr->
mgr.hw;
485 for (rsr = 0, msr = desc->
msr; msr > 1; msr >>= 1)
499 daio_rsc_uninit(&dai->
daio);
503 static int dai_rsc_uninit(
struct dai *dai)
505 ((
struct hw *)dai->
hw)->dai_put_ctrl_blk(dai->
ctrl_blk);
507 daio_rsc_uninit(&dai->
daio);
511 static int daio_mgr_get_rsc(
struct rsc_mgr *mgr,
enum DAIOTYP type)
521 static int daio_mgr_put_rsc(
struct rsc_mgr *mgr,
enum DAIOTYP type)
528 static int get_daio_rsc(
struct daio_mgr *mgr,
533 struct dai *dai =
NULL;
534 struct dao *dao =
NULL;
541 err = daio_mgr_get_rsc(&mgr->
mgr, desc->
type);
542 spin_unlock_irqrestore(&mgr->
mgr_lock, flags);
555 err = dao_rsc_init(dao, desc, mgr);
566 err = dai_rsc_init(dai, desc, mgr);
585 daio_mgr_put_rsc(&mgr->
mgr, desc->
type);
586 spin_unlock_irqrestore(&mgr->
mgr_lock, flags);
590 static int put_daio_rsc(
struct daio_mgr *mgr,
struct daio *daio)
598 daio_mgr_put_rsc(&mgr->
mgr, daio->
type);
599 spin_unlock_irqrestore(&mgr->
mgr_lock, flags);
612 static int daio_mgr_enb_daio(
struct daio_mgr *mgr,
struct daio *daio)
614 struct hw *hw = mgr->
mgr.hw;
618 daio_device_index(daio->
type, hw));
621 daio_device_index(daio->
type, hw));
626 static int daio_mgr_dsb_daio(
struct daio_mgr *mgr,
struct daio *daio)
628 struct hw *hw = mgr->
mgr.hw;
632 daio_device_index(daio->
type, hw));
635 daio_device_index(daio->
type, hw));
640 static int daio_map_op(
void *
data,
struct imapper *entry)
643 struct hw *hw = mgr->
hw;
665 spin_unlock_irqrestore(&mgr->
imap_lock, flags);
670 static int daio_imap_delete(
struct daio_mgr *mgr,
struct imapper *entry)
682 spin_unlock_irqrestore(&mgr->
imap_lock, flags);
689 struct hw *hw = mgr->
mgr.hw;
702 daio_mgr = kzalloc(
sizeof(*daio_mgr),
GFP_KERNEL);
712 INIT_LIST_HEAD(&daio_mgr->
imappers);
731 for (i = 0; i < 8; i++) {
732 ((
struct hw *)hw)->daio_mgr_dsb_dao(daio_mgr->
mgr.ctrl_blk, i);
733 ((
struct hw *)hw)->daio_mgr_dsb_dai(daio_mgr->
mgr.ctrl_blk, i);
735 ((
struct hw *)hw)->daio_mgr_commit_write(hw, daio_mgr->
mgr.ctrl_blk);
737 *rdaio_mgr = daio_mgr;
755 spin_unlock_irqrestore(&daio_mgr->
imap_lock, flags);