mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-07 22:42:04 +00:00
spi: sh-msiof: Convert to use GPIO descriptors
Convert GPIO chip selects in the Renesas MSIOF SPI driver from legacy GPIO numbers to GPIO descriptors. Notes: - The board file for the SH7724-based Ecovec24 development board now registers a GPIO descriptor lookup, instead of passing a GPIO number through controller_data, - sh_msiof_get_cs_gpios() must release all GPIOs, else spi_get_gpio_descs() cannot claim them during SPI controller registration. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
1a8fa5166e
commit
9fda669333
@ -806,7 +806,6 @@ static struct spi_board_info spi_bus[] = {
|
|||||||
.platform_data = &mmc_spi_info,
|
.platform_data = &mmc_spi_info,
|
||||||
.max_speed_hz = 5000000,
|
.max_speed_hz = 5000000,
|
||||||
.mode = SPI_MODE_0,
|
.mode = SPI_MODE_0,
|
||||||
.controller_data = (void *) GPIO_PTM4,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -838,6 +837,14 @@ static struct platform_device msiof0_device = {
|
|||||||
.resource = msiof0_resources,
|
.resource = msiof0_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct gpiod_lookup_table msiof_gpio_table = {
|
||||||
|
.dev_id = "spi_sh_msiof.0",
|
||||||
|
.table = {
|
||||||
|
GPIO_LOOKUP("sh7724_pfc", GPIO_PTM4, "cs", GPIO_ACTIVE_HIGH),
|
||||||
|
{ },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* FSI */
|
/* FSI */
|
||||||
@ -1296,12 +1303,11 @@ static int __init arch_setup(void)
|
|||||||
gpio_request(GPIO_FN_MSIOF0_TXD, NULL);
|
gpio_request(GPIO_FN_MSIOF0_TXD, NULL);
|
||||||
gpio_request(GPIO_FN_MSIOF0_RXD, NULL);
|
gpio_request(GPIO_FN_MSIOF0_RXD, NULL);
|
||||||
gpio_request(GPIO_FN_MSIOF0_TSCK, NULL);
|
gpio_request(GPIO_FN_MSIOF0_TSCK, NULL);
|
||||||
gpio_request(GPIO_PTM4, NULL); /* software CS control of TSYNC pin */
|
|
||||||
gpio_direction_output(GPIO_PTM4, 1); /* active low CS */
|
|
||||||
gpio_request(GPIO_PTB6, NULL); /* 3.3V power control */
|
gpio_request(GPIO_PTB6, NULL); /* 3.3V power control */
|
||||||
gpio_direction_output(GPIO_PTB6, 0); /* disable power by default */
|
gpio_direction_output(GPIO_PTB6, 0); /* disable power by default */
|
||||||
|
|
||||||
gpiod_add_lookup_table(&mmc_spi_gpio_table);
|
gpiod_add_lookup_table(&mmc_spi_gpio_table);
|
||||||
|
gpiod_add_lookup_table(&msiof_gpio_table);
|
||||||
spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus));
|
spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -549,25 +549,11 @@ static void sh_msiof_spi_read_fifo_s32u(struct sh_msiof_spi_priv *p,
|
|||||||
|
|
||||||
static int sh_msiof_spi_setup(struct spi_device *spi)
|
static int sh_msiof_spi_setup(struct spi_device *spi)
|
||||||
{
|
{
|
||||||
struct device_node *np = spi->controller->dev.of_node;
|
|
||||||
struct sh_msiof_spi_priv *p =
|
struct sh_msiof_spi_priv *p =
|
||||||
spi_controller_get_devdata(spi->controller);
|
spi_controller_get_devdata(spi->controller);
|
||||||
u32 clr, set, tmp;
|
u32 clr, set, tmp;
|
||||||
|
|
||||||
if (!np) {
|
if (spi->cs_gpiod || spi_controller_is_slave(p->ctlr))
|
||||||
/*
|
|
||||||
* Use spi->controller_data for CS (same strategy as spi_gpio),
|
|
||||||
* if any. otherwise let HW control CS
|
|
||||||
*/
|
|
||||||
spi->cs_gpio = (uintptr_t)spi->controller_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gpio_is_valid(spi->cs_gpio)) {
|
|
||||||
gpio_direction_output(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spi_controller_is_slave(p->ctlr))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (p->native_cs_inited &&
|
if (p->native_cs_inited &&
|
||||||
@ -600,7 +586,7 @@ static int sh_msiof_prepare_message(struct spi_controller *ctlr,
|
|||||||
u32 ss, cs_high;
|
u32 ss, cs_high;
|
||||||
|
|
||||||
/* Configure pins before asserting CS */
|
/* Configure pins before asserting CS */
|
||||||
if (gpio_is_valid(spi->cs_gpio)) {
|
if (spi->cs_gpiod) {
|
||||||
ss = p->unused_ss;
|
ss = p->unused_ss;
|
||||||
cs_high = p->native_cs_high;
|
cs_high = p->native_cs_high;
|
||||||
} else {
|
} else {
|
||||||
@ -1156,6 +1142,7 @@ static int sh_msiof_get_cs_gpios(struct sh_msiof_spi_priv *p)
|
|||||||
|
|
||||||
gpiod = devm_gpiod_get_index(dev, "cs", i, GPIOD_ASIS);
|
gpiod = devm_gpiod_get_index(dev, "cs", i, GPIOD_ASIS);
|
||||||
if (!IS_ERR(gpiod)) {
|
if (!IS_ERR(gpiod)) {
|
||||||
|
devm_gpiod_put(dev, gpiod);
|
||||||
cs_gpios++;
|
cs_gpios++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1407,6 +1394,7 @@ static int sh_msiof_spi_probe(struct platform_device *pdev)
|
|||||||
ctlr->bits_per_word_mask = chipdata->bits_per_word_mask;
|
ctlr->bits_per_word_mask = chipdata->bits_per_word_mask;
|
||||||
ctlr->auto_runtime_pm = true;
|
ctlr->auto_runtime_pm = true;
|
||||||
ctlr->transfer_one = sh_msiof_transfer_one;
|
ctlr->transfer_one = sh_msiof_transfer_one;
|
||||||
|
ctlr->use_gpio_descriptors = true;
|
||||||
|
|
||||||
ret = sh_msiof_request_dma(p);
|
ret = sh_msiof_request_dma(p);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user