From 7c68f4ef0b9ea2e3222859ff5e68ea926ddb6259 Mon Sep 17 00:00:00 2001 From: Sichen Zhao <1473996754@qq.com> Date: Wed, 8 Nov 2017 21:43:32 +0800 Subject: Port BBB sd driver files to RTEMS. So BBB can mount and read eMMC and SD card. --- rtemsbsd/include/bsp/nexus-devices.h | 2 + rtemsbsd/include/machine/fdt.h | 0 rtemsbsd/include/rtems/bsd/local/gpiobus_if.h | 152 ++++++++++++++++++ rtemsbsd/include/rtems/bsd/local/sdhci_if.h | 216 ++++++++++++++++++++++++++ rtemsbsd/local/gpiobus_if.c | 62 ++++++++ rtemsbsd/local/sdhci_if.c | 90 +++++++++++ 6 files changed, 522 insertions(+) create mode 100644 rtemsbsd/include/machine/fdt.h create mode 100644 rtemsbsd/include/rtems/bsd/local/gpiobus_if.h create mode 100644 rtemsbsd/include/rtems/bsd/local/sdhci_if.h create mode 100644 rtemsbsd/local/gpiobus_if.c create mode 100644 rtemsbsd/local/sdhci_if.c (limited to 'rtemsbsd') diff --git a/rtemsbsd/include/bsp/nexus-devices.h b/rtemsbsd/include/bsp/nexus-devices.h index 59e9d7f8..320922b9 100644 --- a/rtemsbsd/include/bsp/nexus-devices.h +++ b/rtemsbsd/include/bsp/nexus-devices.h @@ -56,6 +56,8 @@ SYSINIT_DRIVER_REFERENCE(ti_scm, simplebus); SYSINIT_DRIVER_REFERENCE(am335x_prcm, simplebus); SYSINIT_DRIVER_REFERENCE(usbss, simplebus); SYSINIT_DRIVER_REFERENCE(musbotg, usbss); +SYSINIT_DRIVER_REFERENCE(sdhci_ti, simplebus); +SYSINIT_DRIVER_REFERENCE(mmcsd, mmc); SYSINIT_DRIVER_REFERENCE(rtwn_usb, uhub); SYSINIT_MODULE_REFERENCE(wlan_ratectl_none); SYSINIT_MODULE_REFERENCE(wlan_sta); diff --git a/rtemsbsd/include/machine/fdt.h b/rtemsbsd/include/machine/fdt.h new file mode 100644 index 00000000..e69de29b diff --git a/rtemsbsd/include/rtems/bsd/local/gpiobus_if.h b/rtemsbsd/include/rtems/bsd/local/gpiobus_if.h new file mode 100644 index 00000000..fb270f2e --- /dev/null +++ b/rtemsbsd/include/rtems/bsd/local/gpiobus_if.h @@ -0,0 +1,152 @@ +/* + * This file is produced automatically. + * Do not modify anything in here by hand. + * + * Created from source file + * freebsd-org/sys/dev/gpio/gpiobus_if.m + * with + * makeobjops.awk + * + * See the source file for legal information + */ + + +#ifndef _gpiobus_if_h_ +#define _gpiobus_if_h_ + +/** @brief Unique descriptor for the GPIOBUS_ACQUIRE_BUS() method */ +extern struct kobjop_desc gpiobus_acquire_bus_desc; +/** @brief A function implementing the GPIOBUS_ACQUIRE_BUS() method */ +typedef int gpiobus_acquire_bus_t(device_t busdev, device_t dev, int how); + +static __inline int GPIOBUS_ACQUIRE_BUS(device_t busdev, device_t dev, int how) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)busdev)->ops,gpiobus_acquire_bus); + return ((gpiobus_acquire_bus_t *) _m)(busdev, dev, how); +} + +/** @brief Unique descriptor for the GPIOBUS_RELEASE_BUS() method */ +extern struct kobjop_desc gpiobus_release_bus_desc; +/** @brief A function implementing the GPIOBUS_RELEASE_BUS() method */ +typedef void gpiobus_release_bus_t(device_t busdev, device_t dev); + +static __inline void GPIOBUS_RELEASE_BUS(device_t busdev, device_t dev) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)busdev)->ops,gpiobus_release_bus); + ((gpiobus_release_bus_t *) _m)(busdev, dev); +} + +/** @brief Unique descriptor for the GPIOBUS_PIN_SET() method */ +extern struct kobjop_desc gpiobus_pin_set_desc; +/** @brief A function implementing the GPIOBUS_PIN_SET() method */ +typedef int gpiobus_pin_set_t(device_t dev, device_t child, uint32_t pin_num, + uint32_t pin_value); + +static __inline int GPIOBUS_PIN_SET(device_t dev, device_t child, + uint32_t pin_num, uint32_t pin_value) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)dev)->ops,gpiobus_pin_set); + return ((gpiobus_pin_set_t *) _m)(dev, child, pin_num, pin_value); +} + +/** @brief Unique descriptor for the GPIOBUS_PIN_GET() method */ +extern struct kobjop_desc gpiobus_pin_get_desc; +/** @brief A function implementing the GPIOBUS_PIN_GET() method */ +typedef int gpiobus_pin_get_t(device_t dev, device_t child, uint32_t pin_num, + uint32_t *pin_value); + +static __inline int GPIOBUS_PIN_GET(device_t dev, device_t child, + uint32_t pin_num, uint32_t *pin_value) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)dev)->ops,gpiobus_pin_get); + return ((gpiobus_pin_get_t *) _m)(dev, child, pin_num, pin_value); +} + +/** @brief Unique descriptor for the GPIOBUS_PIN_TOGGLE() method */ +extern struct kobjop_desc gpiobus_pin_toggle_desc; +/** @brief A function implementing the GPIOBUS_PIN_TOGGLE() method */ +typedef int gpiobus_pin_toggle_t(device_t dev, device_t child, + uint32_t pin_num); + +static __inline int GPIOBUS_PIN_TOGGLE(device_t dev, device_t child, + uint32_t pin_num) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)dev)->ops,gpiobus_pin_toggle); + return ((gpiobus_pin_toggle_t *) _m)(dev, child, pin_num); +} + +/** @brief Unique descriptor for the GPIOBUS_PIN_GETCAPS() method */ +extern struct kobjop_desc gpiobus_pin_getcaps_desc; +/** @brief A function implementing the GPIOBUS_PIN_GETCAPS() method */ +typedef int gpiobus_pin_getcaps_t(device_t dev, device_t child, + uint32_t pin_num, uint32_t *caps); + +static __inline int GPIOBUS_PIN_GETCAPS(device_t dev, device_t child, + uint32_t pin_num, uint32_t *caps) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)dev)->ops,gpiobus_pin_getcaps); + return ((gpiobus_pin_getcaps_t *) _m)(dev, child, pin_num, caps); +} + +/** @brief Unique descriptor for the GPIOBUS_PIN_GETFLAGS() method */ +extern struct kobjop_desc gpiobus_pin_getflags_desc; +/** @brief A function implementing the GPIOBUS_PIN_GETFLAGS() method */ +typedef int gpiobus_pin_getflags_t(device_t dev, device_t child, + uint32_t pin_num, uint32_t *flags); + +static __inline int GPIOBUS_PIN_GETFLAGS(device_t dev, device_t child, + uint32_t pin_num, uint32_t *flags) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)dev)->ops,gpiobus_pin_getflags); + return ((gpiobus_pin_getflags_t *) _m)(dev, child, pin_num, flags); +} + +/** @brief Unique descriptor for the GPIOBUS_PIN_SETFLAGS() method */ +extern struct kobjop_desc gpiobus_pin_setflags_desc; +/** @brief A function implementing the GPIOBUS_PIN_SETFLAGS() method */ +typedef int gpiobus_pin_setflags_t(device_t dev, device_t child, + uint32_t pin_num, uint32_t flags); + +static __inline int GPIOBUS_PIN_SETFLAGS(device_t dev, device_t child, + uint32_t pin_num, uint32_t flags) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)dev)->ops,gpiobus_pin_setflags); + return ((gpiobus_pin_setflags_t *) _m)(dev, child, pin_num, flags); +} + +/** @brief Unique descriptor for the GPIOBUS_PIN_GETNAME() method */ +extern struct kobjop_desc gpiobus_pin_getname_desc; +/** @brief A function implementing the GPIOBUS_PIN_GETNAME() method */ +typedef int gpiobus_pin_getname_t(device_t dev, uint32_t pin_num, char *name); + +static __inline int GPIOBUS_PIN_GETNAME(device_t dev, uint32_t pin_num, + char *name) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)dev)->ops,gpiobus_pin_getname); + return ((gpiobus_pin_getname_t *) _m)(dev, pin_num, name); +} + +/** @brief Unique descriptor for the GPIOBUS_PIN_SETNAME() method */ +extern struct kobjop_desc gpiobus_pin_setname_desc; +/** @brief A function implementing the GPIOBUS_PIN_SETNAME() method */ +typedef int gpiobus_pin_setname_t(device_t dev, uint32_t pin_num, + const char *name); + +static __inline int GPIOBUS_PIN_SETNAME(device_t dev, uint32_t pin_num, + const char *name) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)dev)->ops,gpiobus_pin_setname); + return ((gpiobus_pin_setname_t *) _m)(dev, pin_num, name); +} + +#endif /* _gpiobus_if_h_ */ diff --git a/rtemsbsd/include/rtems/bsd/local/sdhci_if.h b/rtemsbsd/include/rtems/bsd/local/sdhci_if.h new file mode 100644 index 00000000..531090f8 --- /dev/null +++ b/rtemsbsd/include/rtems/bsd/local/sdhci_if.h @@ -0,0 +1,216 @@ +/* + * This file is produced automatically. + * Do not modify anything in here by hand. + * + * Created from source file + * freebsd-org/sys/dev/sdhci/sdhci_if.m + * with + * makeobjops.awk + * + * See the source file for legal information + */ + + +#ifndef _sdhci_if_h_ +#define _sdhci_if_h_ + +/** @brief Unique descriptor for the SDHCI_READ_1() method */ +extern struct kobjop_desc sdhci_read_1_desc; +/** @brief A function implementing the SDHCI_READ_1() method */ +typedef uint8_t sdhci_read_1_t(device_t brdev, struct sdhci_slot *slot, + bus_size_t off); + +static __inline uint8_t SDHCI_READ_1(device_t brdev, struct sdhci_slot *slot, + bus_size_t off) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_read_1); + return ((sdhci_read_1_t *) _m)(brdev, slot, off); +} + +/** @brief Unique descriptor for the SDHCI_READ_2() method */ +extern struct kobjop_desc sdhci_read_2_desc; +/** @brief A function implementing the SDHCI_READ_2() method */ +typedef uint16_t sdhci_read_2_t(device_t brdev, struct sdhci_slot *slot, + bus_size_t off); + +static __inline uint16_t SDHCI_READ_2(device_t brdev, struct sdhci_slot *slot, + bus_size_t off) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_read_2); + return ((sdhci_read_2_t *) _m)(brdev, slot, off); +} + +/** @brief Unique descriptor for the SDHCI_READ_4() method */ +extern struct kobjop_desc sdhci_read_4_desc; +/** @brief A function implementing the SDHCI_READ_4() method */ +typedef uint32_t sdhci_read_4_t(device_t brdev, struct sdhci_slot *slot, + bus_size_t off); + +static __inline uint32_t SDHCI_READ_4(device_t brdev, struct sdhci_slot *slot, + bus_size_t off) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_read_4); + return ((sdhci_read_4_t *) _m)(brdev, slot, off); +} + +/** @brief Unique descriptor for the SDHCI_READ_MULTI_4() method */ +extern struct kobjop_desc sdhci_read_multi_4_desc; +/** @brief A function implementing the SDHCI_READ_MULTI_4() method */ +typedef void sdhci_read_multi_4_t(device_t brdev, struct sdhci_slot *slot, + bus_size_t off, uint32_t *data, + bus_size_t count); + +static __inline void SDHCI_READ_MULTI_4(device_t brdev, struct sdhci_slot *slot, + bus_size_t off, uint32_t *data, + bus_size_t count) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_read_multi_4); + ((sdhci_read_multi_4_t *) _m)(brdev, slot, off, data, count); +} + +/** @brief Unique descriptor for the SDHCI_WRITE_1() method */ +extern struct kobjop_desc sdhci_write_1_desc; +/** @brief A function implementing the SDHCI_WRITE_1() method */ +typedef void sdhci_write_1_t(device_t brdev, struct sdhci_slot *slot, + bus_size_t off, uint8_t val); + +static __inline void SDHCI_WRITE_1(device_t brdev, struct sdhci_slot *slot, + bus_size_t off, uint8_t val) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_write_1); + ((sdhci_write_1_t *) _m)(brdev, slot, off, val); +} + +/** @brief Unique descriptor for the SDHCI_WRITE_2() method */ +extern struct kobjop_desc sdhci_write_2_desc; +/** @brief A function implementing the SDHCI_WRITE_2() method */ +typedef void sdhci_write_2_t(device_t brdev, struct sdhci_slot *slot, + bus_size_t off, uint16_t val); + +static __inline void SDHCI_WRITE_2(device_t brdev, struct sdhci_slot *slot, + bus_size_t off, uint16_t val) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_write_2); + ((sdhci_write_2_t *) _m)(brdev, slot, off, val); +} + +/** @brief Unique descriptor for the SDHCI_WRITE_4() method */ +extern struct kobjop_desc sdhci_write_4_desc; +/** @brief A function implementing the SDHCI_WRITE_4() method */ +typedef void sdhci_write_4_t(device_t brdev, struct sdhci_slot *slot, + bus_size_t off, uint32_t val); + +static __inline void SDHCI_WRITE_4(device_t brdev, struct sdhci_slot *slot, + bus_size_t off, uint32_t val) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_write_4); + ((sdhci_write_4_t *) _m)(brdev, slot, off, val); +} + +/** @brief Unique descriptor for the SDHCI_WRITE_MULTI_4() method */ +extern struct kobjop_desc sdhci_write_multi_4_desc; +/** @brief A function implementing the SDHCI_WRITE_MULTI_4() method */ +typedef void sdhci_write_multi_4_t(device_t brdev, struct sdhci_slot *slot, + bus_size_t off, uint32_t *data, + bus_size_t count); + +static __inline void SDHCI_WRITE_MULTI_4(device_t brdev, + struct sdhci_slot *slot, + bus_size_t off, uint32_t *data, + bus_size_t count) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_write_multi_4); + ((sdhci_write_multi_4_t *) _m)(brdev, slot, off, data, count); +} + +/** @brief Unique descriptor for the SDHCI_PLATFORM_WILL_HANDLE() method */ +extern struct kobjop_desc sdhci_platform_will_handle_desc; +/** @brief A function implementing the SDHCI_PLATFORM_WILL_HANDLE() method */ +typedef int sdhci_platform_will_handle_t(device_t brdev, + struct sdhci_slot *slot); + +static __inline int SDHCI_PLATFORM_WILL_HANDLE(device_t brdev, + struct sdhci_slot *slot) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_platform_will_handle); + return ((sdhci_platform_will_handle_t *) _m)(brdev, slot); +} + +/** @brief Unique descriptor for the SDHCI_PLATFORM_START_TRANSFER() method */ +extern struct kobjop_desc sdhci_platform_start_transfer_desc; +/** @brief A function implementing the SDHCI_PLATFORM_START_TRANSFER() method */ +typedef void sdhci_platform_start_transfer_t(device_t brdev, + struct sdhci_slot *slot, + uint32_t *intmask); + +static __inline void SDHCI_PLATFORM_START_TRANSFER(device_t brdev, + struct sdhci_slot *slot, + uint32_t *intmask) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_platform_start_transfer); + ((sdhci_platform_start_transfer_t *) _m)(brdev, slot, intmask); +} + +/** @brief Unique descriptor for the SDHCI_PLATFORM_FINISH_TRANSFER() method */ +extern struct kobjop_desc sdhci_platform_finish_transfer_desc; +/** @brief A function implementing the SDHCI_PLATFORM_FINISH_TRANSFER() method */ +typedef void sdhci_platform_finish_transfer_t(device_t brdev, + struct sdhci_slot *slot); + +static __inline void SDHCI_PLATFORM_FINISH_TRANSFER(device_t brdev, + struct sdhci_slot *slot) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_platform_finish_transfer); + ((sdhci_platform_finish_transfer_t *) _m)(brdev, slot); +} + +/** @brief Unique descriptor for the SDHCI_MIN_FREQ() method */ +extern struct kobjop_desc sdhci_min_freq_desc; +/** @brief A function implementing the SDHCI_MIN_FREQ() method */ +typedef uint32_t sdhci_min_freq_t(device_t brdev, struct sdhci_slot *slot); + +static __inline uint32_t SDHCI_MIN_FREQ(device_t brdev, struct sdhci_slot *slot) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_min_freq); + return ((sdhci_min_freq_t *) _m)(brdev, slot); +} + +/** @brief Unique descriptor for the SDHCI_GET_CARD_PRESENT() method */ +extern struct kobjop_desc sdhci_get_card_present_desc; +/** @brief A function implementing the SDHCI_GET_CARD_PRESENT() method */ +typedef bool sdhci_get_card_present_t(device_t brdev, struct sdhci_slot *slot); + +static __inline bool SDHCI_GET_CARD_PRESENT(device_t brdev, + struct sdhci_slot *slot) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_get_card_present); + return ((sdhci_get_card_present_t *) _m)(brdev, slot); +} + +/** @brief Unique descriptor for the SDHCI_SET_UHS_TIMING() method */ +extern struct kobjop_desc sdhci_set_uhs_timing_desc; +/** @brief A function implementing the SDHCI_SET_UHS_TIMING() method */ +typedef void sdhci_set_uhs_timing_t(device_t brdev, struct sdhci_slot *slot); + +static __inline void SDHCI_SET_UHS_TIMING(device_t brdev, + struct sdhci_slot *slot) +{ + kobjop_t _m; + KOBJOPLOOKUP(((kobj_t)brdev)->ops,sdhci_set_uhs_timing); + ((sdhci_set_uhs_timing_t *) _m)(brdev, slot); +} + +#endif /* _sdhci_if_h_ */ diff --git a/rtemsbsd/local/gpiobus_if.c b/rtemsbsd/local/gpiobus_if.c new file mode 100644 index 00000000..a1c7dd5c --- /dev/null +++ b/rtemsbsd/local/gpiobus_if.c @@ -0,0 +1,62 @@ +#include + +/* + * This file is produced automatically. + * Do not modify anything in here by hand. + * + * Created from source file + * freebsd-org/sys/dev/gpio/gpiobus_if.m + * with + * makeobjops.awk + * + * See the source file for legal information + */ + +#include +#include +#include +#include +#include +#include +#include + +struct kobjop_desc gpiobus_acquire_bus_desc = { + 0, { &gpiobus_acquire_bus_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc gpiobus_release_bus_desc = { + 0, { &gpiobus_release_bus_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc gpiobus_pin_set_desc = { + 0, { &gpiobus_pin_set_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc gpiobus_pin_get_desc = { + 0, { &gpiobus_pin_get_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc gpiobus_pin_toggle_desc = { + 0, { &gpiobus_pin_toggle_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc gpiobus_pin_getcaps_desc = { + 0, { &gpiobus_pin_getcaps_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc gpiobus_pin_getflags_desc = { + 0, { &gpiobus_pin_getflags_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc gpiobus_pin_setflags_desc = { + 0, { &gpiobus_pin_setflags_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc gpiobus_pin_getname_desc = { + 0, { &gpiobus_pin_getname_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc gpiobus_pin_setname_desc = { + 0, { &gpiobus_pin_setname_desc, (kobjop_t)kobj_error_method } +}; + diff --git a/rtemsbsd/local/sdhci_if.c b/rtemsbsd/local/sdhci_if.c new file mode 100644 index 00000000..1d6c26d4 --- /dev/null +++ b/rtemsbsd/local/sdhci_if.c @@ -0,0 +1,90 @@ +#include + +/* + * This file is produced automatically. + * Do not modify anything in here by hand. + * + * Created from source file + * freebsd-org/sys/dev/sdhci/sdhci_if.m + * with + * makeobjops.awk + * + * See the source file for legal information + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void +null_set_uhs_timing(device_t brdev __unused, + struct sdhci_slot *slot __unused) +{ + +} + +#include + +struct kobjop_desc sdhci_read_1_desc = { + 0, { &sdhci_read_1_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc sdhci_read_2_desc = { + 0, { &sdhci_read_2_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc sdhci_read_4_desc = { + 0, { &sdhci_read_4_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc sdhci_read_multi_4_desc = { + 0, { &sdhci_read_multi_4_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc sdhci_write_1_desc = { + 0, { &sdhci_write_1_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc sdhci_write_2_desc = { + 0, { &sdhci_write_2_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc sdhci_write_4_desc = { + 0, { &sdhci_write_4_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc sdhci_write_multi_4_desc = { + 0, { &sdhci_write_multi_4_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc sdhci_platform_will_handle_desc = { + 0, { &sdhci_platform_will_handle_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc sdhci_platform_start_transfer_desc = { + 0, { &sdhci_platform_start_transfer_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc sdhci_platform_finish_transfer_desc = { + 0, { &sdhci_platform_finish_transfer_desc, (kobjop_t)kobj_error_method } +}; + +struct kobjop_desc sdhci_min_freq_desc = { + 0, { &sdhci_min_freq_desc, (kobjop_t)sdhci_generic_min_freq } +}; + +struct kobjop_desc sdhci_get_card_present_desc = { + 0, { &sdhci_get_card_present_desc, (kobjop_t)sdhci_generic_get_card_present } +}; + +struct kobjop_desc sdhci_set_uhs_timing_desc = { + 0, { &sdhci_set_uhs_timing_desc, (kobjop_t)null_set_uhs_timing } +}; + -- cgit v1.2.3