1/*
2 * Copyright 2020, Data61
3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
4 * ABN 41 687 119 230.
5 *
6 * This software may be distributed and modified according to the terms of
7 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
8 * See "LICENSE_BSD2.txt" for details.
9 *
10 * @TAG(DATA61_BSD)
11 */
12
13#include <errno.h>
14
15#include <utils/util.h>
16#include <gpiomuxserver.h>
17
18typedef struct gpiomuxserver_mux_interface_data {
19    int (*gpiomuxserver_feature_enable)(mux_feature_t mux_feature, mux_gpio_dir_t mux_gpio_dir);
20    int (*gpiomuxserver_feature_disable)(mux_feature_t mux_feature);
21} gpiomuxserver_mux_interface_data_t;
22
23static gpiomuxserver_mux_interface_data_t gpiomuxserver_mux_private_data;
24
25static int gpiomuxserver_feature_enable_wrapper(const mux_sys_t *mux, mux_feature_t feature, enum mux_gpio_dir dir)
26{
27    gpiomuxserver_mux_interface_data_t *gpiomuxserver_data = mux->priv;
28
29    return gpiomuxserver_data->gpiomuxserver_feature_enable(feature, dir);
30}
31
32static int gpiomuxserver_feature_disable_wrapper(const mux_sys_t *mux, mux_feature_t feature)
33{
34    gpiomuxserver_mux_interface_data_t *gpiomuxserver_data = mux->priv;
35
36    return gpiomuxserver_data->gpiomuxserver_feature_disable(feature);
37}
38
39int gpiomuxserver_mux_interface_init(int (*gpiomuxserver_feature_enable)(mux_feature_t mux_feature,
40                                                                         mux_gpio_dir_t mux_gpio_dir),
41                                     int (*gpiomuxserver_feature_disable)(mux_feature_t mux_feature),
42                                     mux_sys_t *mux_sys)
43{
44    if (!gpiomuxserver_feature_enable) {
45        ZF_LOGE("gpiomuxserver_feature_enable is NULL");
46        return -EINVAL;
47    }
48
49    if (!gpiomuxserver_feature_disable) {
50        ZF_LOGE("gpiomuxserver_feature_disable is NULL");
51        return -EINVAL;
52    }
53
54    if (!mux_sys) {
55        ZF_LOGE("mux_sys is NULL");
56        return -EINVAL;
57    }
58
59    gpiomuxserver_mux_private_data.gpiomuxserver_feature_enable = gpiomuxserver_feature_enable;
60    gpiomuxserver_mux_private_data.gpiomuxserver_feature_disable = gpiomuxserver_feature_disable;
61
62    mux_sys->priv = &gpiomuxserver_mux_private_data;
63    mux_sys->feature_enable = gpiomuxserver_feature_enable_wrapper;
64    mux_sys->feature_disable = gpiomuxserver_feature_disable_wrapper;
65
66    return 0;
67}
68