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

OMAPDSS: Taal: use devm_* functions

Use devm_ functions in panel-taal.c's probe when possible. Also reorder
the initialization sequence so that devm_ allocations are done before
things that require explicit freeing. This simplifies the probe and
remove functions.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>

+44 -74
+44 -74
drivers/video/omap2/displays/panel-taal.c
··· 865 865 866 866 dev_dbg(&dssdev->dev, "probe\n"); 867 867 868 - if (!panel_data || !panel_data->name) { 869 - r = -EINVAL; 870 - goto err; 871 - } 868 + if (!panel_data || !panel_data->name) 869 + return -EINVAL; 872 870 873 871 for (i = 0; i < ARRAY_SIZE(panel_configs); i++) { 874 872 if (strcmp(panel_data->name, panel_configs[i].name) == 0) { ··· 875 877 } 876 878 } 877 879 878 - if (!panel_config) { 879 - r = -EINVAL; 880 - goto err; 881 - } 880 + if (!panel_config) 881 + return -EINVAL; 882 882 883 883 dssdev->panel.timings = panel_config->timings; 884 884 dssdev->panel.dsi_pix_fmt = OMAP_DSS_DSI_FMT_RGB888; 885 885 dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE | 886 886 OMAP_DSS_DISPLAY_CAP_TEAR_ELIM; 887 887 888 - td = kzalloc(sizeof(*td), GFP_KERNEL); 889 - if (!td) { 890 - r = -ENOMEM; 891 - goto err; 892 - } 888 + td = devm_kzalloc(&dssdev->dev, sizeof(*td), GFP_KERNEL); 889 + if (!td) 890 + return -ENOMEM; 893 891 td->dssdev = dssdev; 894 892 td->panel_config = panel_config; 895 893 td->esd_interval = panel_data->esd_interval; ··· 896 902 897 903 atomic_set(&td->do_update, 0); 898 904 899 - td->workqueue = create_singlethread_workqueue("taal_esd"); 900 - if (td->workqueue == NULL) { 901 - dev_err(&dssdev->dev, "can't create ESD workqueue\n"); 902 - r = -ENOMEM; 903 - goto err_wq; 904 - } 905 - INIT_DELAYED_WORK_DEFERRABLE(&td->esd_work, taal_esd_work); 906 - INIT_DELAYED_WORK(&td->ulps_work, taal_ulps_work); 907 - 908 905 dev_set_drvdata(&dssdev->dev, td); 909 906 910 907 if (gpio_is_valid(panel_data->reset_gpio)) { 911 - r = gpio_request_one(panel_data->reset_gpio, GPIOF_OUT_INIT_LOW, 912 - "taal rst"); 908 + r = devm_gpio_request_one(&dssdev->dev, panel_data->reset_gpio, 909 + GPIOF_OUT_INIT_LOW, "taal rst"); 913 910 if (r) { 914 911 dev_err(&dssdev->dev, "failed to request reset gpio\n"); 915 - goto err_rst_gpio; 912 + return r; 916 913 } 917 914 } 915 + 916 + if (panel_data->use_ext_te) { 917 + int gpio = panel_data->ext_te_gpio; 918 + 919 + r = devm_gpio_request_one(&dssdev->dev, gpio, GPIOF_IN, 920 + "taal irq"); 921 + if (r) { 922 + dev_err(&dssdev->dev, "GPIO request failed\n"); 923 + return r; 924 + } 925 + 926 + r = devm_request_irq(&dssdev->dev, gpio_to_irq(gpio), 927 + taal_te_isr, 928 + IRQF_TRIGGER_RISING, 929 + "taal vsync", dssdev); 930 + 931 + if (r) { 932 + dev_err(&dssdev->dev, "IRQ request failed\n"); 933 + return r; 934 + } 935 + 936 + INIT_DELAYED_WORK_DEFERRABLE(&td->te_timeout_work, 937 + taal_te_timeout_work_callback); 938 + 939 + dev_dbg(&dssdev->dev, "Using GPIO TE\n"); 940 + } 941 + 942 + td->workqueue = create_singlethread_workqueue("taal_esd"); 943 + if (td->workqueue == NULL) { 944 + dev_err(&dssdev->dev, "can't create ESD workqueue\n"); 945 + return -ENOMEM; 946 + } 947 + INIT_DELAYED_WORK_DEFERRABLE(&td->esd_work, taal_esd_work); 948 + INIT_DELAYED_WORK(&td->ulps_work, taal_ulps_work); 918 949 919 950 taal_hw_reset(dssdev); 920 951 ··· 962 943 bldev->props.brightness = 255; 963 944 964 945 taal_bl_update_status(bldev); 965 - } 966 - 967 - if (panel_data->use_ext_te) { 968 - int gpio = panel_data->ext_te_gpio; 969 - 970 - r = gpio_request_one(gpio, GPIOF_IN, "taal irq"); 971 - if (r) { 972 - dev_err(&dssdev->dev, "GPIO request failed\n"); 973 - goto err_gpio; 974 - } 975 - 976 - r = request_irq(gpio_to_irq(gpio), taal_te_isr, 977 - IRQF_TRIGGER_RISING, 978 - "taal vsync", dssdev); 979 - 980 - if (r) { 981 - dev_err(&dssdev->dev, "IRQ request failed\n"); 982 - gpio_free(gpio); 983 - goto err_irq; 984 - } 985 - 986 - INIT_DELAYED_WORK_DEFERRABLE(&td->te_timeout_work, 987 - taal_te_timeout_work_callback); 988 - 989 - dev_dbg(&dssdev->dev, "Using GPIO TE\n"); 990 946 } 991 947 992 948 r = omap_dsi_request_vc(dssdev, &td->channel); ··· 987 993 err_vc_id: 988 994 omap_dsi_release_vc(dssdev, td->channel); 989 995 err_req_vc: 990 - if (panel_data->use_ext_te) 991 - free_irq(gpio_to_irq(panel_data->ext_te_gpio), dssdev); 992 - err_irq: 993 - if (panel_data->use_ext_te) 994 - gpio_free(panel_data->ext_te_gpio); 995 - err_gpio: 996 996 if (bldev != NULL) 997 997 backlight_device_unregister(bldev); 998 998 err_bl: 999 - if (gpio_is_valid(panel_data->reset_gpio)) 1000 - gpio_free(panel_data->reset_gpio); 1001 - err_rst_gpio: 1002 999 destroy_workqueue(td->workqueue); 1003 - err_wq: 1004 - kfree(td); 1005 - err: 1006 1000 return r; 1007 1001 } 1008 1002 1009 1003 static void __exit taal_remove(struct omap_dss_device *dssdev) 1010 1004 { 1011 1005 struct taal_data *td = dev_get_drvdata(&dssdev->dev); 1012 - struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev); 1013 1006 struct backlight_device *bldev; 1014 1007 1015 1008 dev_dbg(&dssdev->dev, "remove\n"); 1016 1009 1017 1010 sysfs_remove_group(&dssdev->dev.kobj, &taal_attr_group); 1018 1011 omap_dsi_release_vc(dssdev, td->channel); 1019 - 1020 - if (panel_data->use_ext_te) { 1021 - int gpio = panel_data->ext_te_gpio; 1022 - free_irq(gpio_to_irq(gpio), dssdev); 1023 - gpio_free(gpio); 1024 - } 1025 1012 1026 1013 bldev = td->bldev; 1027 1014 if (bldev != NULL) { ··· 1017 1042 1018 1043 /* reset, to be sure that the panel is in a valid state */ 1019 1044 taal_hw_reset(dssdev); 1020 - 1021 - if (gpio_is_valid(panel_data->reset_gpio)) 1022 - gpio_free(panel_data->reset_gpio); 1023 - 1024 - kfree(td); 1025 1045 } 1026 1046 1027 1047 static int taal_power_on(struct omap_dss_device *dssdev)