00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef _SDIO_LAYER_H
00010 #define _SDIO_LAYER_H
00011
00012 #include <oska/all.h>
00013 #include <oska/refcount.h>
00014
00015 #include <sdioemb/sdio.h>
00016 #include <sdioemb/sdio_api.h>
00017 #include <sdioemb/slot_api.h>
00018 #include <sdioemb/trace.h>
00019
00020 #include "sdio_event_log.h"
00021 #include "sdio_config.h"
00022
00023 typedef int (*sdioemb_card_io_read8_t)(struct sdioemb_dev *fdev, int function,
00024 uint32_t addr, uint8_t *data);
00025 typedef int (*sdioemb_card_io_read16_t)(struct sdioemb_dev *fdev, int function,
00026 uint32_t addr, uint16_t *data);
00027 typedef int (*sdioemb_card_io_write8_t)(struct sdioemb_dev *fdev, int function,
00028 uint32_t addr, uint8_t data);
00029 typedef int (*sdioemb_card_io_write16_t)(struct sdioemb_dev *fdev, int function,
00030 uint32_t addr, uint16_t data);
00031 typedef int (*sdioemb_card_io_read_t)(struct sdioemb_dev *fdev, int function,
00032 uint32_t addr, uint8_t *data, size_t len);
00033 typedef int (*sdioemb_card_io_write_t)(struct sdioemb_dev *fdev, int function,
00034 uint32_t addr, const uint8_t *data, size_t len);
00035
00036 struct sdioemb_card_io_ops {
00037 sdioemb_card_io_read8_t read8;
00038 sdioemb_card_io_read16_t read16;
00039 sdioemb_card_io_write8_t write8;
00040 sdioemb_card_io_write16_t write16;
00041 sdioemb_card_io_read_t read;
00042 sdioemb_card_io_write_t write;
00043 };
00044
00045
00046 #define SDIOEMB_MAX_FUNCTIONS (SDIO_MAX_FUNCTIONS)
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 #define SDIOEMB_CMD_QUEUE_LEN 32
00057
00058 struct sdioemb_slot_priv {
00059 int id;
00060
00061 unsigned card_present:1;
00062 unsigned card_powered:1;
00063
00064 int num_functions;
00065 struct sdioemb_dev *functions[SDIOEMB_MAX_FUNCTIONS];
00066 int max_bus_width;
00067 int max_card_freq;
00068 int current_clock_freq;
00069 unsigned supports_high_speed:1;
00070
00071 struct sdioemb_card_io_ops io_ops;
00072
00073 os_spinlock_t lock;
00074
00075 unsigned active;
00076 unsigned power;
00077 unsigned int_enabled;
00078 unsigned int_not_acked;
00079
00080 int busy;
00081 struct sdioemb_cmd *cmd_q[SDIOEMB_CMD_QUEUE_LEN];
00082 int cmd_q_head;
00083 int cmd_q_tail;
00084 #if SDIOEMB_CARD_IS_REMOVABLE
00085 os_thread_t card_detect_thread;
00086 #endif
00087 os_mutex_t card_mutex;
00088
00089 #ifdef SDIOEMB_DEBUG_EVENT_LOG
00090 struct sdio_event_log event_log;
00091 #endif
00092 };
00093
00094 struct sdioemb_dev_priv {
00095 struct sdioemb_slot *slot;
00096 os_refcount_t refcount;
00097 uint32_t cis_ptr;
00098 int max_freq;
00099 struct sdioemb_cmd *queued_cmd;
00100 };
00101
00102 void sdio_core_init(void);
00103 void sdio_core_clean_up(void);
00104 struct sdioemb_dev *sdio_dev_alloc(struct sdioemb_slot *slot, int func);
00105 int sdio_dev_add(struct sdioemb_dev *fdev);
00106 void sdio_dev_del(struct sdioemb_dev *fdev);
00107
00108 int sdio_card_detect_init(struct sdioemb_slot *slot);
00109 void sdio_card_detect_exit(struct sdioemb_slot *slot);
00110 int sdio_card_start(struct sdioemb_slot *slot);
00111 void sdio_card_stop(struct sdioemb_slot *slot);
00112 void sdio_card_configure(struct sdioemb_slot *slot);
00113
00114 void slot_start_cmd(struct sdioemb_slot *slot, struct sdioemb_cmd *cmd);
00115 void slot_set_max_bus_freq(struct sdioemb_slot *slot, int freq);
00116 void slot_set_bus_freq(struct sdioemb_slot *slot, int freq);
00117 int slot_set_bus_width(struct sdioemb_slot *slot, int bus_width);
00118
00119 int sdio_func_set_block_size(struct sdioemb_dev *fdev, uint16_t blksz);
00120 void sdio_func_set_max_bus_freq(struct sdioemb_dev *fdev, int max_freq);
00121
00122 int sdio_cis_read_ptr_reg(struct sdioemb_dev *fdev, uint32_t addr, uint32_t *ptr);
00123
00124 int sdio_raw_cmd(struct sdioemb_slot *slot, uint8_t cmd_id, uint32_t arg, unsigned flags,
00125 union sdioemb_response *response);
00126 int cspi_raw_word_cmd(struct sdioemb_slot *slot, uint8_t cmd_id, uint32_t addr, uint16_t *word);
00127
00128 int sdio_io_read8(struct sdioemb_dev *fdev, int func, uint32_t addr, uint8_t *data);
00129 int sdio_io_read16(struct sdioemb_dev *fdev, int func, uint32_t addr, uint16_t *data);
00130 int sdio_io_write8(struct sdioemb_dev *fdev, int func, uint32_t addr, uint8_t data);
00131 int sdio_io_write16(struct sdioemb_dev *fdev, int func, uint32_t addr, uint16_t data);
00132 int sdio_io_read(struct sdioemb_dev *fdev, int func, uint32_t addr, uint8_t *data, size_t len);
00133 int sdio_io_write(struct sdioemb_dev *fdev, int func, uint32_t addr, const uint8_t *data, size_t len);
00134
00135 int cspi_io_read8(struct sdioemb_dev *fdev, int func, uint32_t addr, uint8_t *data);
00136 int cspi_io_read16(struct sdioemb_dev *fdev, int func, uint32_t addr, uint16_t *data);
00137 int cspi_io_write8(struct sdioemb_dev *fdev, int func, uint32_t addr, uint8_t data);
00138 int cspi_io_write16(struct sdioemb_dev *fdev, int func, uint32_t addr, uint16_t data);
00139 int cspi_io_read(struct sdioemb_dev *fdev, int func, uint32_t addr, uint8_t *data, size_t len);
00140 int cspi_io_write(struct sdioemb_dev *fdev, int func, uint32_t addr, const uint8_t *data, size_t len);
00141
00142 int cspi_is_enabled(struct sdioemb_slot *slot);
00143 int cspi_card_init(struct sdioemb_slot *slot);
00144 int cspi_enable(struct sdioemb_slot *slot);
00145
00146 extern int sdioemb_card_poll_interval_ms;
00147 extern int sdioemb_max_bus_freq;
00148 extern uint16_t sdioemb_max_block_size;
00149
00150 extern os_mutex_t sdio_core_mutex;
00151
00152
00153
00154
00155 int sdio_os_dev_add(struct sdioemb_dev *fdev);
00156 void sdio_os_dev_del(struct sdioemb_dev *fdev);
00157
00158 #endif