Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8331c49c authored by Mark Brown's avatar Mark Brown
Browse files

Merge remote-tracking branches 'spi/fix/s3c64xx', 'spi/fix/samsung' and...

Merge remote-tracking branches 'spi/fix/s3c64xx', 'spi/fix/samsung' and 'spi/fix/xilinx' into spi-linus
Loading
Loading
Loading
Loading
+12 −14
Original line number Diff line number Diff line
@@ -18,14 +18,11 @@ Required SoC Specific Properties:
- interrupts: The interrupt number to the cpu. The interrupt specifier format
  depends on the interrupt controller.

[PRELIMINARY: the dma channel allocation will change once there are
official DMA bindings]
- dmas : Two or more DMA channel specifiers following the convention outlined
  in bindings/dma/dma.txt

- tx-dma-channel: The dma channel specifier for tx operations. The format of
  the dma specifier depends on the dma controller.

- rx-dma-channel: The dma channel specifier for rx operations. The format of
  the dma specifier depends on the dma controller.
- dma-names: Names for the dma channels. There must be at least one channel
  named "tx" for transmit and named "rx" for receive.

Required Board Specific Properties:

@@ -42,15 +39,13 @@ Optional Board Specific Properties:
- num-cs: Specifies the number of chip select lines supported. If
  not specified, the default number of chip select lines is set to 1.

- cs-gpios: should specify GPIOs used for chipselects (see spi-bus.txt)

SPI Controller specific data in SPI slave nodes:

- The spi slave nodes should provide the following information which is required
  by the spi controller.

  - cs-gpio: A gpio specifier that specifies the gpio line used as
    the slave select line by the spi controller. The format of the gpio
    specifier depends on the gpio controller.

  - samsung,spi-feedback-delay: The sampling phase shift to be applied on the
    miso line (to account for any lag in the miso line). The following are the
    valid values.
@@ -74,8 +69,11 @@ Example:
		compatible = "samsung,exynos4210-spi";
		reg = <0x12d20000 0x100>;
		interrupts = <0 66 0>;
		tx-dma-channel = <&pdma0 5>;
		rx-dma-channel = <&pdma0 4>;
		dmas = <&pdma0 5
			&pdma0 4>;
		dma-names = "tx", "rx";
		#address-cells = <1>;
		#size-cells = <0>;
	};

- Board Specific Portion:
@@ -85,6 +83,7 @@ Example:
		#size-cells = <0>;
		pinctrl-names = "default";
		pinctrl-0 = <&spi0_bus>;
		cs-gpios = <&gpa2 5 0>;

		w25q80bw@0 {
			#address-cells = <1>;
@@ -94,7 +93,6 @@ Example:
			spi-max-frequency = <10000>;

			controller-data {
				cs-gpio = <&gpa2 5 1 0 3>;
				samsung,spi-feedback-delay = <0>;
			};

+1 −1
Original line number Diff line number Diff line
@@ -168,6 +168,7 @@
	};

	spi_2: spi@13940000 {
		cs-gpios = <&gpc1 2 0>;
		status = "okay";

		w25x80@0 {
@@ -178,7 +179,6 @@
			spi-max-frequency = <1000000>;

			controller-data {
				cs-gpio = <&gpc1 2 0>;
				samsung,spi-feedback-delay = <0>;
			};

+1 −1
Original line number Diff line number Diff line
@@ -589,6 +589,7 @@
	spi_1: spi@13930000 {
		pinctrl-names = "default";
		pinctrl-0 = <&spi1_bus>;
		cs-gpios = <&gpb 5 0>;
		status = "okay";

		s5c73m3_spi: s5c73m3 {
@@ -596,7 +597,6 @@
			spi-max-frequency = <50000000>;
			reg = <0>;
			controller-data {
				cs-gpio = <&gpb 5 0>;
				samsung,spi-feedback-delay = <2>;
			};
		};
+1 −1
Original line number Diff line number Diff line
@@ -316,6 +316,7 @@
	};

	spi_1: spi@12d30000 {
		cs-gpios = <&gpa2 5 0>;
		status = "okay";

		w25q80bw@0 {
@@ -326,7 +327,6 @@
			spi-max-frequency = <1000000>;

			controller-data {
				cs-gpio = <&gpa2 5 0>;
				samsung,spi-feedback-delay = <0>;
			};

+24 −30
Original line number Diff line number Diff line
@@ -197,7 +197,6 @@ struct s3c64xx_spi_driver_data {
	struct s3c64xx_spi_dma_data	tx_dma;
	struct s3c64xx_spi_port_config	*port_conf;
	unsigned int			port_id;
	bool				cs_gpio;
};

static void flush_fifo(struct s3c64xx_spi_driver_data *sdd)
@@ -754,10 +753,8 @@ static struct s3c64xx_spi_csinfo *s3c64xx_get_slave_ctrldata(
{
	struct s3c64xx_spi_csinfo *cs;
	struct device_node *slave_np, *data_np = NULL;
	struct s3c64xx_spi_driver_data *sdd;
	u32 fb_delay = 0;

	sdd = spi_master_get_devdata(spi->master);
	slave_np = spi->dev.of_node;
	if (!slave_np) {
		dev_err(&spi->dev, "device node not found\n");
@@ -776,17 +773,6 @@ static struct s3c64xx_spi_csinfo *s3c64xx_get_slave_ctrldata(
		return ERR_PTR(-ENOMEM);
	}

	/* The CS line is asserted/deasserted by the gpio pin */
	if (sdd->cs_gpio)
		cs->line = of_get_named_gpio(data_np, "cs-gpio", 0);

	if (!gpio_is_valid(cs->line)) {
		dev_err(&spi->dev, "chip select gpio is not specified or invalid\n");
		kfree(cs);
		of_node_put(data_np);
		return ERR_PTR(-EINVAL);
	}

	of_property_read_u32(data_np, "samsung,spi-feedback-delay", &fb_delay);
	cs->fb_delay = fb_delay;
	of_node_put(data_np);
@@ -807,9 +793,16 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
	int err;

	sdd = spi_master_get_devdata(spi->master);
	if (!cs && spi->dev.of_node) {
	if (spi->dev.of_node) {
		cs = s3c64xx_get_slave_ctrldata(spi);
		spi->controller_data = cs;
	} else if (cs) {
		/* On non-DT platforms the SPI core will set spi->cs_gpio
		 * to -ENOENT. The GPIO pin used to drive the chip select
		 * is defined by using platform data so spi->cs_gpio value
		 * has to be override to have the proper GPIO pin number.
		 */
		spi->cs_gpio = cs->line;
	}

	if (IS_ERR_OR_NULL(cs)) {
@@ -818,18 +811,15 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
	}

	if (!spi_get_ctldata(spi)) {
		/* Request gpio only if cs line is asserted by gpio pins */
		if (sdd->cs_gpio) {
			err = gpio_request_one(cs->line, GPIOF_OUT_INIT_HIGH,
		if (gpio_is_valid(spi->cs_gpio)) {
			err = gpio_request_one(spi->cs_gpio, GPIOF_OUT_INIT_HIGH,
					       dev_name(&spi->dev));
			if (err) {
				dev_err(&spi->dev,
					"Failed to get /CS gpio [%d]: %d\n",
					cs->line, err);
					spi->cs_gpio, err);
				goto err_gpio_req;
			}

			spi->cs_gpio = cs->line;
		}

		spi_set_ctldata(spi, cs);
@@ -884,7 +874,8 @@ setup_exit:
	/* setup() returns with device de-selected */
	writel(S3C64XX_SPI_SLAVE_SIG_INACT, sdd->regs + S3C64XX_SPI_SLAVE_SEL);

	gpio_free(cs->line);
	if (gpio_is_valid(spi->cs_gpio))
		gpio_free(spi->cs_gpio);
	spi_set_ctldata(spi, NULL);

err_gpio_req:
@@ -897,14 +888,21 @@ err_gpio_req:
static void s3c64xx_spi_cleanup(struct spi_device *spi)
{
	struct s3c64xx_spi_csinfo *cs = spi_get_ctldata(spi);
	struct s3c64xx_spi_driver_data *sdd;

	sdd = spi_master_get_devdata(spi->master);
	if (spi->cs_gpio) {
	if (gpio_is_valid(spi->cs_gpio)) {
		gpio_free(spi->cs_gpio);
		if (spi->dev.of_node)
			kfree(cs);
		else {
			/* On non-DT platforms, the SPI core sets
			 * spi->cs_gpio to -ENOENT and .setup()
			 * overrides it with the GPIO pin value
			 * passed using platform data.
			 */
			spi->cs_gpio = -ENOENT;
		}
	}

	spi_set_ctldata(spi, NULL);
}

@@ -1075,11 +1073,7 @@ static int s3c64xx_spi_probe(struct platform_device *pdev)
	sdd->cntrlr_info = sci;
	sdd->pdev = pdev;
	sdd->sfr_start = mem_res->start;
	sdd->cs_gpio = true;
	if (pdev->dev.of_node) {
		if (!of_find_property(pdev->dev.of_node, "cs-gpio", NULL))
			sdd->cs_gpio = false;

		ret = of_alias_get_id(pdev->dev.of_node, "spi");
		if (ret < 0) {
			dev_err(&pdev->dev, "failed to get alias id, errno %d\n",
Loading