1 /*
2 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include "hardware/interp.h"
8 #include "hardware/structs/sio.h"
9 #include "hardware/claim.h"
10
11 check_hw_size(interp_hw_t, SIO_INTERP1_ACCUM0_OFFSET - SIO_INTERP0_ACCUM0_OFFSET);
12
13 check_hw_layout(sio_hw_t, interp, SIO_INTERP0_ACCUM0_OFFSET);
14
15 static_assert(NUM_DMA_CHANNELS <= 16, "");
16
17 static uint8_t _claimed;
18
interp_claim_lane(interp_hw_t * interp,uint lane)19 void interp_claim_lane(interp_hw_t *interp, uint lane) {
20 valid_params_if(INTERP, lane < 2);
21 uint bit = (interp_index(interp) << 1u) | lane;
22 hw_claim_or_assert((uint8_t *) &_claimed, bit, "Lane is already claimed");
23 }
24
interp_claim_lane_mask(interp_hw_t * interp,uint lane_mask)25 void interp_claim_lane_mask(interp_hw_t *interp, uint lane_mask) {
26 valid_params_if(INTERP, lane_mask && lane_mask <= 0x3);
27 if (lane_mask & 1u) interp_claim_lane(interp, 0);
28 if (lane_mask & 2u) interp_claim_lane(interp, 1);
29 }
30
interp_unclaim_lane(interp_hw_t * interp,uint lane)31 void interp_unclaim_lane(interp_hw_t *interp, uint lane) {
32 valid_params_if(INTERP, lane < 2);
33 uint bit = (interp_index(interp) << 1u) | lane;
34 hw_claim_clear((uint8_t *) &_claimed, bit);
35 }
36
interp_save(interp_hw_t * interp,interp_hw_save_t * saver)37 void interp_save(interp_hw_t *interp, interp_hw_save_t *saver) {
38 saver->accum[0] = interp->accum[0];
39 saver->accum[1] = interp->accum[1];
40 saver->base[0] = interp->base[0];
41 saver->base[1] = interp->base[1];
42 saver->base[2] = interp->base[2];
43 saver->ctrl[0] = interp->ctrl[0];
44 saver->ctrl[1] = interp->ctrl[1];
45 }
46
interp_restore(interp_hw_t * interp,interp_hw_save_t * saver)47 void interp_restore(interp_hw_t *interp, interp_hw_save_t *saver) {
48 interp->accum[0] = saver->accum[0];
49 interp->accum[1] = saver->accum[1];
50 interp->base[0] = saver->base[0];
51 interp->base[1] = saver->base[1];
52 interp->base[2] = saver->base[2];
53 interp->ctrl[0] = saver->ctrl[0];
54 interp->ctrl[1] = saver->ctrl[1];
55 }
56