From: Mark Brown Date: Thu, 28 Nov 2013 11:31:35 +0000 (+0000) Subject: Merge remote-tracking branch 'spi/fix/core' into spi-linus X-Git-Tag: drm-fsl-dcu-for-next~6288^2~1 X-Git-Url: http://git.agner.ch/gitweb/?p=linux-drm-fsl-dcu.git;a=commitdiff_plain;h=b8aba7611b9a5a1f67f081be84270c67baf4d2c3;hp=-c Merge remote-tracking branch 'spi/fix/core' into spi-linus --- b8aba7611b9a5a1f67f081be84270c67baf4d2c3 diff --combined drivers/spi/spi.c index 18cc625d887f,481e13f0db54..349ebba4b199 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@@ -245,27 -245,15 +245,27 @@@ EXPORT_SYMBOL_GPL(spi_bus_type) static int spi_drv_probe(struct device *dev) { const struct spi_driver *sdrv = to_spi_driver(dev->driver); + struct spi_device *spi = to_spi_device(dev); + int ret; + + acpi_dev_pm_attach(&spi->dev, true); + ret = sdrv->probe(spi); + if (ret) + acpi_dev_pm_detach(&spi->dev, true); - return sdrv->probe(to_spi_device(dev)); + return ret; } static int spi_drv_remove(struct device *dev) { const struct spi_driver *sdrv = to_spi_driver(dev->driver); + struct spi_device *spi = to_spi_device(dev); + int ret; - return sdrv->remove(to_spi_device(dev)); + ret = sdrv->remove(spi); + acpi_dev_pm_detach(&spi->dev, true); + + return ret; } static void spi_drv_shutdown(struct device *dev) @@@ -357,19 -345,6 +357,19 @@@ struct spi_device *spi_alloc_device(str } EXPORT_SYMBOL_GPL(spi_alloc_device); +static void spi_dev_set_name(struct spi_device *spi) +{ + struct acpi_device *adev = ACPI_COMPANION(&spi->dev); + + if (adev) { + dev_set_name(&spi->dev, "spi-%s", acpi_dev_name(adev)); + return; + } + + dev_set_name(&spi->dev, "%s.%u", dev_name(&spi->master->dev), + spi->chip_select); +} + /** * spi_add_device - Add spi_device allocated with spi_alloc_device * @spi: spi_device to register @@@ -396,7 -371,9 +396,7 @@@ int spi_add_device(struct spi_device *s } /* Set the bus ID string */ - dev_set_name(&spi->dev, "%s.%u", dev_name(&spi->master->dev), - spi->chip_select); - + spi_dev_set_name(spi); /* We need to make sure there's no other device with this * chipselect **BEFORE** we call setup(), else we'll trash @@@ -582,7 -559,7 +582,7 @@@ static int spi_transfer_one_message(str list_for_each_entry(xfer, &msg->transfers, transfer_list) { trace_spi_transfer_start(msg, xfer); - INIT_COMPLETION(master->xfer_completion); + reinit_completion(&master->xfer_completion); ret = master->transfer_one(master, msg->spi, xfer); if (ret < 0) { @@@ -1155,7 -1132,7 +1155,7 @@@ static acpi_status acpi_spi_add_device( return AE_NO_MEMORY; } - ACPI_HANDLE_SET(&spi->dev, handle); + ACPI_COMPANION_SET(&spi->dev, adev); spi->irq = -1; INIT_LIST_HEAD(&resource_list); @@@ -1168,10 -1145,8 +1168,10 @@@ return AE_OK; } + adev->power.flags.ignore_parent = true; strlcpy(spi->modalias, acpi_device_hid(adev), sizeof(spi->modalias)); if (spi_add_device(spi)) { + adev->power.flags.ignore_parent = false; dev_err(&master->dev, "failed to add SPI device %s from ACPI\n", dev_name(&adev->dev)); spi_dev_put(spi); @@@ -1415,7 -1390,7 +1415,7 @@@ int devm_spi_register_master(struct dev return -ENOMEM; ret = spi_register_master(master); - if (ret != 0) { + if (!ret) { *ptr = master; devres_add(dev, ptr); } else {