ctatc.c (a8f4310be59a2e7fc80fba945bcb32b18f4ad54f) ctatc.c (29959a09cc1aabd2d5f4f03afc0305de6bd29248)
1/**
2 * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
3 *
4 * This source file is released under GPL v2 license (no other versions).
5 * See the COPYING file included in the main directory of this source
6 * distribution for the license terms and conditions.
7 *
8 * @File ctatc.c

--- 247 unchanged lines hidden (view full) ---

256 struct amixer_desc mix_dsc = {0};
257 struct src *src;
258 struct amixer *amixer;
259 int err;
260 int n_amixer = apcm->substream->runtime->channels, i = 0;
261 int device = apcm->substream->pcm->device;
262 unsigned int pitch;
263
1/**
2 * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
3 *
4 * This source file is released under GPL v2 license (no other versions).
5 * See the COPYING file included in the main directory of this source
6 * distribution for the license terms and conditions.
7 *
8 * @File ctatc.c

--- 247 unchanged lines hidden (view full) ---

256 struct amixer_desc mix_dsc = {0};
257 struct src *src;
258 struct amixer *amixer;
259 int err;
260 int n_amixer = apcm->substream->runtime->channels, i = 0;
261 int device = apcm->substream->pcm->device;
262 unsigned int pitch;
263
264 if (NULL != apcm->src) {
265 /* Prepared pcm playback */
266 return 0;
267 }
268
269 /* first release old resources */
264 /* first release old resources */
270 atc->pcm_release_resources(atc, apcm);
265 atc_pcm_release_resources(atc, apcm);
271
272 /* Get SRC resource */
273 desc.multi = apcm->substream->runtime->channels;
274 desc.msr = atc->msr;
275 desc.mode = MEMRD;
276 err = src_mgr->get_src(src_mgr, &desc, (struct src **)&apcm->src);
277 if (err)
278 goto error1;

--- 377 unchanged lines hidden (view full) ---

656 struct srcimp *srcimp;
657 struct ct_mixer *mixer = atc->mixer;
658 struct sum *mono;
659 struct rsc *out_ports[8] = {NULL};
660 int err, i, j, n_sum, multi;
661 unsigned int pitch;
662 int mix_base = 0, imp_base = 0;
663
266
267 /* Get SRC resource */
268 desc.multi = apcm->substream->runtime->channels;
269 desc.msr = atc->msr;
270 desc.mode = MEMRD;
271 err = src_mgr->get_src(src_mgr, &desc, (struct src **)&apcm->src);
272 if (err)
273 goto error1;

--- 377 unchanged lines hidden (view full) ---

651 struct srcimp *srcimp;
652 struct ct_mixer *mixer = atc->mixer;
653 struct sum *mono;
654 struct rsc *out_ports[8] = {NULL};
655 int err, i, j, n_sum, multi;
656 unsigned int pitch;
657 int mix_base = 0, imp_base = 0;
658
664 if (NULL != apcm->src) {
665 /* Prepared pcm capture */
666 return 0;
667 }
659 atc_pcm_release_resources(atc, apcm);
668
669 /* Get needed resources. */
670 err = atc_pcm_capture_get_resources(atc, apcm);
671 if (err)
672 return err;
673
674 /* Connect resources */
675 mixer->get_output_ports(mixer, MIX_PCMO_FRONT,

--- 186 unchanged lines hidden (view full) ---

862}
863
864static int
865spdif_passthru_playback_setup(struct ct_atc *atc, struct ct_atc_pcm *apcm)
866{
867 struct dao *dao = container_of(atc->daios[SPDIFOO], struct dao, daio);
868 unsigned int rate = apcm->substream->runtime->rate;
869 unsigned int status;
660
661 /* Get needed resources. */
662 err = atc_pcm_capture_get_resources(atc, apcm);
663 if (err)
664 return err;
665
666 /* Connect resources */
667 mixer->get_output_ports(mixer, MIX_PCMO_FRONT,

--- 186 unchanged lines hidden (view full) ---

854}
855
856static int
857spdif_passthru_playback_setup(struct ct_atc *atc, struct ct_atc_pcm *apcm)
858{
859 struct dao *dao = container_of(atc->daios[SPDIFOO], struct dao, daio);
860 unsigned int rate = apcm->substream->runtime->rate;
861 unsigned int status;
870 int err;
862 int err = 0;
871 unsigned char iec958_con_fs;
872
873 switch (rate) {
874 case 48000:
875 iec958_con_fs = IEC958_AES3_CON_FS_48000;
876 break;
877 case 44100:
878 iec958_con_fs = IEC958_AES3_CON_FS_44100;

--- 24 unchanged lines hidden (view full) ---

903spdif_passthru_playback_prepare(struct ct_atc *atc, struct ct_atc_pcm *apcm)
904{
905 struct src *src;
906 struct amixer *amixer;
907 struct dao *dao;
908 int err;
909 int i;
910
863 unsigned char iec958_con_fs;
864
865 switch (rate) {
866 case 48000:
867 iec958_con_fs = IEC958_AES3_CON_FS_48000;
868 break;
869 case 44100:
870 iec958_con_fs = IEC958_AES3_CON_FS_44100;

--- 24 unchanged lines hidden (view full) ---

895spdif_passthru_playback_prepare(struct ct_atc *atc, struct ct_atc_pcm *apcm)
896{
897 struct src *src;
898 struct amixer *amixer;
899 struct dao *dao;
900 int err;
901 int i;
902
911 if (NULL != apcm->src)
912 return 0;
903 atc_pcm_release_resources(atc, apcm);
913
914 /* Configure SPDIFOO and PLL to passthrough mode;
915 * determine pll_rate. */
916 err = spdif_passthru_playback_setup(atc, apcm);
917 if (err)
918 return err;
919
920 /* Get needed resources. */

--- 190 unchanged lines hidden (view full) ---

1111 }
1112 dao->ops->set_spos(dao, spos);
1113 dao->ops->commit_write(dao);
1114 mutex_unlock(&atc->atc_mutex);
1115
1116 return err;
1117}
1118
904
905 /* Configure SPDIFOO and PLL to passthrough mode;
906 * determine pll_rate. */
907 err = spdif_passthru_playback_setup(atc, apcm);
908 if (err)
909 return err;
910
911 /* Get needed resources. */

--- 190 unchanged lines hidden (view full) ---

1102 }
1103 dao->ops->set_spos(dao, spos);
1104 dao->ops->commit_write(dao);
1105 mutex_unlock(&atc->atc_mutex);
1106
1107 return err;
1108}
1109
1119static int ct_atc_destroy(struct ct_atc *atc)
1110static int atc_release_resources(struct ct_atc *atc)
1120{
1111{
1121 struct daio_mgr *daio_mgr;
1122 struct dao *dao;
1123 struct dai *dai;
1124 struct daio *daio;
1125 struct sum_mgr *sum_mgr;
1126 struct src_mgr *src_mgr;
1127 struct srcimp_mgr *srcimp_mgr;
1128 struct srcimp *srcimp;
1129 struct ct_mixer *mixer;
1130 int i = 0;
1112 int i;
1113 struct daio_mgr *daio_mgr = NULL;
1114 struct dao *dao = NULL;
1115 struct dai *dai = NULL;
1116 struct daio *daio = NULL;
1117 struct sum_mgr *sum_mgr = NULL;
1118 struct src_mgr *src_mgr = NULL;
1119 struct srcimp_mgr *srcimp_mgr = NULL;
1120 struct srcimp *srcimp = NULL;
1121 struct ct_mixer *mixer = NULL;
1131
1122
1132 if (NULL == atc)
1133 return 0;
1134
1135 if (atc->timer) {
1136 ct_timer_free(atc->timer);
1137 atc->timer = NULL;
1138 }
1139
1140 /* Stop hardware and disable all interrupts */
1141 if (NULL != atc->hw)
1142 ((struct hw *)atc->hw)->card_stop(atc->hw);
1143
1144 /* Destroy internal mixer objects */
1123 /* disconnect internal mixer objects */
1145 if (NULL != atc->mixer) {
1146 mixer = atc->mixer;
1147 mixer->set_input_left(mixer, MIX_LINE_IN, NULL);
1148 mixer->set_input_right(mixer, MIX_LINE_IN, NULL);
1149 mixer->set_input_left(mixer, MIX_MIC_IN, NULL);
1150 mixer->set_input_right(mixer, MIX_MIC_IN, NULL);
1151 mixer->set_input_left(mixer, MIX_SPDIF_IN, NULL);
1152 mixer->set_input_right(mixer, MIX_SPDIF_IN, NULL);
1124 if (NULL != atc->mixer) {
1125 mixer = atc->mixer;
1126 mixer->set_input_left(mixer, MIX_LINE_IN, NULL);
1127 mixer->set_input_right(mixer, MIX_LINE_IN, NULL);
1128 mixer->set_input_left(mixer, MIX_MIC_IN, NULL);
1129 mixer->set_input_right(mixer, MIX_MIC_IN, NULL);
1130 mixer->set_input_left(mixer, MIX_SPDIF_IN, NULL);
1131 mixer->set_input_right(mixer, MIX_SPDIF_IN, NULL);
1153 ct_mixer_destroy(atc->mixer);
1154 }
1155
1156 if (NULL != atc->daios) {
1157 daio_mgr = (struct daio_mgr *)atc->rsc_mgrs[DAIO];
1158 for (i = 0; i < atc->n_daio; i++) {
1159 daio = atc->daios[i];
1160 if (daio->type < LINEIM) {
1161 dao = container_of(daio, struct dao, daio);
1162 dao->ops->clear_left_input(dao);
1163 dao->ops->clear_right_input(dao);
1164 } else {
1165 dai = container_of(daio, struct dai, daio);
1166 /* some thing to do for dai ... */
1167 }
1168 daio_mgr->put_daio(daio_mgr, daio);
1169 }
1170 kfree(atc->daios);
1132 }
1133
1134 if (NULL != atc->daios) {
1135 daio_mgr = (struct daio_mgr *)atc->rsc_mgrs[DAIO];
1136 for (i = 0; i < atc->n_daio; i++) {
1137 daio = atc->daios[i];
1138 if (daio->type < LINEIM) {
1139 dao = container_of(daio, struct dao, daio);
1140 dao->ops->clear_left_input(dao);
1141 dao->ops->clear_right_input(dao);
1142 } else {
1143 dai = container_of(daio, struct dai, daio);
1144 /* some thing to do for dai ... */
1145 }
1146 daio_mgr->put_daio(daio_mgr, daio);
1147 }
1148 kfree(atc->daios);
1149 atc->daios = NULL;
1171 }
1172
1173 if (NULL != atc->pcm) {
1174 sum_mgr = atc->rsc_mgrs[SUM];
1175 for (i = 0; i < atc->n_pcm; i++)
1176 sum_mgr->put_sum(sum_mgr, atc->pcm[i]);
1177
1178 kfree(atc->pcm);
1150 }
1151
1152 if (NULL != atc->pcm) {
1153 sum_mgr = atc->rsc_mgrs[SUM];
1154 for (i = 0; i < atc->n_pcm; i++)
1155 sum_mgr->put_sum(sum_mgr, atc->pcm[i]);
1156
1157 kfree(atc->pcm);
1158 atc->pcm = NULL;
1179 }
1180
1181 if (NULL != atc->srcs) {
1182 src_mgr = atc->rsc_mgrs[SRC];
1183 for (i = 0; i < atc->n_src; i++)
1184 src_mgr->put_src(src_mgr, atc->srcs[i]);
1185
1186 kfree(atc->srcs);
1159 }
1160
1161 if (NULL != atc->srcs) {
1162 src_mgr = atc->rsc_mgrs[SRC];
1163 for (i = 0; i < atc->n_src; i++)
1164 src_mgr->put_src(src_mgr, atc->srcs[i]);
1165
1166 kfree(atc->srcs);
1167 atc->srcs = NULL;
1187 }
1188
1189 if (NULL != atc->srcimps) {
1190 srcimp_mgr = atc->rsc_mgrs[SRCIMP];
1191 for (i = 0; i < atc->n_srcimp; i++) {
1192 srcimp = atc->srcimps[i];
1193 srcimp->ops->unmap(srcimp);
1194 srcimp_mgr->put_srcimp(srcimp_mgr, atc->srcimps[i]);
1195 }
1196 kfree(atc->srcimps);
1168 }
1169
1170 if (NULL != atc->srcimps) {
1171 srcimp_mgr = atc->rsc_mgrs[SRCIMP];
1172 for (i = 0; i < atc->n_srcimp; i++) {
1173 srcimp = atc->srcimps[i];
1174 srcimp->ops->unmap(srcimp);
1175 srcimp_mgr->put_srcimp(srcimp_mgr, atc->srcimps[i]);
1176 }
1177 kfree(atc->srcimps);
1178 atc->srcimps = NULL;
1197 }
1198
1179 }
1180
1181 return 0;
1182}
1183
1184static int ct_atc_destroy(struct ct_atc *atc)
1185{
1186 int i = 0;
1187
1188 if (NULL == atc)
1189 return 0;
1190
1191 if (atc->timer) {
1192 ct_timer_free(atc->timer);
1193 atc->timer = NULL;
1194 }
1195
1196 atc_release_resources(atc);
1197
1198 /* Destroy internal mixer objects */
1199 if (NULL != atc->mixer)
1200 ct_mixer_destroy(atc->mixer);
1201
1199 for (i = 0; i < NUM_RSCTYP; i++) {
1200 if ((NULL != rsc_mgr_funcs[i].destroy) &&
1201 (NULL != atc->rsc_mgrs[i]))
1202 rsc_mgr_funcs[i].destroy(atc->rsc_mgrs[i]);
1203
1204 }
1205
1206 if (NULL != atc->hw)

--- 111 unchanged lines hidden (view full) ---

1318 "Failed to create rsc_mgr %d!!!\n", i);
1319 return err;
1320 }
1321 }
1322
1323 return 0;
1324}
1325
1202 for (i = 0; i < NUM_RSCTYP; i++) {
1203 if ((NULL != rsc_mgr_funcs[i].destroy) &&
1204 (NULL != atc->rsc_mgrs[i]))
1205 rsc_mgr_funcs[i].destroy(atc->rsc_mgrs[i]);
1206
1207 }
1208
1209 if (NULL != atc->hw)

--- 111 unchanged lines hidden (view full) ---

1321 "Failed to create rsc_mgr %d!!!\n", i);
1322 return err;
1323 }
1324 }
1325
1326 return 0;
1327}
1328
1326static int __devinit atc_get_resources(struct ct_atc *atc)
1329static int atc_get_resources(struct ct_atc *atc)
1327{
1328 struct daio_desc da_desc = {0};
1329 struct daio_mgr *daio_mgr;
1330 struct src_desc src_dsc = {0};
1331 struct src_mgr *src_mgr;
1332 struct srcimp_desc srcimp_dsc = {0};
1333 struct srcimp_mgr *srcimp_mgr;
1334 struct sum_desc sum_dsc = {0};

--- 80 unchanged lines hidden (view full) ---

1415 err = sum_mgr->get_sum(sum_mgr, &sum_dsc,
1416 (struct sum **)&atc->pcm[i]);
1417 if (err)
1418 return err;
1419
1420 atc->n_pcm++;
1421 }
1422
1330{
1331 struct daio_desc da_desc = {0};
1332 struct daio_mgr *daio_mgr;
1333 struct src_desc src_dsc = {0};
1334 struct src_mgr *src_mgr;
1335 struct srcimp_desc srcimp_dsc = {0};
1336 struct srcimp_mgr *srcimp_mgr;
1337 struct sum_desc sum_dsc = {0};

--- 80 unchanged lines hidden (view full) ---

1418 err = sum_mgr->get_sum(sum_mgr, &sum_dsc,
1419 (struct sum **)&atc->pcm[i]);
1420 if (err)
1421 return err;
1422
1423 atc->n_pcm++;
1424 }
1425
1423 err = ct_mixer_create(atc, (struct ct_mixer **)&atc->mixer);
1424 if (err) {
1425 printk(KERN_ERR "ctxfi: Failed to create mixer obj!!!\n");
1426 return err;
1427 }
1428
1429 return 0;
1430}
1431
1426 return 0;
1427}
1428
1432static void __devinit
1429static void
1433atc_connect_dai(struct src_mgr *src_mgr, struct dai *dai,
1434 struct src **srcs, struct srcimp **srcimps)
1435{
1436 struct rsc *rscs[2] = {NULL};
1437 struct src *src;
1438 struct srcimp *srcimp;
1439 int i = 0;
1440

--- 22 unchanged lines hidden (view full) ---

1463
1464 dai->ops->set_enb_src(dai, 1);
1465 dai->ops->set_enb_srt(dai, 1);
1466 dai->ops->commit_write(dai);
1467
1468 src_mgr->commit_write(src_mgr); /* Synchronously enable SRCs */
1469}
1470
1430atc_connect_dai(struct src_mgr *src_mgr, struct dai *dai,
1431 struct src **srcs, struct srcimp **srcimps)
1432{
1433 struct rsc *rscs[2] = {NULL};
1434 struct src *src;
1435 struct srcimp *srcimp;
1436 int i = 0;
1437

--- 22 unchanged lines hidden (view full) ---

1460
1461 dai->ops->set_enb_src(dai, 1);
1462 dai->ops->set_enb_srt(dai, 1);
1463 dai->ops->commit_write(dai);
1464
1465 src_mgr->commit_write(src_mgr); /* Synchronously enable SRCs */
1466}
1467
1471static void __devinit atc_connect_resources(struct ct_atc *atc)
1468static void atc_connect_resources(struct ct_atc *atc)
1472{
1473 struct dai *dai;
1474 struct dao *dao;
1475 struct src *src;
1476 struct sum *sum;
1477 struct ct_mixer *mixer;
1478 struct rsc *rscs[2] = {NULL};
1479 int i, j;

--- 29 unchanged lines hidden (view full) ---

1509 for (i = MIX_PCMI_FRONT, j = 0; i <= MIX_PCMI_SURROUND; i++, j += 2) {
1510 sum = atc->pcm[j];
1511 mixer->set_input_left(mixer, i, &sum->rsc);
1512 sum = atc->pcm[j+1];
1513 mixer->set_input_right(mixer, i, &sum->rsc);
1514 }
1515}
1516
1469{
1470 struct dai *dai;
1471 struct dao *dao;
1472 struct src *src;
1473 struct sum *sum;
1474 struct ct_mixer *mixer;
1475 struct rsc *rscs[2] = {NULL};
1476 int i, j;

--- 29 unchanged lines hidden (view full) ---

1506 for (i = MIX_PCMI_FRONT, j = 0; i <= MIX_PCMI_SURROUND; i++, j += 2) {
1507 sum = atc->pcm[j];
1508 mixer->set_input_left(mixer, i, &sum->rsc);
1509 sum = atc->pcm[j+1];
1510 mixer->set_input_right(mixer, i, &sum->rsc);
1511 }
1512}
1513
1514#ifdef CONFIG_PM
1515static int atc_suspend(struct ct_atc *atc, pm_message_t state)
1516{
1517 int i;
1518 struct hw *hw = atc->hw;
1519
1520 snd_power_change_state(atc->card, SNDRV_CTL_POWER_D3hot);
1521
1522 for (i = FRONT; i < NUM_PCMS; i++) {
1523 if (!atc->pcms[i])
1524 continue;
1525
1526 snd_pcm_suspend_all(atc->pcms[i]);
1527 }
1528
1529 atc_release_resources(atc);
1530
1531 hw->suspend(hw, state);
1532
1533 return 0;
1534}
1535
1536static int atc_hw_resume(struct ct_atc *atc)
1537{
1538 struct hw *hw = atc->hw;
1539 struct card_conf info = {0};
1540
1541 /* Re-initialize card hardware. */
1542 info.rsr = atc->rsr;
1543 info.msr = atc->msr;
1544 info.vm_pgt_phys = atc_get_ptp_phys(atc, 0);
1545 return hw->resume(hw, &info);
1546}
1547
1548static int atc_resources_resume(struct ct_atc *atc)
1549{
1550 struct ct_mixer *mixer;
1551 int err = 0;
1552
1553 /* Get resources */
1554 err = atc_get_resources(atc);
1555 if (err < 0) {
1556 atc_release_resources(atc);
1557 return err;
1558 }
1559
1560 /* Build topology */
1561 atc_connect_resources(atc);
1562
1563 mixer = atc->mixer;
1564 mixer->resume(mixer);
1565
1566 return 0;
1567}
1568
1569static int atc_resume(struct ct_atc *atc)
1570{
1571 int err = 0;
1572
1573 /* Do hardware resume. */
1574 err = atc_hw_resume(atc);
1575 if (err < 0) {
1576 printk(KERN_ERR "ctxfi: pci_enable_device failed, "
1577 "disabling device\n");
1578 snd_card_disconnect(atc->card);
1579 return err;
1580 }
1581
1582 err = atc_resources_resume(atc);
1583 if (err < 0)
1584 return err;
1585
1586 snd_power_change_state(atc->card, SNDRV_CTL_POWER_D0);
1587
1588 return 0;
1589}
1590#endif
1591
1517static struct ct_atc atc_preset __devinitdata = {
1518 .map_audio_buffer = ct_map_audio_buffer,
1519 .unmap_audio_buffer = ct_unmap_audio_buffer,
1520 .pcm_playback_prepare = atc_pcm_playback_prepare,
1521 .pcm_release_resources = atc_pcm_release_resources,
1522 .pcm_playback_start = atc_pcm_playback_start,
1523 .pcm_playback_stop = atc_pcm_stop,
1524 .pcm_playback_position = atc_pcm_playback_position,

--- 12 unchanged lines hidden (view full) ---

1537 .line_rear_unmute = atc_line_rear_unmute,
1538 .line_in_unmute = atc_line_in_unmute,
1539 .spdif_out_unmute = atc_spdif_out_unmute,
1540 .spdif_in_unmute = atc_spdif_in_unmute,
1541 .spdif_out_get_status = atc_spdif_out_get_status,
1542 .spdif_out_set_status = atc_spdif_out_set_status,
1543 .spdif_out_passthru = atc_spdif_out_passthru,
1544 .have_digit_io_switch = atc_have_digit_io_switch,
1592static struct ct_atc atc_preset __devinitdata = {
1593 .map_audio_buffer = ct_map_audio_buffer,
1594 .unmap_audio_buffer = ct_unmap_audio_buffer,
1595 .pcm_playback_prepare = atc_pcm_playback_prepare,
1596 .pcm_release_resources = atc_pcm_release_resources,
1597 .pcm_playback_start = atc_pcm_playback_start,
1598 .pcm_playback_stop = atc_pcm_stop,
1599 .pcm_playback_position = atc_pcm_playback_position,

--- 12 unchanged lines hidden (view full) ---

1612 .line_rear_unmute = atc_line_rear_unmute,
1613 .line_in_unmute = atc_line_in_unmute,
1614 .spdif_out_unmute = atc_spdif_out_unmute,
1615 .spdif_in_unmute = atc_spdif_in_unmute,
1616 .spdif_out_get_status = atc_spdif_out_get_status,
1617 .spdif_out_set_status = atc_spdif_out_set_status,
1618 .spdif_out_passthru = atc_spdif_out_passthru,
1619 .have_digit_io_switch = atc_have_digit_io_switch,
1620#ifdef CONFIG_PM
1621 .suspend = atc_suspend,
1622 .resume = atc_resume,
1623#endif
1545};
1546
1547/**
1548 * ct_atc_create - create and initialize a hardware manager
1549 * @card: corresponding alsa card object
1550 * @pci: corresponding kernel pci device object
1551 * @ratc: return created object address in it
1552 *

--- 42 unchanged lines hidden (view full) ---

1595 if (err < 0)
1596 goto error1;
1597
1598 /* Create all atc hw devices */
1599 err = atc_create_hw_devs(atc);
1600 if (err < 0)
1601 goto error1;
1602
1624};
1625
1626/**
1627 * ct_atc_create - create and initialize a hardware manager
1628 * @card: corresponding alsa card object
1629 * @pci: corresponding kernel pci device object
1630 * @ratc: return created object address in it
1631 *

--- 42 unchanged lines hidden (view full) ---

1674 if (err < 0)
1675 goto error1;
1676
1677 /* Create all atc hw devices */
1678 err = atc_create_hw_devs(atc);
1679 if (err < 0)
1680 goto error1;
1681
1682 err = ct_mixer_create(atc, (struct ct_mixer **)&atc->mixer);
1683 if (err) {
1684 printk(KERN_ERR "ctxfi: Failed to create mixer obj!!!\n");
1685 goto error1;
1686 }
1687
1603 /* Get resources */
1604 err = atc_get_resources(atc);
1605 if (err < 0)
1606 goto error1;
1607
1608 /* Build topology */
1609 atc_connect_resources(atc);
1610

--- 18 unchanged lines hidden ---
1688 /* Get resources */
1689 err = atc_get_resources(atc);
1690 if (err < 0)
1691 goto error1;
1692
1693 /* Build topology */
1694 atc_connect_resources(atc);
1695

--- 18 unchanged lines hidden ---