67c0472297
Signed-off-by: Peter Galka <peter.galka@wago.com>
147 lines
4.3 KiB
C
147 lines
4.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* include/linux/spi/kbus.h
|
|
*
|
|
* Copyright (C) 2020 WAGO
|
|
* Heinrich Toews <heinrich.toews@wago.com>
|
|
*/
|
|
|
|
#ifndef KBUS_H
|
|
#define KBUS_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
#define KBUS_IRQ_TIMEOUT 10 /* wait for a max. of 10 ms */
|
|
|
|
#define KBUS__DEFAULT_SPEED 12000000
|
|
#define KBUS_READYN_IRQ
|
|
#define KBUS_DATA_FULLDPX
|
|
|
|
#undef KBUS__WAIT_ACTIVE
|
|
#undef KBUS_IRQN_IRQ
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#define PAC_KBUS_SYNC_CYCLES 3
|
|
#define SPI_MODE_MASK \
|
|
(SPI_CPHA | SPI_CPOL | SPI_CS_HIGH | SPI_LSB_FIRST | SPI_3WIRE | \
|
|
SPI_LOOP | SPI_NO_CS | SPI_READY)
|
|
|
|
#define KBUS__MAX_BUF_LEN PAGE_SIZE /* FIXME */
|
|
|
|
#define KBUS_TESTING 0 /* enable when gpio testing wanted */
|
|
|
|
#define KBUS__USE_DMA_ONLY 0
|
|
|
|
#if KBUS_TESTING
|
|
#define kbus_wago_mpoint(k) wago_mpoint()
|
|
#define kbus_dbg(format, arg...) pr_debug("kbus-dbg:" format, ##arg)
|
|
#else
|
|
#define kbus_wago_mpoint(k) \
|
|
({ \
|
|
if (0) \
|
|
wago_mpoint(); \
|
|
0; \
|
|
})
|
|
#define kbus_dbg(format, arg...) \
|
|
({ \
|
|
if (0) \
|
|
pr_debug("kbus-dbg:" format, ##arg); \
|
|
0; \
|
|
})
|
|
#endif
|
|
|
|
#define KBUS_ENABLE_IRQ(irq) \
|
|
do { \
|
|
if (irq != -1) \
|
|
enable_irq(irq); \
|
|
} while (0)
|
|
|
|
#define KBUS_DISABLE_IRQ(irq) \
|
|
do { \
|
|
if (irq != -1) \
|
|
disable_irq(irq); \
|
|
} while (0)
|
|
|
|
struct kbus_drv_data {
|
|
u8 cmdsel; /* 0: data, 1: cmd mode */
|
|
int kbus_err;
|
|
int kbus_err_state;
|
|
u8 *tx_buf;
|
|
u8 *rx_buf;
|
|
bool use_dma;
|
|
u32 timeout_ms;
|
|
dma_addr_t tx_buf_dma;
|
|
dma_addr_t rx_buf_dma;
|
|
int kbus_irq;
|
|
int kbus_irq_enabled;
|
|
int kbus_irq_state;
|
|
int kbus_ign_irq;
|
|
int kbus_ign_reset_irq;
|
|
struct task_struct
|
|
*dma_task; /* task pointer to boost the dma task if necessary */
|
|
bool kbus_dma_boost_en;
|
|
u8 kbus_dma_boost_prio;
|
|
const char *kbus_dma_boost_irq_thread;
|
|
u8 kbus_dma_normal_prio;
|
|
bool dma_boost;
|
|
bool force_update_detection; /* DT: kbus,force-update-detection */
|
|
|
|
/* gpios */
|
|
struct gpio_desc *gpio_nrdy;
|
|
struct gpio_desc *gpio_nrst;
|
|
struct gpio_desc *gpio_nsync;
|
|
struct gpio_desc *gpio_cmdsel;
|
|
struct gpio_desc *gpio_nirq;
|
|
struct gpio_desc *gpio_nerr;
|
|
|
|
wait_queue_head_t kbus_irq_wq;
|
|
struct spi_device *spi;
|
|
const char *kbus_tty_device_name;
|
|
bool kbus_renesas;
|
|
};
|
|
|
|
/* For userspace ioctl communication */
|
|
struct kbus_data {
|
|
__u8 __user *tx_buf;
|
|
__u8 __user *rx_buf;
|
|
__u32 byte_len;
|
|
__u8 __user *err; /* will only be set when err occurs! */
|
|
__u8 __user *err_state;
|
|
__u32 timeout_ms;
|
|
};
|
|
|
|
struct kbus_cmd {
|
|
__u8 __user *tx_buf;
|
|
__u8 __user *rx_buf;
|
|
__u32 byte_len_tx;
|
|
__u32 byte_len_rx;
|
|
__u8 __user *err; /* will only be set when err occurs! */
|
|
__u8 __user *err_state;
|
|
__u32 timeout_ms;
|
|
};
|
|
|
|
struct kbus_spi_config {
|
|
__u8 bits_per_word; /* bits_per_word */
|
|
__u8 mode; /* see SPI_ mode bits in spi.h */
|
|
__u32 max_speed_hz;
|
|
};
|
|
|
|
extern int kbus_wait_for_irq(void);
|
|
extern int kbus_wait_for_event(int *event);
|
|
extern int kbus_error(void);
|
|
extern int kbus_wait_for_gpio(int gpio);
|
|
extern void kbus_boost_dma_task(u8 enable);
|
|
|
|
/* IOCTL commands */
|
|
#define KBUS_IOC_MAGIC 'K'
|
|
#define KBUS_IOC_DATA _IOW(KBUS_IOC_MAGIC, 1, struct kbus_data)
|
|
#define KBUS_IOC_CMD _IOW(KBUS_IOC_MAGIC, 2, struct kbus_cmd)
|
|
#define KBUS_IOC_CONFIG _IOW(KBUS_IOC_MAGIC, 3, struct kbus_spi_config)
|
|
#define KBUS_IOC_BINARY _IOW(KBUS_IOC_MAGIC, 4, struct kbus_data)
|
|
|
|
extern struct spi_driver
|
|
kbus_driver; /* used by spi-omap2-mcspi to recognize the kbus device */
|
|
|
|
#endif /* KBUS_H */
|