On 05/09/16 07:29, Quentin Schulz wrote: > On 04/09/2016 16:35, Jonathan Cameron wrote: >> On 01/09/16 15:05, Quentin Schulz wrote: >>> The Allwinner SoCs all have an ADC that can also act as a touchscreen >>> controller and a thermal sensor. This patch adds the ADC driver which is >>> based on the MFD for the same SoCs ADC. >>> >>> This also registers the thermal adc channel in the iio map array so >>> iio_hwmon could use it without modifying the Device Tree. This registers >>> the driver in the thermal framework. >>> >>> This driver probes on three different platform_device_id to take into >>> account slight differences (registers bit and temperature computation) >>> between Allwinner SoCs ADCs. >>> >>> Signed-off-by: Quentin Schulz <quentin.schulz@xxxxxxxxxxxxxxxxxx> >> One utterly trivial point about unrolling code ordering inline. >> >> Other than the bit about patch 1 I'm basically happy with this.. > > ACK. Will revert this patch in v5. Thanks. > >> However I would like some input (i.e. an Ack) from thermal given this >> sets up a thermal zone. >> >> Zhang or Eduardo, could you take a quick look at this and confirm you >> are happy with it? >> >> Thanks, >> >> Jonathan > [...] >>> + >>> +err_map: >>> + iio_map_array_unregister(indio_dev); >>> + >>> +err_fifo_irq: >>> + /* Disable FIFO_DATA_PENDING interrupt on hardware side. */ >>> + regmap_update_bits(info->regmap, SUN4I_GPADC_INT_FIFOC, >>> + SUN4I_GPADC_INT_FIFOC_TP_DATA_IRQ_EN, >>> + 0); >>> + >>> +err_temp_irq: >>> + /* Disable TEMP_DATA_PENDING interrupt on hardware side. */ >>> + regmap_update_bits(info->regmap, SUN4I_GPADC_INT_FIFOC, >>> + SUN4I_GPADC_INT_FIFOC_TEMP_IRQ_EN, >>> + 0); >>> + >>> +err: >>> + pm_runtime_put(&pdev->dev); >>> + pm_runtime_disable(&pdev->dev); >>> + >>> + return ret; >>> +} >>> + >>> +static int sun4i_gpadc_remove(struct platform_device *pdev) >>> +{ >>> + struct sun4i_gpadc_dev *info; >>> + struct iio_dev *indio_dev = platform_get_drvdata(pdev); >>> + >>> + info = iio_priv(indio_dev); >>> + iio_device_unregister(indio_dev); >>> + iio_map_array_unregister(indio_dev); >>> + pm_runtime_put(&pdev->dev); >>> + pm_runtime_disable(&pdev->dev); >> Its really minor but in the interests of 'obviously correct' making >> review easy I'd rather everything in the remove was in the reverse order >> of probe (and hence the same as the error path in probe for most of it). >> >> That would put the pm_runtime stuff last I think.. >> >> If you weren't rerolling anyway over patch 1 I'd probably have just let >> this go, but might as well make this trivial change as well. >> > > I'm going with the following order: > pm_runtime_put > pm_runtime_disable > regmap_update_bits > iio_map_array_unregister > iio_device_unregister > > Is that okay? (I don't really know which one of iio_map_array_unregister > or iio_device_unregister to put first, if it matters in any way). Unless we have a really complex race condition involving a client driver coming up just as the provider is unregistered I doubt it matters. At some point we should probably chase down any paths through that with some carefully crafted tests but it's in the seriously unlikely category! Jonathan > > Thanks! > Quentin >> >>> + /* >>> + * Disable TEMP_DATA_PENDING and FIFO_DATA_PENDING interrupts on >>> + * hardware side. >>> + */ >>> + regmap_update_bits(info->regmap, SUN4I_GPADC_INT_FIFOC, >>> + SUN4I_GPADC_INT_FIFOC_TEMP_IRQ_EN | >>> + SUN4I_GPADC_INT_FIFOC_TP_DATA_IRQ_EN, >>> + 0); >>> + >>> + return 0; >>> +} >>> + >>> +static const struct platform_device_id sun4i_gpadc_id[] = { >>> + { "sun4i-a10-gpadc-iio", (kernel_ulong_t)&sun4i_gpadc_soc_specific }, >>> + { "sun5i-a13-gpadc-iio", (kernel_ulong_t)&sun5i_gpadc_soc_specific }, >>> + { "sun6i-a31-gpadc-iio", (kernel_ulong_t)&sun6i_gpadc_soc_specific }, >>> + { /* sentinel */ }, >>> +}; >>> + >>> +static struct platform_driver sun4i_gpadc_driver = { >>> + .driver = { >>> + .name = "sun4i-gpadc-iio", >>> + .pm = &sun4i_gpadc_pm_ops, >>> + }, >>> + .id_table = sun4i_gpadc_id, >>> + .probe = sun4i_gpadc_probe, >>> + .remove = sun4i_gpadc_remove, >>> +}; >>> + >>> +module_platform_driver(sun4i_gpadc_driver); >>> + >>> +MODULE_DESCRIPTION("ADC driver for sunxi platforms"); >>> +MODULE_AUTHOR("Quentin Schulz <quentin.schulz@xxxxxxxxxxxxxxxxxx>"); >>> +MODULE_LICENSE("GPL v2"); >>> >> > -- > To unsubscribe from this list: send the line "unsubscribe linux-iio" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html