Commit de6926f3 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Mark Brown

spi: pxa2xx: Switch to use SPI core GPIO (legacy) CS handling

SPI core has been already providing the GPIO CS handling. Use it.
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20210517140351.901-4-andriy.shevchenko@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 778c12e6
...@@ -441,11 +441,6 @@ static void cs_assert(struct spi_device *spi) ...@@ -441,11 +441,6 @@ static void cs_assert(struct spi_device *spi)
return; return;
} }
if (chip->gpiod_cs) {
gpiod_set_value(chip->gpiod_cs, chip->gpio_cs_inverted);
return;
}
if (is_lpss_ssp(drv_data)) if (is_lpss_ssp(drv_data))
lpss_ssp_cs_control(spi, true); lpss_ssp_cs_control(spi, true);
} }
...@@ -471,11 +466,6 @@ static void cs_deassert(struct spi_device *spi) ...@@ -471,11 +466,6 @@ static void cs_deassert(struct spi_device *spi)
return; return;
} }
if (chip->gpiod_cs) {
gpiod_set_value(chip->gpiod_cs, !chip->gpio_cs_inverted);
return;
}
if (is_lpss_ssp(drv_data)) if (is_lpss_ssp(drv_data))
lpss_ssp_cs_control(spi, false); lpss_ssp_cs_control(spi, false);
} }
...@@ -1195,11 +1185,19 @@ static int pxa2xx_spi_unprepare_transfer(struct spi_controller *controller) ...@@ -1195,11 +1185,19 @@ static int pxa2xx_spi_unprepare_transfer(struct spi_controller *controller)
return 0; return 0;
} }
static void cleanup_cs(struct spi_device *spi)
{
if (!gpio_is_valid(spi->cs_gpio))
return;
gpio_free(spi->cs_gpio);
spi->cs_gpio = -ENOENT;
}
static int setup_cs(struct spi_device *spi, struct chip_data *chip, static int setup_cs(struct spi_device *spi, struct chip_data *chip,
struct pxa2xx_spi_chip *chip_info) struct pxa2xx_spi_chip *chip_info)
{ {
struct gpio_desc *gpiod; struct driver_data *drv_data = spi_controller_get_devdata(spi->controller);
int err = 0;
if (chip == NULL) if (chip == NULL)
return 0; return 0;
...@@ -1207,13 +1205,13 @@ static int setup_cs(struct spi_device *spi, struct chip_data *chip, ...@@ -1207,13 +1205,13 @@ static int setup_cs(struct spi_device *spi, struct chip_data *chip,
if (chip_info == NULL) if (chip_info == NULL)
return 0; return 0;
if (drv_data->ssp_type == CE4100_SSP)
return 0;
/* NOTE: setup() can be called multiple times, possibly with /* NOTE: setup() can be called multiple times, possibly with
* different chip_info, release previously requested GPIO * different chip_info, release previously requested GPIO
*/ */
if (chip->gpiod_cs) { cleanup_cs(spi);
gpiod_put(chip->gpiod_cs);
chip->gpiod_cs = NULL;
}
/* If (*cs_control) is provided, ignore GPIO chip select */ /* If (*cs_control) is provided, ignore GPIO chip select */
if (chip_info->cs_control) { if (chip_info->cs_control) {
...@@ -1222,21 +1220,25 @@ static int setup_cs(struct spi_device *spi, struct chip_data *chip, ...@@ -1222,21 +1220,25 @@ static int setup_cs(struct spi_device *spi, struct chip_data *chip,
} }
if (gpio_is_valid(chip_info->gpio_cs)) { if (gpio_is_valid(chip_info->gpio_cs)) {
err = gpio_request(chip_info->gpio_cs, "SPI_CS"); int gpio = chip_info->gpio_cs;
int err;
err = gpio_request(gpio, "SPI_CS");
if (err) { if (err) {
dev_err(&spi->dev, "failed to request chip select GPIO%d\n", dev_err(&spi->dev, "failed to request chip select GPIO%d\n", gpio);
chip_info->gpio_cs);
return err; return err;
} }
gpiod = gpio_to_desc(chip_info->gpio_cs); err = gpio_direction_output(gpio, !(spi->mode & SPI_CS_HIGH));
chip->gpiod_cs = gpiod; if (err) {
chip->gpio_cs_inverted = spi->mode & SPI_CS_HIGH; gpio_free(gpio);
return err;
}
err = gpiod_direction_output(gpiod, !chip->gpio_cs_inverted); spi->cs_gpio = gpio;
} }
return err; return 0;
} }
static int setup(struct spi_device *spi) static int setup(struct spi_device *spi)
...@@ -1411,15 +1413,8 @@ static int setup(struct spi_device *spi) ...@@ -1411,15 +1413,8 @@ static int setup(struct spi_device *spi)
static void cleanup(struct spi_device *spi) static void cleanup(struct spi_device *spi)
{ {
struct chip_data *chip = spi_get_ctldata(spi); struct chip_data *chip = spi_get_ctldata(spi);
struct driver_data *drv_data =
spi_controller_get_devdata(spi->controller);
if (!chip)
return;
if (drv_data->ssp_type != CE4100_SSP && chip->gpiod_cs)
gpiod_put(chip->gpiod_cs);
cleanup_cs(spi);
kfree(chip); kfree(chip);
} }
......
...@@ -62,19 +62,17 @@ struct chip_data { ...@@ -62,19 +62,17 @@ struct chip_data {
u32 dds_rate; u32 dds_rate;
u32 timeout; u32 timeout;
u8 n_bytes; u8 n_bytes;
u8 enable_dma;
u32 dma_burst_size; u32 dma_burst_size;
u32 threshold;
u32 dma_threshold; u32 dma_threshold;
u32 threshold;
u16 lpss_rx_threshold; u16 lpss_rx_threshold;
u16 lpss_tx_threshold; u16 lpss_tx_threshold;
u8 enable_dma;
union {
struct gpio_desc *gpiod_cs;
unsigned int frm;
};
int gpio_cs_inverted;
int (*write)(struct driver_data *drv_data); int (*write)(struct driver_data *drv_data);
int (*read)(struct driver_data *drv_data); int (*read)(struct driver_data *drv_data);
unsigned int frm;
void (*cs_control)(u32 command); void (*cs_control)(u32 command);
}; };
......
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