aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/phone_svn/ipc_spi/spi_dev.c
diff options
context:
space:
mode:
authorcodeworkx <daniel.hillenbrand@codeworkx.de>2012-06-02 13:09:29 +0200
committercodeworkx <daniel.hillenbrand@codeworkx.de>2012-06-02 13:09:29 +0200
commitc6da2cfeb05178a11c6d062a06f8078150ee492f (patch)
treef3b4021d252c52d6463a9b3c1bb7245e399b009c /drivers/phone_svn/ipc_spi/spi_dev.c
parentc6d7c4dbff353eac7919342ae6b3299a378160a6 (diff)
downloadkernel_samsung_smdk4412-c6da2cfeb05178a11c6d062a06f8078150ee492f.zip
kernel_samsung_smdk4412-c6da2cfeb05178a11c6d062a06f8078150ee492f.tar.gz
kernel_samsung_smdk4412-c6da2cfeb05178a11c6d062a06f8078150ee492f.tar.bz2
samsung update 1
Diffstat (limited to 'drivers/phone_svn/ipc_spi/spi_dev.c')
-rw-r--r--drivers/phone_svn/ipc_spi/spi_dev.c345
1 files changed, 345 insertions, 0 deletions
diff --git a/drivers/phone_svn/ipc_spi/spi_dev.c b/drivers/phone_svn/ipc_spi/spi_dev.c
new file mode 100644
index 0000000..54746d9
--- /dev/null
+++ b/drivers/phone_svn/ipc_spi/spi_dev.c
@@ -0,0 +1,345 @@
+/**************************************************************
+
+ spi_dev.c
+
+ adapt device api and spi api
+
+ This is MASTER side.
+
+***************************************************************/
+
+
+
+/**************************************************************
+
+ Preprocessor by common
+
+***************************************************************/
+
+#include "spi_main.h"
+#include "spi_dev.h"
+#include "spi_os.h"
+
+
+
+/**************************************************************
+
+ Preprocessor by platform
+ (OMAP4430 && MSM7X30)
+
+***************************************************************/
+
+#include <linux/spi/spi.h>
+#include <linux/interrupt.h>
+#include <linux/gpio.h>
+#include <linux/phone_svn/ipc_spi.h>
+
+
+
+/**************************************************************
+
+ Definition of Variables and Functions by common
+
+***************************************************************/
+
+int spi_dev_gpio_mrdy;
+int spi_dev_gpio_srdy;
+int spi_dev_gpio_submrdy;
+int spi_dev_gpio_subsrdy;
+
+
+
+/**************************************************************
+
+ Preprocessor by platform
+ (OMAP4430 && MSM7X30)
+
+***************************************************************/
+
+int spi_is_restart;
+
+
+
+/**********************************************************
+
+Prototype void spi_dev_init ( void * data)
+
+Type function
+
+Description init spi gpio info
+
+Param input (none)
+
+Return value (none)
+
+***********************************************************/
+void spi_dev_init(void *data)
+{
+ struct ipc_spi_platform_data *pdata = NULL;
+
+
+ SPI_OS_TRACE(("[SPI] spi_dev_init\n"));
+
+
+ pdata = (struct ipc_spi_platform_data *)data;
+
+ spi_dev_gpio_mrdy = (int) pdata->gpio_ipc_mrdy;
+ spi_dev_gpio_srdy = (int) pdata->gpio_ipc_srdy;
+ spi_dev_gpio_submrdy = (int) pdata->gpio_ipc_sub_mrdy;
+ spi_dev_gpio_subsrdy = (int) pdata->gpio_ipc_sub_srdy;
+
+ spi_dev_set_gpio(spi_dev_gpio_mrdy, SPI_DEV_GPIOLEVEL_LOW);
+ if (spi_is_restart == 0)
+ spi_dev_set_gpio(spi_dev_gpio_submrdy, SPI_DEV_GPIOLEVEL_LOW);
+}
+
+
+/**********************************************************
+
+Prototype void spi_dev_destroy( void )
+
+Type function
+
+Description unregister irq handler
+
+Param input (none)
+
+Return value (none)
+
+***********************************************************/
+
+void spi_dev_destroy(void)
+{
+ spi_dev_unreigster_irq_handler(spi_dev_gpio_srdy, 0);
+ spi_dev_unreigster_irq_handler(spi_dev_gpio_subsrdy, 0);
+}
+
+
+
+/**********************************************************
+
+Prototype int spi_dev_send
+
+Type function
+
+Description starting data send by DMA(CP side)
+ starting send clock for data switching(AP side)
+
+Param input buf : data for send
+ length : data size. this lengt must be fixed
+
+Return value 0 : success
+ (others) : error cause
+
+***********************************************************/
+
+int spi_dev_send(void *buf, void *sync_buf, unsigned int length)
+{
+ int result = 0;
+
+ result = ipc_spi_tx_rx_sync(buf, sync_buf, length);
+
+ return result;
+}
+
+
+/**********************************************************
+
+Prototype int spi_dev_receive
+
+Type function
+
+Description starting data receive by DMA(CP side)
+ starting send clock for data switching(AP side)
+
+Param input buf : buffer for saving data
+ length : data size. this lengt must be fixed
+
+Return value 0 : success
+ (others) : error cause
+
+***********************************************************/
+
+int spi_dev_receive(void *sync_buf, void *buf, unsigned int length)
+{
+ int value = 0;
+
+ value = ipc_spi_tx_rx_sync(sync_buf, buf, length);
+
+ return value;
+}
+
+
+/**********************************************************
+
+Prototype void spi_dev_set_gpio
+
+Type function
+
+Description set gpio pin state
+
+Param input gpio_id : number of gpio id
+ value : SPI_DEV_GPIOLEVEL_HIGH for raising pin state up
+ : SPI_DEV_GPIOLEVEL_LOW for getting pin state down
+
+Return value (none)
+
+***********************************************************/
+void spi_dev_set_gpio(int gpio_id, enum SPI_DEV_GPIOLEVEL_T value)
+{
+ int level = 0;
+
+ SPI_OS_TRACE_MID(("%s gpio_id =[%d], value =[%d]\n",
+ "[SPI] spi_dev_set_gpio :", gpio_id, (int) value));
+
+ switch (value) {
+ case SPI_DEV_GPIOLEVEL_LOW:
+ level = 0;
+ break;
+ case SPI_DEV_GPIOLEVEL_HIGH:
+ level = 1;
+ break;
+ }
+
+ gpio_set_value((unsigned int) gpio_id, level);
+}
+
+
+
+/**********************************************************
+
+Prototype SPI_DEV_GPIOLEVEL_T spi_dev_get_gpio(int gpio_id)
+
+Type function
+
+Description get gpio pin state
+
+Param input gpio_id : number of gpio id
+
+Return value SPI_DEV_GPIOLEVEL
+
+***********************************************************/
+enum SPI_DEV_GPIOLEVEL_T spi_dev_get_gpio(int gpio_id)
+{
+ enum SPI_DEV_GPIOLEVEL_T value = SPI_DEV_GPIOLEVEL_LOW;
+ int level = 0;
+
+ level = gpio_get_value((unsigned int) gpio_id);
+
+ switch (level) {
+ case 0:
+ value = SPI_DEV_GPIOLEVEL_LOW;
+ break;
+ case 1:
+ value = SPI_DEV_GPIOLEVEL_HIGH;
+ break;
+ }
+
+ return value;
+}
+
+
+/**********************************************************
+
+Prototype int spi_dev_reigster_irq_handler
+
+Type function
+
+Description regist irq callback function to each gpio interrupt
+
+Param input gpio_id : gpio pin id
+ tigger : interrupt detection mode
+ handler : interrupt handler function
+ name : register name
+
+Return value 0 : fail
+ 1 : success
+
+***********************************************************/
+int spi_dev_reigster_irq_handler(int gpio_id,
+ enum SPI_DEV_IRQ_TRIGGER_T trigger,
+ SPI_DEV_IRQ_HANDLER_T handler,
+ char *name, void *data)
+{
+#if defined(SPI_FEATURE_OMAP4430)
+ int value = 0;
+ int _trigger = IRQF_TRIGGER_NONE;
+
+ switch (trigger) {
+ case SPI_DEV_IRQ_TRIGGER_RISING:
+ _trigger = IRQF_TRIGGER_RISING;
+ break;
+ case SPI_DEV_IRQ_TRIGGER_FALLING:
+ _trigger = IRQF_TRIGGER_FALLING;
+ break;
+ default:
+ _trigger = IRQF_TRIGGER_NONE;
+ break;
+ }
+
+ value = request_irq(OMAP_GPIO_IRQ(gpio_id), handler,
+ _trigger, name, data);
+
+ if (value != 0) {
+ SPI_OS_ERROR(("%s regist fail(%d)",
+ "[SPI] ERROR : spi_dev_reigster_irq_handler :",
+ value));
+ return 0;
+ }
+
+#elif defined(SPI_FEATURE_S5PC210)
+ int value = 0;
+
+ int _trigger = IRQF_TRIGGER_NONE;
+ int irq = 0;
+
+
+ switch (trigger) {
+ case SPI_DEV_IRQ_TRIGGER_RISING:
+ _trigger = IRQF_TRIGGER_RISING;
+ break;
+ case SPI_DEV_IRQ_TRIGGER_FALLING:
+ _trigger = IRQF_TRIGGER_FALLING;
+ break;
+ default:
+ _trigger = IRQF_TRIGGER_NONE;
+ break;
+ }
+
+ irq = gpio_to_irq(gpio_id);
+ value = request_irq(irq, handler, _trigger, name, data);
+ if (value != 0) {
+ SPI_OS_ERROR(("spi_dev_reigster_irq_handler: regist fail(%d)",
+ value));
+ return 0;
+ }
+ enable_irq_wake(irq);
+#endif
+
+ return 1;
+}
+
+
+/**********************************************************
+
+void spi_dev_unreigster_irq_handler (int gpio_id, void * data)
+
+Type function
+
+Description unregister irq hanger by gpio api
+
+Param input gpio_id : gpio pin id
+ data : param
+
+Return value (none)
+
+***********************************************************/
+
+void spi_dev_unreigster_irq_handler(int gpio_id, void *data)
+{
+#if defined(SPI_FEATURE_OMAP4430)
+ free_irq(OMAP_GPIO_IRQ(gpio_id), data);
+#elif defined(SPI_FEATURE_S5PC210)
+ free_irq(gpio_to_irq(gpio_id), data);
+#endif
+}