diff options
Diffstat (limited to 'drivers/hwtracing/stm/core.c')
| -rw-r--r-- | drivers/hwtracing/stm/core.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/drivers/hwtracing/stm/core.c b/drivers/hwtracing/stm/core.c index de80d45d8df9..ff31108b066f 100644 --- a/drivers/hwtracing/stm/core.c +++ b/drivers/hwtracing/stm/core.c | |||
| @@ -67,9 +67,24 @@ static ssize_t channels_show(struct device *dev, | |||
| 67 | 67 | ||
| 68 | static DEVICE_ATTR_RO(channels); | 68 | static DEVICE_ATTR_RO(channels); |
| 69 | 69 | ||
| 70 | static ssize_t hw_override_show(struct device *dev, | ||
| 71 | struct device_attribute *attr, | ||
| 72 | char *buf) | ||
| 73 | { | ||
| 74 | struct stm_device *stm = to_stm_device(dev); | ||
| 75 | int ret; | ||
| 76 | |||
| 77 | ret = sprintf(buf, "%u\n", stm->data->hw_override); | ||
| 78 | |||
| 79 | return ret; | ||
| 80 | } | ||
| 81 | |||
| 82 | static DEVICE_ATTR_RO(hw_override); | ||
| 83 | |||
| 70 | static struct attribute *stm_attrs[] = { | 84 | static struct attribute *stm_attrs[] = { |
| 71 | &dev_attr_masters.attr, | 85 | &dev_attr_masters.attr, |
| 72 | &dev_attr_channels.attr, | 86 | &dev_attr_channels.attr, |
| 87 | &dev_attr_hw_override.attr, | ||
| 73 | NULL, | 88 | NULL, |
| 74 | }; | 89 | }; |
| 75 | 90 | ||
| @@ -546,8 +561,6 @@ static int stm_char_policy_set_ioctl(struct stm_file *stmf, void __user *arg) | |||
| 546 | if (ret) | 561 | if (ret) |
| 547 | goto err_free; | 562 | goto err_free; |
| 548 | 563 | ||
| 549 | ret = 0; | ||
| 550 | |||
| 551 | if (stm->data->link) | 564 | if (stm->data->link) |
| 552 | ret = stm->data->link(stm->data, stmf->output.master, | 565 | ret = stm->data->link(stm->data, stmf->output.master, |
| 553 | stmf->output.channel); | 566 | stmf->output.channel); |
| @@ -668,18 +681,11 @@ int stm_register_device(struct device *parent, struct stm_data *stm_data, | |||
| 668 | stm->dev.parent = parent; | 681 | stm->dev.parent = parent; |
| 669 | stm->dev.release = stm_device_release; | 682 | stm->dev.release = stm_device_release; |
| 670 | 683 | ||
| 671 | err = kobject_set_name(&stm->dev.kobj, "%s", stm_data->name); | ||
| 672 | if (err) | ||
| 673 | goto err_device; | ||
| 674 | |||
| 675 | err = device_add(&stm->dev); | ||
| 676 | if (err) | ||
| 677 | goto err_device; | ||
| 678 | |||
| 679 | mutex_init(&stm->link_mutex); | 684 | mutex_init(&stm->link_mutex); |
| 680 | spin_lock_init(&stm->link_lock); | 685 | spin_lock_init(&stm->link_lock); |
| 681 | INIT_LIST_HEAD(&stm->link_list); | 686 | INIT_LIST_HEAD(&stm->link_list); |
| 682 | 687 | ||
| 688 | /* initialize the object before it is accessible via sysfs */ | ||
| 683 | spin_lock_init(&stm->mc_lock); | 689 | spin_lock_init(&stm->mc_lock); |
| 684 | mutex_init(&stm->policy_mutex); | 690 | mutex_init(&stm->policy_mutex); |
| 685 | stm->sw_nmasters = nmasters; | 691 | stm->sw_nmasters = nmasters; |
| @@ -687,9 +693,19 @@ int stm_register_device(struct device *parent, struct stm_data *stm_data, | |||
| 687 | stm->data = stm_data; | 693 | stm->data = stm_data; |
| 688 | stm_data->stm = stm; | 694 | stm_data->stm = stm; |
| 689 | 695 | ||
| 696 | err = kobject_set_name(&stm->dev.kobj, "%s", stm_data->name); | ||
| 697 | if (err) | ||
| 698 | goto err_device; | ||
| 699 | |||
| 700 | err = device_add(&stm->dev); | ||
| 701 | if (err) | ||
| 702 | goto err_device; | ||
| 703 | |||
| 690 | return 0; | 704 | return 0; |
| 691 | 705 | ||
| 692 | err_device: | 706 | err_device: |
| 707 | unregister_chrdev(stm->major, stm_data->name); | ||
| 708 | |||
| 693 | /* matches device_initialize() above */ | 709 | /* matches device_initialize() above */ |
| 694 | put_device(&stm->dev); | 710 | put_device(&stm->dev); |
| 695 | err_free: | 711 | err_free: |
