| .. | .. |
|---|
| 924 | 924 | |
|---|
| 925 | 925 | return err; |
|---|
| 926 | 926 | } |
|---|
| 927 | + |
|---|
| 928 | +static int sdei_api_interrupt_bind(u32 intr_num, u64 *result) |
|---|
| 929 | +{ |
|---|
| 930 | + return invoke_sdei_fn(SDEI_1_0_FN_SDEI_INTERRUPT_BIND, intr_num, 0, 0, 0, |
|---|
| 931 | + 0, result); |
|---|
| 932 | +} |
|---|
| 933 | + |
|---|
| 934 | +int sdei_interrupt_bind(u32 intr_num, u32 *event_num) |
|---|
| 935 | +{ |
|---|
| 936 | + int err; |
|---|
| 937 | + u64 result; |
|---|
| 938 | + |
|---|
| 939 | + err = sdei_api_interrupt_bind(intr_num, &result); |
|---|
| 940 | + if (!err) |
|---|
| 941 | + *event_num = (u32)result; |
|---|
| 942 | + |
|---|
| 943 | + return err; |
|---|
| 944 | +} |
|---|
| 945 | + |
|---|
| 946 | +static int sdei_api_interrupt_release(u32 event_num) |
|---|
| 947 | +{ |
|---|
| 948 | + return invoke_sdei_fn(SDEI_1_0_FN_SDEI_INTERRUPT_RELEASE, event_num, 0, 0, 0, |
|---|
| 949 | + 0, NULL); |
|---|
| 950 | +} |
|---|
| 951 | + |
|---|
| 952 | +int sdei_interrupt_release(u32 event_num) |
|---|
| 953 | +{ |
|---|
| 954 | + struct sdei_event *event; |
|---|
| 955 | + |
|---|
| 956 | + mutex_lock(&sdei_events_lock); |
|---|
| 957 | + event = sdei_event_find(event_num); |
|---|
| 958 | + mutex_unlock(&sdei_events_lock); |
|---|
| 959 | + |
|---|
| 960 | + if (event) { |
|---|
| 961 | + pr_err("%s: need unregister event:%d before release\n", |
|---|
| 962 | + __func__, event_num); |
|---|
| 963 | + return SDEI_DENIED; |
|---|
| 964 | + } |
|---|
| 965 | + |
|---|
| 966 | + return sdei_api_interrupt_release(event_num); |
|---|
| 967 | +} |
|---|
| 927 | 968 | #endif |
|---|
| 928 | 969 | |
|---|
| 929 | 970 | static int sdei_get_conduit(struct platform_device *pdev) |
|---|