diff options
author | Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | 2012-10-09 22:16:30 -0400 |
---|---|---|
committer | Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | 2012-10-09 22:16:30 -0400 |
commit | 0febd3bccff3ac005a570180209e44fb7de188df (patch) | |
tree | 2af5177fb8fef95900f68c64121ad6bdc78d8761 /drivers/video/omap2/displays/panel-taal.c | |
parent | 8d93241b923bcb6a60994f8ed20fda8cc06d0fda (diff) | |
parent | 13b1ba7de8d0ecc42e4f9c002d5b0c1a48f05e58 (diff) |
Merge tag 'omapdss-for-3.7' of git://gitorious.org/linux-omap-dss2/linux into fbdev-next
Omapdss driver changes for the 3.7 merge window.
Notable changes:
* Basic writeback support for DISPC level. Writeback is not yet usable, though,
as we need higher level code to actually expose the writeback feature to
userspace.
* Rewriting the omapdss output drivers. We're trying to remove the hard links
between the omapdss and the panels, and this rewrite work moves us closer to
that goal.
* Cleanup and restructuring patches that have been made while working on device
tree support for omapdss. Device tree support is still some way ahead, but
these patches are good cleanups in themselves.
* Basic OMAP5 DSS support for DPI and DSI outputs.
* Workaround for the problem that GFX overlay's fifo is too small for high
resolution scenarios, causing underflows.
* Cleanups that remove dependencies to omap platform code.
Diffstat (limited to 'drivers/video/omap2/displays/panel-taal.c')
-rw-r--r-- | drivers/video/omap2/displays/panel-taal.c | 239 |
1 files changed, 127 insertions, 112 deletions
diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c index 3f5acc7771da..4cf94161ff51 100644 --- a/drivers/video/omap2/displays/panel-taal.c +++ b/drivers/video/omap2/displays/panel-taal.c | |||
@@ -121,6 +121,18 @@ struct taal_data { | |||
121 | 121 | ||
122 | struct omap_dss_device *dssdev; | 122 | struct omap_dss_device *dssdev; |
123 | 123 | ||
124 | /* panel specific HW info */ | ||
125 | struct panel_config *panel_config; | ||
126 | |||
127 | /* panel HW configuration from DT or platform data */ | ||
128 | int reset_gpio; | ||
129 | int ext_te_gpio; | ||
130 | |||
131 | bool use_dsi_backlight; | ||
132 | |||
133 | struct omap_dsi_pin_config pin_config; | ||
134 | |||
135 | /* runtime variables */ | ||
124 | bool enabled; | 136 | bool enabled; |
125 | u8 rotate; | 137 | u8 rotate; |
126 | bool mirror; | 138 | bool mirror; |
@@ -145,16 +157,8 @@ struct taal_data { | |||
145 | bool ulps_enabled; | 157 | bool ulps_enabled; |
146 | unsigned ulps_timeout; | 158 | unsigned ulps_timeout; |
147 | struct delayed_work ulps_work; | 159 | struct delayed_work ulps_work; |
148 | |||
149 | struct panel_config *panel_config; | ||
150 | }; | 160 | }; |
151 | 161 | ||
152 | static inline struct nokia_dsi_panel_data | ||
153 | *get_panel_data(const struct omap_dss_device *dssdev) | ||
154 | { | ||
155 | return (struct nokia_dsi_panel_data *) dssdev->data; | ||
156 | } | ||
157 | |||
158 | static void taal_esd_work(struct work_struct *work); | 162 | static void taal_esd_work(struct work_struct *work); |
159 | static void taal_ulps_work(struct work_struct *work); | 163 | static void taal_ulps_work(struct work_struct *work); |
160 | 164 | ||
@@ -371,7 +375,6 @@ static void taal_cancel_ulps_work(struct omap_dss_device *dssdev) | |||
371 | static int taal_enter_ulps(struct omap_dss_device *dssdev) | 375 | static int taal_enter_ulps(struct omap_dss_device *dssdev) |
372 | { | 376 | { |
373 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); | 377 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); |
374 | struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev); | ||
375 | int r; | 378 | int r; |
376 | 379 | ||
377 | if (td->ulps_enabled) | 380 | if (td->ulps_enabled) |
@@ -383,7 +386,8 @@ static int taal_enter_ulps(struct omap_dss_device *dssdev) | |||
383 | if (r) | 386 | if (r) |
384 | goto err; | 387 | goto err; |
385 | 388 | ||
386 | disable_irq(gpio_to_irq(panel_data->ext_te_gpio)); | 389 | if (gpio_is_valid(td->ext_te_gpio)) |
390 | disable_irq(gpio_to_irq(td->ext_te_gpio)); | ||
387 | 391 | ||
388 | omapdss_dsi_display_disable(dssdev, false, true); | 392 | omapdss_dsi_display_disable(dssdev, false, true); |
389 | 393 | ||
@@ -405,7 +409,6 @@ err: | |||
405 | static int taal_exit_ulps(struct omap_dss_device *dssdev) | 409 | static int taal_exit_ulps(struct omap_dss_device *dssdev) |
406 | { | 410 | { |
407 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); | 411 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); |
408 | struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev); | ||
409 | int r; | 412 | int r; |
410 | 413 | ||
411 | if (!td->ulps_enabled) | 414 | if (!td->ulps_enabled) |
@@ -425,7 +428,8 @@ static int taal_exit_ulps(struct omap_dss_device *dssdev) | |||
425 | goto err2; | 428 | goto err2; |
426 | } | 429 | } |
427 | 430 | ||
428 | enable_irq(gpio_to_irq(panel_data->ext_te_gpio)); | 431 | if (gpio_is_valid(td->ext_te_gpio)) |
432 | enable_irq(gpio_to_irq(td->ext_te_gpio)); | ||
429 | 433 | ||
430 | taal_queue_ulps_work(dssdev); | 434 | taal_queue_ulps_work(dssdev); |
431 | 435 | ||
@@ -438,7 +442,8 @@ err2: | |||
438 | 442 | ||
439 | r = taal_panel_reset(dssdev); | 443 | r = taal_panel_reset(dssdev); |
440 | if (!r) { | 444 | if (!r) { |
441 | enable_irq(gpio_to_irq(panel_data->ext_te_gpio)); | 445 | if (gpio_is_valid(td->ext_te_gpio)) |
446 | enable_irq(gpio_to_irq(td->ext_te_gpio)); | ||
442 | td->ulps_enabled = false; | 447 | td->ulps_enabled = false; |
443 | } | 448 | } |
444 | err1: | 449 | err1: |
@@ -835,94 +840,135 @@ static struct attribute_group taal_attr_group = { | |||
835 | static void taal_hw_reset(struct omap_dss_device *dssdev) | 840 | static void taal_hw_reset(struct omap_dss_device *dssdev) |
836 | { | 841 | { |
837 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); | 842 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); |
838 | struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev); | ||
839 | 843 | ||
840 | if (panel_data->reset_gpio == -1) | 844 | if (!gpio_is_valid(td->reset_gpio)) |
841 | return; | 845 | return; |
842 | 846 | ||
843 | gpio_set_value(panel_data->reset_gpio, 1); | 847 | gpio_set_value(td->reset_gpio, 1); |
844 | if (td->panel_config->reset_sequence.high) | 848 | if (td->panel_config->reset_sequence.high) |
845 | udelay(td->panel_config->reset_sequence.high); | 849 | udelay(td->panel_config->reset_sequence.high); |
846 | /* reset the panel */ | 850 | /* reset the panel */ |
847 | gpio_set_value(panel_data->reset_gpio, 0); | 851 | gpio_set_value(td->reset_gpio, 0); |
848 | /* assert reset */ | 852 | /* assert reset */ |
849 | if (td->panel_config->reset_sequence.low) | 853 | if (td->panel_config->reset_sequence.low) |
850 | udelay(td->panel_config->reset_sequence.low); | 854 | udelay(td->panel_config->reset_sequence.low); |
851 | gpio_set_value(panel_data->reset_gpio, 1); | 855 | gpio_set_value(td->reset_gpio, 1); |
852 | /* wait after releasing reset */ | 856 | /* wait after releasing reset */ |
853 | if (td->panel_config->sleep.hw_reset) | 857 | if (td->panel_config->sleep.hw_reset) |
854 | msleep(td->panel_config->sleep.hw_reset); | 858 | msleep(td->panel_config->sleep.hw_reset); |
855 | } | 859 | } |
856 | 860 | ||
861 | static void taal_probe_pdata(struct taal_data *td, | ||
862 | const struct nokia_dsi_panel_data *pdata) | ||
863 | { | ||
864 | td->reset_gpio = pdata->reset_gpio; | ||
865 | |||
866 | if (pdata->use_ext_te) | ||
867 | td->ext_te_gpio = pdata->ext_te_gpio; | ||
868 | else | ||
869 | td->ext_te_gpio = -1; | ||
870 | |||
871 | td->esd_interval = pdata->esd_interval; | ||
872 | td->ulps_timeout = pdata->ulps_timeout; | ||
873 | |||
874 | td->use_dsi_backlight = pdata->use_dsi_backlight; | ||
875 | |||
876 | td->pin_config = pdata->pin_config; | ||
877 | } | ||
878 | |||
857 | static int taal_probe(struct omap_dss_device *dssdev) | 879 | static int taal_probe(struct omap_dss_device *dssdev) |
858 | { | 880 | { |
859 | struct backlight_properties props; | 881 | struct backlight_properties props; |
860 | struct taal_data *td; | 882 | struct taal_data *td; |
861 | struct backlight_device *bldev = NULL; | 883 | struct backlight_device *bldev = NULL; |
862 | struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev); | ||
863 | struct panel_config *panel_config = NULL; | ||
864 | int r, i; | 884 | int r, i; |
885 | const char *panel_name; | ||
865 | 886 | ||
866 | dev_dbg(&dssdev->dev, "probe\n"); | 887 | dev_dbg(&dssdev->dev, "probe\n"); |
867 | 888 | ||
868 | if (!panel_data || !panel_data->name) { | 889 | td = devm_kzalloc(&dssdev->dev, sizeof(*td), GFP_KERNEL); |
869 | r = -EINVAL; | 890 | if (!td) |
870 | goto err; | 891 | return -ENOMEM; |
892 | |||
893 | dev_set_drvdata(&dssdev->dev, td); | ||
894 | td->dssdev = dssdev; | ||
895 | |||
896 | if (dssdev->data) { | ||
897 | const struct nokia_dsi_panel_data *pdata = dssdev->data; | ||
898 | |||
899 | taal_probe_pdata(td, pdata); | ||
900 | |||
901 | panel_name = pdata->name; | ||
902 | } else { | ||
903 | return -ENODEV; | ||
871 | } | 904 | } |
872 | 905 | ||
906 | if (panel_name == NULL) | ||
907 | return -EINVAL; | ||
908 | |||
873 | for (i = 0; i < ARRAY_SIZE(panel_configs); i++) { | 909 | for (i = 0; i < ARRAY_SIZE(panel_configs); i++) { |
874 | if (strcmp(panel_data->name, panel_configs[i].name) == 0) { | 910 | if (strcmp(panel_name, panel_configs[i].name) == 0) { |
875 | panel_config = &panel_configs[i]; | 911 | td->panel_config = &panel_configs[i]; |
876 | break; | 912 | break; |
877 | } | 913 | } |
878 | } | 914 | } |
879 | 915 | ||
880 | if (!panel_config) { | 916 | if (!td->panel_config) |
881 | r = -EINVAL; | 917 | return -EINVAL; |
882 | goto err; | ||
883 | } | ||
884 | 918 | ||
885 | dssdev->panel.timings = panel_config->timings; | 919 | dssdev->panel.timings = td->panel_config->timings; |
886 | dssdev->panel.dsi_pix_fmt = OMAP_DSS_DSI_FMT_RGB888; | 920 | dssdev->panel.dsi_pix_fmt = OMAP_DSS_DSI_FMT_RGB888; |
887 | 921 | dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE | | |
888 | td = kzalloc(sizeof(*td), GFP_KERNEL); | 922 | OMAP_DSS_DISPLAY_CAP_TEAR_ELIM; |
889 | if (!td) { | ||
890 | r = -ENOMEM; | ||
891 | goto err; | ||
892 | } | ||
893 | td->dssdev = dssdev; | ||
894 | td->panel_config = panel_config; | ||
895 | td->esd_interval = panel_data->esd_interval; | ||
896 | td->ulps_enabled = false; | ||
897 | td->ulps_timeout = panel_data->ulps_timeout; | ||
898 | 923 | ||
899 | mutex_init(&td->lock); | 924 | mutex_init(&td->lock); |
900 | 925 | ||
901 | atomic_set(&td->do_update, 0); | 926 | atomic_set(&td->do_update, 0); |
902 | 927 | ||
903 | td->workqueue = create_singlethread_workqueue("taal_esd"); | 928 | if (gpio_is_valid(td->reset_gpio)) { |
904 | if (td->workqueue == NULL) { | 929 | r = devm_gpio_request_one(&dssdev->dev, td->reset_gpio, |
905 | dev_err(&dssdev->dev, "can't create ESD workqueue\n"); | 930 | GPIOF_OUT_INIT_LOW, "taal rst"); |
906 | r = -ENOMEM; | 931 | if (r) { |
907 | goto err_wq; | 932 | dev_err(&dssdev->dev, "failed to request reset gpio\n"); |
933 | return r; | ||
934 | } | ||
908 | } | 935 | } |
909 | INIT_DELAYED_WORK_DEFERRABLE(&td->esd_work, taal_esd_work); | ||
910 | INIT_DELAYED_WORK(&td->ulps_work, taal_ulps_work); | ||
911 | 936 | ||
912 | dev_set_drvdata(&dssdev->dev, td); | 937 | if (gpio_is_valid(td->ext_te_gpio)) { |
938 | r = devm_gpio_request_one(&dssdev->dev, td->ext_te_gpio, | ||
939 | GPIOF_IN, "taal irq"); | ||
940 | if (r) { | ||
941 | dev_err(&dssdev->dev, "GPIO request failed\n"); | ||
942 | return r; | ||
943 | } | ||
944 | |||
945 | r = devm_request_irq(&dssdev->dev, gpio_to_irq(td->ext_te_gpio), | ||
946 | taal_te_isr, | ||
947 | IRQF_TRIGGER_RISING, | ||
948 | "taal vsync", dssdev); | ||
913 | 949 | ||
914 | if (gpio_is_valid(panel_data->reset_gpio)) { | ||
915 | r = gpio_request_one(panel_data->reset_gpio, GPIOF_OUT_INIT_LOW, | ||
916 | "taal rst"); | ||
917 | if (r) { | 950 | if (r) { |
918 | dev_err(&dssdev->dev, "failed to request reset gpio\n"); | 951 | dev_err(&dssdev->dev, "IRQ request failed\n"); |
919 | goto err_rst_gpio; | 952 | return r; |
920 | } | 953 | } |
954 | |||
955 | INIT_DELAYED_WORK_DEFERRABLE(&td->te_timeout_work, | ||
956 | taal_te_timeout_work_callback); | ||
957 | |||
958 | dev_dbg(&dssdev->dev, "Using GPIO TE\n"); | ||
921 | } | 959 | } |
922 | 960 | ||
961 | td->workqueue = create_singlethread_workqueue("taal_esd"); | ||
962 | if (td->workqueue == NULL) { | ||
963 | dev_err(&dssdev->dev, "can't create ESD workqueue\n"); | ||
964 | return -ENOMEM; | ||
965 | } | ||
966 | INIT_DELAYED_WORK_DEFERRABLE(&td->esd_work, taal_esd_work); | ||
967 | INIT_DELAYED_WORK(&td->ulps_work, taal_ulps_work); | ||
968 | |||
923 | taal_hw_reset(dssdev); | 969 | taal_hw_reset(dssdev); |
924 | 970 | ||
925 | if (panel_data->use_dsi_backlight) { | 971 | if (td->use_dsi_backlight) { |
926 | memset(&props, 0, sizeof(struct backlight_properties)); | 972 | memset(&props, 0, sizeof(struct backlight_properties)); |
927 | props.max_brightness = 255; | 973 | props.max_brightness = 255; |
928 | 974 | ||
@@ -943,31 +989,6 @@ static int taal_probe(struct omap_dss_device *dssdev) | |||
943 | taal_bl_update_status(bldev); | 989 | taal_bl_update_status(bldev); |
944 | } | 990 | } |
945 | 991 | ||
946 | if (panel_data->use_ext_te) { | ||
947 | int gpio = panel_data->ext_te_gpio; | ||
948 | |||
949 | r = gpio_request_one(gpio, GPIOF_IN, "taal irq"); | ||
950 | if (r) { | ||
951 | dev_err(&dssdev->dev, "GPIO request failed\n"); | ||
952 | goto err_gpio; | ||
953 | } | ||
954 | |||
955 | r = request_irq(gpio_to_irq(gpio), taal_te_isr, | ||
956 | IRQF_TRIGGER_RISING, | ||
957 | "taal vsync", dssdev); | ||
958 | |||
959 | if (r) { | ||
960 | dev_err(&dssdev->dev, "IRQ request failed\n"); | ||
961 | gpio_free(gpio); | ||
962 | goto err_irq; | ||
963 | } | ||
964 | |||
965 | INIT_DELAYED_WORK_DEFERRABLE(&td->te_timeout_work, | ||
966 | taal_te_timeout_work_callback); | ||
967 | |||
968 | dev_dbg(&dssdev->dev, "Using GPIO TE\n"); | ||
969 | } | ||
970 | |||
971 | r = omap_dsi_request_vc(dssdev, &td->channel); | 992 | r = omap_dsi_request_vc(dssdev, &td->channel); |
972 | if (r) { | 993 | if (r) { |
973 | dev_err(&dssdev->dev, "failed to get virtual channel\n"); | 994 | dev_err(&dssdev->dev, "failed to get virtual channel\n"); |
@@ -991,29 +1012,16 @@ static int taal_probe(struct omap_dss_device *dssdev) | |||
991 | err_vc_id: | 1012 | err_vc_id: |
992 | omap_dsi_release_vc(dssdev, td->channel); | 1013 | omap_dsi_release_vc(dssdev, td->channel); |
993 | err_req_vc: | 1014 | err_req_vc: |
994 | if (panel_data->use_ext_te) | ||
995 | free_irq(gpio_to_irq(panel_data->ext_te_gpio), dssdev); | ||
996 | err_irq: | ||
997 | if (panel_data->use_ext_te) | ||
998 | gpio_free(panel_data->ext_te_gpio); | ||
999 | err_gpio: | ||
1000 | if (bldev != NULL) | 1015 | if (bldev != NULL) |
1001 | backlight_device_unregister(bldev); | 1016 | backlight_device_unregister(bldev); |
1002 | err_bl: | 1017 | err_bl: |
1003 | if (gpio_is_valid(panel_data->reset_gpio)) | ||
1004 | gpio_free(panel_data->reset_gpio); | ||
1005 | err_rst_gpio: | ||
1006 | destroy_workqueue(td->workqueue); | 1018 | destroy_workqueue(td->workqueue); |
1007 | err_wq: | ||
1008 | kfree(td); | ||
1009 | err: | ||
1010 | return r; | 1019 | return r; |
1011 | } | 1020 | } |
1012 | 1021 | ||
1013 | static void __exit taal_remove(struct omap_dss_device *dssdev) | 1022 | static void __exit taal_remove(struct omap_dss_device *dssdev) |
1014 | { | 1023 | { |
1015 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); | 1024 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); |
1016 | struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev); | ||
1017 | struct backlight_device *bldev; | 1025 | struct backlight_device *bldev; |
1018 | 1026 | ||
1019 | dev_dbg(&dssdev->dev, "remove\n"); | 1027 | dev_dbg(&dssdev->dev, "remove\n"); |
@@ -1021,12 +1029,6 @@ static void __exit taal_remove(struct omap_dss_device *dssdev) | |||
1021 | sysfs_remove_group(&dssdev->dev.kobj, &taal_attr_group); | 1029 | sysfs_remove_group(&dssdev->dev.kobj, &taal_attr_group); |
1022 | omap_dsi_release_vc(dssdev, td->channel); | 1030 | omap_dsi_release_vc(dssdev, td->channel); |
1023 | 1031 | ||
1024 | if (panel_data->use_ext_te) { | ||
1025 | int gpio = panel_data->ext_te_gpio; | ||
1026 | free_irq(gpio_to_irq(gpio), dssdev); | ||
1027 | gpio_free(gpio); | ||
1028 | } | ||
1029 | |||
1030 | bldev = td->bldev; | 1032 | bldev = td->bldev; |
1031 | if (bldev != NULL) { | 1033 | if (bldev != NULL) { |
1032 | bldev->props.power = FB_BLANK_POWERDOWN; | 1034 | bldev->props.power = FB_BLANK_POWERDOWN; |
@@ -1040,26 +1042,31 @@ static void __exit taal_remove(struct omap_dss_device *dssdev) | |||
1040 | 1042 | ||
1041 | /* reset, to be sure that the panel is in a valid state */ | 1043 | /* reset, to be sure that the panel is in a valid state */ |
1042 | taal_hw_reset(dssdev); | 1044 | taal_hw_reset(dssdev); |
1043 | |||
1044 | if (gpio_is_valid(panel_data->reset_gpio)) | ||
1045 | gpio_free(panel_data->reset_gpio); | ||
1046 | |||
1047 | kfree(td); | ||
1048 | } | 1045 | } |
1049 | 1046 | ||
1050 | static int taal_power_on(struct omap_dss_device *dssdev) | 1047 | static int taal_power_on(struct omap_dss_device *dssdev) |
1051 | { | 1048 | { |
1052 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); | 1049 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); |
1053 | struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev); | ||
1054 | u8 id1, id2, id3; | 1050 | u8 id1, id2, id3; |
1055 | int r; | 1051 | int r; |
1056 | 1052 | ||
1057 | r = omapdss_dsi_configure_pins(dssdev, &panel_data->pin_config); | 1053 | r = omapdss_dsi_configure_pins(dssdev, &td->pin_config); |
1058 | if (r) { | 1054 | if (r) { |
1059 | dev_err(&dssdev->dev, "failed to configure DSI pins\n"); | 1055 | dev_err(&dssdev->dev, "failed to configure DSI pins\n"); |
1060 | goto err0; | 1056 | goto err0; |
1061 | }; | 1057 | }; |
1062 | 1058 | ||
1059 | omapdss_dsi_set_size(dssdev, dssdev->panel.timings.x_res, | ||
1060 | dssdev->panel.timings.y_res); | ||
1061 | omapdss_dsi_set_pixel_format(dssdev, OMAP_DSS_DSI_FMT_RGB888); | ||
1062 | omapdss_dsi_set_operation_mode(dssdev, OMAP_DSS_DSI_CMD_MODE); | ||
1063 | |||
1064 | r = omapdss_dsi_set_clocks(dssdev, 216000000, 10000000); | ||
1065 | if (r) { | ||
1066 | dev_err(&dssdev->dev, "failed to set HS and LP clocks\n"); | ||
1067 | goto err0; | ||
1068 | } | ||
1069 | |||
1063 | r = omapdss_dsi_display_enable(dssdev); | 1070 | r = omapdss_dsi_display_enable(dssdev); |
1064 | if (r) { | 1071 | if (r) { |
1065 | dev_err(&dssdev->dev, "failed to enable DSI\n"); | 1072 | dev_err(&dssdev->dev, "failed to enable DSI\n"); |
@@ -1356,7 +1363,6 @@ static int taal_update(struct omap_dss_device *dssdev, | |||
1356 | u16 x, u16 y, u16 w, u16 h) | 1363 | u16 x, u16 y, u16 w, u16 h) |
1357 | { | 1364 | { |
1358 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); | 1365 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); |
1359 | struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev); | ||
1360 | int r; | 1366 | int r; |
1361 | 1367 | ||
1362 | dev_dbg(&dssdev->dev, "update %d, %d, %d x %d\n", x, y, w, h); | 1368 | dev_dbg(&dssdev->dev, "update %d, %d, %d x %d\n", x, y, w, h); |
@@ -1380,7 +1386,7 @@ static int taal_update(struct omap_dss_device *dssdev, | |||
1380 | if (r) | 1386 | if (r) |
1381 | goto err; | 1387 | goto err; |
1382 | 1388 | ||
1383 | if (td->te_enabled && panel_data->use_ext_te) { | 1389 | if (td->te_enabled && gpio_is_valid(td->ext_te_gpio)) { |
1384 | schedule_delayed_work(&td->te_timeout_work, | 1390 | schedule_delayed_work(&td->te_timeout_work, |
1385 | msecs_to_jiffies(250)); | 1391 | msecs_to_jiffies(250)); |
1386 | atomic_set(&td->do_update, 1); | 1392 | atomic_set(&td->do_update, 1); |
@@ -1419,7 +1425,6 @@ static int taal_sync(struct omap_dss_device *dssdev) | |||
1419 | static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable) | 1425 | static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable) |
1420 | { | 1426 | { |
1421 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); | 1427 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); |
1422 | struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev); | ||
1423 | int r; | 1428 | int r; |
1424 | 1429 | ||
1425 | if (enable) | 1430 | if (enable) |
@@ -1427,7 +1432,7 @@ static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable) | |||
1427 | else | 1432 | else |
1428 | r = taal_dcs_write_0(td, MIPI_DCS_SET_TEAR_OFF); | 1433 | r = taal_dcs_write_0(td, MIPI_DCS_SET_TEAR_OFF); |
1429 | 1434 | ||
1430 | if (!panel_data->use_ext_te) | 1435 | if (!gpio_is_valid(td->ext_te_gpio)) |
1431 | omapdss_dsi_enable_te(dssdev, enable); | 1436 | omapdss_dsi_enable_te(dssdev, enable); |
1432 | 1437 | ||
1433 | if (td->panel_config->sleep.enable_te) | 1438 | if (td->panel_config->sleep.enable_te) |
@@ -1487,6 +1492,7 @@ static int taal_get_te(struct omap_dss_device *dssdev) | |||
1487 | static int taal_rotate(struct omap_dss_device *dssdev, u8 rotate) | 1492 | static int taal_rotate(struct omap_dss_device *dssdev, u8 rotate) |
1488 | { | 1493 | { |
1489 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); | 1494 | struct taal_data *td = dev_get_drvdata(&dssdev->dev); |
1495 | u16 dw, dh; | ||
1490 | int r; | 1496 | int r; |
1491 | 1497 | ||
1492 | dev_dbg(&dssdev->dev, "rotate %d\n", rotate); | 1498 | dev_dbg(&dssdev->dev, "rotate %d\n", rotate); |
@@ -1508,6 +1514,16 @@ static int taal_rotate(struct omap_dss_device *dssdev, u8 rotate) | |||
1508 | goto err; | 1514 | goto err; |
1509 | } | 1515 | } |
1510 | 1516 | ||
1517 | if (rotate == 0 || rotate == 2) { | ||
1518 | dw = dssdev->panel.timings.x_res; | ||
1519 | dh = dssdev->panel.timings.y_res; | ||
1520 | } else { | ||
1521 | dw = dssdev->panel.timings.y_res; | ||
1522 | dh = dssdev->panel.timings.x_res; | ||
1523 | } | ||
1524 | |||
1525 | omapdss_dsi_set_size(dssdev, dw, dh); | ||
1526 | |||
1511 | td->rotate = rotate; | 1527 | td->rotate = rotate; |
1512 | 1528 | ||
1513 | dsi_bus_unlock(dssdev); | 1529 | dsi_bus_unlock(dssdev); |
@@ -1726,7 +1742,6 @@ static void taal_esd_work(struct work_struct *work) | |||
1726 | struct taal_data *td = container_of(work, struct taal_data, | 1742 | struct taal_data *td = container_of(work, struct taal_data, |
1727 | esd_work.work); | 1743 | esd_work.work); |
1728 | struct omap_dss_device *dssdev = td->dssdev; | 1744 | struct omap_dss_device *dssdev = td->dssdev; |
1729 | struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev); | ||
1730 | u8 state1, state2; | 1745 | u8 state1, state2; |
1731 | int r; | 1746 | int r; |
1732 | 1747 | ||
@@ -1773,7 +1788,7 @@ static void taal_esd_work(struct work_struct *work) | |||
1773 | } | 1788 | } |
1774 | /* Self-diagnostics result is also shown on TE GPIO line. We need | 1789 | /* Self-diagnostics result is also shown on TE GPIO line. We need |
1775 | * to re-enable TE after self diagnostics */ | 1790 | * to re-enable TE after self diagnostics */ |
1776 | if (td->te_enabled && panel_data->use_ext_te) { | 1791 | if (td->te_enabled && gpio_is_valid(td->ext_te_gpio)) { |
1777 | r = taal_dcs_write_1(td, MIPI_DCS_SET_TEAR_ON, 0); | 1792 | r = taal_dcs_write_1(td, MIPI_DCS_SET_TEAR_ON, 0); |
1778 | if (r) | 1793 | if (r) |
1779 | goto err; | 1794 | goto err; |