/*
 * spi_gpio interface to platform code
 *
 * Copyright (c) 2008 Piotr Skamruk
 * Copyright (c) 2008 Michael Buesch
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#ifndef _LINUX_SPI_SPI_GPIO
#define _LINUX_SPI_SPI_GPIO

#include <linux/types.h>
#include <linux/spi/spi.h>


/**
 * struct spi_gpio_platform_data - Data definitions for a SPI-GPIO device.
 *
 * This structure holds information about a GPIO-based SPI device.
 *
 * @pin_clk: The GPIO pin number of the CLOCK pin.
 *
 * @pin_miso: The GPIO pin number of the MISO pin.
 *
 * @pin_mosi: The GPIO pin number of the MOSI pin.
 *
 * @pin_cs: The GPIO pin number of the CHIPSELECT pin.
 *
 * @cs_activelow: If true, the chip is selected when the CS line is low.
 *
 * @no_spi_delay: If true, no delay is done in the lowlevel bitbanging.
 *                Note that doing no delay is not standards compliant,
 *                but it might be needed to speed up transfers on some
 *                slow embedded machines.
 *
 * @boardinfo_setup: This callback is called after the
 *                   SPI master device was registered, but before the
 *                   device is registered.
 * @boardinfo_setup_data: Data argument passed to boardinfo_setup().
 */
struct spi_gpio_platform_data {
	unsigned int pin_clk;
	unsigned int pin_miso;
	unsigned int pin_mosi;
	unsigned int pin_cs;
	bool cs_activelow;
	bool no_spi_delay;
	int (*boardinfo_setup)(struct spi_board_info *bi,
			       struct spi_master *master,
			       void *data);
	void *boardinfo_setup_data;
};

/**
 * SPI_GPIO_PLATDEV_NAME - The platform device name string.
 *
 * The name string that has to be used for platform_device_alloc
 * when allocating a spi-gpio device.
 */
#define SPI_GPIO_PLATDEV_NAME	"spi-gpio"

/**
 * spi_gpio_next_id - Get another platform device ID number.
 *
 * This returns the next platform device ID number that has to be used
 * for platform_device_alloc. The ID is opaque and should not be used for
 * anything else.
 */
int spi_gpio_next_id(void);

#endif /* _LINUX_SPI_SPI_GPIO */
