/*
 * 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 <linux/types.h>
#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 */