summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPawel Szyszuk <pawel.szyszuk@stericsson.com>2011-04-06 16:08:22 +0100
committerMathieu J. Poirier <mathieu.poirier@linaro.org>2011-11-10 11:12:21 -0700
commitcbc43b35db236f4a9a2d72ac505f4175ba71aba0 (patch)
treeb279cdb140bff8a605772237e84e025d78509301
parentddcccdcfd9b565f98b6ae2dc932ec79c805be596 (diff)
drivers: hsi: Add hsi_char device to /dev/ folder
Change-Id: I48b038f4d80e6a452aad9a2f077c93e66175c810 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/20174 Reviewed-by: Pawel SZYSZUK <pawel.szyszuk@stericsson.com> Tested-by: Pawel SZYSZUK <pawel.szyszuk@stericsson.com> Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
-rw-r--r--drivers/hsi/clients/hsi_char.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/drivers/hsi/clients/hsi_char.c b/drivers/hsi/clients/hsi_char.c
index 19aeb242f2a..4281156657b 100644
--- a/drivers/hsi/clients/hsi_char.c
+++ b/drivers/hsi/clients/hsi_char.c
@@ -237,12 +237,19 @@ out:
return ret;
}
+static struct hsi_client_driver hsi_char_driver;
+static struct cdev hsi_char_cdev;
+static const struct file_operations hsi_char_fops;
+static struct class *hsi_char_class;
+
static int __devinit hsi_char_probe(struct device *dev)
{
struct hsi_char_client_data *cl_data = &hsi_char_cl_data;
struct hsi_char_channel *channel = cl_data->channels;
struct hsi_client *cl = to_hsi_client(dev);
+ char devname[] = "hsi_char";
int i;
+ int ret;
for (i = 0; i < HSI_CHAR_DEVS; i++, channel++) {
if (channel->state == HSI_CHST_AVAIL)
@@ -255,6 +262,26 @@ static int __devinit hsi_char_probe(struct device *dev)
cl_data->attached = 0;
hsi_client_set_drvdata(cl, cl_data);
+ ret = alloc_chrdev_region(&hsi_char_dev, 0, HSI_CHAR_DEVS, devname);
+ if (ret < 0) {
+ hsi_unregister_client_driver(&hsi_char_driver);
+ return ret;
+ }
+
+ cdev_init(&hsi_char_cdev, &hsi_char_fops);
+ ret = cdev_add(&hsi_char_cdev, hsi_char_dev, HSI_CHAR_DEVS);
+ if (ret) {
+ unregister_chrdev_region(hsi_char_dev, HSI_CHAR_DEVS);
+ hsi_unregister_client_driver(&hsi_char_driver);
+ return ret;
+ }
+
+ hsi_char_class = class_create(THIS_MODULE, "hsi");
+ if (IS_ERR(hsi_char_class))
+ pr_err("ERROR: hsi class creation failed!\n");
+
+ device_create(hsi_char_class, NULL, hsi_char_cdev.dev, NULL, devname);
+
return 0;
}
@@ -1019,7 +1046,6 @@ static struct cdev hsi_char_cdev;
static int __init hsi_char_init(void)
{
- char devname[] = "hsi_char";
struct hsi_char_client_data *cl_data = &hsi_char_cl_data;
struct hsi_char_channel *channel = cl_data->channels;
unsigned long ch_mask = 0;
@@ -1059,20 +1085,6 @@ static int __init hsi_char_init(void)
return ret;
}
- ret = alloc_chrdev_region(&hsi_char_dev, 0, HSI_CHAR_DEVS, devname);
- if (ret < 0) {
- hsi_unregister_client_driver(&hsi_char_driver);
- return ret;
- }
-
- cdev_init(&hsi_char_cdev, &hsi_char_fops);
- ret = cdev_add(&hsi_char_cdev, hsi_char_dev, HSI_CHAR_DEVS);
- if (ret) {
- unregister_chrdev_region(hsi_char_dev, HSI_CHAR_DEVS);
- hsi_unregister_client_driver(&hsi_char_driver);
- return ret;
- }
-
pr_info("HSI/SSI char device loaded\n");
return 0;
@@ -1081,6 +1093,8 @@ module_init(hsi_char_init);
static void __exit hsi_char_exit(void)
{
+ device_destroy(hsi_char_class, hsi_char_cdev.dev);
+ class_destroy(hsi_char_class);
cdev_del(&hsi_char_cdev);
unregister_chrdev_region(hsi_char_dev, HSI_CHAR_DEVS);
hsi_unregister_client_driver(&hsi_char_driver);