18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* OMAP SSI internal interface. 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (C) 2010 Nokia Corporation. All rights reserved. 58c2ecf20Sopenharmony_ci * Copyright (C) 2013 Sebastian Reichel 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Contact: Carlos Chinea <carlos.chinea@nokia.com> 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#ifndef __LINUX_HSI_OMAP_SSI_H__ 118c2ecf20Sopenharmony_ci#define __LINUX_HSI_OMAP_SSI_H__ 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <linux/device.h> 148c2ecf20Sopenharmony_ci#include <linux/module.h> 158c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 168c2ecf20Sopenharmony_ci#include <linux/hsi/hsi.h> 178c2ecf20Sopenharmony_ci#include <linux/gpio/consumer.h> 188c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 198c2ecf20Sopenharmony_ci#include <linux/io.h> 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#define SSI_MAX_CHANNELS 8 228c2ecf20Sopenharmony_ci#define SSI_MAX_GDD_LCH 8 238c2ecf20Sopenharmony_ci#define SSI_BYTES_TO_FRAMES(x) ((((x) - 1) >> 2) + 1) 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#define SSI_WAKE_EN 0 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci/** 288c2ecf20Sopenharmony_ci * struct omap_ssm_ctx - OMAP synchronous serial module (TX/RX) context 298c2ecf20Sopenharmony_ci * @mode: Bit transmission mode 308c2ecf20Sopenharmony_ci * @channels: Number of channels 318c2ecf20Sopenharmony_ci * @framesize: Frame size in bits 328c2ecf20Sopenharmony_ci * @timeout: RX frame timeout 338c2ecf20Sopenharmony_ci * @divisor: TX divider 348c2ecf20Sopenharmony_ci * @arb_mode: Arbitration mode for TX frame (Round robin, priority) 358c2ecf20Sopenharmony_ci */ 368c2ecf20Sopenharmony_cistruct omap_ssm_ctx { 378c2ecf20Sopenharmony_ci u32 mode; 388c2ecf20Sopenharmony_ci u32 channels; 398c2ecf20Sopenharmony_ci u32 frame_size; 408c2ecf20Sopenharmony_ci union { 418c2ecf20Sopenharmony_ci u32 timeout; /* Rx Only */ 428c2ecf20Sopenharmony_ci struct { 438c2ecf20Sopenharmony_ci u32 arb_mode; 448c2ecf20Sopenharmony_ci u32 divisor; 458c2ecf20Sopenharmony_ci }; /* Tx only */ 468c2ecf20Sopenharmony_ci }; 478c2ecf20Sopenharmony_ci}; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci/** 508c2ecf20Sopenharmony_ci * struct omap_ssi_port - OMAP SSI port data 518c2ecf20Sopenharmony_ci * @dev: device associated to the port (HSI port) 528c2ecf20Sopenharmony_ci * @pdev: platform device associated to the port 538c2ecf20Sopenharmony_ci * @sst_dma: SSI transmitter physical base address 548c2ecf20Sopenharmony_ci * @ssr_dma: SSI receiver physical base address 558c2ecf20Sopenharmony_ci * @sst_base: SSI transmitter base address 568c2ecf20Sopenharmony_ci * @ssr_base: SSI receiver base address 578c2ecf20Sopenharmony_ci * @wk_lock: spin lock to serialize access to the wake lines 588c2ecf20Sopenharmony_ci * @lock: Spin lock to serialize access to the SSI port 598c2ecf20Sopenharmony_ci * @channels: Current number of channels configured (1,2,4 or 8) 608c2ecf20Sopenharmony_ci * @txqueue: TX message queues 618c2ecf20Sopenharmony_ci * @rxqueue: RX message queues 628c2ecf20Sopenharmony_ci * @brkqueue: Queue of incoming HWBREAK requests (FRAME mode) 638c2ecf20Sopenharmony_ci * @errqueue: Queue for failed messages 648c2ecf20Sopenharmony_ci * @errqueue_work: Delayed Work for failed messages 658c2ecf20Sopenharmony_ci * @irq: IRQ number 668c2ecf20Sopenharmony_ci * @wake_irq: IRQ number for incoming wake line (-1 if none) 678c2ecf20Sopenharmony_ci * @wake_gpio: GPIO number for incoming wake line (-1 if none) 688c2ecf20Sopenharmony_ci * @flags: flags to keep track of states 698c2ecf20Sopenharmony_ci * @wk_refcount: Reference count for output wake line 708c2ecf20Sopenharmony_ci * @work: worker for starting TX 718c2ecf20Sopenharmony_ci * @sys_mpu_enable: Context for the interrupt enable register for irq 0 728c2ecf20Sopenharmony_ci * @sst: Context for the synchronous serial transmitter 738c2ecf20Sopenharmony_ci * @ssr: Context for the synchronous serial receiver 748c2ecf20Sopenharmony_ci */ 758c2ecf20Sopenharmony_cistruct omap_ssi_port { 768c2ecf20Sopenharmony_ci struct device *dev; 778c2ecf20Sopenharmony_ci struct device *pdev; 788c2ecf20Sopenharmony_ci dma_addr_t sst_dma; 798c2ecf20Sopenharmony_ci dma_addr_t ssr_dma; 808c2ecf20Sopenharmony_ci void __iomem *sst_base; 818c2ecf20Sopenharmony_ci void __iomem *ssr_base; 828c2ecf20Sopenharmony_ci spinlock_t wk_lock; 838c2ecf20Sopenharmony_ci spinlock_t lock; 848c2ecf20Sopenharmony_ci unsigned int channels; 858c2ecf20Sopenharmony_ci struct list_head txqueue[SSI_MAX_CHANNELS]; 868c2ecf20Sopenharmony_ci struct list_head rxqueue[SSI_MAX_CHANNELS]; 878c2ecf20Sopenharmony_ci struct list_head brkqueue; 888c2ecf20Sopenharmony_ci struct list_head errqueue; 898c2ecf20Sopenharmony_ci struct delayed_work errqueue_work; 908c2ecf20Sopenharmony_ci unsigned int irq; 918c2ecf20Sopenharmony_ci int wake_irq; 928c2ecf20Sopenharmony_ci struct gpio_desc *wake_gpio; 938c2ecf20Sopenharmony_ci bool wktest:1; /* FIXME: HACK to be removed */ 948c2ecf20Sopenharmony_ci unsigned long flags; 958c2ecf20Sopenharmony_ci unsigned int wk_refcount; 968c2ecf20Sopenharmony_ci struct work_struct work; 978c2ecf20Sopenharmony_ci /* OMAP SSI port context */ 988c2ecf20Sopenharmony_ci u32 sys_mpu_enable; /* We use only one irq */ 998c2ecf20Sopenharmony_ci struct omap_ssm_ctx sst; 1008c2ecf20Sopenharmony_ci struct omap_ssm_ctx ssr; 1018c2ecf20Sopenharmony_ci u32 loss_count; 1028c2ecf20Sopenharmony_ci u32 port_id; 1038c2ecf20Sopenharmony_ci#ifdef CONFIG_DEBUG_FS 1048c2ecf20Sopenharmony_ci struct dentry *dir; 1058c2ecf20Sopenharmony_ci#endif 1068c2ecf20Sopenharmony_ci}; 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci/** 1098c2ecf20Sopenharmony_ci * struct gdd_trn - GDD transaction data 1108c2ecf20Sopenharmony_ci * @msg: Pointer to the HSI message being served 1118c2ecf20Sopenharmony_ci * @sg: Pointer to the current sg entry being served 1128c2ecf20Sopenharmony_ci */ 1138c2ecf20Sopenharmony_cistruct gdd_trn { 1148c2ecf20Sopenharmony_ci struct hsi_msg *msg; 1158c2ecf20Sopenharmony_ci struct scatterlist *sg; 1168c2ecf20Sopenharmony_ci}; 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci/** 1198c2ecf20Sopenharmony_ci * struct omap_ssi_controller - OMAP SSI controller data 1208c2ecf20Sopenharmony_ci * @dev: device associated to the controller (HSI controller) 1218c2ecf20Sopenharmony_ci * @sys: SSI I/O base address 1228c2ecf20Sopenharmony_ci * @gdd: GDD I/O base address 1238c2ecf20Sopenharmony_ci * @fck: SSI functional clock 1248c2ecf20Sopenharmony_ci * @gdd_irq: IRQ line for GDD 1258c2ecf20Sopenharmony_ci * @gdd_tasklet: bottom half for DMA transfers 1268c2ecf20Sopenharmony_ci * @gdd_trn: Array of GDD transaction data for ongoing GDD transfers 1278c2ecf20Sopenharmony_ci * @lock: lock to serialize access to GDD 1288c2ecf20Sopenharmony_ci * @fck_nb: DVFS notfifier block 1298c2ecf20Sopenharmony_ci * @fck_rate: clock rate 1308c2ecf20Sopenharmony_ci * @loss_count: To follow if we need to restore context or not 1318c2ecf20Sopenharmony_ci * @max_speed: Maximum TX speed (Kb/s) set by the clients. 1328c2ecf20Sopenharmony_ci * @gdd_gcr: SSI GDD saved context 1338c2ecf20Sopenharmony_ci * @get_loss: Pointer to omap_pm_get_dev_context_loss_count, if any 1348c2ecf20Sopenharmony_ci * @port: Array of pointers of the ports of the controller 1358c2ecf20Sopenharmony_ci * @dir: Debugfs SSI root directory 1368c2ecf20Sopenharmony_ci */ 1378c2ecf20Sopenharmony_cistruct omap_ssi_controller { 1388c2ecf20Sopenharmony_ci struct device *dev; 1398c2ecf20Sopenharmony_ci void __iomem *sys; 1408c2ecf20Sopenharmony_ci void __iomem *gdd; 1418c2ecf20Sopenharmony_ci struct clk *fck; 1428c2ecf20Sopenharmony_ci unsigned int gdd_irq; 1438c2ecf20Sopenharmony_ci struct tasklet_struct gdd_tasklet; 1448c2ecf20Sopenharmony_ci struct gdd_trn gdd_trn[SSI_MAX_GDD_LCH]; 1458c2ecf20Sopenharmony_ci spinlock_t lock; 1468c2ecf20Sopenharmony_ci struct notifier_block fck_nb; 1478c2ecf20Sopenharmony_ci unsigned long fck_rate; 1488c2ecf20Sopenharmony_ci u32 loss_count; 1498c2ecf20Sopenharmony_ci u32 max_speed; 1508c2ecf20Sopenharmony_ci /* OMAP SSI Controller context */ 1518c2ecf20Sopenharmony_ci u32 gdd_gcr; 1528c2ecf20Sopenharmony_ci int (*get_loss)(struct device *dev); 1538c2ecf20Sopenharmony_ci struct omap_ssi_port **port; 1548c2ecf20Sopenharmony_ci#ifdef CONFIG_DEBUG_FS 1558c2ecf20Sopenharmony_ci struct dentry *dir; 1568c2ecf20Sopenharmony_ci#endif 1578c2ecf20Sopenharmony_ci}; 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_civoid omap_ssi_port_update_fclk(struct hsi_controller *ssi, 1608c2ecf20Sopenharmony_ci struct omap_ssi_port *omap_port); 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ciextern struct platform_driver ssi_port_pdriver; 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci#endif /* __LINUX_HSI_OMAP_SSI_H__ */ 165