Commit 41d5a700 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'spi/topic/lm70llp', 'spi/topic/loopback',...

Merge remote-tracking branches 'spi/topic/lm70llp', 'spi/topic/loopback', 'spi/topic/mtk' and 'spi/topic/omap2-mcspi' into spi-next
...@@ -2,9 +2,10 @@ Binding for MTK SPI controller ...@@ -2,9 +2,10 @@ Binding for MTK SPI controller
Required properties: Required properties:
- compatible: should be one of the following. - compatible: should be one of the following.
- mediatek,mt8173-spi: for mt8173 platforms - mediatek,mt2701-spi: for mt2701 platforms
- mediatek,mt8135-spi: for mt8135 platforms
- mediatek,mt6589-spi: for mt6589 platforms - mediatek,mt6589-spi: for mt6589 platforms
- mediatek,mt8135-spi: for mt8135 platforms
- mediatek,mt8173-spi: for mt8173 platforms
- #address-cells: should be 1. - #address-cells: should be 1.
...@@ -29,10 +30,10 @@ Required properties: ...@@ -29,10 +30,10 @@ Required properties:
muxes clock, and "spi-clk" for the clock gate. muxes clock, and "spi-clk" for the clock gate.
Optional properties: Optional properties:
-cs-gpios: see spi-bus.txt, only required for MT8173. -cs-gpios: see spi-bus.txt.
- mediatek,pad-select: specify which pins group(ck/mi/mo/cs) spi - mediatek,pad-select: specify which pins group(ck/mi/mo/cs) spi
controller used. This is a array, the element value should be 0~3, controller used. This is an array, the element value should be 0~3,
only required for MT8173. only required for MT8173.
0: specify GPIO69,70,71,72 for spi pins. 0: specify GPIO69,70,71,72 for spi pins.
1: specify GPIO102,103,104,105 for spi pins. 1: specify GPIO102,103,104,105 for spi pins.
......
...@@ -689,6 +689,15 @@ config SPI_SPIDEV ...@@ -689,6 +689,15 @@ config SPI_SPIDEV
Note that this application programming interface is EXPERIMENTAL Note that this application programming interface is EXPERIMENTAL
and hence SUBJECT TO CHANGE WITHOUT NOTICE while it stabilizes. and hence SUBJECT TO CHANGE WITHOUT NOTICE while it stabilizes.
config SPI_LOOPBACK_TEST
tristate "spi loopback test framework support"
depends on m
help
This enables the SPI loopback testing framework driver
primarily used for development of spi_master drivers
and to detect regressions
config SPI_TLE62X0 config SPI_TLE62X0
tristate "Infineon TLE62X0 (for power switching)" tristate "Infineon TLE62X0 (for power switching)"
depends on SYSFS depends on SYSFS
......
...@@ -8,6 +8,7 @@ ccflags-$(CONFIG_SPI_DEBUG) := -DDEBUG ...@@ -8,6 +8,7 @@ ccflags-$(CONFIG_SPI_DEBUG) := -DDEBUG
# config declarations into driver model code # config declarations into driver model code
obj-$(CONFIG_SPI_MASTER) += spi.o obj-$(CONFIG_SPI_MASTER) += spi.o
obj-$(CONFIG_SPI_SPIDEV) += spidev.o obj-$(CONFIG_SPI_SPIDEV) += spidev.o
obj-$(CONFIG_SPI_LOOPBACK_TEST) += spi-loopback-test.o
# SPI master controller drivers (bus) # SPI master controller drivers (bus)
obj-$(CONFIG_SPI_ALTERA) += spi-altera.o obj-$(CONFIG_SPI_ALTERA) += spi-altera.o
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -23,11 +25,9 @@ ...@@ -23,11 +25,9 @@
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/spi_bitbang.h> #include <linux/spi/spi_bitbang.h>
/* /*
* The LM70 communicates with a host processor using a 3-wire variant of * The LM70 communicates with a host processor using a 3-wire variant of
* the SPI/Microwire bus interface. This driver specifically supports an * the SPI/Microwire bus interface. This driver specifically supports an
...@@ -88,7 +88,6 @@ struct spi_lm70llp { ...@@ -88,7 +88,6 @@ struct spi_lm70llp {
/* REVISIT : ugly global ; provides "exclusive open" facility */ /* REVISIT : ugly global ; provides "exclusive open" facility */
static struct spi_lm70llp *lm70llp; static struct spi_lm70llp *lm70llp;
/*-------------------------------------------------------------------*/ /*-------------------------------------------------------------------*/
static inline struct spi_lm70llp *spidev_to_pp(struct spi_device *spi) static inline struct spi_lm70llp *spidev_to_pp(struct spi_device *spi)
...@@ -122,12 +121,14 @@ static inline void assertCS(struct spi_lm70llp *pp) ...@@ -122,12 +121,14 @@ static inline void assertCS(struct spi_lm70llp *pp)
static inline void clkHigh(struct spi_lm70llp *pp) static inline void clkHigh(struct spi_lm70llp *pp)
{ {
u8 data = parport_read_data(pp->port); u8 data = parport_read_data(pp->port);
parport_write_data(pp->port, data | SCLK); parport_write_data(pp->port, data | SCLK);
} }
static inline void clkLow(struct spi_lm70llp *pp) static inline void clkLow(struct spi_lm70llp *pp)
{ {
u8 data = parport_read_data(pp->port); u8 data = parport_read_data(pp->port);
parport_write_data(pp->port, data & ~SCLK); parport_write_data(pp->port, data & ~SCLK);
} }
...@@ -166,8 +167,10 @@ static inline void setmosi(struct spi_device *s, int is_on) ...@@ -166,8 +167,10 @@ static inline void setmosi(struct spi_device *s, int is_on)
static inline int getmiso(struct spi_device *s) static inline int getmiso(struct spi_device *s)
{ {
struct spi_lm70llp *pp = spidev_to_pp(s); struct spi_lm70llp *pp = spidev_to_pp(s);
return ((SIO == (parport_read_status(pp->port) & SIO)) ? 0 : 1 );
return ((SIO == (parport_read_status(pp->port) & SIO)) ? 0 : 1);
} }
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
#include "spi-bitbang-txrx.h" #include "spi-bitbang-txrx.h"
...@@ -196,11 +199,10 @@ static void spi_lm70llp_attach(struct parport *p) ...@@ -196,11 +199,10 @@ static void spi_lm70llp_attach(struct parport *p)
struct spi_lm70llp *pp; struct spi_lm70llp *pp;
struct spi_master *master; struct spi_master *master;
int status; int status;
struct pardev_cb lm70llp_cb;
if (lm70llp) { if (lm70llp) {
printk(KERN_WARNING pr_warn("spi_lm70llp instance already loaded. Aborting.\n");
"%s: spi_lm70llp instance already loaded. Aborting.\n",
DRVNAME);
return; return;
} }
...@@ -227,9 +229,11 @@ static void spi_lm70llp_attach(struct parport *p) ...@@ -227,9 +229,11 @@ static void spi_lm70llp_attach(struct parport *p)
* Parport hookup * Parport hookup
*/ */
pp->port = p; pp->port = p;
pd = parport_register_device(p, DRVNAME, memset(&lm70llp_cb, 0, sizeof(lm70llp_cb));
NULL, NULL, NULL, lm70llp_cb.private = pp;
PARPORT_FLAG_EXCL, pp); lm70llp_cb.flags = PARPORT_FLAG_EXCL;
pd = parport_register_dev_model(p, DRVNAME, &lm70llp_cb, 0);
if (!pd) { if (!pd) {
status = -ENOMEM; status = -ENOMEM;
goto out_free_master; goto out_free_master;
...@@ -245,9 +249,8 @@ static void spi_lm70llp_attach(struct parport *p) ...@@ -245,9 +249,8 @@ static void spi_lm70llp_attach(struct parport *p)
*/ */
status = spi_bitbang_start(&pp->bitbang); status = spi_bitbang_start(&pp->bitbang);
if (status < 0) { if (status < 0) {
printk(KERN_WARNING dev_warn(&pd->dev, "spi_bitbang_start failed with status %d\n",
"%s: spi_bitbang_start failed with status %d\n", status);
DRVNAME, status);
goto out_off_and_release; goto out_off_and_release;
} }
...@@ -272,9 +275,9 @@ static void spi_lm70llp_attach(struct parport *p) ...@@ -272,9 +275,9 @@ static void spi_lm70llp_attach(struct parport *p)
pp->spidev_lm70 = spi_new_device(pp->bitbang.master, &pp->info); pp->spidev_lm70 = spi_new_device(pp->bitbang.master, &pp->info);
if (pp->spidev_lm70) if (pp->spidev_lm70)
dev_dbg(&pp->spidev_lm70->dev, "spidev_lm70 at %s\n", dev_dbg(&pp->spidev_lm70->dev, "spidev_lm70 at %s\n",
dev_name(&pp->spidev_lm70->dev)); dev_name(&pp->spidev_lm70->dev));
else { else {
printk(KERN_WARNING "%s: spi_new_device failed\n", DRVNAME); dev_warn(&pd->dev, "spi_new_device failed\n");
status = -ENODEV; status = -ENODEV;
goto out_bitbang_stop; goto out_bitbang_stop;
} }
...@@ -293,9 +296,9 @@ static void spi_lm70llp_attach(struct parport *p) ...@@ -293,9 +296,9 @@ static void spi_lm70llp_attach(struct parport *p)
out_parport_unreg: out_parport_unreg:
parport_unregister_device(pd); parport_unregister_device(pd);
out_free_master: out_free_master:
(void) spi_master_put(master); spi_master_put(master);
out_fail: out_fail:
pr_info("%s: spi_lm70llp probe fail, status %d\n", DRVNAME, status); pr_info("spi_lm70llp probe fail, status %d\n", status);
} }
static void spi_lm70llp_detach(struct parport *p) static void spi_lm70llp_detach(struct parport *p)
...@@ -314,16 +317,16 @@ static void spi_lm70llp_detach(struct parport *p) ...@@ -314,16 +317,16 @@ static void spi_lm70llp_detach(struct parport *p)
parport_release(pp->pd); parport_release(pp->pd);
parport_unregister_device(pp->pd); parport_unregister_device(pp->pd);
(void) spi_master_put(pp->bitbang.master); spi_master_put(pp->bitbang.master);
lm70llp = NULL; lm70llp = NULL;
} }
static struct parport_driver spi_lm70llp_drv = { static struct parport_driver spi_lm70llp_drv = {
.name = DRVNAME, .name = DRVNAME,
.attach = spi_lm70llp_attach, .match_port = spi_lm70llp_attach,
.detach = spi_lm70llp_detach, .detach = spi_lm70llp_detach,
.devmodel = true,
}; };
static int __init init_spi_lm70llp(void) static int __init init_spi_lm70llp(void)
......
This diff is collapsed.
...@@ -95,8 +95,7 @@ struct mtk_spi { ...@@ -95,8 +95,7 @@ struct mtk_spi {
const struct mtk_spi_compatible *dev_comp; const struct mtk_spi_compatible *dev_comp;
}; };
static const struct mtk_spi_compatible mt6589_compat; static const struct mtk_spi_compatible mtk_common_compat;
static const struct mtk_spi_compatible mt8135_compat;
static const struct mtk_spi_compatible mt8173_compat = { static const struct mtk_spi_compatible mt8173_compat = {
.need_pad_sel = true, .need_pad_sel = true,
.must_tx = true, .must_tx = true,
...@@ -112,9 +111,18 @@ static const struct mtk_chip_config mtk_default_chip_info = { ...@@ -112,9 +111,18 @@ static const struct mtk_chip_config mtk_default_chip_info = {
}; };
static const struct of_device_id mtk_spi_of_match[] = { static const struct of_device_id mtk_spi_of_match[] = {
{ .compatible = "mediatek,mt6589-spi", .data = (void *)&mt6589_compat }, { .compatible = "mediatek,mt2701-spi",
{ .compatible = "mediatek,mt8135-spi", .data = (void *)&mt8135_compat }, .data = (void *)&mtk_common_compat,
{ .compatible = "mediatek,mt8173-spi", .data = (void *)&mt8173_compat }, },
{ .compatible = "mediatek,mt6589-spi",
.data = (void *)&mtk_common_compat,
},
{ .compatible = "mediatek,mt8135-spi",
.data = (void *)&mtk_common_compat,
},
{ .compatible = "mediatek,mt8173-spi",
.data = (void *)&mt8173_compat,
},
{} {}
}; };
MODULE_DEVICE_TABLE(of, mtk_spi_of_match); MODULE_DEVICE_TABLE(of, mtk_spi_of_match);
...@@ -154,9 +162,6 @@ static int mtk_spi_prepare_message(struct spi_master *master, ...@@ -154,9 +162,6 @@ static int mtk_spi_prepare_message(struct spi_master *master,
reg_val |= SPI_CMD_CPOL; reg_val |= SPI_CMD_CPOL;
else else
reg_val &= ~SPI_CMD_CPOL; reg_val &= ~SPI_CMD_CPOL;
writel(reg_val, mdata->base + SPI_CMD_REG);
reg_val = readl(mdata->base + SPI_CMD_REG);
/* set the mlsbx and mlsbtx */ /* set the mlsbx and mlsbtx */
if (chip_config->tx_mlsb) if (chip_config->tx_mlsb)
...@@ -618,7 +623,8 @@ static int mtk_spi_probe(struct platform_device *pdev) ...@@ -618,7 +623,8 @@ static int mtk_spi_probe(struct platform_device *pdev)
ret = clk_set_parent(mdata->sel_clk, mdata->parent_clk); ret = clk_set_parent(mdata->sel_clk, mdata->parent_clk);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "failed to clk_set_parent (%d)\n", ret); dev_err(&pdev->dev, "failed to clk_set_parent (%d)\n", ret);
goto err_disable_clk; clk_disable_unprepare(mdata->spi_clk);
goto err_put_master;
} }
clk_disable_unprepare(mdata->spi_clk); clk_disable_unprepare(mdata->spi_clk);
...@@ -628,7 +634,7 @@ static int mtk_spi_probe(struct platform_device *pdev) ...@@ -628,7 +634,7 @@ static int mtk_spi_probe(struct platform_device *pdev)
ret = devm_spi_register_master(&pdev->dev, master); ret = devm_spi_register_master(&pdev->dev, master);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to register master (%d)\n", ret); dev_err(&pdev->dev, "failed to register master (%d)\n", ret);
goto err_put_master; goto err_disable_runtime_pm;
} }
if (mdata->dev_comp->need_pad_sel) { if (mdata->dev_comp->need_pad_sel) {
...@@ -637,14 +643,14 @@ static int mtk_spi_probe(struct platform_device *pdev) ...@@ -637,14 +643,14 @@ static int mtk_spi_probe(struct platform_device *pdev)
"pad_num does not match num_chipselect(%d != %d)\n", "pad_num does not match num_chipselect(%d != %d)\n",
mdata->pad_num, master->num_chipselect); mdata->pad_num, master->num_chipselect);
ret = -EINVAL; ret = -EINVAL;
goto err_put_master; goto err_disable_runtime_pm;
} }
if (!master->cs_gpios && master->num_chipselect > 1) { if (!master->cs_gpios && master->num_chipselect > 1) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"cs_gpios not specified and num_chipselect > 1\n"); "cs_gpios not specified and num_chipselect > 1\n");
ret = -EINVAL; ret = -EINVAL;
goto err_put_master; goto err_disable_runtime_pm;
} }
if (master->cs_gpios) { if (master->cs_gpios) {
...@@ -655,7 +661,7 @@ static int mtk_spi_probe(struct platform_device *pdev) ...@@ -655,7 +661,7 @@ static int mtk_spi_probe(struct platform_device *pdev)
if (ret) { if (ret) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"can't get CS GPIO %i\n", i); "can't get CS GPIO %i\n", i);
goto err_put_master; goto err_disable_runtime_pm;
} }
} }
} }
...@@ -663,8 +669,8 @@ static int mtk_spi_probe(struct platform_device *pdev) ...@@ -663,8 +669,8 @@ static int mtk_spi_probe(struct platform_device *pdev)
return 0; return 0;
err_disable_clk: err_disable_runtime_pm:
clk_disable_unprepare(mdata->spi_clk); pm_runtime_disable(&pdev->dev);
err_put_master: err_put_master:
spi_master_put(master); spi_master_put(master);
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/dmaengine.h> #include <linux/dmaengine.h>
#include <linux/omap-dma.h> #include <linux/omap-dma.h>
#include <linux/pinctrl/consumer.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/clk.h> #include <linux/clk.h>
...@@ -1024,6 +1025,16 @@ static int omap2_mcspi_setup(struct spi_device *spi) ...@@ -1024,6 +1025,16 @@ static int omap2_mcspi_setup(struct spi_device *spi)
spi->controller_state = cs; spi->controller_state = cs;
/* Link this to context save list */ /* Link this to context save list */
list_add_tail(&cs->node, &ctx->cs); list_add_tail(&cs->node, &ctx->cs);
if (gpio_is_valid(spi->cs_gpio)) {
ret = gpio_request(spi->cs_gpio, dev_name(&spi->dev));
if (ret) {
dev_err(&spi->dev, "failed to request gpio\n");
return ret;
}
gpio_direction_output(spi->cs_gpio,
!(spi->mode & SPI_CS_HIGH));
}
} }
if (!mcspi_dma->dma_rx || !mcspi_dma->dma_tx) { if (!mcspi_dma->dma_rx || !mcspi_dma->dma_tx) {
...@@ -1032,15 +1043,6 @@ static int omap2_mcspi_setup(struct spi_device *spi) ...@@ -1032,15 +1043,6 @@ static int omap2_mcspi_setup(struct spi_device *spi)
return ret; return ret;
} }
if (gpio_is_valid(spi->cs_gpio)) {
ret = gpio_request(spi->cs_gpio, dev_name(&spi->dev));
if (ret) {
dev_err(&spi->dev, "failed to request gpio\n");
return ret;
}
gpio_direction_output(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH));
}
ret = pm_runtime_get_sync(mcspi->dev); ret = pm_runtime_get_sync(mcspi->dev);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -1536,14 +1538,23 @@ static int omap2_mcspi_resume(struct device *dev) ...@@ -1536,14 +1538,23 @@ static int omap2_mcspi_resume(struct device *dev)
} }
pm_runtime_mark_last_busy(mcspi->dev); pm_runtime_mark_last_busy(mcspi->dev);
pm_runtime_put_autosuspend(mcspi->dev); pm_runtime_put_autosuspend(mcspi->dev);
return 0;
return pinctrl_pm_select_default_state(dev);
}
static int omap2_mcspi_suspend(struct device *dev)
{
return pinctrl_pm_select_sleep_state(dev);
} }
#else #else
#define omap2_mcspi_suspend NULL
#define omap2_mcspi_resume NULL #define omap2_mcspi_resume NULL
#endif #endif
static const struct dev_pm_ops omap2_mcspi_pm_ops = { static const struct dev_pm_ops omap2_mcspi_pm_ops = {
.resume = omap2_mcspi_resume, .resume = omap2_mcspi_resume,
.suspend = omap2_mcspi_suspend,
.runtime_resume = omap_mcspi_runtime_resume, .runtime_resume = omap_mcspi_runtime_resume,
}; };
......
/*
* linux/drivers/spi/spi-test.h
*
* (c) Martin Sperl <kernel@martin.sperl.org>
*
* spi_test definitions
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <linux/spi/spi.h>
#define SPI_TEST_MAX_TRANSFERS 4
#define SPI_TEST_MAX_SIZE (32 * PAGE_SIZE)
#define SPI_TEST_MAX_ITERATE 32
/* the "dummy" start addresses used in spi_test
* these addresses get translated at a later stage
*/
#define RX_START BIT(30)
#define TX_START BIT(31)
#define RX(off) ((void *)(RX_START + off))
#define TX(off) ((void *)(TX_START + off))
/* some special defines for offsets */
#define SPI_TEST_MAX_SIZE_HALF BIT(29)
/* detection pattern for unfinished reads...
* - 0x00 or 0xff could be valid levels for tx_buf = NULL,
* so we do not use either of them
*/
#define SPI_TEST_PATTERN_UNWRITTEN 0xAA
#define SPI_TEST_PATTERN_DO_NOT_WRITE 0x55
#define SPI_TEST_CHECK_DO_NOT_WRITE 64
/**
* struct spi_test - describes a specific (set of) tests to execute
*
* @description: description of the test
*
* @msg: a template @spi_message usedfor the default settings
* @transfers: array of @spi_transfers that are part of the
* resulting spi_message. The first transfer with len == 0
* signifies the end of the list
* @transfer_count: normally computed number of transfers with len > 0
*
* @run_test: run a specific spi_test - this allows to override
* the default implementation of @spi_test_run_transfer
* either to add some custom filters for a specific test
* or to effectively run some very custom tests...
* @execute_msg: run the spi_message for real - this allows to override
* @spi_test_execute_msg to apply final modifications
* on the spi_message
* @expected_return: the expected return code - in some cases we want to
* test also for error conditions
*
* @iterate_len: list of length to iterate on (in addition to the
* explicitly set @spi_transfer.len)
* @iterate_tx_align: change the alignment of @spi_transfer.tx_buf
* for all values in the below range if set.
* the ranges are:
* [0 : @spi_master.dma_alignment[ if set
* [0 : iterate_tx_align[ if unset
* @iterate_rx_align: change the alignment of @spi_transfer.rx_buf
* see @iterate_tx_align for details
* @iterate_transfer_mask: the bitmask of transfers to which the iterations
* apply - if 0, then it applies to all transfer
*
* @fill_option: define the way how tx_buf is filled
* @fill_pattern: fill pattern to apply to the tx_buf
* (used in some of the @fill_options)
*/
struct spi_test {
char description[64];
struct spi_message msg;
struct spi_transfer transfers[SPI_TEST_MAX_TRANSFERS];
unsigned int transfer_count;
int (*run_test)(struct spi_device *spi, struct spi_test *test,
void *tx, void *rx);
int (*execute_msg)(struct spi_device *spi, struct spi_test *test,
void *tx, void *rx);
int expected_return;
/* iterate over all the non-zero values */
int iterate_len[SPI_TEST_MAX_ITERATE];
int iterate_tx_align;
int iterate_rx_align;
u32 iterate_transfer_mask;
/* the tx-fill operation */
u32 fill_option;
#define FILL_MEMSET_8 0 /* just memset with 8 bit */
#define FILL_MEMSET_16 1 /* just memset with 16 bit */
#define FILL_MEMSET_24 2 /* just memset with 24 bit */
#define FILL_MEMSET_32 3 /* just memset with 32 bit */
#define FILL_COUNT_8 4 /* fill with a 8 byte counter */
#define FILL_COUNT_16 5 /* fill with a 16 bit counter */
#define FILL_COUNT_24 6 /* fill with a 24 bit counter */
#define FILL_COUNT_32 7 /* fill with a 32 bit counter */
#define FILL_TRANSFER_BYTE_8 8 /* fill with the transfer byte - 8 bit */
#define FILL_TRANSFER_BYTE_16 9 /* fill with the transfer byte - 16 bit */
#define FILL_TRANSFER_BYTE_24 10 /* fill with the transfer byte - 24 bit */
#define FILL_TRANSFER_BYTE_32 11 /* fill with the transfer byte - 32 bit */
#define FILL_TRANSFER_NUM 16 /* fill with the transfer number */
u32 fill_pattern;
};
/* default implementation for @spi_test.run_test */
int spi_test_run_test(struct spi_device *spi,
const struct spi_test *test,
void *tx, void *rx);
/* default implementation for @spi_test.execute_msg */
int spi_test_execute_msg(struct spi_device *spi,
struct spi_test *test,
void *tx, void *rx);
/* function to execute a set of tests */
int spi_test_run_tests(struct spi_device *spi,
struct spi_test *tests);
/* some of the default @spi_transfer.len to test */
#define ITERATE_LEN 2, 3, 7, 11, 16, 31, 32, 64, 97, 128, 251, 256, \
1021, 1024, 1031, 4093, PAGE_SIZE, 4099, 65536, 65537
#define ITERATE_MAX_LEN ITERATE_LEN, SPI_TEST_MAX_SIZE - 1, SPI_TEST_MAX_SIZE
/* the default alignment to test */
#define ITERATE_ALIGN sizeof(int)
...@@ -768,10 +768,15 @@ struct spi_message { ...@@ -768,10 +768,15 @@ struct spi_message {
void *state; void *state;
}; };
static inline void spi_message_init_no_memset(struct spi_message *m)
{
INIT_LIST_HEAD(&m->transfers);
}
static inline void spi_message_init(struct spi_message *m) static inline void spi_message_init(struct spi_message *m)
{ {
memset(m, 0, sizeof *m); memset(m, 0, sizeof *m);
INIT_LIST_HEAD(&m->transfers); spi_message_init_no_memset(m);
} }
static inline void static inline void
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment