Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'siox/for-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/ukleinek/linux

Pull siox updates from Uwe Kleine-König:
"This reworks how siox device registration works yielding a saner API.

This allows us to simplify the gpio bus driver using two new devm
functions"

* tag 'siox/for-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/ukleinek/linux:
siox: bus-gpio: Simplify using devm_siox_* functions
siox: Provide a devm variant of siox_master_register()
siox: Provide a devm variant of siox_master_alloc()
siox: Don't pass the reference on a master in siox_master_register()

+70 -42
+20 -42
drivers/siox/siox-bus-gpio.c
··· 91 91 int ret; 92 92 struct siox_master *smaster; 93 93 94 - smaster = siox_master_alloc(&pdev->dev, sizeof(*ddata)); 95 - if (!smaster) { 96 - dev_err(dev, "failed to allocate siox master\n"); 97 - return -ENOMEM; 98 - } 94 + smaster = devm_siox_master_alloc(dev, sizeof(*ddata)); 95 + if (!smaster) 96 + return dev_err_probe(dev, -ENOMEM, 97 + "failed to allocate siox master\n"); 99 98 100 99 platform_set_drvdata(pdev, smaster); 101 100 ddata = siox_master_get_devdata(smaster); 102 101 103 102 ddata->din = devm_gpiod_get(dev, "din", GPIOD_IN); 104 - if (IS_ERR(ddata->din)) { 105 - ret = dev_err_probe(dev, PTR_ERR(ddata->din), 106 - "Failed to get din GPIO\n"); 107 - goto err; 108 - } 103 + if (IS_ERR(ddata->din)) 104 + return dev_err_probe(dev, PTR_ERR(ddata->din), 105 + "Failed to get din GPIO\n"); 109 106 110 107 ddata->dout = devm_gpiod_get(dev, "dout", GPIOD_OUT_LOW); 111 - if (IS_ERR(ddata->dout)) { 112 - ret = dev_err_probe(dev, PTR_ERR(ddata->dout), 113 - "Failed to get dout GPIO\n"); 114 - goto err; 115 - } 108 + if (IS_ERR(ddata->dout)) 109 + return dev_err_probe(dev, PTR_ERR(ddata->dout), 110 + "Failed to get dout GPIO\n"); 116 111 117 112 ddata->dclk = devm_gpiod_get(dev, "dclk", GPIOD_OUT_LOW); 118 - if (IS_ERR(ddata->dclk)) { 119 - ret = dev_err_probe(dev, PTR_ERR(ddata->dclk), 120 - "Failed to get dclk GPIO\n"); 121 - goto err; 122 - } 113 + if (IS_ERR(ddata->dclk)) 114 + return dev_err_probe(dev, PTR_ERR(ddata->dclk), 115 + "Failed to get dclk GPIO\n"); 123 116 124 117 ddata->dld = devm_gpiod_get(dev, "dld", GPIOD_OUT_LOW); 125 - if (IS_ERR(ddata->dld)) { 126 - ret = dev_err_probe(dev, PTR_ERR(ddata->dld), 127 - "Failed to get dld GPIO\n"); 128 - goto err; 129 - } 118 + if (IS_ERR(ddata->dld)) 119 + return dev_err_probe(dev, PTR_ERR(ddata->dld), 120 + "Failed to get dld GPIO\n"); 130 121 131 122 smaster->pushpull = siox_gpio_pushpull; 132 123 /* XXX: determine automatically like spi does */ 133 124 smaster->busno = 0; 134 125 135 - ret = siox_master_register(smaster); 136 - if (ret) { 137 - dev_err_probe(dev, ret, 138 - "Failed to register siox master\n"); 139 - err: 140 - siox_master_put(smaster); 141 - } 142 - 143 - return ret; 144 - } 145 - 146 - static int siox_gpio_remove(struct platform_device *pdev) 147 - { 148 - struct siox_master *master = platform_get_drvdata(pdev); 149 - 150 - siox_master_unregister(master); 126 + ret = devm_siox_master_register(dev, smaster); 127 + if (ret) 128 + return dev_err_probe(dev, ret, 129 + "Failed to register siox master\n"); 151 130 152 131 return 0; 153 132 } ··· 139 160 140 161 static struct platform_driver siox_gpio_driver = { 141 162 .probe = siox_gpio_probe, 142 - .remove = siox_gpio_remove, 143 163 144 164 .driver = { 145 165 .name = DRIVER_NAME,
+46
drivers/siox/siox-core.c
··· 707 707 } 708 708 EXPORT_SYMBOL_GPL(siox_master_alloc); 709 709 710 + static void devm_siox_master_put(void *data) 711 + { 712 + struct siox_master *smaster = data; 713 + 714 + siox_master_put(smaster); 715 + } 716 + 717 + struct siox_master *devm_siox_master_alloc(struct device *dev, 718 + size_t size) 719 + { 720 + struct siox_master *smaster; 721 + int ret; 722 + 723 + smaster = siox_master_alloc(dev, size); 724 + if (!smaster) 725 + return NULL; 726 + 727 + ret = devm_add_action_or_reset(dev, devm_siox_master_put, smaster); 728 + if (ret) 729 + return NULL; 730 + 731 + return smaster; 732 + } 733 + EXPORT_SYMBOL_GPL(devm_siox_master_alloc); 734 + 710 735 int siox_master_register(struct siox_master *smaster) 711 736 { 712 737 int ret; ··· 741 716 742 717 if (!smaster->pushpull) 743 718 return -EINVAL; 719 + 720 + get_device(&smaster->dev); 744 721 745 722 dev_set_name(&smaster->dev, "siox-%d", smaster->busno); 746 723 ··· 794 767 put_device(&smaster->dev); 795 768 } 796 769 EXPORT_SYMBOL_GPL(siox_master_unregister); 770 + 771 + static void devm_siox_master_unregister(void *data) 772 + { 773 + struct siox_master *smaster = data; 774 + 775 + siox_master_unregister(smaster); 776 + } 777 + 778 + int devm_siox_master_register(struct device *dev, struct siox_master *smaster) 779 + { 780 + int ret; 781 + 782 + ret = siox_master_register(smaster); 783 + if (ret) 784 + return ret; 785 + 786 + return devm_add_action_or_reset(dev, devm_siox_master_unregister, smaster); 787 + } 788 + EXPORT_SYMBOL_GPL(devm_siox_master_register); 797 789 798 790 static struct siox_device *siox_device_add(struct siox_master *smaster, 799 791 const char *type, size_t inbytes,
+4
drivers/siox/siox.h
··· 45 45 put_device(&smaster->dev); 46 46 } 47 47 48 + struct siox_master *devm_siox_master_alloc(struct device *dev, size_t size); 49 + 48 50 int siox_master_register(struct siox_master *smaster); 49 51 void siox_master_unregister(struct siox_master *smaster); 52 + 53 + int devm_siox_master_register(struct device *dev, struct siox_master *smaster);