Lines Matching refs:gdev

35 static void __ccwgroup_remove_symlinks(struct ccwgroup_device *gdev)  in __ccwgroup_remove_symlinks()  argument
40 for (i = 0; i < gdev->count; i++) { in __ccwgroup_remove_symlinks()
42 sysfs_remove_link(&gdev->dev.kobj, str); in __ccwgroup_remove_symlinks()
43 sysfs_remove_link(&gdev->cdev[i]->dev.kobj, "group_device"); in __ccwgroup_remove_symlinks()
51 static void __ccwgroup_remove_cdev_refs(struct ccwgroup_device *gdev) in __ccwgroup_remove_cdev_refs() argument
56 for (i = 0; i < gdev->count; i++) { in __ccwgroup_remove_cdev_refs()
57 cdev = gdev->cdev[i]; in __ccwgroup_remove_cdev_refs()
63 gdev->cdev[i] = NULL; in __ccwgroup_remove_cdev_refs()
76 int ccwgroup_set_online(struct ccwgroup_device *gdev) in ccwgroup_set_online() argument
78 struct ccwgroup_driver *gdrv = to_ccwgroupdrv(gdev->dev.driver); in ccwgroup_set_online()
81 if (atomic_cmpxchg(&gdev->onoff, 0, 1) != 0) in ccwgroup_set_online()
83 if (gdev->state == CCWGROUP_ONLINE) in ccwgroup_set_online()
86 ret = gdrv->set_online(gdev); in ccwgroup_set_online()
90 gdev->state = CCWGROUP_ONLINE; in ccwgroup_set_online()
92 atomic_set(&gdev->onoff, 0); in ccwgroup_set_online()
105 int ccwgroup_set_offline(struct ccwgroup_device *gdev) in ccwgroup_set_offline() argument
107 struct ccwgroup_driver *gdrv = to_ccwgroupdrv(gdev->dev.driver); in ccwgroup_set_offline()
110 if (atomic_cmpxchg(&gdev->onoff, 0, 1) != 0) in ccwgroup_set_offline()
112 if (gdev->state == CCWGROUP_OFFLINE) in ccwgroup_set_offline()
115 ret = gdrv->set_offline(gdev); in ccwgroup_set_offline()
119 gdev->state = CCWGROUP_OFFLINE; in ccwgroup_set_offline()
121 atomic_set(&gdev->onoff, 0); in ccwgroup_set_offline()
130 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_online_store() local
145 ret = ccwgroup_set_online(gdev); in ccwgroup_online_store()
147 ret = ccwgroup_set_offline(gdev); in ccwgroup_online_store()
159 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_online_show() local
162 online = (gdev->state == CCWGROUP_ONLINE) ? 1 : 0; in ccwgroup_online_show()
171 static void ccwgroup_ungroup(struct ccwgroup_device *gdev) in ccwgroup_ungroup() argument
173 mutex_lock(&gdev->reg_mutex); in ccwgroup_ungroup()
174 if (device_is_registered(&gdev->dev)) { in ccwgroup_ungroup()
175 __ccwgroup_remove_symlinks(gdev); in ccwgroup_ungroup()
176 device_unregister(&gdev->dev); in ccwgroup_ungroup()
177 __ccwgroup_remove_cdev_refs(gdev); in ccwgroup_ungroup()
179 mutex_unlock(&gdev->reg_mutex); in ccwgroup_ungroup()
186 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_ungroup_store() local
190 if (atomic_cmpxchg(&gdev->onoff, 0, 1) != 0) in ccwgroup_ungroup_store()
192 if (gdev->state != CCWGROUP_OFFLINE) { in ccwgroup_ungroup_store()
198 ccwgroup_ungroup(gdev); in ccwgroup_ungroup_store()
204 atomic_set(&gdev->onoff, 0); in ccwgroup_ungroup_store()
227 struct ccwgroup_device *gdev = in ccwgroup_ungroup_workfn() local
230 ccwgroup_ungroup(gdev); in ccwgroup_ungroup_workfn()
231 put_device(&gdev->dev); in ccwgroup_ungroup_workfn()
239 static int __ccwgroup_create_symlinks(struct ccwgroup_device *gdev) in __ccwgroup_create_symlinks() argument
244 for (i = 0; i < gdev->count; i++) { in __ccwgroup_create_symlinks()
245 rc = sysfs_create_link(&gdev->cdev[i]->dev.kobj, in __ccwgroup_create_symlinks()
246 &gdev->dev.kobj, "group_device"); in __ccwgroup_create_symlinks()
249 sysfs_remove_link(&gdev->cdev[i]->dev.kobj, in __ccwgroup_create_symlinks()
254 for (i = 0; i < gdev->count; i++) { in __ccwgroup_create_symlinks()
256 rc = sysfs_create_link(&gdev->dev.kobj, in __ccwgroup_create_symlinks()
257 &gdev->cdev[i]->dev.kobj, str); in __ccwgroup_create_symlinks()
261 sysfs_remove_link(&gdev->dev.kobj, str); in __ccwgroup_create_symlinks()
263 for (i = 0; i < gdev->count; i++) in __ccwgroup_create_symlinks()
264 sysfs_remove_link(&gdev->cdev[i]->dev.kobj, in __ccwgroup_create_symlinks()
321 struct ccwgroup_device *gdev; in ccwgroup_create_dev() local
325 gdev = kzalloc(sizeof(*gdev) + num_devices * sizeof(gdev->cdev[0]), in ccwgroup_create_dev()
327 if (!gdev) in ccwgroup_create_dev()
330 atomic_set(&gdev->onoff, 0); in ccwgroup_create_dev()
331 mutex_init(&gdev->reg_mutex); in ccwgroup_create_dev()
332 mutex_lock(&gdev->reg_mutex); in ccwgroup_create_dev()
333 INIT_WORK(&gdev->ungroup_work, ccwgroup_ungroup_workfn); in ccwgroup_create_dev()
334 gdev->count = num_devices; in ccwgroup_create_dev()
335 gdev->dev.bus = &ccwgroup_bus_type; in ccwgroup_create_dev()
336 gdev->dev.parent = parent; in ccwgroup_create_dev()
337 gdev->dev.release = ccwgroup_release; in ccwgroup_create_dev()
338 device_initialize(&gdev->dev); in ccwgroup_create_dev()
344 gdev->cdev[i] = get_ccwdev_by_dev_id(&dev_id); in ccwgroup_create_dev()
349 if (!gdev->cdev[i] || !gdev->cdev[i]->drv || in ccwgroup_create_dev()
350 gdev->cdev[i]->drv != gdev->cdev[0]->drv || in ccwgroup_create_dev()
351 gdev->cdev[i]->id.driver_info != in ccwgroup_create_dev()
352 gdev->cdev[0]->id.driver_info) { in ccwgroup_create_dev()
357 spin_lock_irq(gdev->cdev[i]->ccwlock); in ccwgroup_create_dev()
358 if (dev_get_drvdata(&gdev->cdev[i]->dev)) { in ccwgroup_create_dev()
359 spin_unlock_irq(gdev->cdev[i]->ccwlock); in ccwgroup_create_dev()
363 dev_set_drvdata(&gdev->cdev[i]->dev, gdev); in ccwgroup_create_dev()
364 spin_unlock_irq(gdev->cdev[i]->ccwlock); in ccwgroup_create_dev()
377 dev_set_name(&gdev->dev, "%s", dev_name(&gdev->cdev[0]->dev)); in ccwgroup_create_dev()
378 gdev->dev.groups = ccwgroup_attr_groups; in ccwgroup_create_dev()
381 gdev->dev.driver = &gdrv->driver; in ccwgroup_create_dev()
382 rc = gdrv->setup ? gdrv->setup(gdev) : 0; in ccwgroup_create_dev()
386 rc = device_add(&gdev->dev); in ccwgroup_create_dev()
389 rc = __ccwgroup_create_symlinks(gdev); in ccwgroup_create_dev()
391 device_del(&gdev->dev); in ccwgroup_create_dev()
394 mutex_unlock(&gdev->reg_mutex); in ccwgroup_create_dev()
398 if (gdev->cdev[i]) { in ccwgroup_create_dev()
399 spin_lock_irq(gdev->cdev[i]->ccwlock); in ccwgroup_create_dev()
400 if (dev_get_drvdata(&gdev->cdev[i]->dev) == gdev) in ccwgroup_create_dev()
401 dev_set_drvdata(&gdev->cdev[i]->dev, NULL); in ccwgroup_create_dev()
402 spin_unlock_irq(gdev->cdev[i]->ccwlock); in ccwgroup_create_dev()
403 put_device(&gdev->cdev[i]->dev); in ccwgroup_create_dev()
404 gdev->cdev[i] = NULL; in ccwgroup_create_dev()
406 mutex_unlock(&gdev->reg_mutex); in ccwgroup_create_dev()
407 put_device(&gdev->dev); in ccwgroup_create_dev()
415 struct ccwgroup_device *gdev = to_ccwgroupdev(data); in ccwgroup_notifier() local
418 get_device(&gdev->dev); in ccwgroup_notifier()
419 schedule_work(&gdev->ungroup_work); in ccwgroup_notifier()
457 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_remove() local
463 gdrv->remove(gdev); in ccwgroup_remove()
470 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_shutdown() local
476 gdrv->shutdown(gdev); in ccwgroup_shutdown()
481 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_pm_prepare() local
482 struct ccwgroup_driver *gdrv = to_ccwgroupdrv(gdev->dev.driver); in ccwgroup_pm_prepare()
485 if (atomic_read(&gdev->onoff)) in ccwgroup_pm_prepare()
488 if (!gdev->dev.driver || gdev->state != CCWGROUP_ONLINE) in ccwgroup_pm_prepare()
491 return gdrv->prepare ? gdrv->prepare(gdev) : 0; in ccwgroup_pm_prepare()
496 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_pm_complete() local
499 if (!gdev->dev.driver || gdev->state != CCWGROUP_ONLINE) in ccwgroup_pm_complete()
503 gdrv->complete(gdev); in ccwgroup_pm_complete()
508 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_pm_freeze() local
509 struct ccwgroup_driver *gdrv = to_ccwgroupdrv(gdev->dev.driver); in ccwgroup_pm_freeze()
511 if (!gdev->dev.driver || gdev->state != CCWGROUP_ONLINE) in ccwgroup_pm_freeze()
514 return gdrv->freeze ? gdrv->freeze(gdev) : 0; in ccwgroup_pm_freeze()
519 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_pm_thaw() local
520 struct ccwgroup_driver *gdrv = to_ccwgroupdrv(gdev->dev.driver); in ccwgroup_pm_thaw()
522 if (!gdev->dev.driver || gdev->state != CCWGROUP_ONLINE) in ccwgroup_pm_thaw()
525 return gdrv->thaw ? gdrv->thaw(gdev) : 0; in ccwgroup_pm_thaw()
530 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_pm_restore() local
531 struct ccwgroup_driver *gdrv = to_ccwgroupdrv(gdev->dev.driver); in ccwgroup_pm_restore()
533 if (!gdev->dev.driver || gdev->state != CCWGROUP_ONLINE) in ccwgroup_pm_restore()
536 return gdrv->restore ? gdrv->restore(gdev) : 0; in ccwgroup_pm_restore()
587 struct ccwgroup_device *gdev = to_ccwgroupdev(dev); in ccwgroup_driver_unregister() local
589 ccwgroup_ungroup(gdev); in ccwgroup_driver_unregister()
621 struct ccwgroup_device *gdev; in ccwgroup_remove_ccwdev() local
627 gdev = dev_get_drvdata(&cdev->dev); in ccwgroup_remove_ccwdev()
628 if (!gdev) { in ccwgroup_remove_ccwdev()
633 get_device(&gdev->dev); in ccwgroup_remove_ccwdev()
636 ccwgroup_ungroup(gdev); in ccwgroup_remove_ccwdev()
638 put_device(&gdev->dev); in ccwgroup_remove_ccwdev()