Merge remote-tracking branch 'spi/for-5.14' into spi-next
This commit is contained in:
commit
1bee1ecf23
57 changed files with 1249 additions and 862 deletions
|
|
@ -170,6 +170,28 @@ struct spinand_op;
|
|||
struct spinand_device;
|
||||
|
||||
#define SPINAND_MAX_ID_LEN 4
|
||||
/*
|
||||
* For erase, write and read operation, we got the following timings :
|
||||
* tBERS (erase) 1ms to 4ms
|
||||
* tPROG 300us to 400us
|
||||
* tREAD 25us to 100us
|
||||
* In order to minimize latency, the min value is divided by 4 for the
|
||||
* initial delay, and dividing by 20 for the poll delay.
|
||||
* For reset, 5us/10us/500us if the device is respectively
|
||||
* reading/programming/erasing when the RESET occurs. Since we always
|
||||
* issue a RESET when the device is IDLE, 5us is selected for both initial
|
||||
* and poll delay.
|
||||
*/
|
||||
#define SPINAND_READ_INITIAL_DELAY_US 6
|
||||
#define SPINAND_READ_POLL_DELAY_US 5
|
||||
#define SPINAND_RESET_INITIAL_DELAY_US 5
|
||||
#define SPINAND_RESET_POLL_DELAY_US 5
|
||||
#define SPINAND_WRITE_INITIAL_DELAY_US 75
|
||||
#define SPINAND_WRITE_POLL_DELAY_US 15
|
||||
#define SPINAND_ERASE_INITIAL_DELAY_US 250
|
||||
#define SPINAND_ERASE_POLL_DELAY_US 50
|
||||
|
||||
#define SPINAND_WAITRDY_TIMEOUT_MS 400
|
||||
|
||||
/**
|
||||
* struct spinand_id - SPI NAND id structure
|
||||
|
|
|
|||
|
|
@ -1,16 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Platform data definition for Atheros AR71XX/AR724X/AR913X SPI controller
|
||||
*
|
||||
* Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
|
||||
*/
|
||||
|
||||
#ifndef _ATH79_SPI_PLATFORM_H
|
||||
#define _ATH79_SPI_PLATFORM_H
|
||||
|
||||
struct ath79_spi_platform_data {
|
||||
unsigned bus_num;
|
||||
unsigned num_chipselect;
|
||||
};
|
||||
|
||||
#endif /* _ATH79_SPI_PLATFORM_H */
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (C) 2003 Russell King, All Rights Reserved.
|
||||
* Copyright (C) 2003 Russell King, All Rights Reserved.
|
||||
*
|
||||
* This driver supports the following PXA CPU/SSP ports:-
|
||||
*
|
||||
|
|
@ -11,8 +11,8 @@
|
|||
* PXA3xx SSP1, SSP2, SSP3, SSP4
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SSP_H
|
||||
#define __LINUX_SSP_H
|
||||
#ifndef __LINUX_PXA2XX_SSP_H
|
||||
#define __LINUX_PXA2XX_SSP_H
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <linux/compiler_types.h>
|
||||
|
|
@ -38,7 +38,6 @@ struct device_node;
|
|||
#define SSDR (0x10) /* SSP Data Write/Data Read Register */
|
||||
|
||||
#define SSTO (0x28) /* SSP Time Out Register */
|
||||
#define DDS_RATE (0x28) /* SSP DDS Clock Rate Register (Intel Quark) */
|
||||
#define SSPSP (0x2C) /* SSP Programmable Serial Protocol */
|
||||
#define SSTSA (0x30) /* SSP Tx Timeslot Active */
|
||||
#define SSRSA (0x34) /* SSP Rx Timeslot Active */
|
||||
|
|
@ -60,7 +59,7 @@ struct device_node;
|
|||
/* PXA27x, PXA3xx */
|
||||
#define SSCR0_EDSS BIT(20) /* Extended data size select */
|
||||
#define SSCR0_NCS BIT(21) /* Network clock select */
|
||||
#define SSCR0_RIM BIT(22) /* Receive FIFO overrrun interrupt mask */
|
||||
#define SSCR0_RIM BIT(22) /* Receive FIFO overrun interrupt mask */
|
||||
#define SSCR0_TUM BIT(23) /* Transmit FIFO underrun interrupt mask */
|
||||
#define SSCR0_FRDC GENMASK(26, 24) /* Frame rate divider control (mask) */
|
||||
#define SSCR0_SlotsPerFrm(x) (((x) - 1) << 24) /* Time slots per frame [1..8] */
|
||||
|
|
@ -105,6 +104,9 @@ struct device_node;
|
|||
#define CE4100_SSCR1_RFT GENMASK(11, 10) /* Receive FIFO Threshold (mask) */
|
||||
#define CE4100_SSCR1_RxTresh(x) (((x) - 1) << 10) /* level [1..4] */
|
||||
|
||||
/* Intel Quark X1000 */
|
||||
#define DDS_RATE 0x28 /* SSP DDS Clock Rate Register */
|
||||
|
||||
/* QUARK_X1000 SSCR0 bit definition */
|
||||
#define QUARK_X1000_SSCR0_DSS GENMASK(4, 0) /* Data Size Select (mask) */
|
||||
#define QUARK_X1000_SSCR0_DataSize(x) ((x) - 1) /* Data Size Select [4..32] */
|
||||
|
|
@ -124,7 +126,7 @@ struct device_node;
|
|||
#define QUARK_X1000_SSCR1_EFWR BIT(16) /* Enable FIFO Write/Read */
|
||||
#define QUARK_X1000_SSCR1_STRF BIT(17) /* Select FIFO or EFWR */
|
||||
|
||||
/* extra bits in PXA255, PXA26x and PXA27x SSP ports */
|
||||
/* Extra bits in PXA255, PXA26x and PXA27x SSP ports */
|
||||
#define SSCR0_TISSP (1 << 4) /* TI Sync Serial Protocol */
|
||||
#define SSCR0_PSP (3 << 4) /* PSP - Programmable Serial Protocol */
|
||||
|
||||
|
|
@ -181,6 +183,21 @@ struct device_node;
|
|||
#define SSACD_ACPS(x) ((x) << 4) /* Audio clock PLL select */
|
||||
#define SSACD_SCDX8 BIT(7) /* SYSCLK division ratio select */
|
||||
|
||||
/* Intel Merrifield SSP */
|
||||
#define SFIFOL 0x68 /* FIFO level */
|
||||
#define SFIFOTT 0x6c /* FIFO trigger threshold */
|
||||
|
||||
#define RX_THRESH_MRFLD_DFLT 16
|
||||
#define TX_THRESH_MRFLD_DFLT 16
|
||||
|
||||
#define SFIFOL_TFL_MASK GENMASK(15, 0) /* Transmit FIFO Level mask */
|
||||
#define SFIFOL_RFL_MASK GENMASK(31, 16) /* Receive FIFO Level mask */
|
||||
|
||||
#define SFIFOTT_TFT GENMASK(15, 0) /* Transmit FIFO Threshold (mask) */
|
||||
#define SFIFOTT_TxThresh(x) (((x) - 1) << 0) /* TX FIFO trigger threshold / level */
|
||||
#define SFIFOTT_RFT GENMASK(31, 16) /* Receive FIFO Threshold (mask) */
|
||||
#define SFIFOTT_RxThresh(x) (((x) - 1) << 16) /* RX FIFO trigger threshold / level */
|
||||
|
||||
/* LPSS SSP */
|
||||
#define SSITF 0x44 /* TX FIFO trigger level */
|
||||
#define SSITF_TxHiThresh(x) (((x) - 1) << 0)
|
||||
|
|
@ -203,8 +220,10 @@ enum pxa_ssp_type {
|
|||
MMP2_SSP,
|
||||
PXA910_SSP,
|
||||
CE4100_SSP,
|
||||
MRFLD_SSP,
|
||||
QUARK_X1000_SSP,
|
||||
LPSS_LPT_SSP, /* Keep LPSS types sorted with lpss_platforms[] */
|
||||
/* Keep LPSS types sorted with lpss_platforms[] */
|
||||
LPSS_LPT_SSP,
|
||||
LPSS_BYT_SSP,
|
||||
LPSS_BSW_SSP,
|
||||
LPSS_SPT_SSP,
|
||||
|
|
@ -252,6 +271,22 @@ static inline u32 pxa_ssp_read_reg(struct ssp_device *dev, u32 reg)
|
|||
return __raw_readl(dev->mmio_base + reg);
|
||||
}
|
||||
|
||||
static inline void pxa_ssp_enable(struct ssp_device *ssp)
|
||||
{
|
||||
u32 sscr0;
|
||||
|
||||
sscr0 = pxa_ssp_read_reg(ssp, SSCR0) | SSCR0_SSE;
|
||||
pxa_ssp_write_reg(ssp, SSCR0, sscr0);
|
||||
}
|
||||
|
||||
static inline void pxa_ssp_disable(struct ssp_device *ssp)
|
||||
{
|
||||
u32 sscr0;
|
||||
|
||||
sscr0 = pxa_ssp_read_reg(ssp, SSCR0) & ~SSCR0_SSE;
|
||||
pxa_ssp_write_reg(ssp, SSCR0, sscr0);
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_PXA_SSP)
|
||||
struct ssp_device *pxa_ssp_request(int port, const char *label);
|
||||
void pxa_ssp_free(struct ssp_device *);
|
||||
|
|
@ -270,4 +305,4 @@ static inline struct ssp_device *pxa_ssp_request_of(const struct device_node *n,
|
|||
static inline void pxa_ssp_free(struct ssp_device *ssp) {}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif /* __LINUX_PXA2XX_SSP_H */
|
||||
|
|
|
|||
|
|
@ -2,8 +2,10 @@
|
|||
/*
|
||||
* Copyright (C) 2005 Stephen Street / StreetFire Sound Labs
|
||||
*/
|
||||
#ifndef __linux_pxa2xx_spi_h
|
||||
#define __linux_pxa2xx_spi_h
|
||||
#ifndef __LINUX_SPI_PXA2XX_SPI_H
|
||||
#define __LINUX_SPI_PXA2XX_SPI_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <linux/pxa2xx_ssp.h>
|
||||
|
||||
|
|
@ -12,7 +14,10 @@
|
|||
|
||||
struct dma_chan;
|
||||
|
||||
/* device.platform_data for SSP controller devices */
|
||||
/*
|
||||
* The platform data for SSP controller devices
|
||||
* (resides in device.platform_data).
|
||||
*/
|
||||
struct pxa2xx_spi_controller {
|
||||
u16 num_chipselect;
|
||||
u8 enable_dma;
|
||||
|
|
@ -28,8 +33,11 @@ struct pxa2xx_spi_controller {
|
|||
struct ssp_device ssp;
|
||||
};
|
||||
|
||||
/* spi_board_info.controller_data for SPI slave devices,
|
||||
* copied to spi_device.platform_data ... mostly for dma tuning
|
||||
/*
|
||||
* The controller specific data for SPI slave devices
|
||||
* (resides in spi_board_info.controller_data),
|
||||
* copied to spi_device.platform_data ... mostly for
|
||||
* DMA tuning.
|
||||
*/
|
||||
struct pxa2xx_spi_chip {
|
||||
u8 tx_threshold;
|
||||
|
|
@ -49,4 +57,5 @@ struct pxa2xx_spi_chip {
|
|||
extern void pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_controller *info);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* __LINUX_SPI_PXA2XX_SPI_H */
|
||||
|
|
|
|||
|
|
@ -250,6 +250,9 @@ static inline void *spi_mem_get_drvdata(struct spi_mem *mem)
|
|||
* the currently mapped area), and the caller of
|
||||
* spi_mem_dirmap_write() is responsible for calling it again in
|
||||
* this case.
|
||||
* @poll_status: poll memory device status until (status & mask) == match or
|
||||
* when the timeout has expired. It fills the data buffer with
|
||||
* the last status value.
|
||||
*
|
||||
* This interface should be implemented by SPI controllers providing an
|
||||
* high-level interface to execute SPI memory operation, which is usually the
|
||||
|
|
@ -274,6 +277,12 @@ struct spi_controller_mem_ops {
|
|||
u64 offs, size_t len, void *buf);
|
||||
ssize_t (*dirmap_write)(struct spi_mem_dirmap_desc *desc,
|
||||
u64 offs, size_t len, const void *buf);
|
||||
int (*poll_status)(struct spi_mem *mem,
|
||||
const struct spi_mem_op *op,
|
||||
u16 mask, u16 match,
|
||||
unsigned long initial_delay_us,
|
||||
unsigned long polling_rate_us,
|
||||
unsigned long timeout_ms);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -369,6 +378,13 @@ devm_spi_mem_dirmap_create(struct device *dev, struct spi_mem *mem,
|
|||
void devm_spi_mem_dirmap_destroy(struct device *dev,
|
||||
struct spi_mem_dirmap_desc *desc);
|
||||
|
||||
int spi_mem_poll_status(struct spi_mem *mem,
|
||||
const struct spi_mem_op *op,
|
||||
u16 mask, u16 match,
|
||||
unsigned long initial_delay_us,
|
||||
unsigned long polling_delay_us,
|
||||
u16 timeout_ms);
|
||||
|
||||
int spi_mem_driver_register_with_owner(struct spi_mem_driver *drv,
|
||||
struct module *owner);
|
||||
|
||||
|
|
|
|||
|
|
@ -299,6 +299,8 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)
|
|||
driver_unregister(&sdrv->driver);
|
||||
}
|
||||
|
||||
extern struct spi_device *spi_new_ancillary_device(struct spi_device *spi, u8 chip_select);
|
||||
|
||||
/* use a define to avoid include chaining to get THIS_MODULE */
|
||||
#define spi_register_driver(driver) \
|
||||
__spi_register_driver(THIS_MODULE, driver)
|
||||
|
|
@ -586,6 +588,7 @@ struct spi_controller {
|
|||
bool (*can_dma)(struct spi_controller *ctlr,
|
||||
struct spi_device *spi,
|
||||
struct spi_transfer *xfer);
|
||||
struct device *dma_map_dev;
|
||||
|
||||
/*
|
||||
* These hooks are for drivers that want to use the generic
|
||||
|
|
@ -1108,11 +1111,6 @@ static inline void spi_message_free(struct spi_message *m)
|
|||
kfree(m);
|
||||
}
|
||||
|
||||
extern int spi_set_cs_timing(struct spi_device *spi,
|
||||
struct spi_delay *setup,
|
||||
struct spi_delay *hold,
|
||||
struct spi_delay *inactive);
|
||||
|
||||
extern int spi_setup(struct spi_device *spi);
|
||||
extern int spi_async(struct spi_device *spi, struct spi_message *message);
|
||||
extern int spi_async_locked(struct spi_device *spi,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue