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

Input: ads7846 - handle errors from sysfs

Add sysfs error handling and switch to using attribute groups
to simplify it.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

+61 -34
+61 -34
drivers/input/touchscreen/ads7846.c
··· 76 76 char phys[32]; 77 77 78 78 struct spi_device *spi; 79 + struct attribute_group *attr_group; 79 80 u16 model; 80 81 u16 vref_delay_usecs; 81 82 u16 x_plate_ohms; ··· 317 316 } 318 317 319 318 static DEVICE_ATTR(disable, 0664, ads7846_disable_show, ads7846_disable_store); 319 + 320 + static struct attribute *ads7846_attributes[] = { 321 + &dev_attr_temp0.attr, 322 + &dev_attr_temp1.attr, 323 + &dev_attr_vbatt.attr, 324 + &dev_attr_vaux.attr, 325 + &dev_attr_pen_down.attr, 326 + &dev_attr_disable.attr, 327 + NULL, 328 + }; 329 + 330 + static struct attribute_group ads7846_attr_group = { 331 + .attrs = ads7846_attributes, 332 + }; 333 + 334 + /* 335 + * ads7843/7845 don't have temperature sensors, and 336 + * use the other sensors a bit differently too 337 + */ 338 + 339 + static struct attribute *ads7843_attributes[] = { 340 + &dev_attr_vbatt.attr, 341 + &dev_attr_vaux.attr, 342 + &dev_attr_pen_down.attr, 343 + &dev_attr_disable.attr, 344 + NULL, 345 + }; 346 + 347 + static struct attribute_group ads7843_attr_group = { 348 + .attrs = ads7843_attributes, 349 + }; 350 + 351 + static struct attribute *ads7845_attributes[] = { 352 + &dev_attr_vaux.attr, 353 + &dev_attr_pen_down.attr, 354 + &dev_attr_disable.attr, 355 + NULL, 356 + }; 357 + 358 + static struct attribute_group ads7845_attr_group = { 359 + .attrs = ads7845_attributes, 360 + }; 320 361 321 362 /*--------------------------------------------------------------------------*/ 322 363 ··· 831 788 (void) ads7846_read12_ser(&spi->dev, 832 789 READ_12BIT_SER(vaux) | ADS_PD10_ALL_ON); 833 790 834 - /* ads7843/7845 don't have temperature sensors, and 835 - * use the other sensors a bit differently too 836 - */ 837 - if (ts->model == 7846) { 838 - device_create_file(&spi->dev, &dev_attr_temp0); 839 - device_create_file(&spi->dev, &dev_attr_temp1); 791 + switch (ts->model) { 792 + case 7846: 793 + ts->attr_group = &ads7846_attr_group; 794 + break; 795 + case 7845: 796 + ts->attr_group = &ads7845_attr_group; 797 + break; 798 + default: 799 + ts->attr_group = &ads7843_attr_group; 800 + break; 840 801 } 841 - if (ts->model != 7845) 842 - device_create_file(&spi->dev, &dev_attr_vbatt); 843 - device_create_file(&spi->dev, &dev_attr_vaux); 844 - 845 - device_create_file(&spi->dev, &dev_attr_pen_down); 846 - 847 - device_create_file(&spi->dev, &dev_attr_disable); 802 + err = sysfs_create_group(&spi->dev.kobj, ts->attr_group); 803 + if (err) 804 + goto err_free_irq; 848 805 849 806 err = input_register_device(input_dev); 850 807 if (err) 851 - goto err_remove_attr; 808 + goto err_remove_attr_group; 852 809 853 810 return 0; 854 811 855 - err_remove_attr: 856 - device_remove_file(&spi->dev, &dev_attr_disable); 857 - device_remove_file(&spi->dev, &dev_attr_pen_down); 858 - if (ts->model == 7846) { 859 - device_remove_file(&spi->dev, &dev_attr_temp1); 860 - device_remove_file(&spi->dev, &dev_attr_temp0); 861 - } 862 - if (ts->model != 7845) 863 - device_remove_file(&spi->dev, &dev_attr_vbatt); 864 - device_remove_file(&spi->dev, &dev_attr_vaux); 865 - 812 + err_remove_attr_group: 813 + sysfs_remove_group(&spi->dev.kobj, ts->attr_group); 814 + err_free_irq: 866 815 free_irq(spi->irq, ts); 867 816 err_free_mem: 868 817 input_free_device(input_dev); ··· 870 835 871 836 ads7846_suspend(spi, PMSG_SUSPEND); 872 837 873 - device_remove_file(&spi->dev, &dev_attr_disable); 874 - device_remove_file(&spi->dev, &dev_attr_pen_down); 875 - if (ts->model == 7846) { 876 - device_remove_file(&spi->dev, &dev_attr_temp1); 877 - device_remove_file(&spi->dev, &dev_attr_temp0); 878 - } 879 - if (ts->model != 7845) 880 - device_remove_file(&spi->dev, &dev_attr_vbatt); 881 - device_remove_file(&spi->dev, &dev_attr_vaux); 838 + sysfs_remove_group(&spi->dev.kobj, ts->attr_group); 882 839 883 840 free_irq(ts->spi->irq, ts); 884 841 /* suspend left the IRQ disabled */