|
27 | 27 | #define to_smd_subdev(d) container_of(d, struct qcom_rproc_subdev, subdev)
|
28 | 28 | #define to_ssr_subdev(d) container_of(d, struct qcom_rproc_ssr, subdev)
|
29 | 29 | #define to_pdm_subdev(d) container_of(d, struct qcom_rproc_pdm, subdev)
|
| 30 | +#define to_sns_reg_subdev(d) container_of(d, struct qcom_rproc_sns_reg, subdev) |
30 | 31 |
|
31 | 32 | #define MAX_NUM_OF_SS 10
|
32 | 33 | #define MAX_REGION_NAME_LENGTH 16
|
@@ -641,5 +642,83 @@ void qcom_remove_pdm_subdev(struct rproc *rproc, struct qcom_rproc_pdm *pdm)
|
641 | 642 | }
|
642 | 643 | EXPORT_SYMBOL_GPL(qcom_remove_pdm_subdev);
|
643 | 644 |
|
| 645 | +static int sns_reg_prepare(struct rproc_subdev *subdev) |
| 646 | +{ |
| 647 | + struct qcom_rproc_sns_reg *sns_reg = to_sns_reg_subdev(subdev); |
| 648 | + struct auxiliary_device *adev; |
| 649 | + int ret; |
| 650 | + |
| 651 | + adev = kzalloc(sizeof(*adev), GFP_KERNEL); |
| 652 | + if (!adev) |
| 653 | + return -ENOMEM; |
| 654 | + |
| 655 | + adev->dev.parent = sns_reg->rproc_dev; |
| 656 | + /* yes, we can reuse release helper from PDM */ |
| 657 | + adev->dev.release = pdm_dev_release; |
| 658 | + adev->name = "sns-reg"; |
| 659 | + adev->id = sns_reg->rproc_index; |
| 660 | + |
| 661 | + ret = auxiliary_device_init(adev); |
| 662 | + if (ret) { |
| 663 | + kfree(adev); |
| 664 | + return ret; |
| 665 | + } |
| 666 | + |
| 667 | + ret = auxiliary_device_add(adev); |
| 668 | + if (ret) { |
| 669 | + auxiliary_device_uninit(adev); |
| 670 | + return ret; |
| 671 | + } |
| 672 | + |
| 673 | + sns_reg->adev = adev; |
| 674 | + |
| 675 | + return 0; |
| 676 | +} |
| 677 | + |
| 678 | +static void sns_reg_unprepare(struct rproc_subdev *subdev) |
| 679 | +{ |
| 680 | + struct qcom_rproc_sns_reg *sns_reg = to_sns_reg_subdev(subdev); |
| 681 | + |
| 682 | + if (!sns_reg->adev) |
| 683 | + return; |
| 684 | + |
| 685 | + auxiliary_device_delete(sns_reg->adev); |
| 686 | + auxiliary_device_uninit(sns_reg->adev); |
| 687 | + sns_reg->adev = NULL; |
| 688 | +} |
| 689 | + |
| 690 | +/** |
| 691 | + * qcom_add_sns_reg_subdev() - register sns-reg subdevice |
| 692 | + * @rproc: rproc handle |
| 693 | + * @sns_reg: sns-reg subdevice handle |
| 694 | + * |
| 695 | + * Register @sns_reg so that Sensor Registry service is started when the |
| 696 | + * DSP is started. |
| 697 | + */ |
| 698 | +void qcom_add_sns_reg_subdev(struct rproc *rproc, struct qcom_rproc_sns_reg *sns_reg) |
| 699 | +{ |
| 700 | + sns_reg->rproc_dev = &rproc->dev; |
| 701 | + sns_reg->rproc_index = rproc->index; |
| 702 | + |
| 703 | + sns_reg->subdev.prepare = sns_reg_prepare; |
| 704 | + sns_reg->subdev.unprepare = sns_reg_unprepare; |
| 705 | + |
| 706 | + rproc_add_subdev(rproc, &sns_reg->subdev); |
| 707 | +} |
| 708 | +EXPORT_SYMBOL_GPL(qcom_add_sns_reg_subdev); |
| 709 | + |
| 710 | +/** |
| 711 | + * qcom_remove_sns_reg_subdev() - remove sns-reg subdevice |
| 712 | + * @rproc: rproc handle |
| 713 | + * @sns_reg: sns-reg subdevice handle |
| 714 | + * |
| 715 | + * Remove the Sensor Registry subdevice. |
| 716 | + */ |
| 717 | +void qcom_remove_sns_reg_subdev(struct rproc *rproc, struct qcom_rproc_sns_reg *sns_reg) |
| 718 | +{ |
| 719 | + rproc_remove_subdev(rproc, &sns_reg->subdev); |
| 720 | +} |
| 721 | +EXPORT_SYMBOL_GPL(qcom_remove_sns_reg_subdev); |
| 722 | + |
644 | 723 | MODULE_DESCRIPTION("Qualcomm Remoteproc helper driver");
|
645 | 724 | MODULE_LICENSE("GPL v2");
|
0 commit comments