Files
twx-linux/include/linux/spi/kbus.h
2025-10-24 14:11:36 +02:00

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 */