mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-21 14:11:20 +00:00
Merge remote-tracking branches 'spi/fix/s3c64xx', 'spi/fix/samsung' and 'spi/fix/xilinx' into spi-linus
This commit is contained in:
commit
8331c49c48
6 changed files with 40 additions and 48 deletions
|
@ -18,14 +18,11 @@ Required SoC Specific Properties:
|
||||||
- interrupts: The interrupt number to the cpu. The interrupt specifier format
|
- interrupts: The interrupt number to the cpu. The interrupt specifier format
|
||||||
depends on the interrupt controller.
|
depends on the interrupt controller.
|
||||||
|
|
||||||
[PRELIMINARY: the dma channel allocation will change once there are
|
- dmas : Two or more DMA channel specifiers following the convention outlined
|
||||||
official DMA bindings]
|
in bindings/dma/dma.txt
|
||||||
|
|
||||||
- tx-dma-channel: The dma channel specifier for tx operations. The format of
|
- dma-names: Names for the dma channels. There must be at least one channel
|
||||||
the dma specifier depends on the dma controller.
|
named "tx" for transmit and named "rx" for receive.
|
||||||
|
|
||||||
- rx-dma-channel: The dma channel specifier for rx operations. The format of
|
|
||||||
the dma specifier depends on the dma controller.
|
|
||||||
|
|
||||||
Required Board Specific Properties:
|
Required Board Specific Properties:
|
||||||
|
|
||||||
|
@ -42,15 +39,13 @@ Optional Board Specific Properties:
|
||||||
- num-cs: Specifies the number of chip select lines supported. If
|
- num-cs: Specifies the number of chip select lines supported. If
|
||||||
not specified, the default number of chip select lines is set to 1.
|
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:
|
SPI Controller specific data in SPI slave nodes:
|
||||||
|
|
||||||
- The spi slave nodes should provide the following information which is required
|
- The spi slave nodes should provide the following information which is required
|
||||||
by the spi controller.
|
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
|
- 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
|
miso line (to account for any lag in the miso line). The following are the
|
||||||
valid values.
|
valid values.
|
||||||
|
@ -74,8 +69,11 @@ Example:
|
||||||
compatible = "samsung,exynos4210-spi";
|
compatible = "samsung,exynos4210-spi";
|
||||||
reg = <0x12d20000 0x100>;
|
reg = <0x12d20000 0x100>;
|
||||||
interrupts = <0 66 0>;
|
interrupts = <0 66 0>;
|
||||||
tx-dma-channel = <&pdma0 5>;
|
dmas = <&pdma0 5
|
||||||
rx-dma-channel = <&pdma0 4>;
|
&pdma0 4>;
|
||||||
|
dma-names = "tx", "rx";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
- Board Specific Portion:
|
- Board Specific Portion:
|
||||||
|
@ -85,6 +83,7 @@ Example:
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&spi0_bus>;
|
pinctrl-0 = <&spi0_bus>;
|
||||||
|
cs-gpios = <&gpa2 5 0>;
|
||||||
|
|
||||||
w25q80bw@0 {
|
w25q80bw@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
|
@ -94,7 +93,6 @@ Example:
|
||||||
spi-max-frequency = <10000>;
|
spi-max-frequency = <10000>;
|
||||||
|
|
||||||
controller-data {
|
controller-data {
|
||||||
cs-gpio = <&gpa2 5 1 0 3>;
|
|
||||||
samsung,spi-feedback-delay = <0>;
|
samsung,spi-feedback-delay = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -168,6 +168,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
spi_2: spi@13940000 {
|
spi_2: spi@13940000 {
|
||||||
|
cs-gpios = <&gpc1 2 0>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
w25x80@0 {
|
w25x80@0 {
|
||||||
|
@ -178,7 +179,6 @@
|
||||||
spi-max-frequency = <1000000>;
|
spi-max-frequency = <1000000>;
|
||||||
|
|
||||||
controller-data {
|
controller-data {
|
||||||
cs-gpio = <&gpc1 2 0>;
|
|
||||||
samsung,spi-feedback-delay = <0>;
|
samsung,spi-feedback-delay = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -589,6 +589,7 @@
|
||||||
spi_1: spi@13930000 {
|
spi_1: spi@13930000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&spi1_bus>;
|
pinctrl-0 = <&spi1_bus>;
|
||||||
|
cs-gpios = <&gpb 5 0>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
s5c73m3_spi: s5c73m3 {
|
s5c73m3_spi: s5c73m3 {
|
||||||
|
@ -596,7 +597,6 @@
|
||||||
spi-max-frequency = <50000000>;
|
spi-max-frequency = <50000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
controller-data {
|
controller-data {
|
||||||
cs-gpio = <&gpb 5 0>;
|
|
||||||
samsung,spi-feedback-delay = <2>;
|
samsung,spi-feedback-delay = <2>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -316,6 +316,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
spi_1: spi@12d30000 {
|
spi_1: spi@12d30000 {
|
||||||
|
cs-gpios = <&gpa2 5 0>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
w25q80bw@0 {
|
w25q80bw@0 {
|
||||||
|
@ -326,7 +327,6 @@
|
||||||
spi-max-frequency = <1000000>;
|
spi-max-frequency = <1000000>;
|
||||||
|
|
||||||
controller-data {
|
controller-data {
|
||||||
cs-gpio = <&gpa2 5 0>;
|
|
||||||
samsung,spi-feedback-delay = <0>;
|
samsung,spi-feedback-delay = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -197,7 +197,6 @@ struct s3c64xx_spi_driver_data {
|
||||||
struct s3c64xx_spi_dma_data tx_dma;
|
struct s3c64xx_spi_dma_data tx_dma;
|
||||||
struct s3c64xx_spi_port_config *port_conf;
|
struct s3c64xx_spi_port_config *port_conf;
|
||||||
unsigned int port_id;
|
unsigned int port_id;
|
||||||
bool cs_gpio;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void flush_fifo(struct s3c64xx_spi_driver_data *sdd)
|
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 s3c64xx_spi_csinfo *cs;
|
||||||
struct device_node *slave_np, *data_np = NULL;
|
struct device_node *slave_np, *data_np = NULL;
|
||||||
struct s3c64xx_spi_driver_data *sdd;
|
|
||||||
u32 fb_delay = 0;
|
u32 fb_delay = 0;
|
||||||
|
|
||||||
sdd = spi_master_get_devdata(spi->master);
|
|
||||||
slave_np = spi->dev.of_node;
|
slave_np = spi->dev.of_node;
|
||||||
if (!slave_np) {
|
if (!slave_np) {
|
||||||
dev_err(&spi->dev, "device node not found\n");
|
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);
|
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);
|
of_property_read_u32(data_np, "samsung,spi-feedback-delay", &fb_delay);
|
||||||
cs->fb_delay = fb_delay;
|
cs->fb_delay = fb_delay;
|
||||||
of_node_put(data_np);
|
of_node_put(data_np);
|
||||||
|
@ -807,9 +793,16 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
sdd = spi_master_get_devdata(spi->master);
|
sdd = spi_master_get_devdata(spi->master);
|
||||||
if (!cs && spi->dev.of_node) {
|
if (spi->dev.of_node) {
|
||||||
cs = s3c64xx_get_slave_ctrldata(spi);
|
cs = s3c64xx_get_slave_ctrldata(spi);
|
||||||
spi->controller_data = cs;
|
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)) {
|
if (IS_ERR_OR_NULL(cs)) {
|
||||||
|
@ -818,18 +811,15 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!spi_get_ctldata(spi)) {
|
if (!spi_get_ctldata(spi)) {
|
||||||
/* Request gpio only if cs line is asserted by gpio pins */
|
if (gpio_is_valid(spi->cs_gpio)) {
|
||||||
if (sdd->cs_gpio) {
|
err = gpio_request_one(spi->cs_gpio, GPIOF_OUT_INIT_HIGH,
|
||||||
err = gpio_request_one(cs->line, GPIOF_OUT_INIT_HIGH,
|
dev_name(&spi->dev));
|
||||||
dev_name(&spi->dev));
|
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(&spi->dev,
|
dev_err(&spi->dev,
|
||||||
"Failed to get /CS gpio [%d]: %d\n",
|
"Failed to get /CS gpio [%d]: %d\n",
|
||||||
cs->line, err);
|
spi->cs_gpio, err);
|
||||||
goto err_gpio_req;
|
goto err_gpio_req;
|
||||||
}
|
}
|
||||||
|
|
||||||
spi->cs_gpio = cs->line;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
spi_set_ctldata(spi, cs);
|
spi_set_ctldata(spi, cs);
|
||||||
|
@ -884,7 +874,8 @@ setup_exit:
|
||||||
/* setup() returns with device de-selected */
|
/* setup() returns with device de-selected */
|
||||||
writel(S3C64XX_SPI_SLAVE_SIG_INACT, sdd->regs + S3C64XX_SPI_SLAVE_SEL);
|
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);
|
spi_set_ctldata(spi, NULL);
|
||||||
|
|
||||||
err_gpio_req:
|
err_gpio_req:
|
||||||
|
@ -897,14 +888,21 @@ err_gpio_req:
|
||||||
static void s3c64xx_spi_cleanup(struct spi_device *spi)
|
static void s3c64xx_spi_cleanup(struct spi_device *spi)
|
||||||
{
|
{
|
||||||
struct s3c64xx_spi_csinfo *cs = spi_get_ctldata(spi);
|
struct s3c64xx_spi_csinfo *cs = spi_get_ctldata(spi);
|
||||||
struct s3c64xx_spi_driver_data *sdd;
|
|
||||||
|
|
||||||
sdd = spi_master_get_devdata(spi->master);
|
if (gpio_is_valid(spi->cs_gpio)) {
|
||||||
if (spi->cs_gpio) {
|
|
||||||
gpio_free(spi->cs_gpio);
|
gpio_free(spi->cs_gpio);
|
||||||
if (spi->dev.of_node)
|
if (spi->dev.of_node)
|
||||||
kfree(cs);
|
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);
|
spi_set_ctldata(spi, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1075,11 +1073,7 @@ static int s3c64xx_spi_probe(struct platform_device *pdev)
|
||||||
sdd->cntrlr_info = sci;
|
sdd->cntrlr_info = sci;
|
||||||
sdd->pdev = pdev;
|
sdd->pdev = pdev;
|
||||||
sdd->sfr_start = mem_res->start;
|
sdd->sfr_start = mem_res->start;
|
||||||
sdd->cs_gpio = true;
|
|
||||||
if (pdev->dev.of_node) {
|
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");
|
ret = of_alias_get_id(pdev->dev.of_node, "spi");
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev, "failed to get alias id, errno %d\n",
|
dev_err(&pdev->dev, "failed to get alias id, errno %d\n",
|
||||||
|
|
|
@ -369,7 +369,7 @@ static int xilinx_spi_probe(struct platform_device *pdev)
|
||||||
goto put_master;
|
goto put_master;
|
||||||
}
|
}
|
||||||
|
|
||||||
master->bus_num = pdev->dev.id;
|
master->bus_num = pdev->id;
|
||||||
master->num_chipselect = num_cs;
|
master->num_chipselect = num_cs;
|
||||||
master->dev.of_node = pdev->dev.of_node;
|
master->dev.of_node = pdev->dev.of_node;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue