Commit ae9d1b5f authored by Robert Jarzmik's avatar Robert Jarzmik Committed by Mark Brown
Browse files

Input: wm97xx: add new AC97 bus support



This adds support for the new AC97 bus code, which discovers the devices
rather than uses platform data.

As part of this discovery, it enables a multi-function device wm97xx,
which supports touchscreen, battery, ADC and an audio codec. This patch
adds the code to bind the touchscreen "cell" as the touchscreen driver.

This was tested on the pxa architecture with a pxa270 + wm9713 + the
mioa701 touchscreen.

Signed-off-by: default avatarRobert Jarzmik <robert.jarzmik@free.fr>
Acked-by: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Acked-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent a5c6951c
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -727,7 +727,7 @@ config TOUCHSCREEN_WM831X


config TOUCHSCREEN_WM97XX
config TOUCHSCREEN_WM97XX
	tristate "Support for WM97xx AC97 touchscreen controllers"
	tristate "Support for WM97xx AC97 touchscreen controllers"
	depends on AC97_BUS
	depends on AC97_BUS || AC97_BUS_NEW
	help
	help
	  Say Y here if you have a Wolfson Microelectronics WM97xx
	  Say Y here if you have a Wolfson Microelectronics WM97xx
	  touchscreen connected to your system. Note that this option
	  touchscreen connected to your system. Note that this option
+55 −1
Original line number Original line Diff line number Diff line
@@ -44,6 +44,7 @@
#include <linux/pm.h>
#include <linux/pm.h>
#include <linux/interrupt.h>
#include <linux/interrupt.h>
#include <linux/bitops.h>
#include <linux/bitops.h>
#include <linux/mfd/wm97xx.h>
#include <linux/workqueue.h>
#include <linux/workqueue.h>
#include <linux/wm97xx.h>
#include <linux/wm97xx.h>
#include <linux/uaccess.h>
#include <linux/uaccess.h>
@@ -766,6 +767,39 @@ static int wm97xx_remove(struct device *dev)
	return 0;
	return 0;
}
}


static int wm97xx_mfd_probe(struct platform_device *pdev)
{
	struct wm97xx *wm;
	struct wm97xx_platform_data *mfd_pdata = dev_get_platdata(&pdev->dev);
	int ret;

	wm = devm_kzalloc(&pdev->dev, sizeof(struct wm97xx), GFP_KERNEL);
	if (!wm)
		return -ENOMEM;

	wm->dev = &pdev->dev;
	wm->ac97 = mfd_pdata->ac97;

	ret =  _wm97xx_probe(wm);
	if (ret)
		return ret;

	ret = wm97xx_add_battery(wm, mfd_pdata->batt_pdata);
	if (ret < 0)
		goto batt_err;

	return ret;

batt_err:
	wm97xx_unregister_touch(wm);
	return ret;
}

static int wm97xx_mfd_remove(struct platform_device *pdev)
{
	return wm97xx_remove(&pdev->dev);
}

static int __maybe_unused wm97xx_suspend(struct device *dev)
static int __maybe_unused wm97xx_suspend(struct device *dev)
{
{
	struct wm97xx *wm = dev_get_drvdata(dev);
	struct wm97xx *wm = dev_get_drvdata(dev);
@@ -862,21 +896,41 @@ EXPORT_SYMBOL_GPL(wm97xx_unregister_mach_ops);


static struct device_driver wm97xx_driver = {
static struct device_driver wm97xx_driver = {
	.name =		"wm97xx-ts",
	.name =		"wm97xx-ts",
#ifdef CONFIG_AC97_BUS
	.bus =		&ac97_bus_type,
	.bus =		&ac97_bus_type,
#endif
	.owner =	THIS_MODULE,
	.owner =	THIS_MODULE,
	.probe =	wm97xx_probe,
	.probe =	wm97xx_probe,
	.remove =	wm97xx_remove,
	.remove =	wm97xx_remove,
	.pm =		&wm97xx_pm_ops,
	.pm =		&wm97xx_pm_ops,
};
};


static struct platform_driver wm97xx_mfd_driver = {
	.driver = {
		.name =		"wm97xx-ts",
		.pm =		&wm97xx_pm_ops,
	},
	.probe =	wm97xx_mfd_probe,
	.remove =	wm97xx_mfd_remove,
};

static int __init wm97xx_init(void)
static int __init wm97xx_init(void)
{
{
	return driver_register(&wm97xx_driver);
	int ret;

	ret = platform_driver_register(&wm97xx_mfd_driver);
	if (ret)
		return ret;

	if (IS_BUILTIN(CONFIG_AC97_BUS))
		ret =  driver_register(&wm97xx_driver);
	return ret;
}
}


static void __exit wm97xx_exit(void)
static void __exit wm97xx_exit(void)
{
{
	driver_unregister(&wm97xx_driver);
	driver_unregister(&wm97xx_driver);
	platform_driver_unregister(&wm97xx_mfd_driver);
}
}


module_init(wm97xx_init);
module_init(wm97xx_init);