/* * i2c-slave.h - definitions for the i2c-slave-bus interface * * Copyright (c) 2009-2011, NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * 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. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* ------------------------------------------------------------------------- */ #ifndef _LINUX_I2C_SLAVE_H #define _LINUX_I2C_SLAVE_H #include #ifdef __KERNEL__ /* --- General options ------------------------------------------------ */ struct i2c_client; struct i2c_slave_algorithm; struct i2c_slave_adapter; #if defined(CONFIG_I2C_SLAVE) && defined(CONFIG_I2C) /** * i2c_slave_send - Sends data to master. When master issues a read cycle, the * data is sent by the slave. * This function copies the client data into the slave tx buffer and return to * client. This is not a blocking call. Data will be sent to master later once * slave got the master-ready cycle transfer. * if there is no sufficient space to write the client buffer, it will return * error. it will not write partial data. * @client: Handle to i2c-slave client. * @buf: Data that will be written to the master * @count: How many bytes to write. * * Returns negative errno, or else the number of bytes written. */ extern int i2c_slave_send(struct i2c_client *client, const char *buf, int count); /** * i2c_slave_get_tx_status - Get amount of data available in tx buffer. If there * is still data in tx buffer then wait for given time to transfer complete * for a give timeout. * @client: Handle to i2c-slave client. * @timeout_ms: Time to wait for transfer to complete. * * Returns negative errno, or else the number of bytes remaining in tx buffer. */ extern int i2c_slave_get_tx_status(struct i2c_client *client, int timeout_ms); /** * i2c_slave_recv - Receive data from master. The data received from master is * stored on slave rx buffer. When this api will be called, the data will be * copied from the slave rx buffer to client buffer. If requested amount (count) * of data is not available then it will wait for either min_count to be receive * or timeout whatever first. * * if timeout_ms = 0, then wait for min_count data to be read. * if timoue_ms non zero then wait for the data till timeout happen. * @client: Handle to i2c-slave client. * @buf: Data that will be read from the master * @count: How many bytes to read. * @min_count: Block till read min_count of data. * @timeout_ms: Time to wait for read to be complete. * * Returns negative errno, or else the number of bytes read. */ extern int i2c_slave_recv(struct i2c_client *client, char *buf, int count, int min_count, int timeout_ms); /** * i2c_slave_start - Start the i2c slave to receive/transmit data. * After this i2c controller starts responding master. * The dummy-char will send to master if there is no data to send on slave tx * buffer. * @client: Handle to i2c-slave client. * @dummy_char: Data which will be send to master if there is no data to be send * in slave tx buffer. * * Returns negative errno, or else 0 for success. */ extern int i2c_slave_start(struct i2c_client *client, unsigned char dummy_char); /** * i2c_slave_stop - Stop slave to receive/transmit data. * After this i2c controller stops responding master. * @client: Handle to i2c-slave client. * @is_buffer_clear: Reset the tx and rx slave buffer or not. */ extern void i2c_slave_stop(struct i2c_client *client, int is_buffer_clear); /** * i2c_slave_flush_buffer - Flush the receive and transmit buffer. * @client: Handle to i2c-slave client. * @is_flush_tx_buffer: Reset the tx slave buffer or not. * @is_flush_rx_buffer: Reset the rx slave buffer or not. * * Returns negative errno, or else 0 for success. */ extern int i2c_slave_flush_buffer(struct i2c_client *client, int is_flush_tx_buffer, int is_flush_rx_buffer); /** * i2c_slave_get_nack_cycle - Get the number of master read cycle on which * dummy char sent. This is the way to find that how much cycle slave sent the * NACK packet. * * @client: Handle to i2c-slave client. * @is_cout_reset: Reset the nack count or not. * * Returns negative errno, or else 0 for success. */ extern int i2c_slave_get_nack_cycle(struct i2c_client *client, int is_cout_reset); /** * i2c_add_slave_adapter - Add slave adapter. * * @slv_adap: Slave adapter. * @force_nr: Adapter number. * * Returns negative errno, or else 0 for success. */ extern int i2c_add_slave_adapter(struct i2c_slave_adapter *slv_adap, bool force_nr); /** * i2c_del_slave_adapter - Delete slave adapter. * * @slv_adap: Slave adapter. * * Returns negative errno, or else 0 for success. */ extern int i2c_del_slave_adapter(struct i2c_slave_adapter *slv_adap); #endif /* I2C_SLAVE */ /* * i2c_slave_adapter is the structure used to identify a physical i2c bus along * with the access algorithms necessary to access it. */ struct i2c_slave_adapter { struct module *owner; unsigned int id; unsigned int class; /* classes to allow probing for */ /* the algorithm to access the i2c-slave bus */ const struct i2c_slave_algorithm *slv_algo; void *algo_data; void *parent_data; /* data fields that are valid for all devices */ u8 level; /* nesting level for lockdep */ struct mutex bus_lock; int timeout; /* in jiffies */ int retries; struct device *dev; /* the adapter device */ struct device *parent_dev; /* the adapter device */ int nr; char name[48]; struct completion dev_released; }; static inline void *i2c_get_slave_adapdata(const struct i2c_slave_adapter *dev) { return dev_get_drvdata(dev->dev); } static inline void i2c_set_slave_adapdata(struct i2c_slave_adapter *dev, void *data) { dev_set_drvdata(dev->dev, data); } /* * The following struct are for those who like to implement new i2c slave * bus drivers: * i2c_slave_algorithm is the interface to a class of hardware solutions which * can be addressed using the same bus algorithms. */ struct i2c_slave_algorithm { /* Start the slave to receive/transmit data. * The dummy-char will send to master if there is no data to send on * slave tx buffer. */ int (*slave_start)(struct i2c_slave_adapter *slv_adap, int addr, int is_ten_bit_addr, unsigned char dummy_char); /* Stop slave to receive/transmit data. * Required information to reset the slave rx and tx buffer to reset * or not. */ void (*slave_stop)(struct i2c_slave_adapter *slv_adap, int is_buffer_clear); /* * Send data to master. The data will be copied on the slave tx buffer * and will send to master once master initiates the master-read cycle. * Function will return immediately once the buffer copied into slave * tx buffer. * Client will not wait till data is sent to master. * This function will not copy data partially. If sufficient space is * not available, it will return error. */ int (*slave_send)(struct i2c_slave_adapter *slv_adap, const char *buf, int count); /* * Get amount of data available in tx buffer. If there is still data in * tx buffer wait for given time to get slave tx buffer emptied. * returns number of data available in slave tx buffer. */ int (*slave_get_tx_status)(struct i2c_slave_adapter *slv_adap, int timeout_ms); /* * Receive data to master. The data received from master is stored on * slave rx buffer. When this api will be called, the data will be * coped from the slave rx buffer to client buffer. If requested (count) * data is not available then it will wait for either min_count to be * receive or timeout whatever first. * * if timeout_ms = 0, then wait for min_count data to be read. * if timoue_ms non zero then wait for the data till timeout happen. * returns number of bytes read as positive integer otherwise error. */ int (*slave_recv)(struct i2c_slave_adapter *slv_adap, char *buf, int count, int min_count, int timeout_ms); /* Flush the receive and transmit buffer. */ int (*slave_flush_buffer)(struct i2c_slave_adapter *slv_adap, int is_flush_tx_buffer, int is_flush_rx_buffer); /* Get the number of dummy char cycle. * Get the number of master read cycle on which dummy character has * been sent. * This can be treat as NACK cycle from slave side. * Pass option whether count need to be reset or not. */ int (*slave_get_nack_cycle)(struct i2c_slave_adapter *slv_adap, int is_cout_reset); }; #endif /* __KERNEL__ */ #endif /* _LINUX_I2C_SLAVE_H */