aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Hackmann <ghackmann@google.com>2012-04-04 15:13:11 -0700
committerGreg Hackmann <ghackmann@google.com>2012-04-04 15:13:11 -0700
commit00b12364835378a3f55732acf5a4c45cc957612e (patch)
treec481f672a3bdc4c3d7f94542725bebe7ceb13e25
parent649bd9f0df3c538f05b4038154d4642466f1b3c3 (diff)
downloadkernel_samsung_tuna-00b12364835378a3f55732acf5a4c45cc957612e.zip
kernel_samsung_tuna-00b12364835378a3f55732acf5a4c45cc957612e.tar.gz
kernel_samsung_tuna-00b12364835378a3f55732acf5a4c45cc957612e.tar.bz2
Create sii9234 rcp input device
Change-Id: I35353c044c8b9ba0fa8d7b7e9c3a00326e4b25e6 Signed-off-by: Greg Hackmann <ghackmann@google.com>
-rw-r--r--drivers/video/sii9234.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/drivers/video/sii9234.c b/drivers/video/sii9234.c
index c09c421..3b1771d 100644
--- a/drivers/video/sii9234.c
+++ b/drivers/video/sii9234.c
@@ -24,6 +24,7 @@
#include <linux/err.h>
#include <linux/gpio.h>
#include <linux/i2c.h>
+#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/kernel.h>
@@ -328,6 +329,8 @@ struct sii9234_data {
struct completion msc_complete;
u8 devcap[16];
+
+ struct input_dev *input_dev;
};
static irqreturn_t sii9234_irq_thread(int irq, void *data);
@@ -1241,6 +1244,7 @@ static int __devinit sii9234_mhl_tx_i2c_probe(struct i2c_client *client,
{
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
struct sii9234_data *sii9234;
+ struct input_dev *input;
int ret;
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
@@ -1252,6 +1256,13 @@ static int __devinit sii9234_mhl_tx_i2c_probe(struct i2c_client *client,
return -ENOMEM;
}
+ input = input_allocate_device();
+ if (!input) {
+ dev_err(&client->dev, "failed to allocate input device.\n");
+ ret = -ENOMEM;
+ goto err_exit0;
+ }
+
sii9234->pdata = client->dev.platform_data;
sii9234->pdata->mhl_tx_client = client;
if (!sii9234->pdata) {
@@ -1271,7 +1282,7 @@ static int __devinit sii9234_mhl_tx_i2c_probe(struct i2c_client *client,
IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
"sii9234", sii9234);
if (ret < 0)
- goto err_exit2;
+ goto err_exit1;
disable_irq(client->irq);
@@ -1279,6 +1290,21 @@ static int __devinit sii9234_mhl_tx_i2c_probe(struct i2c_client *client,
sii9234->otg_id_nb.cancel = sii9234_cancel_callback;
sii9234->otg_id_nb.priority = sii9234->pdata->prio;
+ /* indicate that we generate key events */
+ set_bit(EV_KEY, input->evbit);
+ bitmap_fill(input->keybit, KEY_MAX);
+
+ sii9234->input_dev = input;
+ input_set_drvdata(input, sii9234);
+ input->name = "sii9234_rcp";
+ input->id.bustype = BUS_I2C;
+
+ ret = input_register_device(input);
+ if (ret < 0) {
+ dev_err(&client->dev, "fail to register input device\n");
+ goto err_exit1;
+ }
+
plist_node_init(&sii9234->otg_id_nb.p, sii9234->pdata->prio);
ret = otg_id_register_notifier(&sii9234->otg_id_nb);
@@ -1290,7 +1316,11 @@ static int __devinit sii9234_mhl_tx_i2c_probe(struct i2c_client *client,
return 0;
err_exit2:
+ input_unregister_device(input);
+ goto err_exit0;
err_exit1:
+ input_free_device(input);
+err_exit0:
kfree(sii9234);
return ret;
}