make sti-netlink register to sti bus.

Signed-off-by: Felipe Balbi <[email protected]>
---
 drivers/misc/sti/sti-netlink.c |   70 +++++++++++++++++++++++++++++++++------
 1 files changed, 59 insertions(+), 11 deletions(-)

diff --git a/drivers/misc/sti/sti-netlink.c b/drivers/misc/sti/sti-netlink.c
index dbd6a03..0a41e7d 100644
--- a/drivers/misc/sti/sti-netlink.c
+++ b/drivers/misc/sti/sti-netlink.c
@@ -17,8 +17,12 @@
 #include <net/sock.h>
 #include <mach/sti.h>
 
-static struct sock *sti_sock;
-static DEFINE_MUTEX(sti_netlink_mutex);
+struct sti_netlink {
+       struct sock *sock;
+       struct mutex mutex;
+};
+
+static struct sti_netlink *the_link;
 
 enum {
        STI_READ,
@@ -44,7 +48,7 @@ static int sti_netlink_read(int pid, int seq, void *payload, 
int size)
        memcpy(NLMSG_DATA(nlh), payload, size);
        nlh->nlmsg_len = skb->tail - tail;
 
-       ret = netlink_unicast(sti_sock, skb, pid, MSG_DONTWAIT);
+       ret = netlink_unicast(the_link->sock, skb, pid, MSG_DONTWAIT);
        if (ret > 0)
                ret = 0;
 
@@ -69,7 +73,7 @@ static int sti_netlink_receive_msg(struct sk_buff *skb, 
struct nlmsghdr *nlh)
        void *data;
        u8 chan, id;
        int size;
-       int ret = 0, len = 0;
+       int ret = 0;
 
        data    = NLMSG_DATA(nlh);
        chan    = (nlh->nlmsg_flags >> 8) & 0xff;
@@ -130,28 +134,72 @@ static int sti_netlink_receive_skb(struct sk_buff *skb)
 
 static void sti_netlink_receive(struct sk_buff *skb)
 {
-       if (!mutex_trylock(&sti_netlink_mutex))
+       if (!mutex_trylock(&the_link->mutex))
                return;
 
        sti_netlink_receive_skb(skb);
-       mutex_unlock(&sti_netlink_mutex);
+       mutex_unlock(&the_link->mutex);
 }
 
-static int __init sti_netlink_init(void)
+static int __init sti_netlink_probe(struct sti_client *client)
 {
-       sti_sock = netlink_kernel_create(&init_net, NETLINK_USERSOCK, 0,
+       struct sti_netlink      *link;
+       int                     status;
+
+       link = kzalloc(sizeof(*link), GFP_KERNEL);
+       if (!link) {
+               status = -ENOMEM;
+               goto fail1;
+       }
+
+       link->sock = netlink_kernel_create(&init_net, NETLINK_USERSOCK, 0,
                                         sti_netlink_receive, NULL,
                                         THIS_MODULE);
-       if (!sti_sock) {
-               printk(KERN_ERR "STI: Failed to create netlink socket\n");
-               return -ENODEV;
+       if (!link->sock) {
+               dev_dbg(&client->dev, "STI: Failed to create netlink socket\n");
+               status = -ENOMEM;
+               goto fail2;
        }
 
+       sti_set_clientdata(client, link);
+
+       the_link = link;
+
+       return 0;
+
+fail2:
+       kfree(link);
+
+fail1:
+       return status;
+}
+
+static int __exit sti_netlink_remove(struct sti_client *client)
+{
+       struct sti_netlink      *link = sti_get_clientdata(client);
+
+       kfree(link);
+       the_link = NULL;
+
        return 0;
 }
 
+static struct sti_driver sti_netlink_driver = {
+       .probe          = sti_netlink_probe,
+       .remove         = __exit_p(sti_netlink_remove),
+       .driver         = {
+               .name   = "sti_netlink",
+       },
+};
+
+static int __init sti_netlink_init(void)
+{
+       return sti_add_driver(&sti_netlink_driver);
+}
+
 module_init(sti_netlink_init);
 
 MODULE_AUTHOR("Paul Mundt");
+MODULE_AUTHOR("Felipe Balbi");
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("STI netlink-driven communications interface");
-- 
1.6.3.1.244.gf9275

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to