static int img_spfi_setup(struct spi_device *spi) { int ret = -EINVAL; struct img_spfi_device_data *spfi_data = spi_get_ctldata(spi); if (!spfi_data) { spfi_data = kzalloc(sizeof(*spfi_data), GFP_KERNEL); if (!spfi_data) return -ENOMEM; spfi_data->gpio_requested = false; spi_set_ctldata(spi, spfi_data); } if (!spfi_data->gpio_requested) { ret = gpio_request_one(spi->cs_gpio, (spi->mode & SPI_CS_HIGH) ? GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH, dev_name(&spi->dev)); if (ret) dev_err(&spi->dev, "can't request chipselect gpio %d\n", spi->cs_gpio); else spfi_data->gpio_requested = true; } else { if (gpio_is_valid(spi->cs_gpio)) { int mode = ((spi->mode & SPI_CS_HIGH) ? GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH); ret = gpio_direction_output(spi->cs_gpio, mode); if (ret) dev_err(&spi->dev, "chipselect gpio %d setup failed (%d)\n", spi->cs_gpio, ret); } } return ret; }
static int stellaris_spi_setup(struct spi_device *spi) { struct spi_stellaris_config *priv_dev; struct spi_stellaris_data *priv_master; if( spi->chip_select >= spi->master->num_chipselect ) return -EINVAL; priv_dev = kmalloc(sizeof(struct spi_stellaris_config), GFP_KERNEL); if( priv_dev == 0 ) return -ENOMEM; priv_master = spi_master_get_devdata(spi->master); spi_set_ctldata(spi, priv_dev); priv_dev->gpio_chipselect = priv_master->chipselect[spi->chip_select]; spi_config(priv_dev, spi->mode, spi->bits_per_word, spi->max_speed_hz); spi_chipselect(spi, BITBANG_CS_INACTIVE); dev_dbg(&spi->dev, "%s: mode %d, %u bpw, %d hz\n", __func__, spi->mode, spi->bits_per_word, spi->max_speed_hz); return 0; }
static void dw_spi_cleanup(struct spi_device *spi) { struct chip_data *chip = spi_get_ctldata(spi); kfree(chip); spi_set_ctldata(spi, NULL); }
/* This may be called twice for each spi dev */ static int dw_spi_setup(struct spi_device *spi) { struct dw_spi_chip *chip_info = NULL; struct chip_data *chip; /* Only alloc on first setup */ chip = spi_get_ctldata(spi); if (!chip) { chip = kzalloc(sizeof(struct chip_data), GFP_KERNEL); if (!chip) return -ENOMEM; spi_set_ctldata(spi, chip); } /* * Protocol drivers may change the chip settings, so... * if chip_info exists, use it */ chip_info = spi->controller_data; /* chip_info doesn't always exist */ if (chip_info) { if (chip_info->cs_control) chip->cs_control = chip_info->cs_control; chip->poll_mode = chip_info->poll_mode; chip->type = chip_info->type; } chip->tmode = SPI_TMOD_TR; return 0; }
static void img_spfi_cleanup(struct spi_device *spi) { struct img_spfi_device_data *spfi_data = spi_get_ctldata(spi); if (spfi_data) { if (spfi_data->gpio_requested) gpio_free(spi->cs_gpio); kfree(spfi_data); spi_set_ctldata(spi, NULL); } }
static int dspi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) { struct chip_data *chip; struct fsl_dspi *dspi = spi_master_get_devdata(spi->master); unsigned char br = 0, pbr = 0, fmsz = 0; /* Only alloc on first setup */ chip = spi_get_ctldata(spi); if (chip == NULL) { chip = kcalloc(1, sizeof(struct chip_data), GFP_KERNEL); if (!chip) return -ENOMEM; } chip->mcr_val = SPI_MCR_MASTER | SPI_MCR_PCSIS | SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF; if ((spi->bits_per_word >= 4) && (spi->bits_per_word <= 16)) { fmsz = spi->bits_per_word - 1; } else { pr_err("Invalid wordsize\n"); kfree(chip); return -ENODEV; } chip->void_write_data = 0; hz_to_spi_baud(&pbr, &br, spi->max_speed_hz, clk_get_rate(dspi->clk)); chip->ctar_val = SPI_CTAR_FMSZ(fmsz) | SPI_CTAR_CPOL(spi->mode & SPI_CPOL ? 1 : 0) | SPI_CTAR_CPHA(spi->mode & SPI_CPHA ? 1 : 0) | SPI_CTAR_LSBFE(spi->mode & SPI_LSB_FIRST ? 1 : 0) | SPI_CTAR_PBR(pbr) | SPI_CTAR_BR(br); spi_set_ctldata(spi, chip); return 0; }
static int bcm_qspi_setup(struct spi_device *spi) { struct bcm_qspi_parms *xp; if (spi->bits_per_word > 16) return -EINVAL; xp = spi_get_ctldata(spi); if (!xp) { xp = kzalloc(sizeof(*xp), GFP_KERNEL); if (!xp) return -ENOMEM; spi_set_ctldata(spi, xp); } xp->speed_hz = spi->max_speed_hz; xp->mode = spi->mode; if (spi->bits_per_word) xp->bits_per_word = spi->bits_per_word; else xp->bits_per_word = 8; return 0; }