static int __devinit mc33880_probe(struct spi_device *spi) { struct mc33880 *mc; struct mc33880_platform_data *pdata; int ret; pdata = spi->dev.platform_data; if (!pdata || !pdata->base) { dev_dbg(&spi->dev, "incorrect or missing platform data\n"); return -EINVAL; } spi->bits_per_word = 8; ret = spi_setup(spi); if (ret < 0) return ret; mc = kzalloc(sizeof(struct mc33880), GFP_KERNEL); if (!mc) return -ENOMEM; mutex_init(&mc->lock); dev_set_drvdata(&spi->dev, mc); mc->spi = spi; mc->chip.label = DRIVER_NAME, mc->chip.set = mc33880_set; mc->chip.base = pdata->base; mc->chip.ngpio = PIN_NUMBER; mc->chip.can_sleep = 1; mc->chip.dev = &spi->dev; mc->chip.owner = THIS_MODULE; mc->port_config = 0x00; ret = mc33880_write_config(mc); mc->port_config = 0x00; if (!ret) ret = mc33880_write_config(mc); if (ret) { printk(KERN_ERR "Failed writing to " DRIVER_NAME ": %d\n", ret); goto exit_destroy; } ret = gpiochip_add(&mc->chip); if (ret) goto exit_destroy; return ret; exit_destroy: dev_set_drvdata(&spi->dev, NULL); mutex_destroy(&mc->lock); kfree(mc); return ret; }
static int __mc33880_set(struct mc33880 *mc, unsigned offset, int value) { if (value) mc->port_config |= 1 << offset; else mc->port_config &= ~(1 << offset); return mc33880_write_config(mc); }
static int __devinit mc33880_probe(struct spi_device *spi) { struct mc33880 *mc; struct mc33880_platform_data *pdata; int ret; pdata = spi->dev.platform_data; if (!pdata || !pdata->base) { dev_dbg(&spi->dev, "incorrect or missing platform data\n"); return -EINVAL; } /* * bits_per_word cannot be configured in platform data */ spi->bits_per_word = 8; ret = spi_setup(spi); if (ret < 0) return ret; mc = kzalloc(sizeof(struct mc33880), GFP_KERNEL); if (!mc) return -ENOMEM; mutex_init(&mc->lock); dev_set_drvdata(&spi->dev, mc); mc->spi = spi; mc->chip.label = DRIVER_NAME, mc->chip.set = mc33880_set; mc->chip.base = pdata->base; mc->chip.ngpio = PIN_NUMBER; mc->chip.can_sleep = 1; mc->chip.dev = &spi->dev; mc->chip.owner = THIS_MODULE; mc->port_config = 0x00; /* write twice, because during initialisation the first setting * is just for testing SPI communication, and the second is the * "real" configuration */ ret = mc33880_write_config(mc); mc->port_config = 0x00; if (!ret) ret = mc33880_write_config(mc); if (ret) { ; goto exit_destroy; } ret = gpiochip_add(&mc->chip); if (ret) goto exit_destroy; return ret; exit_destroy: dev_set_drvdata(&spi->dev, NULL); mutex_destroy(&mc->lock); kfree(mc); return ret; }