162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef __CPM_H 362306a36Sopenharmony_ci#define __CPM_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/compiler.h> 662306a36Sopenharmony_ci#include <linux/types.h> 762306a36Sopenharmony_ci#include <linux/errno.h> 862306a36Sopenharmony_ci#include <linux/of.h> 962306a36Sopenharmony_ci#include <soc/fsl/qe/qe.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/* 1262306a36Sopenharmony_ci * SPI Parameter RAM common to QE and CPM. 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_cistruct spi_pram { 1562306a36Sopenharmony_ci __be16 rbase; /* Rx Buffer descriptor base address */ 1662306a36Sopenharmony_ci __be16 tbase; /* Tx Buffer descriptor base address */ 1762306a36Sopenharmony_ci u8 rfcr; /* Rx function code */ 1862306a36Sopenharmony_ci u8 tfcr; /* Tx function code */ 1962306a36Sopenharmony_ci __be16 mrblr; /* Max receive buffer length */ 2062306a36Sopenharmony_ci __be32 rstate; /* Internal */ 2162306a36Sopenharmony_ci __be32 rdp; /* Internal */ 2262306a36Sopenharmony_ci __be16 rbptr; /* Internal */ 2362306a36Sopenharmony_ci __be16 rbc; /* Internal */ 2462306a36Sopenharmony_ci __be32 rxtmp; /* Internal */ 2562306a36Sopenharmony_ci __be32 tstate; /* Internal */ 2662306a36Sopenharmony_ci __be32 tdp; /* Internal */ 2762306a36Sopenharmony_ci __be16 tbptr; /* Internal */ 2862306a36Sopenharmony_ci __be16 tbc; /* Internal */ 2962306a36Sopenharmony_ci __be32 txtmp; /* Internal */ 3062306a36Sopenharmony_ci __be32 res; /* Tx temp. */ 3162306a36Sopenharmony_ci __be16 rpbase; /* Relocation pointer (CPM1 only) */ 3262306a36Sopenharmony_ci __be16 res1; /* Reserved */ 3362306a36Sopenharmony_ci}; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* 3662306a36Sopenharmony_ci * USB Controller pram common to QE and CPM. 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_cistruct usb_ctlr { 3962306a36Sopenharmony_ci u8 usb_usmod; 4062306a36Sopenharmony_ci u8 usb_usadr; 4162306a36Sopenharmony_ci u8 usb_uscom; 4262306a36Sopenharmony_ci u8 res1[1]; 4362306a36Sopenharmony_ci __be16 usb_usep[4]; 4462306a36Sopenharmony_ci u8 res2[4]; 4562306a36Sopenharmony_ci __be16 usb_usber; 4662306a36Sopenharmony_ci u8 res3[2]; 4762306a36Sopenharmony_ci __be16 usb_usbmr; 4862306a36Sopenharmony_ci u8 res4[1]; 4962306a36Sopenharmony_ci u8 usb_usbs; 5062306a36Sopenharmony_ci /* Fields down below are QE-only */ 5162306a36Sopenharmony_ci __be16 usb_ussft; 5262306a36Sopenharmony_ci u8 res5[2]; 5362306a36Sopenharmony_ci __be16 usb_usfrn; 5462306a36Sopenharmony_ci u8 res6[0x22]; 5562306a36Sopenharmony_ci} __attribute__ ((packed)); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* 5862306a36Sopenharmony_ci * Function code bits, usually generic to devices. 5962306a36Sopenharmony_ci */ 6062306a36Sopenharmony_ci#ifdef CONFIG_CPM1 6162306a36Sopenharmony_ci#define CPMFCR_GBL ((u_char)0x00) /* Flag doesn't exist in CPM1 */ 6262306a36Sopenharmony_ci#define CPMFCR_TC2 ((u_char)0x00) /* Flag doesn't exist in CPM1 */ 6362306a36Sopenharmony_ci#define CPMFCR_DTB ((u_char)0x00) /* Flag doesn't exist in CPM1 */ 6462306a36Sopenharmony_ci#define CPMFCR_BDB ((u_char)0x00) /* Flag doesn't exist in CPM1 */ 6562306a36Sopenharmony_ci#else 6662306a36Sopenharmony_ci#define CPMFCR_GBL ((u_char)0x20) /* Set memory snooping */ 6762306a36Sopenharmony_ci#define CPMFCR_TC2 ((u_char)0x04) /* Transfer code 2 value */ 6862306a36Sopenharmony_ci#define CPMFCR_DTB ((u_char)0x02) /* Use local bus for data when set */ 6962306a36Sopenharmony_ci#define CPMFCR_BDB ((u_char)0x01) /* Use local bus for BD when set */ 7062306a36Sopenharmony_ci#endif 7162306a36Sopenharmony_ci#define CPMFCR_EB ((u_char)0x10) /* Set big endian byte order */ 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci/* Opcodes common to CPM1 and CPM2 7462306a36Sopenharmony_ci*/ 7562306a36Sopenharmony_ci#define CPM_CR_INIT_TRX ((ushort)0x0000) 7662306a36Sopenharmony_ci#define CPM_CR_INIT_RX ((ushort)0x0001) 7762306a36Sopenharmony_ci#define CPM_CR_INIT_TX ((ushort)0x0002) 7862306a36Sopenharmony_ci#define CPM_CR_HUNT_MODE ((ushort)0x0003) 7962306a36Sopenharmony_ci#define CPM_CR_STOP_TX ((ushort)0x0004) 8062306a36Sopenharmony_ci#define CPM_CR_GRA_STOP_TX ((ushort)0x0005) 8162306a36Sopenharmony_ci#define CPM_CR_RESTART_TX ((ushort)0x0006) 8262306a36Sopenharmony_ci#define CPM_CR_CLOSE_RX_BD ((ushort)0x0007) 8362306a36Sopenharmony_ci#define CPM_CR_SET_GADDR ((ushort)0x0008) 8462306a36Sopenharmony_ci#define CPM_CR_SET_TIMER ((ushort)0x0008) 8562306a36Sopenharmony_ci#define CPM_CR_STOP_IDMA ((ushort)0x000b) 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci/* Buffer descriptors used by many of the CPM protocols. */ 8862306a36Sopenharmony_citypedef struct cpm_buf_desc { 8962306a36Sopenharmony_ci ushort cbd_sc; /* Status and Control */ 9062306a36Sopenharmony_ci ushort cbd_datlen; /* Data length in buffer */ 9162306a36Sopenharmony_ci uint cbd_bufaddr; /* Buffer address in host memory */ 9262306a36Sopenharmony_ci} cbd_t; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci/* Buffer descriptor control/status used by serial 9562306a36Sopenharmony_ci */ 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci#define BD_SC_EMPTY (0x8000) /* Receive is empty */ 9862306a36Sopenharmony_ci#define BD_SC_READY (0x8000) /* Transmit is ready */ 9962306a36Sopenharmony_ci#define BD_SC_WRAP (0x2000) /* Last buffer descriptor */ 10062306a36Sopenharmony_ci#define BD_SC_INTRPT (0x1000) /* Interrupt on change */ 10162306a36Sopenharmony_ci#define BD_SC_LAST (0x0800) /* Last buffer in frame */ 10262306a36Sopenharmony_ci#define BD_SC_TC (0x0400) /* Transmit CRC */ 10362306a36Sopenharmony_ci#define BD_SC_CM (0x0200) /* Continuous mode */ 10462306a36Sopenharmony_ci#define BD_SC_ID (0x0100) /* Rec'd too many idles */ 10562306a36Sopenharmony_ci#define BD_SC_P (0x0100) /* xmt preamble */ 10662306a36Sopenharmony_ci#define BD_SC_BR (0x0020) /* Break received */ 10762306a36Sopenharmony_ci#define BD_SC_FR (0x0010) /* Framing error */ 10862306a36Sopenharmony_ci#define BD_SC_PR (0x0008) /* Parity error */ 10962306a36Sopenharmony_ci#define BD_SC_NAK (0x0004) /* NAK - did not respond */ 11062306a36Sopenharmony_ci#define BD_SC_OV (0x0002) /* Overrun */ 11162306a36Sopenharmony_ci#define BD_SC_UN (0x0002) /* Underrun */ 11262306a36Sopenharmony_ci#define BD_SC_CD (0x0001) /* */ 11362306a36Sopenharmony_ci#define BD_SC_CL (0x0001) /* Collision */ 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci/* Buffer descriptor control/status used by Ethernet receive. 11662306a36Sopenharmony_ci * Common to SCC and FCC. 11762306a36Sopenharmony_ci */ 11862306a36Sopenharmony_ci#define BD_ENET_RX_EMPTY (0x8000) 11962306a36Sopenharmony_ci#define BD_ENET_RX_WRAP (0x2000) 12062306a36Sopenharmony_ci#define BD_ENET_RX_INTR (0x1000) 12162306a36Sopenharmony_ci#define BD_ENET_RX_LAST (0x0800) 12262306a36Sopenharmony_ci#define BD_ENET_RX_FIRST (0x0400) 12362306a36Sopenharmony_ci#define BD_ENET_RX_MISS (0x0100) 12462306a36Sopenharmony_ci#define BD_ENET_RX_BC (0x0080) /* FCC Only */ 12562306a36Sopenharmony_ci#define BD_ENET_RX_MC (0x0040) /* FCC Only */ 12662306a36Sopenharmony_ci#define BD_ENET_RX_LG (0x0020) 12762306a36Sopenharmony_ci#define BD_ENET_RX_NO (0x0010) 12862306a36Sopenharmony_ci#define BD_ENET_RX_SH (0x0008) 12962306a36Sopenharmony_ci#define BD_ENET_RX_CR (0x0004) 13062306a36Sopenharmony_ci#define BD_ENET_RX_OV (0x0002) 13162306a36Sopenharmony_ci#define BD_ENET_RX_CL (0x0001) 13262306a36Sopenharmony_ci#define BD_ENET_RX_STATS (0x01ff) /* All status bits */ 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci/* Buffer descriptor control/status used by Ethernet transmit. 13562306a36Sopenharmony_ci * Common to SCC and FCC. 13662306a36Sopenharmony_ci */ 13762306a36Sopenharmony_ci#define BD_ENET_TX_READY (0x8000) 13862306a36Sopenharmony_ci#define BD_ENET_TX_PAD (0x4000) 13962306a36Sopenharmony_ci#define BD_ENET_TX_WRAP (0x2000) 14062306a36Sopenharmony_ci#define BD_ENET_TX_INTR (0x1000) 14162306a36Sopenharmony_ci#define BD_ENET_TX_LAST (0x0800) 14262306a36Sopenharmony_ci#define BD_ENET_TX_TC (0x0400) 14362306a36Sopenharmony_ci#define BD_ENET_TX_DEF (0x0200) 14462306a36Sopenharmony_ci#define BD_ENET_TX_HB (0x0100) 14562306a36Sopenharmony_ci#define BD_ENET_TX_LC (0x0080) 14662306a36Sopenharmony_ci#define BD_ENET_TX_RL (0x0040) 14762306a36Sopenharmony_ci#define BD_ENET_TX_RCMASK (0x003c) 14862306a36Sopenharmony_ci#define BD_ENET_TX_UN (0x0002) 14962306a36Sopenharmony_ci#define BD_ENET_TX_CSL (0x0001) 15062306a36Sopenharmony_ci#define BD_ENET_TX_STATS (0x03ff) /* All status bits */ 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci/* Buffer descriptor control/status used by Transparent mode SCC. 15362306a36Sopenharmony_ci */ 15462306a36Sopenharmony_ci#define BD_SCC_TX_LAST (0x0800) 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci/* Buffer descriptor control/status used by I2C. 15762306a36Sopenharmony_ci */ 15862306a36Sopenharmony_ci#define BD_I2C_START (0x0400) 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci#ifdef CONFIG_CPM 16162306a36Sopenharmony_ciint cpm_command(u32 command, u8 opcode); 16262306a36Sopenharmony_ci#else 16362306a36Sopenharmony_cistatic inline int cpm_command(u32 command, u8 opcode) 16462306a36Sopenharmony_ci{ 16562306a36Sopenharmony_ci return -ENOSYS; 16662306a36Sopenharmony_ci} 16762306a36Sopenharmony_ci#endif /* CONFIG_CPM */ 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ciint cpm2_gpiochip_add32(struct device *dev); 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci#endif 172