Commit | Line | Data |
---|---|---|
b36ece83 MH |
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 | /* SPI/eSPI Controller driver's private data. */ | |
22 | struct mpc8xxx_spi { | |
23 | struct device *dev; | |
24 | void *reg_base; | |
25 | ||
26 | /* rx & tx bufs from the spi_transfer */ | |
27 | const void *tx; | |
28 | void *rx; | |
29 | ||
30 | int subblock; | |
31 | struct spi_pram __iomem *pram; | |
32 | struct cpm_buf_desc __iomem *tx_bd; | |
33 | struct cpm_buf_desc __iomem *rx_bd; | |
34 | ||
35 | struct spi_transfer *xfer_in_progress; | |
36 | ||
37 | /* dma addresses for CPM transfers */ | |
38 | dma_addr_t tx_dma; | |
39 | dma_addr_t rx_dma; | |
40 | bool map_tx_dma; | |
41 | bool map_rx_dma; | |
42 | ||
43 | dma_addr_t dma_dummy_tx; | |
44 | dma_addr_t dma_dummy_rx; | |
45 | ||
46 | /* functions to deal with different sized buffers */ | |
47 | void (*get_rx) (u32 rx_data, struct mpc8xxx_spi *); | |
48 | u32(*get_tx) (struct mpc8xxx_spi *); | |
49 | ||
50 | /* hooks for different controller driver */ | |
51 | void (*spi_do_one_msg) (struct spi_message *m); | |
52 | void (*spi_remove) (struct mpc8xxx_spi *mspi); | |
53 | ||
54 | unsigned int count; | |
55 | unsigned int irq; | |
56 | ||
57 | unsigned nsecs; /* (clock cycle time)/2 */ | |
58 | ||
59 | u32 spibrg; /* SPIBRG input clock */ | |
60 | u32 rx_shift; /* RX data reg shift when in qe mode */ | |
61 | u32 tx_shift; /* TX data reg shift when in qe mode */ | |
62 | ||
63 | unsigned int flags; | |
64 | ||
65 | struct workqueue_struct *workqueue; | |
66 | struct work_struct work; | |
67 | ||
68 | struct list_head queue; | |
69 | spinlock_t lock; | |
70 | ||
71 | struct completion done; | |
72 | }; | |
73 | ||
74 | struct spi_mpc8xxx_cs { | |
75 | /* functions to deal with different sized buffers */ | |
76 | void (*get_rx) (u32 rx_data, struct mpc8xxx_spi *); | |
77 | u32 (*get_tx) (struct mpc8xxx_spi *); | |
78 | u32 rx_shift; /* RX data reg shift when in qe mode */ | |
79 | u32 tx_shift; /* TX data reg shift when in qe mode */ | |
80 | u32 hw_mode; /* Holds HW mode register settings */ | |
81 | }; | |
82 | ||
83 | static inline void mpc8xxx_spi_write_reg(__be32 __iomem *reg, u32 val) | |
84 | { | |
85 | out_be32(reg, val); | |
86 | } | |
87 | ||
88 | static inline u32 mpc8xxx_spi_read_reg(__be32 __iomem *reg) | |
89 | { | |
90 | return in_be32(reg); | |
91 | } | |
92 | ||
93 | struct mpc8xxx_spi_probe_info { | |
94 | struct fsl_spi_platform_data pdata; | |
95 | int *gpios; | |
96 | bool *alow_flags; | |
97 | }; | |
98 | ||
99 | extern u32 mpc8xxx_spi_tx_buf_u8(struct mpc8xxx_spi *mpc8xxx_spi); | |
100 | extern u32 mpc8xxx_spi_tx_buf_u16(struct mpc8xxx_spi *mpc8xxx_spi); | |
101 | extern u32 mpc8xxx_spi_tx_buf_u32(struct mpc8xxx_spi *mpc8xxx_spi); | |
102 | extern void mpc8xxx_spi_rx_buf_u8(u32 data, struct mpc8xxx_spi *mpc8xxx_spi); | |
103 | extern void mpc8xxx_spi_rx_buf_u16(u32 data, struct mpc8xxx_spi *mpc8xxx_spi); | |
104 | extern void mpc8xxx_spi_rx_buf_u32(u32 data, struct mpc8xxx_spi *mpc8xxx_spi); | |
105 | ||
106 | extern struct mpc8xxx_spi_probe_info *to_of_pinfo( | |
107 | struct fsl_spi_platform_data *pdata); | |
108 | extern int mpc8xxx_spi_bufs(struct mpc8xxx_spi *mspi, | |
109 | struct spi_transfer *t, unsigned int len); | |
110 | extern int mpc8xxx_spi_transfer(struct spi_device *spi, struct spi_message *m); | |
111 | extern void mpc8xxx_spi_cleanup(struct spi_device *spi); | |
112 | extern const char *mpc8xxx_spi_strmode(unsigned int flags); | |
113 | extern int mpc8xxx_spi_probe(struct device *dev, struct resource *mem, | |
114 | unsigned int irq); | |
115 | extern int mpc8xxx_spi_remove(struct device *dev); | |
116 | extern int of_mpc8xxx_spi_probe(struct platform_device *ofdev, | |
117 | const struct of_device_id *ofid); | |
118 | ||
119 | #endif /* __SPI_FSL_LIB_H__ */ |