diff options
Diffstat (limited to 'drivers/extcon/extcon-adc-jack.c')
| -rw-r--r-- | drivers/extcon/extcon-adc-jack.c | 70 | 
1 files changed, 31 insertions, 39 deletions
diff --git a/drivers/extcon/extcon-adc-jack.c b/drivers/extcon/extcon-adc-jack.c index 5985807e52c..e18f95be373 100644 --- a/drivers/extcon/extcon-adc-jack.c +++ b/drivers/extcon/extcon-adc-jack.c @@ -27,19 +27,19 @@  /**   * struct adc_jack_data - internal data for adc_jack device driver - * @edev        - extcon device. - * @cable_names - list of supported cables. - * @num_cables  - size of cable_names. - * @adc_conditions       - list of adc value conditions. - * @num_conditions       - size of adc_conditions. - * @irq         - irq number of attach/detach event (0 if not exist). - * @handling_delay      - interrupt handler will schedule extcon event - *                      handling at handling_delay jiffies. - * @handler     - extcon event handler called by interrupt handler. - * @chan       - iio channel being queried. + * @edev:		extcon device. + * @cable_names:	list of supported cables. + * @num_cables:		size of cable_names. + * @adc_conditions:	list of adc value conditions. + * @num_conditions:	size of adc_conditions. + * @irq:		irq number of attach/detach event (0 if not exist). + * @handling_delay:	interrupt handler will schedule extcon event + *			handling at handling_delay jiffies. + * @handler:		extcon event handler called by interrupt handler. + * @chan:		iio channel being queried.   */  struct adc_jack_data { -	struct extcon_dev edev; +	struct extcon_dev *edev;  	const char **cable_names;  	int num_cables; @@ -64,7 +64,7 @@ static void adc_jack_handler(struct work_struct *work)  	ret = iio_read_channel_raw(data->chan, &adc_val);  	if (ret < 0) { -		dev_err(data->edev.dev, "read channel() error: %d\n", ret); +		dev_err(&data->edev->dev, "read channel() error: %d\n", ret);  		return;  	} @@ -80,7 +80,7 @@ static void adc_jack_handler(struct work_struct *work)  	}  	/* if no def has met, it means state = 0 (no cables attached) */ -	extcon_set_state(&data->edev, state); +	extcon_set_state(data->edev, state);  }  static irqreturn_t adc_jack_irq_thread(int irq, void *_data) @@ -95,39 +95,40 @@ static irqreturn_t adc_jack_irq_thread(int irq, void *_data)  static int adc_jack_probe(struct platform_device *pdev)  {  	struct adc_jack_data *data; -	struct adc_jack_pdata *pdata = pdev->dev.platform_data; +	struct adc_jack_pdata *pdata = dev_get_platdata(&pdev->dev);  	int i, err = 0;  	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);  	if (!data)  		return -ENOMEM; -	data->edev.name = pdata->name; -  	if (!pdata->cable_names) { -		err = -EINVAL;  		dev_err(&pdev->dev, "error: cable_names not defined.\n"); -		goto out; +		return -EINVAL;  	} -	data->edev.supported_cable = pdata->cable_names; +	data->edev = devm_extcon_dev_allocate(&pdev->dev, pdata->cable_names); +	if (IS_ERR(data->edev)) { +		dev_err(&pdev->dev, "failed to allocate extcon device\n"); +		return -ENOMEM; +	} +	data->edev->dev.parent = &pdev->dev; +	data->edev->name = pdata->name;  	/* Check the length of array and set num_cables */ -	for (i = 0; data->edev.supported_cable[i]; i++) +	for (i = 0; data->edev->supported_cable[i]; i++)  		;  	if (i == 0 || i > SUPPORTED_CABLE_MAX) { -		err = -EINVAL;  		dev_err(&pdev->dev, "error: pdata->cable_names size = %d\n",  				i - 1); -		goto out; +		return -EINVAL;  	}  	data->num_cables = i;  	if (!pdata->adc_conditions ||  			!pdata->adc_conditions[0].state) { -		err = -EINVAL;  		dev_err(&pdev->dev, "error: adc_conditions not defined.\n"); -		goto out; +		return -EINVAL;  	}  	data->adc_conditions = pdata->adc_conditions; @@ -137,10 +138,8 @@ static int adc_jack_probe(struct platform_device *pdev)  	data->num_conditions = i;  	data->chan = iio_channel_get(&pdev->dev, pdata->consumer_channel); -	if (IS_ERR(data->chan)) { -		err = PTR_ERR(data->chan); -		goto out; -	} +	if (IS_ERR(data->chan)) +		return PTR_ERR(data->chan);  	data->handling_delay = msecs_to_jiffies(pdata->handling_delay_ms); @@ -148,15 +147,14 @@ static int adc_jack_probe(struct platform_device *pdev)  	platform_set_drvdata(pdev, data); -	err = extcon_dev_register(&data->edev, &pdev->dev); +	err = devm_extcon_dev_register(&pdev->dev, data->edev);  	if (err) -		goto out; +		return err;  	data->irq = platform_get_irq(pdev, 0);  	if (!data->irq) {  		dev_err(&pdev->dev, "platform_get_irq failed\n"); -		err = -ENODEV; -		goto err_irq; +		return -ENODEV;  	}  	err = request_any_context_irq(data->irq, adc_jack_irq_thread, @@ -164,15 +162,10 @@ static int adc_jack_probe(struct platform_device *pdev)  	if (err < 0) {  		dev_err(&pdev->dev, "error: irq %d\n", data->irq); -		goto err_irq; +		return err;  	}  	return 0; - -err_irq: -	extcon_dev_unregister(&data->edev); -out: -	return err;  }  static int adc_jack_remove(struct platform_device *pdev) @@ -181,7 +174,6 @@ static int adc_jack_remove(struct platform_device *pdev)  	free_irq(data->irq, data);  	cancel_work_sync(&data->handler.work); -	extcon_dev_unregister(&data->edev);  	return 0;  }  | 
