Commit f88e42c4 authored by Xu Chenjiao's avatar Xu Chenjiao Committed by guzitao
Browse files

sw64: spi: update spi controller driver

Sunway inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IB73UR



--------------------------------

Update spi controller driver. It should be noted as follows:

- The m25p80 driver has been removed in commit b35b9a10 ("mtd:
spi-nor: Move m25p80 code in spi-nor.c").

- The data structures used by spi memory driver have changed.

Signed-off-by: default avatarXu Chenjiao <xuchenjiao@wxiat.com>
Reviewed-by: default avatarHe Sheng <hesheng@wxiat.com>
Signed-off-by: default avatarGu Zitao <guzitao@wxiat.com>
parent cefd52df
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -140,7 +140,7 @@
		spi: spi@0x8032 {
			#address-cells = <1>;
			#size-cells = <0>;
			compatible = "sunway,chip3-spi";
			compatible = "sunway,chip-spi";
			reg = <0x8032 0x0 0x0 0x8000>;
			clocks = <&spiclk>;
			poll_mode = <1>;    /* poll_mode:1  interrupt mode: 0 */
+2 −2
Original line number Diff line number Diff line
@@ -160,7 +160,7 @@

					partition@0 {
						label = "test";
						reg = <0 0x400000>;
						reg = <0 0x800000>;
					};
				};
			};
@@ -178,7 +178,7 @@

					partition@0 {
						label = "test";
						reg = <0 0x400000>;
						reg = <0 0x800000>;
					};
				};
			};
+15 −7
Original line number Diff line number Diff line
@@ -343,6 +343,21 @@ config SPI_DW_BT1_DIRMAP

endif

config SPI_SUNWAY
	tristate "Sunway SPI controller support"
	depends on SW64
	imply SPI_MEM
	help
	  general driver for Sunway SPI controller

if SPI_SUNWAY

config SPI_SUNWAY_MMIO
	tristate "Memory-mapped io interface driver for Sunway SPI controller"
	depends on HAS_IOMEM

endif

config SPI_DLN2
       tristate "Diolan DLN-2 USB SPI adapter"
       depends on MFD_DLN2
@@ -1179,13 +1194,6 @@ config SPI_AMD
#
# Add new SPI master controllers in alphabetical order above this line
#
config SPI_CHIP3
        tristate "Memory-mapped io interface driver for SUNWAY CHIP3 SPI core"
        depends on UNCORE_XUELANG
        help
          general driver for SPI controller core from DesignWare


comment "SPI Multiplexer support"

config SPI_MUX
+3 −1
Original line number Diff line number Diff line
@@ -48,8 +48,10 @@ spi-dw-y := spi-dw-core.o
spi-dw-$(CONFIG_SPI_DW_DMA)		+= spi-dw-dma.o
obj-$(CONFIG_SPI_DW_BT1)		+= spi-dw-bt1.o
obj-$(CONFIG_SPI_DW_MMIO)		+= spi-dw-mmio.o
obj-$(CONFIG_SPI_CHIP3)			+= spi-chip3.o spi-chip3-mmio.o
obj-$(CONFIG_SPI_DW_PCI)		+= spi-dw-pci.o
obj-$(CONFIG_SPI_SUNWAY)		+= spi-sunway.o
obj-$(CONFIG_SPI_SUNWAY_MMIO)		+= spi-sunway-mmio.o
obj-$(CONFIG_SPI_EFM32)			+= spi-efm32.o
obj-$(CONFIG_SPI_EP93XX)		+= spi-ep93xx.o
obj-$(CONFIG_SPI_FALCON)		+= spi-falcon.o
obj-$(CONFIG_SPI_FSI)			+= spi-fsi.o
+144 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * Memory-mapped interface driver for SUNWAY CHIP SPI Core
 */

#include <linux/clk.h>
#include <linux/err.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/spi/spi.h>
#include <linux/scatterlist.h>
#include <linux/mfd/syscon.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/of_platform.h>
#include <linux/property.h>
#include <linux/regmap.h>

#include "spi-sunway.h"


#define DRIVER_NAME "sunway_chip_spi"

struct chip_spi_mmio {
	struct spi_chip  spi_chip;
	struct clk     *clk;
	void           *priv;
};

static int chip_spi_mmio_probe(struct platform_device *pdev)
{
	int (*init_func)(struct platform_device *pdev,
			 struct chip_spi_mmio *spimmio);
	struct chip_spi_mmio *spimmio;
	struct spi_chip *spi_chip;
	struct resource *mem;
	int ret;
	int num_cs;

	spimmio = devm_kzalloc(&pdev->dev, sizeof(struct chip_spi_mmio),
			GFP_KERNEL);
	if (!spimmio)
		return -ENOMEM;

	spi_chip = &spimmio->spi_chip;

	/* Get basic io resource and map it */
	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	spi_chip->regs = devm_ioremap_resource(&pdev->dev, mem);
	if (IS_ERR(spi_chip->regs)) {
		dev_err(&pdev->dev, "SPI region map failed\n");
		return PTR_ERR(spi_chip->regs);
	}

	spimmio->clk = devm_clk_get(&pdev->dev, NULL);
	if (IS_ERR(spimmio->clk))
		return PTR_ERR(spimmio->clk);
	ret = clk_prepare_enable(spimmio->clk);
	if (ret)
		return ret;

	spi_chip->bus_num = pdev->id;
	spi_chip->max_freq = clk_get_rate(spimmio->clk);

	device_property_read_u32(&pdev->dev, "reg-io-width",
				&spi_chip->reg_io_width);

	num_cs = 4;
	device_property_read_u32(&pdev->dev, "num-cs", &num_cs);
	spi_chip->num_cs = num_cs;

	if (pdev->dev.of_node) {
		int i;

		for (i = 0; i < spi_chip->num_cs; i++) {
			int cs_gpio = of_get_named_gpio(pdev->dev.of_node,
					"cs-gpios", i);

			if (cs_gpio == -EPROBE_DEFER) {
				ret = cs_gpio;
				goto out;
			}

			if (gpio_is_valid(cs_gpio)) {
				ret = devm_gpio_request(&pdev->dev, cs_gpio,
						dev_name(&pdev->dev));
				if (ret)
					goto out;
			}
		}
	}

	init_func = device_get_match_data(&pdev->dev);
	if (init_func) {
		ret = init_func(pdev, spimmio);
		if (ret)
			goto out;
	}

	spi_chip->flags = SPI_PLAT;

	ret = spi_chip_add_host(&pdev->dev, spi_chip);
	if (ret)
		goto out;

	platform_set_drvdata(pdev, spimmio);

	return 0;
out:
	clk_disable_unprepare(spimmio->clk);
	return ret;
}

static int chip_spi_mmio_remove(struct platform_device *pdev)
{
	struct chip_spi_mmio *spimmio = platform_get_drvdata(pdev);

	spi_chip_remove_host(&spimmio->spi_chip);
	clk_disable_unprepare(spimmio->clk);

	return 0;
}

static const struct of_device_id chip_spi_mmio_of_match[] = {
	{ .compatible = "sunway,chip-spi",},
	{ /* end of table */}
};
MODULE_DEVICE_TABLE(of, chip_spi_mmio_of_match);

static struct platform_driver chip_spi_mmio_driver = {
	.probe		= chip_spi_mmio_probe,
	.remove		= chip_spi_mmio_remove,
	.driver		= {
		.name	= DRIVER_NAME,
		.of_match_table = chip_spi_mmio_of_match,
	},
};
module_platform_driver(chip_spi_mmio_driver);

MODULE_AUTHOR("Platform@wiat.com");
MODULE_DESCRIPTION("Memory-mapped I/O interface driver for Sunway CHIP");
MODULE_LICENSE("GPL v2");
Loading