diff options
Diffstat (limited to 'drivers/spi/spi_fsl_lib.h')
| -rw-r--r-- | drivers/spi/spi_fsl_lib.h | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/drivers/spi/spi_fsl_lib.h b/drivers/spi/spi_fsl_lib.h new file mode 100644 index 00000000000..281e060977c --- /dev/null +++ b/drivers/spi/spi_fsl_lib.h | |||
| @@ -0,0 +1,124 @@ | |||
| 1 | /* | ||
| 2 | * Freescale SPI/eSPI controller driver library. | ||
| 3 | * | ||
| 4 | * Maintainer: Kumar Gala | ||
| 5 | * | ||
| 6 | * Copyright 2010 Freescale Semiconductor, Inc. | ||
| 7 | * Copyright (C) 2006 Polycom, Inc. | ||
| 8 | * | ||
| 9 | * CPM SPI and QE buffer descriptors mode support: | ||
| 10 | * Copyright (c) 2009 MontaVista Software, Inc. | ||
| 11 | * Author: Anton Vorontsov <avorontsov@ru.mvista.com> | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify it | ||
| 14 | * under the terms of the GNU General Public License as published by the | ||
| 15 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 16 | * option) any later version. | ||
| 17 | */ | ||
| 18 | #ifndef __SPI_FSL_LIB_H__ | ||
| 19 | #define __SPI_FSL_LIB_H__ | ||
| 20 | |||
| 21 | #include <asm/io.h> | ||
| 22 | |||
| 23 | /* SPI/eSPI Controller driver's private data. */ | ||
| 24 | struct mpc8xxx_spi { | ||
| 25 | struct device *dev; | ||
| 26 | void *reg_base; | ||
| 27 | |||
| 28 | /* rx & tx bufs from the spi_transfer */ | ||
| 29 | const void *tx; | ||
| 30 | void *rx; | ||
| 31 | #ifdef CONFIG_SPI_FSL_ESPI | ||
| 32 | int len; | ||
| 33 | #endif | ||
| 34 | |||
| 35 | int subblock; | ||
| 36 | struct spi_pram __iomem *pram; | ||
| 37 | struct cpm_buf_desc __iomem *tx_bd; | ||
| 38 | struct cpm_buf_desc __iomem *rx_bd; | ||
| 39 | |||
| 40 | struct spi_transfer *xfer_in_progress; | ||
| 41 | |||
| 42 | /* dma addresses for CPM transfers */ | ||
| 43 | dma_addr_t tx_dma; | ||
| 44 | dma_addr_t rx_dma; | ||
| 45 | bool map_tx_dma; | ||
| 46 | bool map_rx_dma; | ||
| 47 | |||
| 48 | dma_addr_t dma_dummy_tx; | ||
| 49 | dma_addr_t dma_dummy_rx; | ||
| 50 | |||
| 51 | /* functions to deal with different sized buffers */ | ||
| 52 | void (*get_rx) (u32 rx_data, struct mpc8xxx_spi *); | ||
| 53 | u32(*get_tx) (struct mpc8xxx_spi *); | ||
| 54 | |||
| 55 | /* hooks for different controller driver */ | ||
| 56 | void (*spi_do_one_msg) (struct spi_message *m); | ||
| 57 | void (*spi_remove) (struct mpc8xxx_spi *mspi); | ||
| 58 | |||
| 59 | unsigned int count; | ||
| 60 | unsigned int irq; | ||
| 61 | |||
| 62 | unsigned nsecs; /* (clock cycle time)/2 */ | ||
| 63 | |||
| 64 | u32 spibrg; /* SPIBRG input clock */ | ||
| 65 | u32 rx_shift; /* RX data reg shift when in qe mode */ | ||
| 66 | u32 tx_shift; /* TX data reg shift when in qe mode */ | ||
| 67 | |||
| 68 | unsigned int flags; | ||
| 69 | |||
| 70 | struct workqueue_struct *workqueue; | ||
| 71 | struct work_struct work; | ||
| 72 | |||
| 73 | struct list_head queue; | ||
| 74 | spinlock_t lock; | ||
| 75 | |||
| 76 | struct completion done; | ||
| 77 | }; | ||
| 78 | |||
| 79 | struct spi_mpc8xxx_cs { | ||
| 80 | /* functions to deal with different sized buffers */ | ||
| 81 | void (*get_rx) (u32 rx_data, struct mpc8xxx_spi *); | ||
| 82 | u32 (*get_tx) (struct mpc8xxx_spi *); | ||
| 83 | u32 rx_shift; /* RX data reg shift when in qe mode */ | ||
| 84 | u32 tx_shift; /* TX data reg shift when in qe mode */ | ||
| 85 | u32 hw_mode; /* Holds HW mode register settings */ | ||
| 86 | }; | ||
| 87 | |||
| 88 | static inline void mpc8xxx_spi_write_reg(__be32 __iomem *reg, u32 val) | ||
| 89 | { | ||
| 90 | out_be32(reg, val); | ||
| 91 | } | ||
| 92 | |||
| 93 | static inline u32 mpc8xxx_spi_read_reg(__be32 __iomem *reg) | ||
| 94 | { | ||
| 95 | return in_be32(reg); | ||
| 96 | } | ||
| 97 | |||
| 98 | struct mpc8xxx_spi_probe_info { | ||
| 99 | struct fsl_spi_platform_data pdata; | ||
| 100 | int *gpios; | ||
| 101 | bool *alow_flags; | ||
| 102 | }; | ||
| 103 | |||
| 104 | extern u32 mpc8xxx_spi_tx_buf_u8(struct mpc8xxx_spi *mpc8xxx_spi); | ||
| 105 | extern u32 mpc8xxx_spi_tx_buf_u16(struct mpc8xxx_spi *mpc8xxx_spi); | ||
| 106 | extern u32 mpc8xxx_spi_tx_buf_u32(struct mpc8xxx_spi *mpc8xxx_spi); | ||
| 107 | extern void mpc8xxx_spi_rx_buf_u8(u32 data, struct mpc8xxx_spi *mpc8xxx_spi); | ||
| 108 | extern void mpc8xxx_spi_rx_buf_u16(u32 data, struct mpc8xxx_spi *mpc8xxx_spi); | ||
| 109 | extern void mpc8xxx_spi_rx_buf_u32(u32 data, struct mpc8xxx_spi *mpc8xxx_spi); | ||
| 110 | |||
| 111 | extern struct mpc8xxx_spi_probe_info *to_of_pinfo( | ||
| 112 | struct fsl_spi_platform_data *pdata); | ||
| 113 | extern int mpc8xxx_spi_bufs(struct mpc8xxx_spi *mspi, | ||
| 114 | struct spi_transfer *t, unsigned int len); | ||
| 115 | extern int mpc8xxx_spi_transfer(struct spi_device *spi, struct spi_message *m); | ||
| 116 | extern void mpc8xxx_spi_cleanup(struct spi_device *spi); | ||
| 117 | extern const char *mpc8xxx_spi_strmode(unsigned int flags); | ||
| 118 | extern int mpc8xxx_spi_probe(struct device *dev, struct resource *mem, | ||
| 119 | unsigned int irq); | ||
| 120 | extern int mpc8xxx_spi_remove(struct device *dev); | ||
| 121 | extern int of_mpc8xxx_spi_probe(struct platform_device *ofdev, | ||
| 122 | const struct of_device_id *ofid); | ||
| 123 | |||
| 124 | #endif /* __SPI_FSL_LIB_H__ */ | ||
