Commit b9e06694 authored by Ameya Palande's avatar Ameya Palande Committed by Matthew Garrett
Browse files

platform/x86: Simplify intel_mid_powerbtn



This patch:
1. Removes unnecessay #defines
2. Removes 'mfld_pb_priv' data structure which results in simpler error
   handling and less memory allocations.

Signed-off-by: default avatarAmeya Palande <2ameya@gmail.com>
Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
parent 02003667
Loading
Loading
Loading
Loading
+30 −42
Original line number Original line Diff line number Diff line
@@ -23,58 +23,48 @@
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/input.h>

#include <asm/intel_scu_ipc.h>
#include <asm/intel_scu_ipc.h>


#define DRIVER_NAME "msic_power_btn"
#define DRIVER_NAME "msic_power_btn"


#define MSIC_IRQ_STAT	0x02
  #define MSIC_IRQ_PB	(1 << 0)
#define MSIC_PB_CONFIG	0x3e
#define MSIC_PB_STATUS	0x3f
#define MSIC_PB_STATUS	0x3f
#define MSIC_PB_LEVEL	(1 << 3) /* 1 - release, 0 - press */
#define MSIC_PB_LEVEL	(1 << 3) /* 1 - release, 0 - press */


struct mfld_pb_priv {
	struct input_dev *input;
	unsigned int irq;
};

static irqreturn_t mfld_pb_isr(int irq, void *dev_id)
static irqreturn_t mfld_pb_isr(int irq, void *dev_id)
{
{
	struct mfld_pb_priv *priv = dev_id;
	struct input_dev *input = dev_id;
	int ret;
	int ret;
	u8 pbstat;
	u8 pbstat;


	ret = intel_scu_ipc_ioread8(MSIC_PB_STATUS, &pbstat);
	ret = intel_scu_ipc_ioread8(MSIC_PB_STATUS, &pbstat);
	if (ret < 0)
	if (ret < 0) {
		return IRQ_HANDLED;
		dev_err(input->dev.parent, "Read error %d while reading"

			       " MSIC_PB_STATUS\n", ret);
	input_event(priv->input, EV_KEY, KEY_POWER, !(pbstat & MSIC_PB_LEVEL));
	} else {
	input_sync(priv->input);
		input_event(input, EV_KEY, KEY_POWER,
			       !(pbstat & MSIC_PB_LEVEL));
		input_sync(input);
	}


	return IRQ_HANDLED;
	return IRQ_HANDLED;
}
}


static int __devinit mfld_pb_probe(struct platform_device *pdev)
static int __devinit mfld_pb_probe(struct platform_device *pdev)
{
{
	struct mfld_pb_priv *priv;
	struct input_dev *input;
	struct input_dev *input;
	int irq;
	int irq = platform_get_irq(pdev, 0);
	int error;
	int error;


	irq = platform_get_irq(pdev, 0);
	if (irq < 0)
	if (irq < 0)
		return -EINVAL;
		return -EINVAL;


	priv = kzalloc(sizeof(struct mfld_pb_priv), GFP_KERNEL);
	input = input_allocate_device();
	input = input_allocate_device();
	if (!priv || !input) {
	if (!input) {
		error = -ENOMEM;
		dev_err(&pdev->dev, "Input device allocation error\n");
		goto err_free_mem;
		return -ENOMEM;
	}
	}


	priv->input = input;
	priv->irq = irq;

	input->name = pdev->name;
	input->name = pdev->name;
	input->phys = "power-button/input0";
	input->phys = "power-button/input0";
	input->id.bustype = BUS_HOST;
	input->id.bustype = BUS_HOST;
@@ -82,42 +72,40 @@ static int __devinit mfld_pb_probe(struct platform_device *pdev)


	input_set_capability(input, EV_KEY, KEY_POWER);
	input_set_capability(input, EV_KEY, KEY_POWER);


	error = request_threaded_irq(priv->irq, NULL, mfld_pb_isr,
	error = request_threaded_irq(irq, NULL, mfld_pb_isr, 0,
				     0, DRIVER_NAME, priv);
			DRIVER_NAME, input);
	if (error) {
	if (error) {
		dev_err(&pdev->dev,
		dev_err(&pdev->dev, "Unable to request irq %d for mfld power"
			"unable to request irq %d for mfld power button\n",
				"button\n", irq);
			irq);
		goto err_free_input;
		goto err_free_mem;
	}
	}


	error = input_register_device(input);
	error = input_register_device(input);
	if (error) {
	if (error) {
		dev_err(&pdev->dev,
		dev_err(&pdev->dev, "Unable to register input dev, error "
			"unable to register input dev, error %d\n", error);
				"%d\n", error);
		goto err_free_irq;
		goto err_free_irq;
	}
	}


	platform_set_drvdata(pdev, priv);
	platform_set_drvdata(pdev, input);
	return 0;
	return 0;


err_free_irq:
err_free_irq:
	free_irq(priv->irq, priv);
	free_irq(irq, input);
err_free_mem:
err_free_input:
	input_free_device(input);
	input_free_device(input);
	kfree(priv);
	return error;
	return error;
}
}


static int __devexit mfld_pb_remove(struct platform_device *pdev)
static int __devexit mfld_pb_remove(struct platform_device *pdev)
{
{
	struct mfld_pb_priv *priv = platform_get_drvdata(pdev);
	struct input_dev *input = platform_get_drvdata(pdev);

	int irq = platform_get_irq(pdev, 0);
	free_irq(priv->irq, priv);
	input_unregister_device(priv->input);
	kfree(priv);


	free_irq(irq, input);
	input_unregister_device(input);
	platform_set_drvdata(pdev, NULL);
	platform_set_drvdata(pdev, NULL);

	return 0;
	return 0;
}
}