|
@@ -454,31 +454,16 @@ static int sun4i_irq_init(struct platform_device *pdev, const char *name,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int sun4i_gpadc_probe(struct platform_device *pdev)
|
|
|
+static int sun4i_gpadc_probe_mfd(struct platform_device *pdev,
|
|
|
+ struct iio_dev *indio_dev)
|
|
|
{
|
|
|
- struct sun4i_gpadc_iio *info;
|
|
|
- struct iio_dev *indio_dev;
|
|
|
+ struct sun4i_gpadc_iio *info = iio_priv(indio_dev);
|
|
|
+ struct sun4i_gpadc_dev *sun4i_gpadc_dev =
|
|
|
+ dev_get_drvdata(pdev->dev.parent);
|
|
|
int ret;
|
|
|
- struct sun4i_gpadc_dev *sun4i_gpadc_dev;
|
|
|
-
|
|
|
- sun4i_gpadc_dev = dev_get_drvdata(pdev->dev.parent);
|
|
|
-
|
|
|
- indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info));
|
|
|
- if (!indio_dev)
|
|
|
- return -ENOMEM;
|
|
|
|
|
|
- info = iio_priv(indio_dev);
|
|
|
- platform_set_drvdata(pdev, indio_dev);
|
|
|
-
|
|
|
- mutex_init(&info->mutex);
|
|
|
info->regmap = sun4i_gpadc_dev->regmap;
|
|
|
- info->indio_dev = indio_dev;
|
|
|
- init_completion(&info->completion);
|
|
|
- indio_dev->name = dev_name(&pdev->dev);
|
|
|
- indio_dev->dev.parent = &pdev->dev;
|
|
|
- indio_dev->dev.of_node = pdev->dev.of_node;
|
|
|
- indio_dev->info = &sun4i_gpadc_iio_info;
|
|
|
- indio_dev->modes = INDIO_DIRECT_MODE;
|
|
|
+
|
|
|
indio_dev->num_channels = ARRAY_SIZE(sun4i_gpadc_channels);
|
|
|
indio_dev->channels = sun4i_gpadc_channels;
|
|
|
|
|
@@ -519,8 +504,7 @@ static int sun4i_gpadc_probe(struct platform_device *pdev)
|
|
|
dev_err(&pdev->dev,
|
|
|
"could not register thermal sensor: %ld\n",
|
|
|
PTR_ERR(tzd));
|
|
|
- ret = PTR_ERR(tzd);
|
|
|
- goto err;
|
|
|
+ return PTR_ERR(tzd);
|
|
|
}
|
|
|
} else {
|
|
|
indio_dev->num_channels =
|
|
@@ -528,36 +512,65 @@ static int sun4i_gpadc_probe(struct platform_device *pdev)
|
|
|
indio_dev->channels = sun4i_gpadc_channels_no_temp;
|
|
|
}
|
|
|
|
|
|
- pm_runtime_set_autosuspend_delay(&pdev->dev,
|
|
|
- SUN4I_GPADC_AUTOSUSPEND_DELAY);
|
|
|
- pm_runtime_use_autosuspend(&pdev->dev);
|
|
|
- pm_runtime_set_suspended(&pdev->dev);
|
|
|
- pm_runtime_enable(&pdev->dev);
|
|
|
-
|
|
|
if (IS_ENABLED(CONFIG_THERMAL_OF)) {
|
|
|
ret = sun4i_irq_init(pdev, "TEMP_DATA_PENDING",
|
|
|
sun4i_gpadc_temp_data_irq_handler,
|
|
|
"temp_data", &info->temp_data_irq,
|
|
|
&info->ignore_temp_data_irq);
|
|
|
if (ret < 0)
|
|
|
- goto err;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
ret = sun4i_irq_init(pdev, "FIFO_DATA_PENDING",
|
|
|
sun4i_gpadc_fifo_data_irq_handler, "fifo_data",
|
|
|
&info->fifo_data_irq, &info->ignore_fifo_data_irq);
|
|
|
if (ret < 0)
|
|
|
- goto err;
|
|
|
+ return ret;
|
|
|
|
|
|
if (IS_ENABLED(CONFIG_THERMAL_OF)) {
|
|
|
ret = iio_map_array_register(indio_dev, sun4i_gpadc_hwmon_maps);
|
|
|
if (ret < 0) {
|
|
|
dev_err(&pdev->dev,
|
|
|
"failed to register iio map array\n");
|
|
|
- goto err;
|
|
|
+ return ret;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int sun4i_gpadc_probe(struct platform_device *pdev)
|
|
|
+{
|
|
|
+ struct sun4i_gpadc_iio *info;
|
|
|
+ struct iio_dev *indio_dev;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info));
|
|
|
+ if (!indio_dev)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ info = iio_priv(indio_dev);
|
|
|
+ platform_set_drvdata(pdev, indio_dev);
|
|
|
+
|
|
|
+ mutex_init(&info->mutex);
|
|
|
+ info->indio_dev = indio_dev;
|
|
|
+ init_completion(&info->completion);
|
|
|
+ indio_dev->name = dev_name(&pdev->dev);
|
|
|
+ indio_dev->dev.parent = &pdev->dev;
|
|
|
+ indio_dev->dev.of_node = pdev->dev.of_node;
|
|
|
+ indio_dev->info = &sun4i_gpadc_iio_info;
|
|
|
+ indio_dev->modes = INDIO_DIRECT_MODE;
|
|
|
+
|
|
|
+ ret = sun4i_gpadc_probe_mfd(pdev, indio_dev);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ pm_runtime_set_autosuspend_delay(&pdev->dev,
|
|
|
+ SUN4I_GPADC_AUTOSUSPEND_DELAY);
|
|
|
+ pm_runtime_use_autosuspend(&pdev->dev);
|
|
|
+ pm_runtime_set_suspended(&pdev->dev);
|
|
|
+ pm_runtime_enable(&pdev->dev);
|
|
|
+
|
|
|
ret = devm_iio_device_register(&pdev->dev, indio_dev);
|
|
|
if (ret < 0) {
|
|
|
dev_err(&pdev->dev, "could not register the device\n");
|
|
@@ -570,7 +583,6 @@ err_map:
|
|
|
if (IS_ENABLED(CONFIG_THERMAL_OF))
|
|
|
iio_map_array_unregister(indio_dev);
|
|
|
|
|
|
-err:
|
|
|
pm_runtime_put(&pdev->dev);
|
|
|
pm_runtime_disable(&pdev->dev);
|
|
|
|