]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
spi: cadence: Chip select related changes
authorHarini Katakam <harini.katakam@xilinx.com>
Tue, 6 May 2014 09:29:07 +0000 (14:59 +0530)
committerMichal Simek <michal.simek@xilinx.com>
Tue, 6 May 2014 10:51:25 +0000 (12:51 +0200)
Change chip select property name to "num-cs". Use a default value
instead of giving error when num-cs is not found.
Add "is-decoded-cs" property for using extended slave select; make
necessary changes in cdns_spi_chipselect function.

Signed-off-by: Harini Katakam <harinik@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/arm/boot/dts/zynq-zc770-xm010.dts
arch/arm/boot/dts/zynq-zc770-xm011.dts
arch/arm/boot/dts/zynq-zc770-xm012.dts
arch/arm/boot/dts/zynq-zc770-xm013.dts
drivers/spi/spi-cadence.c

index 4c3e9a032b4d3217a9df9816d510dadeaf9195d9..74e9c665bf2b9dad1bac45e34fac28181b74d5d6 100644 (file)
                        compatible = "cdns,spi-r1p6";
                        interrupt-parent = <&ps7_scugic_0>;
                        interrupts = <0 49 4>;
-                       num-chip-select = <4>;
+                       num-cs = <4>;
+                       is-decoded-cs = <0>;
                        reg = <0xe0007000 0x1000>;
                        #address-cells = <1>;
                        #size-cells = <0>;
index 7fb245d0c2ae2cf481d08cc4545e95b279615a7f..0307eab9e4644cf57f8baf74e486175dfed0f6aa 100644 (file)
                        compatible = "cdns,spi-r1p6";
                        interrupt-parent = <&ps7_scugic_0>;
                        interrupts = <0 26 4>;
-                       num-chip-select = <4>;
+                       num-cs = <4>;
+                       is-decoded-cs = <0>;
                        reg = <0xe0006000 0x1000>;
                } ;
                ps7_ttc_0: ps7-ttc@f8001000 {
index cdc44df17fa4e82da65b39187aad085e330e5077..11cd21a9ddb61b364df41937cb768439eb9ef297 100644 (file)
                        compatible = "cdns,spi-r1p6";
                        interrupt-parent = <&ps7_scugic_0>;
                        interrupts = <0 49 4>;
-                       num-chip-select = <4>;
+                       num-cs = <4>;
+                       is-decoded-cs = <0>;
                        reg = <0xe0007000 0x1000>;
                } ;
                ps7_ttc_0: ps7-ttc@f8001000 {
index 30ca651decb0d5e365c11d18f5007a5df349a6e3..6dcb87aca362a88bba962995dafaed48f57509f3 100644 (file)
                        compatible = "cdns,spi-r1p6";
                        interrupt-parent = <&ps7_scugic_0>;
                        interrupts = <0 26 4>;
-                       num-chip-select = <4>;
+                       num-cs = <4>;
+                       is-decoded-cs = <0>;
                        reg = <0xe0006000 0x1000>;
                        #address-cells = <1>;
                        #size-cells = <0>;
index 9bf260519548dd01c19ce92700a0f028c67614cd..4da5482a4b79ec5c4deef9484764ff635a3c66fe 100644 (file)
@@ -95,6 +95,9 @@
 /* SPI FIFO depth in bytes */
 #define CDNS_SPI_FIFO_DEPTH    128
 
+/* Default number of chip select lines */
+#define CDNS_SPI_DEFAULT_NUM_CS                4
+
 /**
  * struct cdns_spi - This definition defines spi driver instance
  * @regs:              Virtual address of the SPI controller registers
  * @remaining_bytes:   Number of bytes left to transfer
  * @requested_bytes:   Number of bytes requested
  * @dev_busy:          Device busy flag
+ * @is_decoded_cs:     Flag for decoder property set or not
  */
 struct cdns_spi {
        void __iomem *regs;
@@ -117,6 +121,7 @@ struct cdns_spi {
        int remaining_bytes;
        int requested_bytes;
        u8 dev_busy;
+       u32 is_decoded_cs;
 };
 
 /* Macros for the SPI controller read/write */
@@ -179,9 +184,13 @@ static void cdns_spi_chipselect(struct spi_device *spi, bool is_high)
        } else {
                /* Select the slave */
                ctrl_reg &= ~CDNS_SPI_CR_SSCTRL_MASK;
-               ctrl_reg |= ((~(CDNS_SPI_SS0 << spi->chip_select)) <<
-                            CDNS_SPI_SS_SHIFT) &
-                            CDNS_SPI_CR_SSCTRL_MASK;
+               if (!(xspi->is_decoded_cs))
+                       ctrl_reg |= ((~(CDNS_SPI_SS0 << spi->chip_select)) <<
+                                    CDNS_SPI_SS_SHIFT) &
+                                    CDNS_SPI_CR_SSCTRL_MASK;
+               else
+                       ctrl_reg |= (spi->chip_select << CDNS_SPI_SS_SHIFT) &
+                                    CDNS_SPI_CR_SSCTRL_MASK;
        }
 
        cdns_spi_write(xspi, CDNS_SPI_CR_OFFSET, ctrl_reg);
@@ -509,13 +518,18 @@ static int cdns_spi_probe(struct platform_device *pdev)
                goto remove_master;
        }
 
-       ret = of_property_read_u32(pdev->dev.of_node, "num-chip-select",
-                                  &num_cs);
-       master->num_chipselect = num_cs;
-       if (ret < 0) {
-               dev_err(&pdev->dev, "couldn't determine num-chip-select\n");
-               goto clk_dis_all;
-       }
+       ret = of_property_read_u32(pdev->dev.of_node, "num-cs", &num_cs);
+
+       if (ret < 0)
+               master->num_chipselect = CDNS_SPI_DEFAULT_NUM_CS;
+       else
+               master->num_chipselect = num_cs;
+
+       ret = of_property_read_u32(pdev->dev.of_node, "is-decoded-cs",
+                                  &xspi->is_decoded_cs);
+
+       if (ret < 0)
+               xspi->is_decoded_cs = 0;
 
        master->prepare_transfer_hardware = cdns_prepare_transfer_hardware;
        master->transfer_one = cdns_transfer_one;