/* Copyright (c) 2011, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ /* * SDIO-Abstraction-Layer internal interface. */ #ifndef __SDIO_AL_PRIVATE__ #define __SDIO_AL_PRIVATE__ #include #include #include #define DRV_VERSION "1.30" #define MODULE_NAME "sdio_al" #define SDIOC_CHAN_TO_FUNC_NUM(x) ((x)+2) #define REAL_FUNC_TO_FUNC_IN_ARRAY(x) ((x)-1) #define SDIO_PREFIX "SDIO_" #define PEER_CHANNEL_NAME_SIZE 4 #define CHANNEL_NAME_SIZE (sizeof(SDIO_PREFIX) + PEER_CHANNEL_NAME_SIZE) #define SDIO_TEST_POSTFIX_SIZE 5 #define MAX_NUM_OF_SDIO_DEVICES 2 #define TEST_CH_NAME_SIZE (CHANNEL_NAME_SIZE + SDIO_TEST_POSTFIX_SIZE) struct sdio_al_device; /* Forward Declaration */ enum sdio_channel_state { SDIO_CHANNEL_STATE_INVALID, /* before reading software header */ SDIO_CHANNEL_STATE_IDLE, /* channel valid, not opened */ SDIO_CHANNEL_STATE_CLOSED, /* was closed */ SDIO_CHANNEL_STATE_OPEN, /* opened */ SDIO_CHANNEL_STATE_CLOSING, /* during flush, when closing */ }; /** * Peer SDIO-Client channel configuration. * * @is_ready - channel is ready and the data is valid. * * @max_rx_threshold - maximum rx threshold, according to the * total buffers size on the peer pipe. * @max_tx_threshold - maximum tx threshold, according to the * total buffers size on the peer pipe. * @tx_buf_size - size of a single buffer on the peer pipe; a * transfer smaller than the buffer size still * make the buffer unusable for the next transfer. * @max_packet_size * @is_host_ok_to_sleep - Host marks this bit when it's okay to * sleep (no pending transactions) */ struct peer_sdioc_channel_config { u32 is_ready; u32 max_rx_threshold; /* Downlink */ u32 max_tx_threshold; /* Uplink */ u32 tx_buf_size; u32 max_packet_size; u32 is_host_ok_to_sleep; u32 is_packet_mode; u32 peer_operation; u32 is_low_latency_ch; u32 reserved[23]; }; /** * Peer SDIO-Client channel statsitics. * * @last_any_read_avail - the last read avail in all the * channels including this channel. * @last_read_avail - the last read_avail that was read from HW * mailbox. * @last_old_read_avail - the last read_avail channel shadow. * @total_notifs - the total number of read notifications sent * to this channel client * @total_read_times - the total number of successful sdio_read * calls for this channel */ struct sdio_channel_statistics { int last_any_read_avail; int last_read_avail; int last_old_read_avail; int total_notifs; int total_read_times; }; /** * SDIO Channel context. * * @name - channel name. Used by the caller to open the * channel. * * @read_threshold - Threshold on SDIO-Client mailbox for Rx * Data available bytes. When the limit exceed * the SDIO-Client generates an interrupt to the * host. * * @write_threshold - Threshold on SDIO-Client mailbox for Tx * Data available bytes. When the limit exceed * the SDIO-Client generates an interrupt to the * host. * * @def_read_threshold - Default theshold on SDIO-Client for Rx * * @min_write_avail - Threshold of minimal available bytes * to write. Below that threshold the host * will initiate reading the mailbox. * * @poll_delay_msec - Delay between polling the mailbox. When * the SDIO-Client doesn't generates EOT * interrupt for Rx Available bytes, the host * should poll the SDIO-Client mailbox. * * @is_packet_mode - The host get interrupt when a packet is * available at the SDIO-client (pipe EOT * indication). * * @num - channel number. * * @notify - Client's callback. Should not call sdio read/write. * * @priv - Client's private context, provided to callback. * * @is_valid - Channel is used (we have a list of * SDIO_AL_MAX_CHANNELS and not all of them are in * use). * * @is_open - Channel is open. * * @func - SDIO Function handle. * * @rx_pipe_index - SDIO-Client Pipe Index for Rx Data. * * @tx_pipe_index - SDIO-Client Pipe Index for Tx Data. * * @ch_lock - Channel lock to protect channel specific Data * * @rx_pending_bytes - Total number of Rx pending bytes, at Rx * packet list. Maximum of 16KB-1 limited by * SDIO-Client specification. * * @read_avail - Available bytes to read. * * @write_avail - Available bytes to write. * * @rx_size_list_head - The head of Rx Pending Packets List. * * @pdev - platform device - clients to probe for the sdio-al. * * @signature - Context Validity check. * * @sdio_al_dev - a pointer to the sdio_al_device instance of * this channel * * @statistics - channel statistics * */ struct sdio_channel { /* Channel Configuration Parameters*/ char name[CHANNEL_NAME_SIZE]; char ch_test_name[TEST_CH_NAME_SIZE]; int read_threshold; int write_threshold; int def_read_threshold; int threshold_change_cnt; int min_write_avail; int poll_delay_msec; int is_packet_mode; int is_low_latency_ch; struct peer_sdioc_channel_config ch_config; /* Channel Info */ int num; void (*notify)(void *priv, unsigned channel_event); void *priv; int state; struct sdio_func *func; int rx_pipe_index; int tx_pipe_index; struct mutex ch_lock; u32 read_avail; u32 write_avail; u32 peer_tx_buf_size; u16 rx_pending_bytes; struct list_head rx_size_list_head; struct platform_device *pdev; u32 total_rx_bytes; u32 total_tx_bytes; u32 signature; struct sdio_al_device *sdio_al_dev; struct sdio_channel_statistics statistics; }; /** * sdio_downloader_setup * initializes the TTY driver * * @card: a pointer to mmc_card. * @num_of_devices: number of devices. * @channel_number: channel number. * @return 0 on success or negative value on error. * * The TTY stack needs to know in advance how many devices it should * plan to manage. Use this call to set up the ports that will * be exported through SDIO. */ int sdio_downloader_setup(struct mmc_card *card, unsigned int num_of_devices, int func_number, int(*func)(void)); /** * test_channel_init * initializes a test channel * * @name: the channel name. * @return 0 on success or negative value on error. * */ int test_channel_init(char *name); /** * sdio_al_register_lpm_cb * Allow the sdio_al test to register for lpm voting * notifications * * @device_handle: the device handle. * @wakeup_callback: callback function to be called when voting. * */ void sdio_al_register_lpm_cb(void *device_handle, int(*lpm_callback)(void *, int)); /** * sdio_al_unregister_lpm_cb * Allow the sdio_al test to unregister for lpm voting * notifications * * @device_handle: the device handle. * */ void sdio_al_unregister_lpm_cb(void *device_handle); #endif /* __SDIO_AL_PRIVATE__ */