Lines Matching refs:gdev

38 static void __ccwgroup_remove_symlinks(struct ccwgroup_device *gdev)  in __ccwgroup_remove_symlinks()  argument
43 for (i = 0; i < gdev->count; i++) { in __ccwgroup_remove_symlinks()
45 sysfs_remove_link(&gdev->dev.kobj, str); in __ccwgroup_remove_symlinks()
46 sysfs_remove_link(&gdev->cdev[i]->dev.kobj, "group_device"); in __ccwgroup_remove_symlinks()
58 int ccwgroup_set_online(struct ccwgroup_device *gdev) in ccwgroup_set_online() argument
60 struct ccwgroup_driver *gdrv = to_ccwgroupdrv(gdev->dev.driver); in ccwgroup_set_online()
63 if (atomic_cmpxchg(&gdev->onoff, 0, 1) != 0) in ccwgroup_set_online()
65 if (gdev->state == CCWGROUP_ONLINE) in ccwgroup_set_online()
68 ret = gdrv->set_online(gdev); in ccwgroup_set_online()
72 gdev->state = CCWGROUP_ONLINE; in ccwgroup_set_online()
74 atomic_set(&gdev->onoff, 0); in ccwgroup_set_online()
88 int ccwgroup_set_offline(struct ccwgroup_device *gdev, bool call_gdrv) in ccwgroup_set_offline() argument
90 struct ccwgroup_driver *gdrv = to_ccwgroupdrv(gdev->dev.driver); in ccwgroup_set_offline()
93 if (atomic_cmpxchg(&gdev->onoff, 0, 1) != 0) in ccwgroup_set_offline()
95 if (gdev->state == CCWGROUP_OFFLINE) in ccwgroup_set_offline()
102 ret = gdrv->set_offline(gdev); in ccwgroup_set_offline()
107 gdev->state = CCWGROUP_OFFLINE; in ccwgroup_set_offline()
109 atomic_set(&gdev->onoff, 0); in ccwgroup_set_offline()
118 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_online_store() local
133 ret = ccwgroup_set_online(gdev); in ccwgroup_online_store()
135 ret = ccwgroup_set_offline(gdev, true); in ccwgroup_online_store()
147 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_online_show() local
150 online = (gdev->state == CCWGROUP_ONLINE) ? 1 : 0; in ccwgroup_online_show()
159 static void ccwgroup_ungroup(struct ccwgroup_device *gdev) in ccwgroup_ungroup() argument
161 mutex_lock(&gdev->reg_mutex); in ccwgroup_ungroup()
162 if (device_is_registered(&gdev->dev)) { in ccwgroup_ungroup()
163 __ccwgroup_remove_symlinks(gdev); in ccwgroup_ungroup()
164 device_unregister(&gdev->dev); in ccwgroup_ungroup()
166 mutex_unlock(&gdev->reg_mutex); in ccwgroup_ungroup()
173 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_ungroup_store() local
177 if (atomic_cmpxchg(&gdev->onoff, 0, 1) != 0) in ccwgroup_ungroup_store()
179 if (gdev->state != CCWGROUP_OFFLINE) { in ccwgroup_ungroup_store()
185 ccwgroup_ungroup(gdev); in ccwgroup_ungroup_store()
191 atomic_set(&gdev->onoff, 0); in ccwgroup_ungroup_store()
208 struct ccwgroup_device *gdev = in ccwgroup_ungroup_workfn() local
211 ccwgroup_ungroup(gdev); in ccwgroup_ungroup_workfn()
212 put_device(&gdev->dev); in ccwgroup_ungroup_workfn()
217 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_release() local
220 for (i = 0; i < gdev->count; i++) { in ccwgroup_release()
221 struct ccw_device *cdev = gdev->cdev[i]; in ccwgroup_release()
226 if (dev_get_drvdata(&cdev->dev) == gdev) in ccwgroup_release()
233 kfree(gdev); in ccwgroup_release()
236 static int __ccwgroup_create_symlinks(struct ccwgroup_device *gdev) in __ccwgroup_create_symlinks() argument
241 for (i = 0; i < gdev->count; i++) { in __ccwgroup_create_symlinks()
242 rc = sysfs_create_link(&gdev->cdev[i]->dev.kobj, in __ccwgroup_create_symlinks()
243 &gdev->dev.kobj, "group_device"); in __ccwgroup_create_symlinks()
246 sysfs_remove_link(&gdev->cdev[i]->dev.kobj, in __ccwgroup_create_symlinks()
251 for (i = 0; i < gdev->count; i++) { in __ccwgroup_create_symlinks()
253 rc = sysfs_create_link(&gdev->dev.kobj, in __ccwgroup_create_symlinks()
254 &gdev->cdev[i]->dev.kobj, str); in __ccwgroup_create_symlinks()
258 sysfs_remove_link(&gdev->dev.kobj, str); in __ccwgroup_create_symlinks()
260 for (i = 0; i < gdev->count; i++) in __ccwgroup_create_symlinks()
261 sysfs_remove_link(&gdev->cdev[i]->dev.kobj, in __ccwgroup_create_symlinks()
318 struct ccwgroup_device *gdev; in ccwgroup_create_dev() local
325 gdev = kzalloc(struct_size(gdev, cdev, num_devices), GFP_KERNEL); in ccwgroup_create_dev()
326 if (!gdev) in ccwgroup_create_dev()
329 atomic_set(&gdev->onoff, 0); in ccwgroup_create_dev()
330 mutex_init(&gdev->reg_mutex); in ccwgroup_create_dev()
331 mutex_lock(&gdev->reg_mutex); in ccwgroup_create_dev()
332 INIT_WORK(&gdev->ungroup_work, ccwgroup_ungroup_workfn); in ccwgroup_create_dev()
333 gdev->count = num_devices; in ccwgroup_create_dev()
334 gdev->dev.bus = &ccwgroup_bus_type; in ccwgroup_create_dev()
335 gdev->dev.parent = parent; in ccwgroup_create_dev()
336 gdev->dev.release = ccwgroup_release; in ccwgroup_create_dev()
337 device_initialize(&gdev->dev); in ccwgroup_create_dev()
343 gdev->cdev[i] = get_ccwdev_by_dev_id(&dev_id); in ccwgroup_create_dev()
348 if (!gdev->cdev[i] || !gdev->cdev[i]->drv || in ccwgroup_create_dev()
349 gdev->cdev[i]->drv != gdev->cdev[0]->drv || in ccwgroup_create_dev()
350 gdev->cdev[i]->id.driver_info != in ccwgroup_create_dev()
351 gdev->cdev[0]->id.driver_info) { in ccwgroup_create_dev()
356 spin_lock_irq(gdev->cdev[i]->ccwlock); in ccwgroup_create_dev()
357 if (dev_get_drvdata(&gdev->cdev[i]->dev)) { in ccwgroup_create_dev()
358 spin_unlock_irq(gdev->cdev[i]->ccwlock); in ccwgroup_create_dev()
362 dev_set_drvdata(&gdev->cdev[i]->dev, gdev); in ccwgroup_create_dev()
363 spin_unlock_irq(gdev->cdev[i]->ccwlock); in ccwgroup_create_dev()
377 gdev->cdev[0]->drv != gdrv->ccw_driver) { in ccwgroup_create_dev()
382 dev_set_name(&gdev->dev, "%s", dev_name(&gdev->cdev[0]->dev)); in ccwgroup_create_dev()
385 gdev->dev.driver = &gdrv->driver; in ccwgroup_create_dev()
386 rc = gdrv->setup ? gdrv->setup(gdev) : 0; in ccwgroup_create_dev()
390 rc = device_add(&gdev->dev); in ccwgroup_create_dev()
393 rc = __ccwgroup_create_symlinks(gdev); in ccwgroup_create_dev()
395 device_del(&gdev->dev); in ccwgroup_create_dev()
398 mutex_unlock(&gdev->reg_mutex); in ccwgroup_create_dev()
401 mutex_unlock(&gdev->reg_mutex); in ccwgroup_create_dev()
402 put_device(&gdev->dev); in ccwgroup_create_dev()
410 struct ccwgroup_device *gdev = to_ccwgroupdev(data); in ccwgroup_notifier() local
413 get_device(&gdev->dev); in ccwgroup_notifier()
414 schedule_work(&gdev->ungroup_work); in ccwgroup_notifier()
452 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_remove() local
456 gdrv->remove(gdev); in ccwgroup_remove()
461 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_shutdown() local
467 gdrv->shutdown(gdev); in ccwgroup_shutdown()
535 struct ccwgroup_device *gdev; in ccwgroup_remove_ccwdev() local
541 gdev = dev_get_drvdata(&cdev->dev); in ccwgroup_remove_ccwdev()
542 if (!gdev) { in ccwgroup_remove_ccwdev()
547 get_device(&gdev->dev); in ccwgroup_remove_ccwdev()
550 ccwgroup_ungroup(gdev); in ccwgroup_remove_ccwdev()
552 put_device(&gdev->dev); in ccwgroup_remove_ccwdev()