Lines Matching refs:gdev
36 static void __ccwgroup_remove_symlinks(struct ccwgroup_device *gdev) in __ccwgroup_remove_symlinks() argument
41 for (i = 0; i < gdev->count; i++) { in __ccwgroup_remove_symlinks()
43 sysfs_remove_link(&gdev->dev.kobj, str); in __ccwgroup_remove_symlinks()
44 sysfs_remove_link(&gdev->cdev[i]->dev.kobj, "group_device"); in __ccwgroup_remove_symlinks()
56 int ccwgroup_set_online(struct ccwgroup_device *gdev) in ccwgroup_set_online() argument
58 struct ccwgroup_driver *gdrv = to_ccwgroupdrv(gdev->dev.driver); in ccwgroup_set_online()
61 if (atomic_cmpxchg(&gdev->onoff, 0, 1) != 0) in ccwgroup_set_online()
63 if (gdev->state == CCWGROUP_ONLINE) in ccwgroup_set_online()
66 ret = gdrv->set_online(gdev); in ccwgroup_set_online()
70 gdev->state = CCWGROUP_ONLINE; in ccwgroup_set_online()
72 atomic_set(&gdev->onoff, 0); in ccwgroup_set_online()
86 int ccwgroup_set_offline(struct ccwgroup_device *gdev, bool call_gdrv) in ccwgroup_set_offline() argument
88 struct ccwgroup_driver *gdrv = to_ccwgroupdrv(gdev->dev.driver); in ccwgroup_set_offline()
91 if (atomic_cmpxchg(&gdev->onoff, 0, 1) != 0) in ccwgroup_set_offline()
93 if (gdev->state == CCWGROUP_OFFLINE) in ccwgroup_set_offline()
100 ret = gdrv->set_offline(gdev); in ccwgroup_set_offline()
105 gdev->state = CCWGROUP_OFFLINE; in ccwgroup_set_offline()
107 atomic_set(&gdev->onoff, 0); in ccwgroup_set_offline()
116 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_online_store() local
131 ret = ccwgroup_set_online(gdev); in ccwgroup_online_store()
133 ret = ccwgroup_set_offline(gdev, true); in ccwgroup_online_store()
145 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_online_show() local
148 online = (gdev->state == CCWGROUP_ONLINE) ? 1 : 0; in ccwgroup_online_show()
157 static void ccwgroup_ungroup(struct ccwgroup_device *gdev) in ccwgroup_ungroup() argument
159 mutex_lock(&gdev->reg_mutex); in ccwgroup_ungroup()
160 if (device_is_registered(&gdev->dev)) { in ccwgroup_ungroup()
161 __ccwgroup_remove_symlinks(gdev); in ccwgroup_ungroup()
162 device_unregister(&gdev->dev); in ccwgroup_ungroup()
164 mutex_unlock(&gdev->reg_mutex); in ccwgroup_ungroup()
171 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_ungroup_store() local
175 if (atomic_cmpxchg(&gdev->onoff, 0, 1) != 0) in ccwgroup_ungroup_store()
177 if (gdev->state != CCWGROUP_OFFLINE) { in ccwgroup_ungroup_store()
183 ccwgroup_ungroup(gdev); in ccwgroup_ungroup_store()
189 atomic_set(&gdev->onoff, 0); in ccwgroup_ungroup_store()
206 struct ccwgroup_device *gdev = in ccwgroup_ungroup_workfn() local
209 ccwgroup_ungroup(gdev); in ccwgroup_ungroup_workfn()
210 put_device(&gdev->dev); in ccwgroup_ungroup_workfn()
215 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_release() local
218 for (i = 0; i < gdev->count; i++) { in ccwgroup_release()
219 struct ccw_device *cdev = gdev->cdev[i]; in ccwgroup_release()
224 if (dev_get_drvdata(&cdev->dev) == gdev) in ccwgroup_release()
231 kfree(gdev); in ccwgroup_release()
234 static int __ccwgroup_create_symlinks(struct ccwgroup_device *gdev) in __ccwgroup_create_symlinks() argument
239 for (i = 0; i < gdev->count; i++) { in __ccwgroup_create_symlinks()
240 rc = sysfs_create_link(&gdev->cdev[i]->dev.kobj, in __ccwgroup_create_symlinks()
241 &gdev->dev.kobj, "group_device"); in __ccwgroup_create_symlinks()
244 sysfs_remove_link(&gdev->cdev[i]->dev.kobj, in __ccwgroup_create_symlinks()
249 for (i = 0; i < gdev->count; i++) { in __ccwgroup_create_symlinks()
251 rc = sysfs_create_link(&gdev->dev.kobj, in __ccwgroup_create_symlinks()
252 &gdev->cdev[i]->dev.kobj, str); in __ccwgroup_create_symlinks()
256 sysfs_remove_link(&gdev->dev.kobj, str); in __ccwgroup_create_symlinks()
258 for (i = 0; i < gdev->count; i++) in __ccwgroup_create_symlinks()
259 sysfs_remove_link(&gdev->cdev[i]->dev.kobj, in __ccwgroup_create_symlinks()
316 struct ccwgroup_device *gdev; in ccwgroup_create_dev() local
323 gdev = kzalloc(struct_size(gdev, cdev, num_devices), GFP_KERNEL); in ccwgroup_create_dev()
324 if (!gdev) in ccwgroup_create_dev()
327 atomic_set(&gdev->onoff, 0); in ccwgroup_create_dev()
328 mutex_init(&gdev->reg_mutex); in ccwgroup_create_dev()
329 mutex_lock(&gdev->reg_mutex); in ccwgroup_create_dev()
330 INIT_WORK(&gdev->ungroup_work, ccwgroup_ungroup_workfn); in ccwgroup_create_dev()
331 gdev->count = num_devices; in ccwgroup_create_dev()
332 gdev->dev.bus = &ccwgroup_bus_type; in ccwgroup_create_dev()
333 gdev->dev.parent = parent; in ccwgroup_create_dev()
334 gdev->dev.release = ccwgroup_release; in ccwgroup_create_dev()
335 device_initialize(&gdev->dev); in ccwgroup_create_dev()
341 gdev->cdev[i] = get_ccwdev_by_dev_id(&dev_id); in ccwgroup_create_dev()
346 if (!gdev->cdev[i] || !gdev->cdev[i]->drv || in ccwgroup_create_dev()
347 gdev->cdev[i]->drv != gdev->cdev[0]->drv || in ccwgroup_create_dev()
348 gdev->cdev[i]->id.driver_info != in ccwgroup_create_dev()
349 gdev->cdev[0]->id.driver_info) { in ccwgroup_create_dev()
354 spin_lock_irq(gdev->cdev[i]->ccwlock); in ccwgroup_create_dev()
355 if (dev_get_drvdata(&gdev->cdev[i]->dev)) { in ccwgroup_create_dev()
356 spin_unlock_irq(gdev->cdev[i]->ccwlock); in ccwgroup_create_dev()
360 dev_set_drvdata(&gdev->cdev[i]->dev, gdev); in ccwgroup_create_dev()
361 spin_unlock_irq(gdev->cdev[i]->ccwlock); in ccwgroup_create_dev()
375 gdev->cdev[0]->drv != gdrv->ccw_driver) { in ccwgroup_create_dev()
380 dev_set_name(&gdev->dev, "%s", dev_name(&gdev->cdev[0]->dev)); in ccwgroup_create_dev()
383 gdev->dev.driver = &gdrv->driver; in ccwgroup_create_dev()
384 rc = gdrv->setup ? gdrv->setup(gdev) : 0; in ccwgroup_create_dev()
388 rc = device_add(&gdev->dev); in ccwgroup_create_dev()
391 rc = __ccwgroup_create_symlinks(gdev); in ccwgroup_create_dev()
393 device_del(&gdev->dev); in ccwgroup_create_dev()
396 mutex_unlock(&gdev->reg_mutex); in ccwgroup_create_dev()
399 mutex_unlock(&gdev->reg_mutex); in ccwgroup_create_dev()
400 put_device(&gdev->dev); in ccwgroup_create_dev()
408 struct ccwgroup_device *gdev = to_ccwgroupdev(data); in ccwgroup_notifier() local
411 get_device(&gdev->dev); in ccwgroup_notifier()
412 schedule_work(&gdev->ungroup_work); in ccwgroup_notifier()
450 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_remove() local
454 gdrv->remove(gdev); in ccwgroup_remove()
459 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_shutdown() local
465 gdrv->shutdown(gdev); in ccwgroup_shutdown()
533 struct ccwgroup_device *gdev; in ccwgroup_remove_ccwdev() local
539 gdev = dev_get_drvdata(&cdev->dev); in ccwgroup_remove_ccwdev()
540 if (!gdev) { in ccwgroup_remove_ccwdev()
545 get_device(&gdev->dev); in ccwgroup_remove_ccwdev()
548 ccwgroup_ungroup(gdev); in ccwgroup_remove_ccwdev()
550 put_device(&gdev->dev); in ccwgroup_remove_ccwdev()