Lines Matching refs:mcli

131 	struct mctp_i2c_client *mcli = NULL;  in mctp_i2c_new_client()  local
157 mcli = kzalloc(sizeof(*mcli), GFP_KERNEL); in mctp_i2c_new_client()
158 if (!mcli) { in mctp_i2c_new_client()
162 spin_lock_init(&mcli->sel_lock); in mctp_i2c_new_client()
163 INIT_LIST_HEAD(&mcli->devs); in mctp_i2c_new_client()
164 INIT_LIST_HEAD(&mcli->list); in mctp_i2c_new_client()
165 mcli->lladdr = client->addr & 0xff; in mctp_i2c_new_client()
166 mcli->client = client; in mctp_i2c_new_client()
167 i2c_set_clientdata(client, mcli); in mctp_i2c_new_client()
169 rc = i2c_slave_register(mcli->client, mctp_i2c_slave_cb); in mctp_i2c_new_client()
172 mcli->client = NULL; in mctp_i2c_new_client()
177 return mcli; in mctp_i2c_new_client()
179 if (mcli) { in mctp_i2c_new_client()
180 i2c_unregister_device(mcli->client); in mctp_i2c_new_client()
181 kfree(mcli); in mctp_i2c_new_client()
186 static void mctp_i2c_free_client(struct mctp_i2c_client *mcli) in mctp_i2c_free_client() argument
191 WARN_ON(!list_empty(&mcli->devs)); in mctp_i2c_free_client()
192 WARN_ON(mcli->sel); /* sanity check, no locking */ in mctp_i2c_free_client()
194 rc = i2c_slave_unregister(mcli->client); in mctp_i2c_free_client()
197 dev_err(&mcli->client->dev, "i2c unregister failed %d\n", rc); in mctp_i2c_free_client()
199 kfree(mcli); in mctp_i2c_free_client()
205 static void __mctp_i2c_device_select(struct mctp_i2c_client *mcli, in __mctp_i2c_device_select() argument
208 assert_spin_locked(&mcli->sel_lock); in __mctp_i2c_device_select()
211 if (mcli->sel) in __mctp_i2c_device_select()
212 dev_put(mcli->sel->ndev); in __mctp_i2c_device_select()
213 mcli->sel = midev; in __mctp_i2c_device_select()
217 static void mctp_i2c_device_select(struct mctp_i2c_client *mcli, in mctp_i2c_device_select() argument
222 spin_lock_irqsave(&mcli->sel_lock, flags); in mctp_i2c_device_select()
223 __mctp_i2c_device_select(mcli, midev); in mctp_i2c_device_select()
224 spin_unlock_irqrestore(&mcli->sel_lock, flags); in mctp_i2c_device_select()
230 struct mctp_i2c_client *mcli = i2c_get_clientdata(client); in mctp_i2c_slave_cb() local
235 spin_lock_irqsave(&mcli->sel_lock, flags); in mctp_i2c_slave_cb()
236 midev = mcli->sel; in mctp_i2c_slave_cb()
239 spin_unlock_irqrestore(&mcli->sel_lock, flags); in mctp_i2c_slave_cb()
256 midev->rx_buffer[0] = mcli->lladdr << 1; in mctp_i2c_slave_cb()
736 struct mctp_i2c_client *mcli, in mctp_i2c_midev_init() argument
750 get_device(&mcli->client->dev); in mctp_i2c_midev_init()
751 midev->client = mcli; in mctp_i2c_midev_init()
762 spin_lock_irqsave(&mcli->sel_lock, flags); in mctp_i2c_midev_init()
763 list_add(&midev->list, &mcli->devs); in mctp_i2c_midev_init()
765 if (!mcli->sel) in mctp_i2c_midev_init()
766 __mctp_i2c_device_select(mcli, midev); in mctp_i2c_midev_init()
767 spin_unlock_irqrestore(&mcli->sel_lock, flags); in mctp_i2c_midev_init()
778 struct mctp_i2c_client *mcli = midev->client; in mctp_i2c_midev_free() local
790 spin_lock_irqsave(&mcli->sel_lock, flags); in mctp_i2c_midev_free()
792 if (mcli->sel == midev) { in mctp_i2c_midev_free()
795 first = list_first_entry_or_null(&mcli->devs, struct mctp_i2c_dev, list); in mctp_i2c_midev_free()
796 __mctp_i2c_device_select(mcli, first); in mctp_i2c_midev_free()
798 spin_unlock_irqrestore(&mcli->sel_lock, flags); in mctp_i2c_midev_free()
802 put_device(&mcli->client->dev); in mctp_i2c_midev_free()
850 static int mctp_i2c_add_netdev(struct mctp_i2c_client *mcli, in mctp_i2c_add_netdev() argument
861 if (root != mcli->client->adapter) { in mctp_i2c_add_netdev()
862 dev_err(&mcli->client->dev, in mctp_i2c_add_netdev()
864 mcli->client->adapter->name, root->name); in mctp_i2c_add_netdev()
872 dev_err(&mcli->client->dev, "alloc netdev failed\n"); in mctp_i2c_add_netdev()
878 dev_addr_set(ndev, &mcli->lladdr); in mctp_i2c_add_netdev()
880 midev = mctp_i2c_midev_init(ndev, mcli, adap); in mctp_i2c_add_netdev()
890 dev_err(&mcli->client->dev, in mctp_i2c_add_netdev()
910 static void mctp_i2c_remove_netdev(struct mctp_i2c_client *mcli, in mctp_i2c_remove_netdev() argument
917 spin_lock_irqsave(&mcli->sel_lock, flags); in mctp_i2c_remove_netdev()
919 list_for_each_entry(m, &mcli->devs, list) in mctp_i2c_remove_netdev()
924 spin_unlock_irqrestore(&mcli->sel_lock, flags); in mctp_i2c_remove_netdev()
967 struct mctp_i2c_client *mcli = data; in mctp_i2c_client_try_attach() local
972 if (mcli->client->adapter != root) in mctp_i2c_client_try_attach()
980 return mctp_i2c_add_netdev(mcli, adap); in mctp_i2c_client_try_attach()
985 struct mctp_i2c_client *mcli = NULL, *m = NULL; in mctp_i2c_notify_add() local
1000 mcli = m; in mctp_i2c_notify_add()
1005 if (mcli) { in mctp_i2c_notify_add()
1006 rc = mctp_i2c_add_netdev(mcli, adap); in mctp_i2c_notify_add()
1016 struct mctp_i2c_client *mcli = NULL; in mctp_i2c_notify_del() local
1023 list_for_each_entry(mcli, &driver_clients, list) { in mctp_i2c_notify_del()
1024 if (mcli->client->adapter == root) { in mctp_i2c_notify_del()
1025 mctp_i2c_remove_netdev(mcli, adap); in mctp_i2c_notify_del()
1034 struct mctp_i2c_client *mcli = NULL; in mctp_i2c_probe() local
1038 mcli = mctp_i2c_new_client(client); in mctp_i2c_probe()
1039 if (IS_ERR(mcli)) { in mctp_i2c_probe()
1040 rc = PTR_ERR(mcli); in mctp_i2c_probe()
1041 mcli = NULL; in mctp_i2c_probe()
1044 list_add(&mcli->list, &driver_clients); in mctp_i2c_probe()
1048 i2c_for_each_dev(mcli, mctp_i2c_client_try_attach); in mctp_i2c_probe()
1057 struct mctp_i2c_client *mcli = i2c_get_clientdata(client); in mctp_i2c_remove() local
1061 list_del(&mcli->list); in mctp_i2c_remove()
1063 list_for_each_entry_safe(midev, tmp, &mcli->devs, list) in mctp_i2c_remove()
1066 mctp_i2c_free_client(mcli); in mctp_i2c_remove()