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

Merge tag 'omapdrm-4.13-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/tomba/linux into drm-next

omapdrm changes for v4.13

* dmabuf fence support
* TILER rotation fixes
* big pile of various cleanups and refactorings

* tag 'omapdrm-4.13-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/tomba/linux: (64 commits)
drm/omap: fix tiled buffer stride calculations
drm/omap: fix YUV422 90/270 rotation with mirroring
drm/omap: fix YUV422 rotation with TILER
drm/omap: pass rotation to dispc
drm/omap: DRM_MODE_REFLECT_* instead of mirror boolean
drm/omap: use DRM_MODE_ROTATE_* instead of OMAP_DSS_ROT_*
drm/omap: remove omap_drm_win
drm/omap: add drm_rotation_to_tiler helper()
drm/omap: rename color_mode to fourcc
drm/omap: cleanup formats array
drm/omap: remove omap_framebuffer_get_formats()
drm/omap: use DRM_FORMAT_* instead of OMAP_DSS_COLOR_*
drm/omap: use u32 instead of enum omap_color_mode
drm/omap: change supported_modes to an array
drm/omap: remove unneeded prototypes
drm/omap: add format_is_yuv() helper
drm/omap: cleanup offset calculation
drm/omap: remove dma & vrfb rotation
drm/omap: ratelimit OCP error
drm/omap: remove CLUT
...

+708 -3406
+3 -48
drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
··· 14 14 #include <linux/platform_device.h> 15 15 #include <linux/of.h> 16 16 17 - #include <video/omap-panel-data.h> 18 - 19 17 #include "../dss/omapdss.h" 20 18 21 19 struct panel_drv_data { ··· 23 25 struct device *dev; 24 26 25 27 struct videomode vm; 26 - 27 - bool invert_polarity; 28 28 }; 29 29 30 30 static const struct videomode tvc_pal_vm = { ··· 90 94 return 0; 91 95 92 96 in->ops.atv->set_timings(in, &ddata->vm); 93 - 94 - if (!ddata->dev->of_node) { 95 - in->ops.atv->set_type(in, OMAP_DSS_VENC_TYPE_COMPOSITE); 96 - 97 - in->ops.atv->invert_vid_out_polarity(in, 98 - ddata->invert_polarity); 99 - } 100 97 101 98 r = in->ops.atv->enable(in); 102 99 if (r) ··· 171 182 .get_timings = tvc_get_timings, 172 183 .check_timings = tvc_check_timings, 173 184 174 - .get_resolution = omapdss_default_get_resolution, 175 - 176 185 .get_wss = tvc_get_wss, 177 186 .set_wss = tvc_set_wss, 178 187 }; 179 - 180 - static int tvc_probe_pdata(struct platform_device *pdev) 181 - { 182 - struct panel_drv_data *ddata = platform_get_drvdata(pdev); 183 - struct connector_atv_platform_data *pdata; 184 - struct omap_dss_device *in, *dssdev; 185 - 186 - pdata = dev_get_platdata(&pdev->dev); 187 - 188 - in = omap_dss_find_output(pdata->source); 189 - if (in == NULL) { 190 - dev_err(&pdev->dev, "Failed to find video source\n"); 191 - return -EPROBE_DEFER; 192 - } 193 - 194 - ddata->in = in; 195 - 196 - ddata->invert_polarity = pdata->invert_polarity; 197 - 198 - dssdev = &ddata->dssdev; 199 - dssdev->name = pdata->name; 200 - 201 - return 0; 202 - } 203 188 204 189 static int tvc_probe_of(struct platform_device *pdev) 205 190 { ··· 205 242 platform_set_drvdata(pdev, ddata); 206 243 ddata->dev = &pdev->dev; 207 244 208 - if (dev_get_platdata(&pdev->dev)) { 209 - r = tvc_probe_pdata(pdev); 210 - if (r) 211 - return r; 212 - } else if (pdev->dev.of_node) { 213 - r = tvc_probe_of(pdev); 214 - if (r) 215 - return r; 216 - } else { 217 - return -ENODEV; 218 - } 245 + r = tvc_probe_of(pdev); 246 + if (r) 247 + return r; 219 248 220 249 ddata->vm = tvc_pal_vm; 221 250
-3
drivers/gpu/drm/omapdrm/displays/connector-dvi.c
··· 15 15 #include <linux/slab.h> 16 16 17 17 #include <drm/drm_edid.h> 18 - #include <video/omap-panel-data.h> 19 18 20 19 #include "../dss/omapdss.h" 21 20 ··· 226 227 .set_timings = dvic_set_timings, 227 228 .get_timings = dvic_get_timings, 228 229 .check_timings = dvic_check_timings, 229 - 230 - .get_resolution = omapdss_default_get_resolution, 231 230 232 231 .read_edid = dvic_read_edid, 233 232 .detect = dvic_detect,
-3
drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
··· 17 17 #include <linux/of_gpio.h> 18 18 19 19 #include <drm/drm_edid.h> 20 - #include <video/omap-panel-data.h> 21 20 22 21 #include "../dss/omapdss.h" 23 22 ··· 194 195 .set_timings = hdmic_set_timings, 195 196 .get_timings = hdmic_get_timings, 196 197 .check_timings = hdmic_check_timings, 197 - 198 - .get_resolution = omapdss_default_get_resolution, 199 198 200 199 .read_edid = hdmic_read_edid, 201 200 .detect = hdmic_detect,
-10
drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
··· 157 157 return in->ops.atv->check_timings(in, vm); 158 158 } 159 159 160 - static void opa362_set_type(struct omap_dss_device *dssdev, 161 - enum omap_dss_venc_type type) 162 - { 163 - /* we can only drive a COMPOSITE output */ 164 - WARN_ON(type != OMAP_DSS_VENC_TYPE_COMPOSITE); 165 - 166 - } 167 - 168 160 static const struct omapdss_atv_ops opa362_atv_ops = { 169 161 .connect = opa362_connect, 170 162 .disconnect = opa362_disconnect, ··· 167 175 .check_timings = opa362_check_timings, 168 176 .set_timings = opa362_set_timings, 169 177 .get_timings = opa362_get_timings, 170 - 171 - .set_type = opa362_set_type, 172 178 }; 173 179 174 180 static int opa362_probe(struct platform_device *pdev)
-4
drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
··· 22 22 struct omap_dss_device *in; 23 23 24 24 int pd_gpio; 25 - int data_lines; 26 25 27 26 struct videomode vm; 28 27 }; ··· 81 82 return 0; 82 83 83 84 in->ops.dpi->set_timings(in, &ddata->vm); 84 - if (ddata->data_lines) 85 - in->ops.dpi->set_data_lines(in, ddata->data_lines); 86 85 87 86 r = in->ops.dpi->enable(in); 88 87 if (r) ··· 223 226 dssdev->type = OMAP_DISPLAY_TYPE_DPI; 224 227 dssdev->output_type = OMAP_DISPLAY_TYPE_DVI; 225 228 dssdev->owner = THIS_MODULE; 226 - dssdev->phy.dpi.data_lines = ddata->data_lines; 227 229 dssdev->port_num = 1; 228 230 229 231 r = omapdss_register_output(dssdev);
+3 -80
drivers/gpu/drm/omapdrm/displays/panel-dpi.c
··· 14 14 #include <linux/platform_device.h> 15 15 #include <linux/slab.h> 16 16 #include <linux/of.h> 17 - #include <linux/of_gpio.h> 18 17 #include <linux/regulator/consumer.h> 19 18 #include <linux/backlight.h> 20 19 21 - #include <video/omap-panel-data.h> 22 20 #include <video/of_display_timing.h> 23 21 24 22 #include "../dss/omapdss.h" ··· 25 27 struct omap_dss_device dssdev; 26 28 struct omap_dss_device *in; 27 29 28 - int data_lines; 29 - 30 30 struct videomode vm; 31 31 32 32 struct backlight_device *backlight; 33 - 34 - /* used for non-DT boot, to be removed */ 35 - int backlight_gpio; 36 33 37 34 struct gpio_desc *enable_gpio; 38 35 struct regulator *vcc_supply; ··· 74 81 if (omapdss_device_is_enabled(dssdev)) 75 82 return 0; 76 83 77 - if (ddata->data_lines) 78 - in->ops.dpi->set_data_lines(in, ddata->data_lines); 79 84 in->ops.dpi->set_timings(in, &ddata->vm); 80 85 81 86 r = in->ops.dpi->enable(in); ··· 87 96 } 88 97 89 98 gpiod_set_value_cansleep(ddata->enable_gpio, 1); 90 - 91 - if (gpio_is_valid(ddata->backlight_gpio)) 92 - gpio_set_value_cansleep(ddata->backlight_gpio, 1); 93 99 94 100 if (ddata->backlight) { 95 101 ddata->backlight->props.power = FB_BLANK_UNBLANK; ··· 105 117 106 118 if (!omapdss_device_is_enabled(dssdev)) 107 119 return; 108 - 109 - if (gpio_is_valid(ddata->backlight_gpio)) 110 - gpio_set_value_cansleep(ddata->backlight_gpio, 0); 111 120 112 121 if (ddata->backlight) { 113 122 ddata->backlight->props.power = FB_BLANK_POWERDOWN; ··· 158 173 .set_timings = panel_dpi_set_timings, 159 174 .get_timings = panel_dpi_get_timings, 160 175 .check_timings = panel_dpi_check_timings, 161 - 162 - .get_resolution = omapdss_default_get_resolution, 163 176 }; 164 - 165 - static int panel_dpi_probe_pdata(struct platform_device *pdev) 166 - { 167 - const struct panel_dpi_platform_data *pdata; 168 - struct panel_drv_data *ddata = platform_get_drvdata(pdev); 169 - struct omap_dss_device *dssdev, *in; 170 - int r; 171 - 172 - pdata = dev_get_platdata(&pdev->dev); 173 - 174 - in = omap_dss_find_output(pdata->source); 175 - if (in == NULL) { 176 - dev_err(&pdev->dev, "failed to find video source '%s'\n", 177 - pdata->source); 178 - return -EPROBE_DEFER; 179 - } 180 - 181 - ddata->in = in; 182 - 183 - ddata->data_lines = pdata->data_lines; 184 - 185 - videomode_from_timing(pdata->display_timing, &ddata->vm); 186 - 187 - dssdev = &ddata->dssdev; 188 - dssdev->name = pdata->name; 189 - 190 - r = devm_gpio_request_one(&pdev->dev, pdata->enable_gpio, 191 - GPIOF_OUT_INIT_LOW, "panel enable"); 192 - if (r) 193 - goto err_gpio; 194 - 195 - ddata->enable_gpio = gpio_to_desc(pdata->enable_gpio); 196 - 197 - ddata->backlight_gpio = pdata->backlight_gpio; 198 - 199 - return 0; 200 - 201 - err_gpio: 202 - omap_dss_put_device(ddata->in); 203 - return r; 204 - } 205 177 206 178 static int panel_dpi_probe_of(struct platform_device *pdev) 207 179 { ··· 189 247 ddata->vcc_supply = devm_regulator_get(&pdev->dev, "vcc"); 190 248 if (IS_ERR(ddata->vcc_supply)) 191 249 return PTR_ERR(ddata->vcc_supply); 192 - 193 - ddata->backlight_gpio = -ENOENT; 194 250 195 251 bl_node = of_parse_phandle(node, "backlight", 0); 196 252 if (bl_node) { ··· 237 297 238 298 platform_set_drvdata(pdev, ddata); 239 299 240 - if (dev_get_platdata(&pdev->dev)) { 241 - r = panel_dpi_probe_pdata(pdev); 242 - if (r) 243 - return r; 244 - } else if (pdev->dev.of_node) { 245 - r = panel_dpi_probe_of(pdev); 246 - if (r) 247 - return r; 248 - } else { 249 - return -ENODEV; 250 - } 251 - 252 - if (gpio_is_valid(ddata->backlight_gpio)) { 253 - r = devm_gpio_request_one(&pdev->dev, ddata->backlight_gpio, 254 - GPIOF_OUT_INIT_LOW, "panel backlight"); 255 - if (r) 256 - goto err_gpio; 257 - } 300 + r = panel_dpi_probe_of(pdev); 301 + if (r) 302 + return r; 258 303 259 304 dssdev = &ddata->dssdev; 260 305 dssdev->dev = &pdev->dev; ··· 247 322 dssdev->type = OMAP_DISPLAY_TYPE_DPI; 248 323 dssdev->owner = THIS_MODULE; 249 324 dssdev->panel.vm = ddata->vm; 250 - dssdev->phy.dpi.data_lines = ddata->data_lines; 251 325 252 326 r = omapdss_register_display(dssdev); 253 327 if (r) { ··· 257 333 return 0; 258 334 259 335 err_reg: 260 - err_gpio: 261 336 omap_dss_put_device(ddata->in); 262 337 return r; 263 338 }
-10
drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
··· 379 379 .update_status = dsicm_bl_update_status, 380 380 }; 381 381 382 - static void dsicm_get_resolution(struct omap_dss_device *dssdev, 383 - u16 *xres, u16 *yres) 384 - { 385 - *xres = dssdev->panel.vm.hactive; 386 - *yres = dssdev->panel.vm.vactive; 387 - } 388 - 389 382 static ssize_t dsicm_num_errors_show(struct device *dev, 390 383 struct device_attribute *attr, char *buf) 391 384 { ··· 1108 1115 1109 1116 .update = dsicm_update, 1110 1117 .sync = dsicm_sync, 1111 - 1112 - .get_resolution = dsicm_get_resolution, 1113 - .get_recommended_bpp = omapdss_default_get_recommended_bpp, 1114 1118 1115 1119 .enable_te = dsicm_enable_te, 1116 1120 .get_te = dsicm_get_te,
-7
drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
··· 49 49 50 50 struct spi_device *spi; 51 51 52 - int data_lines; 53 - 54 52 struct videomode vm; 55 53 56 54 struct gpio_desc *enable_gpio; ··· 157 159 if (omapdss_device_is_enabled(dssdev)) 158 160 return 0; 159 161 160 - if (ddata->data_lines) 161 - in->ops.dpi->set_data_lines(in, ddata->data_lines); 162 162 in->ops.dpi->set_timings(in, &ddata->vm); 163 163 164 164 r = in->ops.dpi->enable(in); ··· 226 230 .set_timings = lb035q02_set_timings, 227 231 .get_timings = lb035q02_get_timings, 228 232 .check_timings = lb035q02_check_timings, 229 - 230 - .get_resolution = omapdss_default_get_resolution, 231 233 }; 232 234 233 235 static int lb035q02_probe_of(struct spi_device *spi) ··· 283 289 dssdev->type = OMAP_DISPLAY_TYPE_DPI; 284 290 dssdev->owner = THIS_MODULE; 285 291 dssdev->panel.vm = ddata->vm; 286 - dssdev->phy.dpi.data_lines = ddata->data_lines; 287 292 288 293 r = omapdss_register_display(dssdev); 289 294 if (r) {
-6
drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
··· 25 25 26 26 struct videomode vm; 27 27 28 - int data_lines; 29 - 30 28 int res_gpio; 31 29 int qvga_gpio; 32 30 ··· 151 153 if (omapdss_device_is_enabled(dssdev)) 152 154 return 0; 153 155 154 - if (ddata->data_lines) 155 - in->ops.dpi->set_data_lines(in, ddata->data_lines); 156 156 in->ops.dpi->set_timings(in, &ddata->vm); 157 157 158 158 r = in->ops.dpi->enable(in); ··· 220 224 .set_timings = nec_8048_set_timings, 221 225 .get_timings = nec_8048_get_timings, 222 226 .check_timings = nec_8048_check_timings, 223 - 224 - .get_resolution = omapdss_default_get_resolution, 225 227 }; 226 228 227 229 static int nec_8048_probe_of(struct spi_device *spi)
-7
drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
··· 24 24 struct omap_dss_device *in; 25 25 struct regulator *vcc; 26 26 27 - int data_lines; 28 - 29 27 struct videomode vm; 30 28 31 29 struct gpio_desc *resb_gpio; /* low = reset active min 20 us */ ··· 97 99 if (omapdss_device_is_enabled(dssdev)) 98 100 return 0; 99 101 100 - if (ddata->data_lines) 101 - in->ops.dpi->set_data_lines(in, ddata->data_lines); 102 102 in->ops.dpi->set_timings(in, &ddata->vm); 103 103 104 104 if (ddata->vcc) { ··· 190 194 .set_timings = sharp_ls_set_timings, 191 195 .get_timings = sharp_ls_get_timings, 192 196 .check_timings = sharp_ls_check_timings, 193 - 194 - .get_resolution = omapdss_default_get_resolution, 195 197 }; 196 198 197 199 static int sharp_ls_get_gpio_of(struct device *dev, int index, int val, ··· 283 289 dssdev->type = OMAP_DISPLAY_TYPE_DPI; 284 290 dssdev->owner = THIS_MODULE; 285 291 dssdev->panel.vm = ddata->vm; 286 - dssdev->phy.dpi.data_lines = ddata->data_lines; 287 292 288 293 r = omapdss_register_display(dssdev); 289 294 if (r) {
+3 -46
drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
··· 32 32 #include <linux/of.h> 33 33 #include <linux/of_gpio.h> 34 34 35 - #include <video/omap-panel-data.h> 36 - 37 35 #include "../dss/omapdss.h" 38 36 39 37 #define MIPID_CMD_READ_DISP_ID 0x04 ··· 67 69 struct omap_dss_device *in; 68 70 69 71 int reset_gpio; 70 - int datapairs; 71 72 72 73 struct videomode vm; 73 74 ··· 544 547 545 548 in->ops.sdi->set_timings(in, &ddata->vm); 546 549 547 - if (ddata->datapairs > 0) 548 - in->ops.sdi->set_datapairs(in, ddata->datapairs); 549 - 550 550 r = in->ops.sdi->enable(in); 551 551 if (r) { 552 552 pr_err("%s sdi enable failed\n", __func__); ··· 691 697 .set_timings = acx565akm_set_timings, 692 698 .get_timings = acx565akm_get_timings, 693 699 .check_timings = acx565akm_check_timings, 694 - 695 - .get_resolution = omapdss_default_get_resolution, 696 700 }; 697 - 698 - static int acx565akm_probe_pdata(struct spi_device *spi) 699 - { 700 - const struct panel_acx565akm_platform_data *pdata; 701 - struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev); 702 - struct omap_dss_device *dssdev, *in; 703 - 704 - pdata = dev_get_platdata(&spi->dev); 705 - 706 - ddata->reset_gpio = pdata->reset_gpio; 707 - 708 - in = omap_dss_find_output(pdata->source); 709 - if (in == NULL) { 710 - dev_err(&spi->dev, "failed to find video source '%s'\n", 711 - pdata->source); 712 - return -EPROBE_DEFER; 713 - } 714 - ddata->in = in; 715 - 716 - ddata->datapairs = pdata->datapairs; 717 - 718 - dssdev = &ddata->dssdev; 719 - dssdev->name = pdata->name; 720 - 721 - return 0; 722 - } 723 701 724 702 static int acx565akm_probe_of(struct spi_device *spi) 725 703 { ··· 732 766 733 767 mutex_init(&ddata->mutex); 734 768 735 - if (dev_get_platdata(&spi->dev)) { 736 - r = acx565akm_probe_pdata(spi); 737 - if (r) 738 - return r; 739 - } else if (spi->dev.of_node) { 740 - r = acx565akm_probe_of(spi); 741 - if (r) 742 - return r; 743 - } else { 744 - dev_err(&spi->dev, "platform data missing!\n"); 745 - return -ENODEV; 746 - } 769 + r = acx565akm_probe_of(spi); 770 + if (r) 771 + return r; 747 772 748 773 if (gpio_is_valid(ddata->reset_gpio)) { 749 774 r = devm_gpio_request_one(&spi->dev, ddata->reset_gpio,
-5
drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
··· 35 35 struct omap_dss_device dssdev; 36 36 struct omap_dss_device *in; 37 37 38 - int data_lines; 39 - 40 38 struct videomode vm; 41 39 42 40 struct spi_device *spi_dev; ··· 205 207 if (omapdss_device_is_enabled(dssdev)) 206 208 return 0; 207 209 208 - if (ddata->data_lines) 209 - in->ops.dpi->set_data_lines(in, ddata->data_lines); 210 210 in->ops.dpi->set_timings(in, &ddata->vm); 211 211 212 212 r = in->ops.dpi->enable(in); ··· 419 423 dssdev->type = OMAP_DISPLAY_TYPE_DPI; 420 424 dssdev->owner = THIS_MODULE; 421 425 dssdev->panel.vm = ddata->vm; 422 - dssdev->phy.dpi.data_lines = ddata->data_lines; 423 426 424 427 r = omapdss_register_display(dssdev); 425 428 if (r) {
-6
drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
··· 58 58 59 59 struct videomode vm; 60 60 61 - int data_lines; 62 - 63 61 struct spi_device *spi; 64 62 struct regulator *vcc_reg; 65 63 int nreset_gpio; ··· 376 378 if (omapdss_device_is_enabled(dssdev)) 377 379 return 0; 378 380 379 - if (ddata->data_lines) 380 - in->ops.dpi->set_data_lines(in, ddata->data_lines); 381 381 in->ops.dpi->set_timings(in, &ddata->vm); 382 382 383 383 r = in->ops.dpi->enable(in); ··· 457 461 458 462 .set_mirror = tpo_td043_set_hmirror, 459 463 .get_mirror = tpo_td043_get_hmirror, 460 - 461 - .get_resolution = omapdss_default_get_resolution, 462 464 }; 463 465 464 466 static int tpo_td043_probe_of(struct spi_device *spi)
-13
drivers/gpu/drm/omapdrm/dss/Kconfig
··· 49 49 help 50 50 DPI Interface. This is the Parallel Display Interface. 51 51 52 - config OMAP2_DSS_RFBI 53 - bool "RFBI support" 54 - depends on BROKEN 55 - default n 56 - help 57 - MIPI DBI support (RFBI, Remote Framebuffer Interface, in Texas 58 - Instrument's terminology). 59 - 60 - DBI is a bus between the host processor and a peripheral, 61 - such as a display or a framebuffer chip. 62 - 63 - See http://www.mipi.org/ for DBI specifications. 64 - 65 52 config OMAP2_DSS_VENC 66 53 bool "VENC support" 67 54 default y
-1
drivers/gpu/drm/omapdrm/dss/Makefile
··· 8 8 omapdss-y := core.o dss.o dss_features.o dispc.o dispc_coefs.o \ 9 9 pll.o video-pll.o 10 10 omapdss-$(CONFIG_OMAP2_DSS_DPI) += dpi.o 11 - omapdss-$(CONFIG_OMAP2_DSS_RFBI) += rfbi.o 12 11 omapdss-$(CONFIG_OMAP2_DSS_VENC) += venc.o 13 12 omapdss-$(CONFIG_OMAP2_DSS_SDI) += sdi.o 14 13 omapdss-$(CONFIG_OMAP2_DSS_DSI) += dsi.o
-41
drivers/gpu/drm/omapdrm/dss/core.c
··· 41 41 42 42 static struct { 43 43 struct platform_device *pdev; 44 - 45 - const char *default_display_name; 46 44 } core; 47 - 48 - static char *def_disp_name; 49 - module_param_named(def_disp, def_disp_name, charp, 0); 50 - MODULE_PARM_DESC(def_disp, "default display name"); 51 - 52 - const char *omapdss_get_default_display_name(void) 53 - { 54 - return core.default_display_name; 55 - } 56 - EXPORT_SYMBOL(omapdss_get_default_display_name); 57 45 58 46 enum omapdss_version omapdss_get_version(void) 59 47 { ··· 49 61 return pdata->version; 50 62 } 51 63 EXPORT_SYMBOL(omapdss_get_version); 52 - 53 - struct platform_device *dss_get_core_pdev(void) 54 - { 55 - return core.pdev; 56 - } 57 64 58 65 int dss_dsi_enable_pads(int dsi_id, unsigned lane_mask) 59 66 { ··· 163 180 164 181 static int __init omap_dss_probe(struct platform_device *pdev) 165 182 { 166 - struct omap_dss_board_info *pdata = pdev->dev.platform_data; 167 183 int r; 168 184 169 185 core.pdev = pdev; ··· 172 190 r = dss_initialize_debugfs(); 173 191 if (r) 174 192 goto err_debugfs; 175 - 176 - if (def_disp_name) 177 - core.default_display_name = def_disp_name; 178 - else if (pdata->default_display_name) 179 - core.default_display_name = pdata->default_display_name; 180 193 181 194 return 0; 182 195 ··· 208 231 #ifdef CONFIG_OMAP2_DSS_DSI 209 232 dsi_init_platform_driver, 210 233 #endif 211 - #ifdef CONFIG_OMAP2_DSS_DPI 212 - dpi_init_platform_driver, 213 - #endif 214 - #ifdef CONFIG_OMAP2_DSS_SDI 215 - sdi_init_platform_driver, 216 - #endif 217 - #ifdef CONFIG_OMAP2_DSS_RFBI 218 - rfbi_init_platform_driver, 219 - #endif 220 234 #ifdef CONFIG_OMAP2_DSS_VENC 221 235 venc_init_platform_driver, 222 236 #endif ··· 228 260 #endif 229 261 #ifdef CONFIG_OMAP2_DSS_VENC 230 262 venc_uninit_platform_driver, 231 - #endif 232 - #ifdef CONFIG_OMAP2_DSS_RFBI 233 - rfbi_uninit_platform_driver, 234 - #endif 235 - #ifdef CONFIG_OMAP2_DSS_SDI 236 - sdi_uninit_platform_driver, 237 - #endif 238 - #ifdef CONFIG_OMAP2_DSS_DPI 239 - dpi_uninit_platform_driver, 240 263 #endif 241 264 #ifdef CONFIG_OMAP2_DSS_DSI 242 265 dsi_uninit_platform_driver,
+203 -512
drivers/gpu/drm/omapdrm/dss/dispc.c
··· 40 40 #include <linux/regmap.h> 41 41 #include <linux/of.h> 42 42 #include <linux/component.h> 43 + #include <drm/drm_fourcc.h> 44 + #include <drm/drm_blend.h> 43 45 44 46 #include "omapdss.h" 45 47 #include "dss.h" ··· 79 77 int (*calc_scaling) (unsigned long pclk, unsigned long lclk, 80 78 const struct videomode *vm, 81 79 u16 width, u16 height, u16 out_width, u16 out_height, 82 - enum omap_color_mode color_mode, bool *five_taps, 80 + u32 fourcc, bool *five_taps, 83 81 int *x_predecim, int *y_predecim, int *decim_x, int *decim_y, 84 82 u16 pos_x, unsigned long *core_clk, bool mem_to_mem); 85 83 unsigned long (*calc_core_clk) (unsigned long pclk, ··· 160 158 */ 161 159 DISPC_COLOR_COMPONENT_RGB_Y = 1 << 0, 162 160 /* used for UV component for 163 - * OMAP_DSS_COLOR_YUV2, OMAP_DSS_COLOR_UYVY, OMAP_DSS_COLOR_NV12 161 + * DRM_FORMAT_YUYV, DRM_FORMAT_UYVY, DRM_FORMAT_NV12 164 162 * color formats on OMAP4 165 163 */ 166 164 DISPC_COLOR_COMPONENT_UV = 1 << 1, ··· 907 905 dispc_write_reg(DISPC_OVL_ROW_INC(plane), inc); 908 906 } 909 907 910 - static void dispc_ovl_set_color_mode(enum omap_plane_id plane, 911 - enum omap_color_mode color_mode) 908 + static void dispc_ovl_set_color_mode(enum omap_plane_id plane, u32 fourcc) 912 909 { 913 910 u32 m = 0; 914 911 if (plane != OMAP_DSS_GFX) { 915 - switch (color_mode) { 916 - case OMAP_DSS_COLOR_NV12: 912 + switch (fourcc) { 913 + case DRM_FORMAT_NV12: 917 914 m = 0x0; break; 918 - case OMAP_DSS_COLOR_RGBX16: 915 + case DRM_FORMAT_XRGB4444: 919 916 m = 0x1; break; 920 - case OMAP_DSS_COLOR_RGBA16: 917 + case DRM_FORMAT_RGBA4444: 921 918 m = 0x2; break; 922 - case OMAP_DSS_COLOR_RGB12U: 919 + case DRM_FORMAT_RGBX4444: 923 920 m = 0x4; break; 924 - case OMAP_DSS_COLOR_ARGB16: 921 + case DRM_FORMAT_ARGB4444: 925 922 m = 0x5; break; 926 - case OMAP_DSS_COLOR_RGB16: 923 + case DRM_FORMAT_RGB565: 927 924 m = 0x6; break; 928 - case OMAP_DSS_COLOR_ARGB16_1555: 925 + case DRM_FORMAT_ARGB1555: 929 926 m = 0x7; break; 930 - case OMAP_DSS_COLOR_RGB24U: 927 + case DRM_FORMAT_XRGB8888: 931 928 m = 0x8; break; 932 - case OMAP_DSS_COLOR_RGB24P: 929 + case DRM_FORMAT_RGB888: 933 930 m = 0x9; break; 934 - case OMAP_DSS_COLOR_YUV2: 931 + case DRM_FORMAT_YUYV: 935 932 m = 0xa; break; 936 - case OMAP_DSS_COLOR_UYVY: 933 + case DRM_FORMAT_UYVY: 937 934 m = 0xb; break; 938 - case OMAP_DSS_COLOR_ARGB32: 935 + case DRM_FORMAT_ARGB8888: 939 936 m = 0xc; break; 940 - case OMAP_DSS_COLOR_RGBA32: 937 + case DRM_FORMAT_RGBA8888: 941 938 m = 0xd; break; 942 - case OMAP_DSS_COLOR_RGBX32: 939 + case DRM_FORMAT_RGBX8888: 943 940 m = 0xe; break; 944 - case OMAP_DSS_COLOR_XRGB16_1555: 941 + case DRM_FORMAT_XRGB1555: 945 942 m = 0xf; break; 946 943 default: 947 944 BUG(); return; 948 945 } 949 946 } else { 950 - switch (color_mode) { 951 - case OMAP_DSS_COLOR_CLUT1: 952 - m = 0x0; break; 953 - case OMAP_DSS_COLOR_CLUT2: 954 - m = 0x1; break; 955 - case OMAP_DSS_COLOR_CLUT4: 956 - m = 0x2; break; 957 - case OMAP_DSS_COLOR_CLUT8: 958 - m = 0x3; break; 959 - case OMAP_DSS_COLOR_RGB12U: 947 + switch (fourcc) { 948 + case DRM_FORMAT_RGBX4444: 960 949 m = 0x4; break; 961 - case OMAP_DSS_COLOR_ARGB16: 950 + case DRM_FORMAT_ARGB4444: 962 951 m = 0x5; break; 963 - case OMAP_DSS_COLOR_RGB16: 952 + case DRM_FORMAT_RGB565: 964 953 m = 0x6; break; 965 - case OMAP_DSS_COLOR_ARGB16_1555: 954 + case DRM_FORMAT_ARGB1555: 966 955 m = 0x7; break; 967 - case OMAP_DSS_COLOR_RGB24U: 956 + case DRM_FORMAT_XRGB8888: 968 957 m = 0x8; break; 969 - case OMAP_DSS_COLOR_RGB24P: 958 + case DRM_FORMAT_RGB888: 970 959 m = 0x9; break; 971 - case OMAP_DSS_COLOR_RGBX16: 960 + case DRM_FORMAT_XRGB4444: 972 961 m = 0xa; break; 973 - case OMAP_DSS_COLOR_RGBA16: 962 + case DRM_FORMAT_RGBA4444: 974 963 m = 0xb; break; 975 - case OMAP_DSS_COLOR_ARGB32: 964 + case DRM_FORMAT_ARGB8888: 976 965 m = 0xc; break; 977 - case OMAP_DSS_COLOR_RGBA32: 966 + case DRM_FORMAT_RGBA8888: 978 967 m = 0xd; break; 979 - case OMAP_DSS_COLOR_RGBX32: 968 + case DRM_FORMAT_RGBX8888: 980 969 m = 0xe; break; 981 - case OMAP_DSS_COLOR_XRGB16_1555: 970 + case DRM_FORMAT_XRGB1555: 982 971 m = 0xf; break; 983 972 default: 984 973 BUG(); return; ··· 977 984 } 978 985 979 986 REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), m, 4, 1); 987 + } 988 + 989 + static bool format_is_yuv(u32 fourcc) 990 + { 991 + switch (fourcc) { 992 + case DRM_FORMAT_YUYV: 993 + case DRM_FORMAT_UYVY: 994 + case DRM_FORMAT_NV12: 995 + return true; 996 + default: 997 + return false; 998 + } 980 999 } 981 1000 982 1001 static void dispc_ovl_configure_burst_type(enum omap_plane_id plane, ··· 1141 1136 return unit * 8; 1142 1137 } 1143 1138 1144 - static enum omap_color_mode dispc_ovl_get_color_modes(enum omap_plane_id plane) 1139 + static const u32 *dispc_ovl_get_color_modes(enum omap_plane_id plane) 1145 1140 { 1146 1141 return dss_feat_get_supported_color_modes(plane); 1147 1142 } ··· 1563 1558 1564 1559 static void dispc_ovl_set_accu_uv(enum omap_plane_id plane, 1565 1560 u16 orig_width, u16 orig_height, u16 out_width, u16 out_height, 1566 - bool ilace, enum omap_color_mode color_mode, u8 rotation) 1561 + bool ilace, u32 fourcc, u8 rotation) 1567 1562 { 1568 1563 int h_accu2_0, h_accu2_1; 1569 1564 int v_accu2_0, v_accu2_1; ··· 1601 1596 { 0, 1, 0, 1, -1, 1, 0, 1 }, 1602 1597 }; 1603 1598 1604 - switch (rotation) { 1605 - case OMAP_DSS_ROT_0: 1599 + /* Note: DSS HW rotates clockwise, DRM_MODE_ROTATE_* counter-clockwise */ 1600 + switch (rotation & DRM_MODE_ROTATE_MASK) { 1601 + default: 1602 + case DRM_MODE_ROTATE_0: 1606 1603 idx = 0; 1607 1604 break; 1608 - case OMAP_DSS_ROT_90: 1609 - idx = 1; 1610 - break; 1611 - case OMAP_DSS_ROT_180: 1612 - idx = 2; 1613 - break; 1614 - case OMAP_DSS_ROT_270: 1605 + case DRM_MODE_ROTATE_90: 1615 1606 idx = 3; 1616 1607 break; 1617 - default: 1618 - BUG(); 1619 - return; 1608 + case DRM_MODE_ROTATE_180: 1609 + idx = 2; 1610 + break; 1611 + case DRM_MODE_ROTATE_270: 1612 + idx = 1; 1613 + break; 1620 1614 } 1621 1615 1622 - switch (color_mode) { 1623 - case OMAP_DSS_COLOR_NV12: 1616 + switch (fourcc) { 1617 + case DRM_FORMAT_NV12: 1624 1618 if (ilace) 1625 1619 accu_table = accu_nv12_ilace; 1626 1620 else 1627 1621 accu_table = accu_nv12; 1628 1622 break; 1629 - case OMAP_DSS_COLOR_YUV2: 1630 - case OMAP_DSS_COLOR_UYVY: 1623 + case DRM_FORMAT_YUYV: 1624 + case DRM_FORMAT_UYVY: 1631 1625 accu_table = accu_yuv; 1632 1626 break; 1633 1627 default: ··· 1652 1648 u16 orig_width, u16 orig_height, 1653 1649 u16 out_width, u16 out_height, 1654 1650 bool ilace, bool five_taps, 1655 - bool fieldmode, enum omap_color_mode color_mode, 1651 + bool fieldmode, u32 fourcc, 1656 1652 u8 rotation) 1657 1653 { 1658 1654 int accu0 = 0; ··· 1706 1702 u16 orig_width, u16 orig_height, 1707 1703 u16 out_width, u16 out_height, 1708 1704 bool ilace, bool five_taps, 1709 - bool fieldmode, enum omap_color_mode color_mode, 1705 + bool fieldmode, u32 fourcc, 1710 1706 u8 rotation) 1711 1707 { 1712 1708 int scale_x = out_width != orig_width; ··· 1715 1711 1716 1712 if (!dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) 1717 1713 return; 1718 - if ((color_mode != OMAP_DSS_COLOR_YUV2 && 1719 - color_mode != OMAP_DSS_COLOR_UYVY && 1720 - color_mode != OMAP_DSS_COLOR_NV12)) { 1714 + 1715 + if (!format_is_yuv(fourcc)) { 1721 1716 /* reset chroma resampling for RGB formats */ 1722 1717 if (plane != OMAP_DSS_WB) 1723 1718 REG_FLD_MOD(DISPC_OVL_ATTRIBUTES2(plane), 0, 8, 8); ··· 1724 1721 } 1725 1722 1726 1723 dispc_ovl_set_accu_uv(plane, orig_width, orig_height, out_width, 1727 - out_height, ilace, color_mode, rotation); 1724 + out_height, ilace, fourcc, rotation); 1728 1725 1729 - switch (color_mode) { 1730 - case OMAP_DSS_COLOR_NV12: 1726 + switch (fourcc) { 1727 + case DRM_FORMAT_NV12: 1731 1728 if (chroma_upscale) { 1732 1729 /* UV is subsampled by 2 horizontally and vertically */ 1733 1730 orig_height >>= 1; ··· 1739 1736 } 1740 1737 1741 1738 break; 1742 - case OMAP_DSS_COLOR_YUV2: 1743 - case OMAP_DSS_COLOR_UYVY: 1739 + case DRM_FORMAT_YUYV: 1740 + case DRM_FORMAT_UYVY: 1744 1741 /* For YUV422 with 90/270 rotation, we don't upsample chroma */ 1745 - if (rotation == OMAP_DSS_ROT_0 || 1746 - rotation == OMAP_DSS_ROT_180) { 1742 + if (!drm_rotation_90_or_270(rotation)) { 1747 1743 if (chroma_upscale) 1748 1744 /* UV is subsampled by 2 horizontally */ 1749 1745 orig_width >>= 1; ··· 1752 1750 } 1753 1751 1754 1752 /* must use FIR for YUV422 if rotated */ 1755 - if (rotation != OMAP_DSS_ROT_0) 1753 + if ((rotation & DRM_MODE_ROTATE_MASK) != DRM_MODE_ROTATE_0) 1756 1754 scale_x = scale_y = true; 1757 1755 1758 1756 break; ··· 1784 1782 u16 orig_width, u16 orig_height, 1785 1783 u16 out_width, u16 out_height, 1786 1784 bool ilace, bool five_taps, 1787 - bool fieldmode, enum omap_color_mode color_mode, 1785 + bool fieldmode, u32 fourcc, 1788 1786 u8 rotation) 1789 1787 { 1790 1788 BUG_ON(plane == OMAP_DSS_GFX); ··· 1793 1791 orig_width, orig_height, 1794 1792 out_width, out_height, 1795 1793 ilace, five_taps, 1796 - fieldmode, color_mode, 1794 + fieldmode, fourcc, 1797 1795 rotation); 1798 1796 1799 1797 dispc_ovl_set_scaling_uv(plane, 1800 1798 orig_width, orig_height, 1801 1799 out_width, out_height, 1802 1800 ilace, five_taps, 1803 - fieldmode, color_mode, 1801 + fieldmode, fourcc, 1804 1802 rotation); 1805 1803 } 1806 1804 1807 1805 static void dispc_ovl_set_rotation_attrs(enum omap_plane_id plane, u8 rotation, 1808 - enum omap_dss_rotation_type rotation_type, 1809 - bool mirroring, enum omap_color_mode color_mode) 1806 + enum omap_dss_rotation_type rotation_type, u32 fourcc) 1810 1807 { 1811 1808 bool row_repeat = false; 1812 1809 int vidrot = 0; 1813 1810 1814 - if (color_mode == OMAP_DSS_COLOR_YUV2 || 1815 - color_mode == OMAP_DSS_COLOR_UYVY) { 1811 + /* Note: DSS HW rotates clockwise, DRM_MODE_ROTATE_* counter-clockwise */ 1812 + if (fourcc == DRM_FORMAT_YUYV || fourcc == DRM_FORMAT_UYVY) { 1816 1813 1817 - if (mirroring) { 1818 - switch (rotation) { 1819 - case OMAP_DSS_ROT_0: 1814 + if (rotation & DRM_MODE_REFLECT_X) { 1815 + switch (rotation & DRM_MODE_ROTATE_MASK) { 1816 + case DRM_MODE_ROTATE_0: 1820 1817 vidrot = 2; 1821 1818 break; 1822 - case OMAP_DSS_ROT_90: 1819 + case DRM_MODE_ROTATE_90: 1823 1820 vidrot = 1; 1824 1821 break; 1825 - case OMAP_DSS_ROT_180: 1822 + case DRM_MODE_ROTATE_180: 1826 1823 vidrot = 0; 1827 1824 break; 1828 - case OMAP_DSS_ROT_270: 1825 + case DRM_MODE_ROTATE_270: 1829 1826 vidrot = 3; 1830 1827 break; 1831 1828 } 1832 1829 } else { 1833 - switch (rotation) { 1834 - case OMAP_DSS_ROT_0: 1830 + switch (rotation & DRM_MODE_ROTATE_MASK) { 1831 + case DRM_MODE_ROTATE_0: 1835 1832 vidrot = 0; 1836 1833 break; 1837 - case OMAP_DSS_ROT_90: 1838 - vidrot = 1; 1834 + case DRM_MODE_ROTATE_90: 1835 + vidrot = 3; 1839 1836 break; 1840 - case OMAP_DSS_ROT_180: 1837 + case DRM_MODE_ROTATE_180: 1841 1838 vidrot = 2; 1842 1839 break; 1843 - case OMAP_DSS_ROT_270: 1844 - vidrot = 3; 1840 + case DRM_MODE_ROTATE_270: 1841 + vidrot = 1; 1845 1842 break; 1846 1843 } 1847 1844 } 1848 1845 1849 - if (rotation == OMAP_DSS_ROT_90 || rotation == OMAP_DSS_ROT_270) 1846 + if (drm_rotation_90_or_270(rotation)) 1850 1847 row_repeat = true; 1851 1848 else 1852 1849 row_repeat = false; ··· 1856 1855 * NV12 in 1D mode must use ROTATION=1. Otherwise DSS will fetch extra 1857 1856 * rows beyond the framebuffer, which may cause OCP error. 1858 1857 */ 1859 - if (color_mode == OMAP_DSS_COLOR_NV12 && 1860 - rotation_type != OMAP_DSS_ROT_TILER) 1858 + if (fourcc == DRM_FORMAT_NV12 && rotation_type != OMAP_DSS_ROT_TILER) 1861 1859 vidrot = 1; 1862 1860 1863 1861 REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), vidrot, 13, 12); ··· 1864 1864 REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), 1865 1865 row_repeat ? 1 : 0, 18, 18); 1866 1866 1867 - if (color_mode == OMAP_DSS_COLOR_NV12) { 1868 - bool doublestride = (rotation_type == OMAP_DSS_ROT_TILER) && 1869 - (rotation == OMAP_DSS_ROT_0 || 1870 - rotation == OMAP_DSS_ROT_180); 1867 + if (dss_feat_color_mode_supported(plane, DRM_FORMAT_NV12)) { 1868 + bool doublestride = 1869 + fourcc == DRM_FORMAT_NV12 && 1870 + rotation_type == OMAP_DSS_ROT_TILER && 1871 + !drm_rotation_90_or_270(rotation); 1872 + 1871 1873 /* DOUBLESTRIDE */ 1872 1874 REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), doublestride, 22, 22); 1873 1875 } 1874 - 1875 1876 } 1876 1877 1877 - static int color_mode_to_bpp(enum omap_color_mode color_mode) 1878 + static int color_mode_to_bpp(u32 fourcc) 1878 1879 { 1879 - switch (color_mode) { 1880 - case OMAP_DSS_COLOR_CLUT1: 1881 - return 1; 1882 - case OMAP_DSS_COLOR_CLUT2: 1883 - return 2; 1884 - case OMAP_DSS_COLOR_CLUT4: 1885 - return 4; 1886 - case OMAP_DSS_COLOR_CLUT8: 1887 - case OMAP_DSS_COLOR_NV12: 1880 + switch (fourcc) { 1881 + case DRM_FORMAT_NV12: 1888 1882 return 8; 1889 - case OMAP_DSS_COLOR_RGB12U: 1890 - case OMAP_DSS_COLOR_RGB16: 1891 - case OMAP_DSS_COLOR_ARGB16: 1892 - case OMAP_DSS_COLOR_YUV2: 1893 - case OMAP_DSS_COLOR_UYVY: 1894 - case OMAP_DSS_COLOR_RGBA16: 1895 - case OMAP_DSS_COLOR_RGBX16: 1896 - case OMAP_DSS_COLOR_ARGB16_1555: 1897 - case OMAP_DSS_COLOR_XRGB16_1555: 1883 + case DRM_FORMAT_RGBX4444: 1884 + case DRM_FORMAT_RGB565: 1885 + case DRM_FORMAT_ARGB4444: 1886 + case DRM_FORMAT_YUYV: 1887 + case DRM_FORMAT_UYVY: 1888 + case DRM_FORMAT_RGBA4444: 1889 + case DRM_FORMAT_XRGB4444: 1890 + case DRM_FORMAT_ARGB1555: 1891 + case DRM_FORMAT_XRGB1555: 1898 1892 return 16; 1899 - case OMAP_DSS_COLOR_RGB24P: 1893 + case DRM_FORMAT_RGB888: 1900 1894 return 24; 1901 - case OMAP_DSS_COLOR_RGB24U: 1902 - case OMAP_DSS_COLOR_ARGB32: 1903 - case OMAP_DSS_COLOR_RGBA32: 1904 - case OMAP_DSS_COLOR_RGBX32: 1895 + case DRM_FORMAT_XRGB8888: 1896 + case DRM_FORMAT_ARGB8888: 1897 + case DRM_FORMAT_RGBA8888: 1898 + case DRM_FORMAT_RGBX8888: 1905 1899 return 32; 1906 1900 default: 1907 1901 BUG(); ··· 1916 1922 return 0; 1917 1923 } 1918 1924 1919 - static void calc_vrfb_rotation_offset(u8 rotation, bool mirror, 1920 - u16 screen_width, 1921 - u16 width, u16 height, 1922 - enum omap_color_mode color_mode, bool fieldmode, 1923 - unsigned int field_offset, 1924 - unsigned *offset0, unsigned *offset1, 1925 - s32 *row_inc, s32 *pix_inc, int x_predecim, int y_predecim) 1926 - { 1927 - u8 ps; 1928 - 1929 - /* FIXME CLUT formats */ 1930 - switch (color_mode) { 1931 - case OMAP_DSS_COLOR_CLUT1: 1932 - case OMAP_DSS_COLOR_CLUT2: 1933 - case OMAP_DSS_COLOR_CLUT4: 1934 - case OMAP_DSS_COLOR_CLUT8: 1935 - BUG(); 1936 - return; 1937 - case OMAP_DSS_COLOR_YUV2: 1938 - case OMAP_DSS_COLOR_UYVY: 1939 - ps = 4; 1940 - break; 1941 - default: 1942 - ps = color_mode_to_bpp(color_mode) / 8; 1943 - break; 1944 - } 1945 - 1946 - DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width, 1947 - width, height); 1948 - 1949 - /* 1950 - * field 0 = even field = bottom field 1951 - * field 1 = odd field = top field 1952 - */ 1953 - switch (rotation + mirror * 4) { 1954 - case OMAP_DSS_ROT_0: 1955 - case OMAP_DSS_ROT_180: 1956 - /* 1957 - * If the pixel format is YUV or UYVY divide the width 1958 - * of the image by 2 for 0 and 180 degree rotation. 1959 - */ 1960 - if (color_mode == OMAP_DSS_COLOR_YUV2 || 1961 - color_mode == OMAP_DSS_COLOR_UYVY) 1962 - width = width >> 1; 1963 - case OMAP_DSS_ROT_90: 1964 - case OMAP_DSS_ROT_270: 1965 - *offset1 = 0; 1966 - if (field_offset) 1967 - *offset0 = field_offset * screen_width * ps; 1968 - else 1969 - *offset0 = 0; 1970 - 1971 - *row_inc = pixinc(1 + 1972 - (y_predecim * screen_width - x_predecim * width) + 1973 - (fieldmode ? screen_width : 0), ps); 1974 - *pix_inc = pixinc(x_predecim, ps); 1975 - break; 1976 - 1977 - case OMAP_DSS_ROT_0 + 4: 1978 - case OMAP_DSS_ROT_180 + 4: 1979 - /* If the pixel format is YUV or UYVY divide the width 1980 - * of the image by 2 for 0 degree and 180 degree 1981 - */ 1982 - if (color_mode == OMAP_DSS_COLOR_YUV2 || 1983 - color_mode == OMAP_DSS_COLOR_UYVY) 1984 - width = width >> 1; 1985 - case OMAP_DSS_ROT_90 + 4: 1986 - case OMAP_DSS_ROT_270 + 4: 1987 - *offset1 = 0; 1988 - if (field_offset) 1989 - *offset0 = field_offset * screen_width * ps; 1990 - else 1991 - *offset0 = 0; 1992 - *row_inc = pixinc(1 - 1993 - (y_predecim * screen_width + x_predecim * width) - 1994 - (fieldmode ? screen_width : 0), ps); 1995 - *pix_inc = pixinc(x_predecim, ps); 1996 - break; 1997 - 1998 - default: 1999 - BUG(); 2000 - return; 2001 - } 2002 - } 2003 - 2004 - static void calc_dma_rotation_offset(u8 rotation, bool mirror, 2005 - u16 screen_width, 2006 - u16 width, u16 height, 2007 - enum omap_color_mode color_mode, bool fieldmode, 2008 - unsigned int field_offset, 2009 - unsigned *offset0, unsigned *offset1, 2010 - s32 *row_inc, s32 *pix_inc, int x_predecim, int y_predecim) 2011 - { 2012 - u8 ps; 2013 - u16 fbw, fbh; 2014 - 2015 - /* FIXME CLUT formats */ 2016 - switch (color_mode) { 2017 - case OMAP_DSS_COLOR_CLUT1: 2018 - case OMAP_DSS_COLOR_CLUT2: 2019 - case OMAP_DSS_COLOR_CLUT4: 2020 - case OMAP_DSS_COLOR_CLUT8: 2021 - BUG(); 2022 - return; 2023 - default: 2024 - ps = color_mode_to_bpp(color_mode) / 8; 2025 - break; 2026 - } 2027 - 2028 - DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width, 2029 - width, height); 2030 - 2031 - /* width & height are overlay sizes, convert to fb sizes */ 2032 - 2033 - if (rotation == OMAP_DSS_ROT_0 || rotation == OMAP_DSS_ROT_180) { 2034 - fbw = width; 2035 - fbh = height; 2036 - } else { 2037 - fbw = height; 2038 - fbh = width; 2039 - } 2040 - 2041 - /* 2042 - * field 0 = even field = bottom field 2043 - * field 1 = odd field = top field 2044 - */ 2045 - switch (rotation + mirror * 4) { 2046 - case OMAP_DSS_ROT_0: 2047 - *offset1 = 0; 2048 - if (field_offset) 2049 - *offset0 = *offset1 + field_offset * screen_width * ps; 2050 - else 2051 - *offset0 = *offset1; 2052 - *row_inc = pixinc(1 + 2053 - (y_predecim * screen_width - fbw * x_predecim) + 2054 - (fieldmode ? screen_width : 0), ps); 2055 - if (color_mode == OMAP_DSS_COLOR_YUV2 || 2056 - color_mode == OMAP_DSS_COLOR_UYVY) 2057 - *pix_inc = pixinc(x_predecim, 2 * ps); 2058 - else 2059 - *pix_inc = pixinc(x_predecim, ps); 2060 - break; 2061 - case OMAP_DSS_ROT_90: 2062 - *offset1 = screen_width * (fbh - 1) * ps; 2063 - if (field_offset) 2064 - *offset0 = *offset1 + field_offset * ps; 2065 - else 2066 - *offset0 = *offset1; 2067 - *row_inc = pixinc(screen_width * (fbh * x_predecim - 1) + 2068 - y_predecim + (fieldmode ? 1 : 0), ps); 2069 - *pix_inc = pixinc(-x_predecim * screen_width, ps); 2070 - break; 2071 - case OMAP_DSS_ROT_180: 2072 - *offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps; 2073 - if (field_offset) 2074 - *offset0 = *offset1 - field_offset * screen_width * ps; 2075 - else 2076 - *offset0 = *offset1; 2077 - *row_inc = pixinc(-1 - 2078 - (y_predecim * screen_width - fbw * x_predecim) - 2079 - (fieldmode ? screen_width : 0), ps); 2080 - if (color_mode == OMAP_DSS_COLOR_YUV2 || 2081 - color_mode == OMAP_DSS_COLOR_UYVY) 2082 - *pix_inc = pixinc(-x_predecim, 2 * ps); 2083 - else 2084 - *pix_inc = pixinc(-x_predecim, ps); 2085 - break; 2086 - case OMAP_DSS_ROT_270: 2087 - *offset1 = (fbw - 1) * ps; 2088 - if (field_offset) 2089 - *offset0 = *offset1 - field_offset * ps; 2090 - else 2091 - *offset0 = *offset1; 2092 - *row_inc = pixinc(-screen_width * (fbh * x_predecim - 1) - 2093 - y_predecim - (fieldmode ? 1 : 0), ps); 2094 - *pix_inc = pixinc(x_predecim * screen_width, ps); 2095 - break; 2096 - 2097 - /* mirroring */ 2098 - case OMAP_DSS_ROT_0 + 4: 2099 - *offset1 = (fbw - 1) * ps; 2100 - if (field_offset) 2101 - *offset0 = *offset1 + field_offset * screen_width * ps; 2102 - else 2103 - *offset0 = *offset1; 2104 - *row_inc = pixinc(y_predecim * screen_width * 2 - 1 + 2105 - (fieldmode ? screen_width : 0), 2106 - ps); 2107 - if (color_mode == OMAP_DSS_COLOR_YUV2 || 2108 - color_mode == OMAP_DSS_COLOR_UYVY) 2109 - *pix_inc = pixinc(-x_predecim, 2 * ps); 2110 - else 2111 - *pix_inc = pixinc(-x_predecim, ps); 2112 - break; 2113 - 2114 - case OMAP_DSS_ROT_90 + 4: 2115 - *offset1 = 0; 2116 - if (field_offset) 2117 - *offset0 = *offset1 + field_offset * ps; 2118 - else 2119 - *offset0 = *offset1; 2120 - *row_inc = pixinc(-screen_width * (fbh * x_predecim - 1) + 2121 - y_predecim + (fieldmode ? 1 : 0), 2122 - ps); 2123 - *pix_inc = pixinc(x_predecim * screen_width, ps); 2124 - break; 2125 - 2126 - case OMAP_DSS_ROT_180 + 4: 2127 - *offset1 = screen_width * (fbh - 1) * ps; 2128 - if (field_offset) 2129 - *offset0 = *offset1 - field_offset * screen_width * ps; 2130 - else 2131 - *offset0 = *offset1; 2132 - *row_inc = pixinc(1 - y_predecim * screen_width * 2 - 2133 - (fieldmode ? screen_width : 0), 2134 - ps); 2135 - if (color_mode == OMAP_DSS_COLOR_YUV2 || 2136 - color_mode == OMAP_DSS_COLOR_UYVY) 2137 - *pix_inc = pixinc(x_predecim, 2 * ps); 2138 - else 2139 - *pix_inc = pixinc(x_predecim, ps); 2140 - break; 2141 - 2142 - case OMAP_DSS_ROT_270 + 4: 2143 - *offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps; 2144 - if (field_offset) 2145 - *offset0 = *offset1 - field_offset * ps; 2146 - else 2147 - *offset0 = *offset1; 2148 - *row_inc = pixinc(screen_width * (fbh * x_predecim - 1) - 2149 - y_predecim - (fieldmode ? 1 : 0), 2150 - ps); 2151 - *pix_inc = pixinc(-x_predecim * screen_width, ps); 2152 - break; 2153 - 2154 - default: 2155 - BUG(); 2156 - return; 2157 - } 2158 - } 2159 - 2160 - static void calc_tiler_rotation_offset(u16 screen_width, u16 width, 2161 - enum omap_color_mode color_mode, bool fieldmode, 1925 + static void calc_offset(u16 screen_width, u16 width, 1926 + u32 fourcc, bool fieldmode, 2162 1927 unsigned int field_offset, unsigned *offset0, unsigned *offset1, 2163 - s32 *row_inc, s32 *pix_inc, int x_predecim, int y_predecim) 1928 + s32 *row_inc, s32 *pix_inc, int x_predecim, int y_predecim, 1929 + enum omap_dss_rotation_type rotation_type, u8 rotation) 2164 1930 { 2165 1931 u8 ps; 2166 1932 2167 - switch (color_mode) { 2168 - case OMAP_DSS_COLOR_CLUT1: 2169 - case OMAP_DSS_COLOR_CLUT2: 2170 - case OMAP_DSS_COLOR_CLUT4: 2171 - case OMAP_DSS_COLOR_CLUT8: 2172 - BUG(); 2173 - return; 2174 - default: 2175 - ps = color_mode_to_bpp(color_mode) / 8; 2176 - break; 2177 - } 1933 + ps = color_mode_to_bpp(fourcc) / 8; 2178 1934 2179 1935 DSSDBG("scrw %d, width %d\n", screen_width, width); 2180 1936 1937 + if (rotation_type == OMAP_DSS_ROT_TILER && 1938 + (fourcc == DRM_FORMAT_UYVY || fourcc == DRM_FORMAT_YUYV) && 1939 + drm_rotation_90_or_270(rotation)) { 1940 + /* 1941 + * HACK: ROW_INC needs to be calculated with TILER units. 1942 + * We get such 'screen_width' that multiplying it with the 1943 + * YUV422 pixel size gives the correct TILER container width. 1944 + * However, 'width' is in pixels and multiplying it with YUV422 1945 + * pixel size gives incorrect result. We thus multiply it here 1946 + * with 2 to match the 32 bit TILER unit size. 1947 + */ 1948 + width *= 2; 1949 + } 1950 + 2181 1951 /* 2182 1952 * field 0 = even field = bottom field 2183 1953 * field 1 = odd field = top field 2184 1954 */ 1955 + *offset0 = field_offset * screen_width * ps; 2185 1956 *offset1 = 0; 2186 - if (field_offset) 2187 - *offset0 = *offset1 + field_offset * screen_width * ps; 2188 - else 2189 - *offset0 = *offset1; 1957 + 2190 1958 *row_inc = pixinc(1 + (y_predecim * screen_width - width * x_predecim) + 2191 1959 (fieldmode ? screen_width : 0), ps); 2192 - if (color_mode == OMAP_DSS_COLOR_YUV2 || 2193 - color_mode == OMAP_DSS_COLOR_UYVY) 1960 + if (fourcc == DRM_FORMAT_YUYV || fourcc == DRM_FORMAT_UYVY) 2194 1961 *pix_inc = pixinc(x_predecim, 2 * ps); 2195 1962 else 2196 1963 *pix_inc = pixinc(x_predecim, ps); ··· 2018 2263 static unsigned long calc_core_clk_five_taps(unsigned long pclk, 2019 2264 const struct videomode *vm, u16 width, 2020 2265 u16 height, u16 out_width, u16 out_height, 2021 - enum omap_color_mode color_mode) 2266 + u32 fourcc) 2022 2267 { 2023 2268 u32 core_clk = 0; 2024 2269 u64 tmp; ··· 2048 2293 do_div(tmp, out_width); 2049 2294 core_clk = max_t(u32, core_clk, tmp); 2050 2295 2051 - if (color_mode == OMAP_DSS_COLOR_RGB24U) 2296 + if (fourcc == DRM_FORMAT_XRGB8888) 2052 2297 core_clk <<= 1; 2053 2298 } 2054 2299 ··· 2111 2356 static int dispc_ovl_calc_scaling_24xx(unsigned long pclk, unsigned long lclk, 2112 2357 const struct videomode *vm, 2113 2358 u16 width, u16 height, u16 out_width, u16 out_height, 2114 - enum omap_color_mode color_mode, bool *five_taps, 2359 + u32 fourcc, bool *five_taps, 2115 2360 int *x_predecim, int *y_predecim, int *decim_x, int *decim_y, 2116 2361 u16 pos_x, unsigned long *core_clk, bool mem_to_mem) 2117 2362 { ··· 2157 2402 static int dispc_ovl_calc_scaling_34xx(unsigned long pclk, unsigned long lclk, 2158 2403 const struct videomode *vm, 2159 2404 u16 width, u16 height, u16 out_width, u16 out_height, 2160 - enum omap_color_mode color_mode, bool *five_taps, 2405 + u32 fourcc, bool *five_taps, 2161 2406 int *x_predecim, int *y_predecim, int *decim_x, int *decim_y, 2162 2407 u16 pos_x, unsigned long *core_clk, bool mem_to_mem) 2163 2408 { ··· 2179 2424 if (*five_taps) 2180 2425 *core_clk = calc_core_clk_five_taps(pclk, vm, 2181 2426 in_width, in_height, out_width, 2182 - out_height, color_mode); 2427 + out_height, fourcc); 2183 2428 else 2184 2429 *core_clk = dispc.feat->calc_core_clk(pclk, in_width, 2185 2430 in_height, out_width, out_height, ··· 2242 2487 static int dispc_ovl_calc_scaling_44xx(unsigned long pclk, unsigned long lclk, 2243 2488 const struct videomode *vm, 2244 2489 u16 width, u16 height, u16 out_width, u16 out_height, 2245 - enum omap_color_mode color_mode, bool *five_taps, 2490 + u32 fourcc, bool *five_taps, 2246 2491 int *x_predecim, int *y_predecim, int *decim_x, int *decim_y, 2247 2492 u16 pos_x, unsigned long *core_clk, bool mem_to_mem) 2248 2493 { ··· 2276 2521 return -EINVAL; 2277 2522 } 2278 2523 2279 - if (*decim_x > 4 && color_mode != OMAP_DSS_COLOR_NV12) { 2524 + if (*decim_x > 4 && fourcc != DRM_FORMAT_NV12) { 2280 2525 /* 2281 2526 * Let's disable all scaling that requires horizontal 2282 2527 * decimation with higher factor than 4, until we have ··· 2307 2552 enum omap_overlay_caps caps, 2308 2553 const struct videomode *vm, 2309 2554 u16 width, u16 height, u16 out_width, u16 out_height, 2310 - enum omap_color_mode color_mode, bool *five_taps, 2555 + u32 fourcc, bool *five_taps, 2311 2556 int *x_predecim, int *y_predecim, u16 pos_x, 2312 2557 enum omap_dss_rotation_type rotation_type, bool mem_to_mem) 2313 2558 { ··· 2336 2581 2 : max_decim_limit; 2337 2582 } 2338 2583 2339 - if (color_mode == OMAP_DSS_COLOR_CLUT1 || 2340 - color_mode == OMAP_DSS_COLOR_CLUT2 || 2341 - color_mode == OMAP_DSS_COLOR_CLUT4 || 2342 - color_mode == OMAP_DSS_COLOR_CLUT8) { 2343 - *x_predecim = 1; 2344 - *y_predecim = 1; 2345 - *five_taps = false; 2346 - return 0; 2347 - } 2348 - 2349 2584 decim_x = DIV_ROUND_UP(DIV_ROUND_UP(width, out_width), maxdownscale); 2350 2585 decim_y = DIV_ROUND_UP(DIV_ROUND_UP(height, out_height), maxdownscale); 2351 2586 ··· 2346 2601 return -EINVAL; 2347 2602 2348 2603 ret = dispc.feat->calc_scaling(pclk, lclk, vm, width, height, 2349 - out_width, out_height, color_mode, five_taps, 2604 + out_width, out_height, fourcc, five_taps, 2350 2605 x_predecim, y_predecim, &decim_x, &decim_y, pos_x, &core_clk, 2351 2606 mem_to_mem); 2352 2607 if (ret) ··· 2382 2637 static int dispc_ovl_setup_common(enum omap_plane_id plane, 2383 2638 enum omap_overlay_caps caps, u32 paddr, u32 p_uv_addr, 2384 2639 u16 screen_width, int pos_x, int pos_y, u16 width, u16 height, 2385 - u16 out_width, u16 out_height, enum omap_color_mode color_mode, 2386 - u8 rotation, bool mirror, u8 zorder, u8 pre_mult_alpha, 2640 + u16 out_width, u16 out_height, u32 fourcc, 2641 + u8 rotation, u8 zorder, u8 pre_mult_alpha, 2387 2642 u8 global_alpha, enum omap_dss_rotation_type rotation_type, 2388 2643 bool replication, const struct videomode *vm, 2389 2644 bool mem_to_mem) ··· 2406 2661 if (paddr == 0 && rotation_type != OMAP_DSS_ROT_TILER) 2407 2662 return -EINVAL; 2408 2663 2409 - switch (color_mode) { 2410 - case OMAP_DSS_COLOR_YUV2: 2411 - case OMAP_DSS_COLOR_UYVY: 2412 - case OMAP_DSS_COLOR_NV12: 2413 - if (in_width & 1) { 2414 - DSSERR("input width %d is not even for YUV format\n", 2415 - in_width); 2416 - return -EINVAL; 2417 - } 2418 - break; 2419 - 2420 - default: 2421 - break; 2664 + if (format_is_yuv(fourcc) && (in_width & 1)) { 2665 + DSSERR("input width %d is not even for YUV format\n", in_width); 2666 + return -EINVAL; 2422 2667 } 2423 2668 2424 2669 out_width = out_width == 0 ? width : out_width; ··· 2428 2693 out_height); 2429 2694 } 2430 2695 2431 - if (!dss_feat_color_mode_supported(plane, color_mode)) 2696 + if (!dss_feat_color_mode_supported(plane, fourcc)) 2432 2697 return -EINVAL; 2433 2698 2434 2699 r = dispc_ovl_calc_scaling(pclk, lclk, caps, vm, in_width, 2435 - in_height, out_width, out_height, color_mode, 2700 + in_height, out_width, out_height, fourcc, 2436 2701 &five_taps, &x_predecim, &y_predecim, pos_x, 2437 2702 rotation_type, mem_to_mem); 2438 2703 if (r) ··· 2445 2710 DSSDBG("predecimation %d x %x, new input size %d x %d\n", 2446 2711 x_predecim, y_predecim, in_width, in_height); 2447 2712 2448 - switch (color_mode) { 2449 - case OMAP_DSS_COLOR_YUV2: 2450 - case OMAP_DSS_COLOR_UYVY: 2451 - case OMAP_DSS_COLOR_NV12: 2452 - if (in_width & 1) { 2453 - DSSDBG("predecimated input width is not even for YUV format\n"); 2454 - DSSDBG("adjusting input width %d -> %d\n", 2455 - in_width, in_width & ~1); 2713 + if (format_is_yuv(fourcc) && (in_width & 1)) { 2714 + DSSDBG("predecimated input width is not even for YUV format\n"); 2715 + DSSDBG("adjusting input width %d -> %d\n", 2716 + in_width, in_width & ~1); 2456 2717 2457 - in_width &= ~1; 2458 - } 2459 - break; 2460 - 2461 - default: 2462 - break; 2718 + in_width &= ~1; 2463 2719 } 2464 2720 2465 - if (color_mode == OMAP_DSS_COLOR_YUV2 || 2466 - color_mode == OMAP_DSS_COLOR_UYVY || 2467 - color_mode == OMAP_DSS_COLOR_NV12) 2721 + if (format_is_yuv(fourcc)) 2468 2722 cconv = 1; 2469 2723 2470 2724 if (ilace && !fieldmode) { ··· 2487 2763 frame_height = height; 2488 2764 } 2489 2765 2490 - if (rotation_type == OMAP_DSS_ROT_TILER) 2491 - calc_tiler_rotation_offset(screen_width, frame_width, 2492 - color_mode, fieldmode, field_offset, 2493 - &offset0, &offset1, &row_inc, &pix_inc, 2494 - x_predecim, y_predecim); 2495 - else if (rotation_type == OMAP_DSS_ROT_DMA) 2496 - calc_dma_rotation_offset(rotation, mirror, screen_width, 2497 - frame_width, frame_height, 2498 - color_mode, fieldmode, field_offset, 2499 - &offset0, &offset1, &row_inc, &pix_inc, 2500 - x_predecim, y_predecim); 2501 - else 2502 - calc_vrfb_rotation_offset(rotation, mirror, 2503 - screen_width, frame_width, frame_height, 2504 - color_mode, fieldmode, field_offset, 2505 - &offset0, &offset1, &row_inc, &pix_inc, 2506 - x_predecim, y_predecim); 2766 + calc_offset(screen_width, frame_width, 2767 + fourcc, fieldmode, field_offset, 2768 + &offset0, &offset1, &row_inc, &pix_inc, 2769 + x_predecim, y_predecim, 2770 + rotation_type, rotation); 2507 2771 2508 2772 DSSDBG("offset0 %u, offset1 %u, row_inc %d, pix_inc %d\n", 2509 2773 offset0, offset1, row_inc, pix_inc); 2510 2774 2511 - dispc_ovl_set_color_mode(plane, color_mode); 2775 + dispc_ovl_set_color_mode(plane, fourcc); 2512 2776 2513 2777 dispc_ovl_configure_burst_type(plane, rotation_type); 2514 2778 ··· 2506 2794 dispc_ovl_set_ba0(plane, paddr + offset0); 2507 2795 dispc_ovl_set_ba1(plane, paddr + offset1); 2508 2796 2509 - if (OMAP_DSS_COLOR_NV12 == color_mode) { 2797 + if (fourcc == DRM_FORMAT_NV12) { 2510 2798 dispc_ovl_set_ba0_uv(plane, p_uv_addr + offset0); 2511 2799 dispc_ovl_set_ba1_uv(plane, p_uv_addr + offset1); 2512 2800 } ··· 2527 2815 if (caps & OMAP_DSS_OVL_CAP_SCALE) { 2528 2816 dispc_ovl_set_scaling(plane, in_width, in_height, out_width, 2529 2817 out_height, ilace, five_taps, fieldmode, 2530 - color_mode, rotation); 2818 + fourcc, rotation); 2531 2819 dispc_ovl_set_output_size(plane, out_width, out_height); 2532 2820 dispc_ovl_set_vid_color_conv(plane, cconv); 2533 2821 } 2534 2822 2535 - dispc_ovl_set_rotation_attrs(plane, rotation, rotation_type, mirror, 2536 - color_mode); 2823 + dispc_ovl_set_rotation_attrs(plane, rotation, rotation_type, fourcc); 2537 2824 2538 2825 dispc_ovl_set_zorder(plane, caps, zorder); 2539 2826 dispc_ovl_set_pre_mult_alpha(plane, caps, pre_mult_alpha); ··· 2545 2834 2546 2835 static int dispc_ovl_setup(enum omap_plane_id plane, 2547 2836 const struct omap_overlay_info *oi, 2548 - const struct videomode *vm, bool mem_to_mem) 2837 + const struct videomode *vm, bool mem_to_mem, 2838 + enum omap_channel channel) 2549 2839 { 2550 2840 int r; 2551 2841 enum omap_overlay_caps caps = dss_feat_get_overlay_caps(plane); 2552 - enum omap_channel channel; 2553 2842 const bool replication = true; 2554 2843 2555 - channel = dispc_ovl_get_channel_out(plane); 2556 - 2557 2844 DSSDBG("dispc_ovl_setup %d, pa %pad, pa_uv %pad, sw %d, %d,%d, %dx%d ->" 2558 - " %dx%d, cmode %x, rot %d, mir %d, chan %d repl %d\n", 2845 + " %dx%d, cmode %x, rot %d, chan %d repl %d\n", 2559 2846 plane, &oi->paddr, &oi->p_uv_addr, oi->screen_width, oi->pos_x, 2560 2847 oi->pos_y, oi->width, oi->height, oi->out_width, oi->out_height, 2561 - oi->color_mode, oi->rotation, oi->mirror, channel, replication); 2848 + oi->fourcc, oi->rotation, channel, replication); 2849 + 2850 + dispc_ovl_set_channel_out(plane, channel); 2562 2851 2563 2852 r = dispc_ovl_setup_common(plane, caps, oi->paddr, oi->p_uv_addr, 2564 2853 oi->screen_width, oi->pos_x, oi->pos_y, oi->width, oi->height, 2565 - oi->out_width, oi->out_height, oi->color_mode, oi->rotation, 2566 - oi->mirror, oi->zorder, oi->pre_mult_alpha, oi->global_alpha, 2854 + oi->out_width, oi->out_height, oi->fourcc, oi->rotation, 2855 + oi->zorder, oi->pre_mult_alpha, oi->global_alpha, 2567 2856 oi->rotation_type, replication, vm, mem_to_mem); 2568 2857 2569 2858 return r; ··· 2585 2874 OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA; 2586 2875 2587 2876 DSSDBG("dispc_wb_setup, pa %x, pa_uv %x, %d,%d -> %dx%d, cmode %x, " 2588 - "rot %d, mir %d\n", wi->paddr, wi->p_uv_addr, in_width, 2589 - in_height, wi->width, wi->height, wi->color_mode, wi->rotation, 2590 - wi->mirror); 2877 + "rot %d\n", wi->paddr, wi->p_uv_addr, in_width, 2878 + in_height, wi->width, wi->height, wi->fourcc, wi->rotation); 2591 2879 2592 2880 r = dispc_ovl_setup_common(plane, caps, wi->paddr, wi->p_uv_addr, 2593 2881 wi->buf_width, pos_x, pos_y, in_width, in_height, wi->width, 2594 - wi->height, wi->color_mode, wi->rotation, wi->mirror, zorder, 2882 + wi->height, wi->fourcc, wi->rotation, zorder, 2595 2883 wi->pre_mult_alpha, global_alpha, wi->rotation_type, 2596 2884 replication, vm, mem_to_mem); 2597 2885 2598 - switch (wi->color_mode) { 2599 - case OMAP_DSS_COLOR_RGB16: 2600 - case OMAP_DSS_COLOR_RGB24P: 2601 - case OMAP_DSS_COLOR_ARGB16: 2602 - case OMAP_DSS_COLOR_RGBA16: 2603 - case OMAP_DSS_COLOR_RGB12U: 2604 - case OMAP_DSS_COLOR_ARGB16_1555: 2605 - case OMAP_DSS_COLOR_XRGB16_1555: 2606 - case OMAP_DSS_COLOR_RGBX16: 2886 + switch (wi->fourcc) { 2887 + case DRM_FORMAT_RGB565: 2888 + case DRM_FORMAT_RGB888: 2889 + case DRM_FORMAT_ARGB4444: 2890 + case DRM_FORMAT_RGBA4444: 2891 + case DRM_FORMAT_RGBX4444: 2892 + case DRM_FORMAT_ARGB1555: 2893 + case DRM_FORMAT_XRGB1555: 2894 + case DRM_FORMAT_XRGB4444: 2607 2895 truncation = true; 2608 2896 break; 2609 2897 default: ··· 2643 2933 REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable ? 1 : 0, 0, 0); 2644 2934 2645 2935 return 0; 2646 - } 2647 - 2648 - static bool dispc_ovl_enabled(enum omap_plane_id plane) 2649 - { 2650 - return REG_GET(DISPC_OVL_ATTRIBUTES(plane), 0, 0); 2651 2936 } 2652 2937 2653 2938 static enum omap_dss_output_id dispc_mgr_get_supported_outputs(enum omap_channel channel) ··· 3492 3787 dispc_write_reg(DISPC_IRQSTATUS, mask); 3493 3788 } 3494 3789 3495 - static u32 dispc_read_irqenable(void) 3496 - { 3497 - return dispc_read_reg(DISPC_IRQENABLE); 3498 - } 3499 - 3500 3790 static void dispc_write_irqenable(u32 mask) 3501 3791 { 3502 3792 u32 old_mask = dispc_read_reg(DISPC_IRQENABLE); ··· 3500 3800 dispc_clear_irqstatus((mask ^ old_mask) & mask); 3501 3801 3502 3802 dispc_write_reg(DISPC_IRQENABLE, mask); 3803 + 3804 + /* flush posted write */ 3805 + dispc_read_reg(DISPC_IRQENABLE); 3503 3806 } 3504 3807 3505 3808 void dispc_enable_sidle(void) ··· 3928 4225 .ovli = { 3929 4226 .screen_width = 1, 3930 4227 .width = 1, .height = 1, 3931 - .color_mode = OMAP_DSS_COLOR_RGB24U, 3932 - .rotation = OMAP_DSS_ROT_0, 3933 - .rotation_type = OMAP_DSS_ROT_DMA, 3934 - .mirror = 0, 4228 + .fourcc = DRM_FORMAT_XRGB8888, 4229 + .rotation = DRM_MODE_ROTATE_0, 4230 + .rotation_type = OMAP_DSS_ROT_NONE, 3935 4231 .pos_x = 0, .pos_y = 0, 3936 4232 .out_width = 0, .out_height = 0, 3937 4233 .global_alpha = 0xff, ··· 3968 4266 return 0; 3969 4267 3970 4268 i734_buf.size = i734.ovli.width * i734.ovli.height * 3971 - color_mode_to_bpp(i734.ovli.color_mode) / 8; 4269 + color_mode_to_bpp(i734.ovli.fourcc) / 8; 3972 4270 3973 4271 i734_buf.vaddr = dma_alloc_writecombine(&dispc.pdev->dev, i734_buf.size, 3974 4272 &i734_buf.paddr, GFP_KERNEL); ··· 4011 4309 REG_FLD_MOD(DISPC_CONFIG, 0x1f, 8, 4); 4012 4310 4013 4311 /* Setup and enable GFX plane */ 4014 - dispc_ovl_set_channel_out(OMAP_DSS_GFX, OMAP_DSS_CHANNEL_LCD); 4015 - dispc_ovl_setup(OMAP_DSS_GFX, &ovli, &i734.vm, false); 4312 + dispc_ovl_setup(OMAP_DSS_GFX, &ovli, &i734.vm, false, 4313 + OMAP_DSS_CHANNEL_LCD); 4016 4314 dispc_ovl_enable(OMAP_DSS_GFX, true); 4017 4315 4018 4316 /* Set up and enable display manager for LCD1 */ ··· 4052 4350 static const struct dispc_ops dispc_ops = { 4053 4351 .read_irqstatus = dispc_read_irqstatus, 4054 4352 .clear_irqstatus = dispc_clear_irqstatus, 4055 - .read_irqenable = dispc_read_irqenable, 4056 4353 .write_irqenable = dispc_write_irqenable, 4057 4354 4058 4355 .request_irq = dispc_request_irq, ··· 4078 4377 .mgr_set_gamma = dispc_mgr_set_gamma, 4079 4378 4080 4379 .ovl_enable = dispc_ovl_enable, 4081 - .ovl_enabled = dispc_ovl_enabled, 4082 - .ovl_set_channel_out = dispc_ovl_set_channel_out, 4083 4380 .ovl_setup = dispc_ovl_setup, 4084 4381 .ovl_get_color_modes = dispc_ovl_get_color_modes, 4085 4382 }; ··· 4104 4405 return r; 4105 4406 4106 4407 dispc_mem = platform_get_resource(dispc.pdev, IORESOURCE_MEM, 0); 4107 - if (!dispc_mem) { 4108 - DSSERR("can't get IORESOURCE_MEM DISPC\n"); 4109 - return -EINVAL; 4110 - } 4111 - 4112 - dispc.base = devm_ioremap(&pdev->dev, dispc_mem->start, 4113 - resource_size(dispc_mem)); 4114 - if (!dispc.base) { 4115 - DSSERR("can't ioremap DISPC\n"); 4116 - return -ENOMEM; 4117 - } 4408 + dispc.base = devm_ioremap_resource(&pdev->dev, dispc_mem); 4409 + if (IS_ERR(dispc.base)) 4410 + return PTR_ERR(dispc.base); 4118 4411 4119 4412 dispc.irq = platform_get_irq(dispc.pdev, 0); 4120 4413 if (dispc.irq < 0) {
+5 -57
drivers/gpu/drm/omapdrm/dss/display.c
··· 30 30 31 31 #include "omapdss.h" 32 32 33 - void omapdss_default_get_resolution(struct omap_dss_device *dssdev, 34 - u16 *xres, u16 *yres) 35 - { 36 - *xres = dssdev->panel.vm.hactive; 37 - *yres = dssdev->panel.vm.vactive; 38 - } 39 - EXPORT_SYMBOL(omapdss_default_get_resolution); 40 - 41 - int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev) 42 - { 43 - switch (dssdev->type) { 44 - case OMAP_DISPLAY_TYPE_DPI: 45 - if (dssdev->phy.dpi.data_lines == 24) 46 - return 24; 47 - else 48 - return 16; 49 - 50 - case OMAP_DISPLAY_TYPE_DBI: 51 - if (dssdev->ctrl.pixel_size == 24) 52 - return 24; 53 - else 54 - return 16; 55 - case OMAP_DISPLAY_TYPE_DSI: 56 - if (dssdev->panel.dsi_pix_fmt == OMAP_DSS_DSI_FMT_RGB565) 57 - return 16; 58 - else 59 - return 24; 60 - case OMAP_DISPLAY_TYPE_VENC: 61 - case OMAP_DISPLAY_TYPE_SDI: 62 - case OMAP_DISPLAY_TYPE_HDMI: 63 - case OMAP_DISPLAY_TYPE_DVI: 64 - return 24; 65 - default: 66 - BUG(); 67 - return 0; 68 - } 69 - } 70 - EXPORT_SYMBOL(omapdss_default_get_recommended_bpp); 71 - 72 33 void omapdss_default_get_timings(struct omap_dss_device *dssdev, 73 34 struct videomode *vm) 74 35 { ··· 48 87 int id; 49 88 50 89 /* 51 - * Note: this presumes all the displays are either using DT or non-DT, 52 - * which normally should be the case. This also presumes that all 53 - * displays either have an DT alias, or none has. 90 + * Note: this presumes that all displays either have an DT alias, or 91 + * none has. 54 92 */ 55 - 56 - if (dssdev->dev->of_node) { 57 - id = of_alias_get_id(dssdev->dev->of_node, "display"); 58 - 59 - if (id < 0) 60 - id = disp_num_counter++; 61 - } else { 93 + id = of_alias_get_id(dssdev->dev->of_node, "display"); 94 + if (id < 0) 62 95 id = disp_num_counter++; 63 - } 64 96 65 97 snprintf(dssdev->alias, sizeof(dssdev->alias), "display%d", id); 66 98 67 99 /* Use 'label' property for name, if it exists */ 68 - if (dssdev->dev->of_node) 69 - of_property_read_string(dssdev->dev->of_node, "label", 70 - &dssdev->name); 100 + of_property_read_string(dssdev->dev->of_node, "label", &dssdev->name); 71 101 72 102 if (dssdev->name == NULL) 73 103 dssdev->name = dssdev->alias; 74 104 75 - if (drv && drv->get_resolution == NULL) 76 - drv->get_resolution = omapdss_default_get_resolution; 77 - if (drv && drv->get_recommended_bpp == NULL) 78 - drv->get_recommended_bpp = omapdss_default_get_recommended_bpp; 79 105 if (drv && drv->get_timings == NULL) 80 106 drv->get_timings = omapdss_default_get_timings; 81 107
-106
drivers/gpu/drm/omapdrm/dss/dpi.c
··· 32 32 #include <linux/string.h> 33 33 #include <linux/of.h> 34 34 #include <linux/clk.h> 35 - #include <linux/component.h> 36 35 37 36 #include "omapdss.h" 38 37 #include "dss.h" ··· 58 59 static struct dpi_data *dpi_get_data_from_dssdev(struct omap_dss_device *dssdev) 59 60 { 60 61 return container_of(dssdev, struct dpi_data, output); 61 - } 62 - 63 - /* only used in non-DT mode */ 64 - static struct dpi_data *dpi_get_data_from_pdev(struct platform_device *pdev) 65 - { 66 - return dev_get_drvdata(&pdev->dev); 67 62 } 68 63 69 64 static enum dss_clk_source dpi_get_clk_src_dra7xx(enum omap_channel channel) ··· 560 567 return 0; 561 568 } 562 569 563 - static void dpi_set_data_lines(struct omap_dss_device *dssdev, int data_lines) 564 - { 565 - struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev); 566 - 567 - mutex_lock(&dpi->lock); 568 - 569 - dpi->data_lines = data_lines; 570 - 571 - mutex_unlock(&dpi->lock); 572 - } 573 - 574 570 static int dpi_verify_pll(struct dss_pll *pll) 575 571 { 576 572 int r; ··· 714 732 .check_timings = dpi_check_timings, 715 733 .set_timings = dpi_set_timings, 716 734 .get_timings = dpi_get_timings, 717 - 718 - .set_data_lines = dpi_set_data_lines, 719 735 }; 720 - 721 - static void dpi_init_output(struct platform_device *pdev) 722 - { 723 - struct dpi_data *dpi = dpi_get_data_from_pdev(pdev); 724 - struct omap_dss_device *out = &dpi->output; 725 - 726 - out->dev = &pdev->dev; 727 - out->id = OMAP_DSS_OUTPUT_DPI; 728 - out->output_type = OMAP_DISPLAY_TYPE_DPI; 729 - out->name = "dpi.0"; 730 - out->dispc_channel = dpi_get_channel(0); 731 - out->ops.dpi = &dpi_ops; 732 - out->owner = THIS_MODULE; 733 - 734 - omapdss_register_output(out); 735 - } 736 - 737 - static void dpi_uninit_output(struct platform_device *pdev) 738 - { 739 - struct dpi_data *dpi = dpi_get_data_from_pdev(pdev); 740 - struct omap_dss_device *out = &dpi->output; 741 - 742 - omapdss_unregister_output(out); 743 - } 744 736 745 737 static void dpi_init_output_port(struct platform_device *pdev, 746 738 struct device_node *port) ··· 758 802 struct omap_dss_device *out = &dpi->output; 759 803 760 804 omapdss_unregister_output(out); 761 - } 762 - 763 - static int dpi_bind(struct device *dev, struct device *master, void *data) 764 - { 765 - struct platform_device *pdev = to_platform_device(dev); 766 - struct dpi_data *dpi; 767 - 768 - dpi = devm_kzalloc(&pdev->dev, sizeof(*dpi), GFP_KERNEL); 769 - if (!dpi) 770 - return -ENOMEM; 771 - 772 - dpi->pdev = pdev; 773 - 774 - dev_set_drvdata(&pdev->dev, dpi); 775 - 776 - mutex_init(&dpi->lock); 777 - 778 - dpi_init_output(pdev); 779 - 780 - return 0; 781 - } 782 - 783 - static void dpi_unbind(struct device *dev, struct device *master, void *data) 784 - { 785 - struct platform_device *pdev = to_platform_device(dev); 786 - 787 - dpi_uninit_output(pdev); 788 - } 789 - 790 - static const struct component_ops dpi_component_ops = { 791 - .bind = dpi_bind, 792 - .unbind = dpi_unbind, 793 - }; 794 - 795 - static int dpi_probe(struct platform_device *pdev) 796 - { 797 - return component_add(&pdev->dev, &dpi_component_ops); 798 - } 799 - 800 - static int dpi_remove(struct platform_device *pdev) 801 - { 802 - component_del(&pdev->dev, &dpi_component_ops); 803 - return 0; 804 - } 805 - 806 - static struct platform_driver omap_dpi_driver = { 807 - .probe = dpi_probe, 808 - .remove = dpi_remove, 809 - .driver = { 810 - .name = "omapdss_dpi", 811 - .suppress_bind_attrs = true, 812 - }, 813 - }; 814 - 815 - int __init dpi_init_platform_driver(void) 816 - { 817 - return platform_driver_register(&omap_dpi_driver); 818 - } 819 - 820 - void dpi_uninit_platform_driver(void) 821 - { 822 - platform_driver_unregister(&omap_dpi_driver); 823 805 } 824 806 825 807 int dpi_init_port(struct platform_device *pdev, struct device_node *port)
+27 -91
drivers/gpu/drm/omapdrm/dss/dsi.c
··· 5276 5276 static int dsi_bind(struct device *dev, struct device *master, void *data) 5277 5277 { 5278 5278 struct platform_device *dsidev = to_platform_device(dev); 5279 + const struct dsi_module_id_data *d; 5279 5280 u32 rev; 5280 5281 int r, i; 5281 5282 struct dsi_data *dsi; 5282 5283 struct resource *dsi_mem; 5283 5284 struct resource *res; 5284 - struct resource temp_res; 5285 5285 5286 5286 dsi = devm_kzalloc(&dsidev->dev, sizeof(*dsi), GFP_KERNEL); 5287 5287 if (!dsi) ··· 5311 5311 dsi->te_timer.data = 0; 5312 5312 #endif 5313 5313 5314 - res = platform_get_resource_byname(dsidev, IORESOURCE_MEM, "proto"); 5315 - if (!res) { 5316 - res = platform_get_resource(dsidev, IORESOURCE_MEM, 0); 5317 - if (!res) { 5318 - DSSERR("can't get IORESOURCE_MEM DSI\n"); 5319 - return -EINVAL; 5320 - } 5321 - 5322 - temp_res.start = res->start; 5323 - temp_res.end = temp_res.start + DSI_PROTO_SZ - 1; 5324 - res = &temp_res; 5325 - } 5326 - 5327 - dsi_mem = res; 5328 - 5329 - dsi->proto_base = devm_ioremap(&dsidev->dev, res->start, 5330 - resource_size(res)); 5331 - if (!dsi->proto_base) { 5332 - DSSERR("can't ioremap DSI protocol engine\n"); 5333 - return -ENOMEM; 5334 - } 5314 + dsi_mem = platform_get_resource_byname(dsidev, IORESOURCE_MEM, "proto"); 5315 + dsi->proto_base = devm_ioremap_resource(&dsidev->dev, dsi_mem); 5316 + if (IS_ERR(dsi->proto_base)) 5317 + return PTR_ERR(dsi->proto_base); 5335 5318 5336 5319 res = platform_get_resource_byname(dsidev, IORESOURCE_MEM, "phy"); 5337 - if (!res) { 5338 - res = platform_get_resource(dsidev, IORESOURCE_MEM, 0); 5339 - if (!res) { 5340 - DSSERR("can't get IORESOURCE_MEM DSI\n"); 5341 - return -EINVAL; 5342 - } 5343 - 5344 - temp_res.start = res->start + DSI_PHY_OFFSET; 5345 - temp_res.end = temp_res.start + DSI_PHY_SZ - 1; 5346 - res = &temp_res; 5347 - } 5348 - 5349 - dsi->phy_base = devm_ioremap(&dsidev->dev, res->start, 5350 - resource_size(res)); 5351 - if (!dsi->phy_base) { 5352 - DSSERR("can't ioremap DSI PHY\n"); 5353 - return -ENOMEM; 5354 - } 5320 + dsi->phy_base = devm_ioremap_resource(&dsidev->dev, res); 5321 + if (IS_ERR(dsi->phy_base)) 5322 + return PTR_ERR(dsi->phy_base); 5355 5323 5356 5324 res = platform_get_resource_byname(dsidev, IORESOURCE_MEM, "pll"); 5357 - if (!res) { 5358 - res = platform_get_resource(dsidev, IORESOURCE_MEM, 0); 5359 - if (!res) { 5360 - DSSERR("can't get IORESOURCE_MEM DSI\n"); 5361 - return -EINVAL; 5362 - } 5363 - 5364 - temp_res.start = res->start + DSI_PLL_OFFSET; 5365 - temp_res.end = temp_res.start + DSI_PLL_SZ - 1; 5366 - res = &temp_res; 5367 - } 5368 - 5369 - dsi->pll_base = devm_ioremap(&dsidev->dev, res->start, 5370 - resource_size(res)); 5371 - if (!dsi->pll_base) { 5372 - DSSERR("can't ioremap DSI PLL\n"); 5373 - return -ENOMEM; 5374 - } 5325 + dsi->pll_base = devm_ioremap_resource(&dsidev->dev, res); 5326 + if (IS_ERR(dsi->pll_base)) 5327 + return PTR_ERR(dsi->pll_base); 5375 5328 5376 5329 dsi->irq = platform_get_irq(dsi->pdev, 0); 5377 5330 if (dsi->irq < 0) { ··· 5339 5386 return r; 5340 5387 } 5341 5388 5342 - if (dsidev->dev.of_node) { 5343 - const struct of_device_id *match; 5344 - const struct dsi_module_id_data *d; 5389 + d = of_match_node(dsi_of_match, dsidev->dev.of_node)->data; 5390 + while (d->address != 0 && d->address != dsi_mem->start) 5391 + d++; 5345 5392 5346 - match = of_match_node(dsi_of_match, dsidev->dev.of_node); 5347 - if (!match) { 5348 - DSSERR("unsupported DSI module\n"); 5349 - return -ENODEV; 5350 - } 5351 - 5352 - d = match->data; 5353 - 5354 - while (d->address != 0 && d->address != dsi_mem->start) 5355 - d++; 5356 - 5357 - if (d->address == 0) { 5358 - DSSERR("unsupported DSI module\n"); 5359 - return -ENODEV; 5360 - } 5361 - 5362 - dsi->module_id = d->id; 5363 - } else { 5364 - dsi->module_id = dsidev->id; 5393 + if (d->address == 0) { 5394 + DSSERR("unsupported DSI module\n"); 5395 + return -ENODEV; 5365 5396 } 5397 + 5398 + dsi->module_id = d->id; 5366 5399 5367 5400 /* DSI VCs initialization */ 5368 5401 for (i = 0; i < ARRAY_SIZE(dsi->vc); i++) { ··· 5385 5446 5386 5447 dsi_init_output(dsidev); 5387 5448 5388 - if (dsidev->dev.of_node) { 5389 - r = dsi_probe_of(dsidev); 5390 - if (r) { 5391 - DSSERR("Invalid DSI DT data\n"); 5392 - goto err_probe_of; 5393 - } 5394 - 5395 - r = of_platform_populate(dsidev->dev.of_node, NULL, NULL, 5396 - &dsidev->dev); 5397 - if (r) 5398 - DSSERR("Failed to populate DSI child devices: %d\n", r); 5449 + r = dsi_probe_of(dsidev); 5450 + if (r) { 5451 + DSSERR("Invalid DSI DT data\n"); 5452 + goto err_probe_of; 5399 5453 } 5454 + 5455 + r = of_platform_populate(dsidev->dev.of_node, NULL, NULL, &dsidev->dev); 5456 + if (r) 5457 + DSSERR("Failed to populate DSI child devices: %d\n", r); 5400 5458 5401 5459 dsi_runtime_put(dsidev); 5402 5460
+3 -11
drivers/gpu/drm/omapdrm/dss/dss.c
··· 1158 1158 return r; 1159 1159 1160 1160 dss_mem = platform_get_resource(dss.pdev, IORESOURCE_MEM, 0); 1161 - if (!dss_mem) { 1162 - DSSERR("can't get IORESOURCE_MEM DSS\n"); 1163 - return -EINVAL; 1164 - } 1165 - 1166 - dss.base = devm_ioremap(&pdev->dev, dss_mem->start, 1167 - resource_size(dss_mem)); 1168 - if (!dss.base) { 1169 - DSSERR("can't ioremap DSS\n"); 1170 - return -ENOMEM; 1171 - } 1161 + dss.base = devm_ioremap_resource(&pdev->dev, dss_mem); 1162 + if (IS_ERR(dss.base)) 1163 + return PTR_ERR(dss.base); 1172 1164 1173 1165 r = dss_get_clocks(); 1174 1166 if (r)
-11
drivers/gpu/drm/omapdrm/dss/dss.h
··· 219 219 struct platform_device; 220 220 221 221 /* core */ 222 - struct platform_device *dss_get_core_pdev(void); 223 222 int dss_dsi_enable_pads(int dsi_id, unsigned lane_mask); 224 223 void dss_dsi_disable_pads(int dsi_id, unsigned lane_mask); 225 224 int dss_set_min_bus_tput(struct device *dev, unsigned long tput); ··· 280 281 dss_div_calc_func func, void *data); 281 282 282 283 /* SDI */ 283 - int sdi_init_platform_driver(void) __init; 284 - void sdi_uninit_platform_driver(void); 285 - 286 284 #ifdef CONFIG_OMAP2_DSS_SDI 287 285 int sdi_init_port(struct platform_device *pdev, struct device_node *port); 288 286 void sdi_uninit_port(struct device_node *port); ··· 311 315 #endif 312 316 313 317 /* DPI */ 314 - int dpi_init_platform_driver(void) __init; 315 - void dpi_uninit_platform_driver(void); 316 - 317 318 #ifdef CONFIG_OMAP2_DSS_DPI 318 319 int dpi_init_port(struct platform_device *pdev, struct device_node *port); 319 320 void dpi_uninit_port(struct device_node *port); ··· 381 388 382 389 int hdmi5_init_platform_driver(void) __init; 383 390 void hdmi5_uninit_platform_driver(void); 384 - 385 - /* RFBI */ 386 - int rfbi_init_platform_driver(void) __init; 387 - void rfbi_uninit_platform_driver(void); 388 391 389 392 390 393 #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
+90 -89
drivers/gpu/drm/omapdrm/dss/dss_features.c
··· 22 22 #include <linux/types.h> 23 23 #include <linux/err.h> 24 24 #include <linux/slab.h> 25 + #include <drm/drm_fourcc.h> 25 26 26 27 #include "omapdss.h" 27 28 #include "dss.h" ··· 48 47 const int num_ovls; 49 48 const enum omap_display_type *supported_displays; 50 49 const enum omap_dss_output_id *supported_outputs; 51 - const enum omap_color_mode *supported_color_modes; 50 + const u32 **supported_color_modes; 52 51 const enum omap_overlay_caps *overlay_caps; 53 52 const struct dss_param_range *dss_params; 54 - 55 - const enum omap_dss_rotation_type supported_rotation_types; 56 53 57 54 const u32 buffer_size_unit; 58 55 const u32 burst_size_unit; ··· 230 231 OMAP_DSS_OUTPUT_DSI2, 231 232 }; 232 233 233 - static const enum omap_color_mode omap2_dss_supported_color_modes[] = { 234 + #define COLOR_ARRAY(arr...) (const u32[]) { arr, 0 } 235 + 236 + static const u32 *omap2_dss_supported_color_modes[] = { 237 + 234 238 /* OMAP_DSS_GFX */ 235 - OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 | 236 - OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 | 237 - OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 | 238 - OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P, 239 + COLOR_ARRAY( 240 + DRM_FORMAT_RGBX4444, DRM_FORMAT_RGB565, 241 + DRM_FORMAT_XRGB8888, DRM_FORMAT_RGB888), 239 242 240 243 /* OMAP_DSS_VIDEO1 */ 241 - OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | 242 - OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 | 243 - OMAP_DSS_COLOR_UYVY, 244 + COLOR_ARRAY( 245 + DRM_FORMAT_RGB565, DRM_FORMAT_XRGB8888, 246 + DRM_FORMAT_RGB888, DRM_FORMAT_YUYV, 247 + DRM_FORMAT_UYVY), 244 248 245 249 /* OMAP_DSS_VIDEO2 */ 246 - OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | 247 - OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 | 248 - OMAP_DSS_COLOR_UYVY, 250 + COLOR_ARRAY( 251 + DRM_FORMAT_RGB565, DRM_FORMAT_XRGB8888, 252 + DRM_FORMAT_RGB888, DRM_FORMAT_YUYV, 253 + DRM_FORMAT_UYVY), 249 254 }; 250 255 251 - static const enum omap_color_mode omap3_dss_supported_color_modes[] = { 256 + static const u32 *omap3_dss_supported_color_modes[] = { 252 257 /* OMAP_DSS_GFX */ 253 - OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 | 254 - OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 | 255 - OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 | 256 - OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | 257 - OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 | 258 - OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32, 258 + COLOR_ARRAY( 259 + DRM_FORMAT_RGBX4444, DRM_FORMAT_ARGB4444, 260 + DRM_FORMAT_RGB565, DRM_FORMAT_XRGB8888, 261 + DRM_FORMAT_RGB888, DRM_FORMAT_ARGB8888, 262 + DRM_FORMAT_RGBA8888, DRM_FORMAT_RGBX8888), 259 263 260 264 /* OMAP_DSS_VIDEO1 */ 261 - OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P | 262 - OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 | 263 - OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_UYVY, 265 + COLOR_ARRAY( 266 + DRM_FORMAT_XRGB8888, DRM_FORMAT_RGB888, 267 + DRM_FORMAT_RGBX4444, DRM_FORMAT_RGB565, 268 + DRM_FORMAT_YUYV, DRM_FORMAT_UYVY), 264 269 265 270 /* OMAP_DSS_VIDEO2 */ 266 - OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 | 267 - OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | 268 - OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 | 269 - OMAP_DSS_COLOR_UYVY | OMAP_DSS_COLOR_ARGB32 | 270 - OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32, 271 + COLOR_ARRAY( 272 + DRM_FORMAT_RGBX4444, DRM_FORMAT_ARGB4444, 273 + DRM_FORMAT_RGB565, DRM_FORMAT_XRGB8888, 274 + DRM_FORMAT_RGB888, DRM_FORMAT_YUYV, 275 + DRM_FORMAT_UYVY, DRM_FORMAT_ARGB8888, 276 + DRM_FORMAT_RGBA8888, DRM_FORMAT_RGBX8888), 271 277 }; 272 278 273 - static const enum omap_color_mode omap4_dss_supported_color_modes[] = { 279 + static const u32 *omap4_dss_supported_color_modes[] = { 274 280 /* OMAP_DSS_GFX */ 275 - OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 | 276 - OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 | 277 - OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 | 278 - OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | 279 - OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 | 280 - OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32 | 281 - OMAP_DSS_COLOR_ARGB16_1555 | OMAP_DSS_COLOR_RGBX16 | 282 - OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_XRGB16_1555, 281 + COLOR_ARRAY( 282 + DRM_FORMAT_RGBX4444, DRM_FORMAT_ARGB4444, 283 + DRM_FORMAT_RGB565, DRM_FORMAT_XRGB8888, 284 + DRM_FORMAT_RGB888, DRM_FORMAT_ARGB8888, 285 + DRM_FORMAT_RGBA8888, DRM_FORMAT_RGBX8888, 286 + DRM_FORMAT_ARGB1555, DRM_FORMAT_XRGB4444, 287 + DRM_FORMAT_RGBA4444, DRM_FORMAT_XRGB1555), 283 288 284 289 /* OMAP_DSS_VIDEO1 */ 285 - OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U | 286 - OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 | 287 - OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 | 288 - OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U | 289 - OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY | 290 - OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 | 291 - OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 | 292 - OMAP_DSS_COLOR_RGBX32, 290 + COLOR_ARRAY( 291 + DRM_FORMAT_RGB565, DRM_FORMAT_RGBX4444, 292 + DRM_FORMAT_YUYV, DRM_FORMAT_ARGB1555, 293 + DRM_FORMAT_RGBA8888, DRM_FORMAT_NV12, 294 + DRM_FORMAT_RGBA4444, DRM_FORMAT_XRGB8888, 295 + DRM_FORMAT_RGB888, DRM_FORMAT_UYVY, 296 + DRM_FORMAT_ARGB4444, DRM_FORMAT_XRGB1555, 297 + DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB4444, 298 + DRM_FORMAT_RGBX8888), 293 299 294 300 /* OMAP_DSS_VIDEO2 */ 295 - OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U | 296 - OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 | 297 - OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 | 298 - OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U | 299 - OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY | 300 - OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 | 301 - OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 | 302 - OMAP_DSS_COLOR_RGBX32, 301 + COLOR_ARRAY( 302 + DRM_FORMAT_RGB565, DRM_FORMAT_RGBX4444, 303 + DRM_FORMAT_YUYV, DRM_FORMAT_ARGB1555, 304 + DRM_FORMAT_RGBA8888, DRM_FORMAT_NV12, 305 + DRM_FORMAT_RGBA4444, DRM_FORMAT_XRGB8888, 306 + DRM_FORMAT_RGB888, DRM_FORMAT_UYVY, 307 + DRM_FORMAT_ARGB4444, DRM_FORMAT_XRGB1555, 308 + DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB4444, 309 + DRM_FORMAT_RGBX8888), 303 310 304 311 /* OMAP_DSS_VIDEO3 */ 305 - OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U | 306 - OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 | 307 - OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 | 308 - OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U | 309 - OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY | 310 - OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 | 311 - OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 | 312 - OMAP_DSS_COLOR_RGBX32, 312 + COLOR_ARRAY( 313 + DRM_FORMAT_RGB565, DRM_FORMAT_RGBX4444, 314 + DRM_FORMAT_YUYV, DRM_FORMAT_ARGB1555, 315 + DRM_FORMAT_RGBA8888, DRM_FORMAT_NV12, 316 + DRM_FORMAT_RGBA4444, DRM_FORMAT_XRGB8888, 317 + DRM_FORMAT_RGB888, DRM_FORMAT_UYVY, 318 + DRM_FORMAT_ARGB4444, DRM_FORMAT_XRGB1555, 319 + DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB4444, 320 + DRM_FORMAT_RGBX8888), 313 321 314 322 /* OMAP_DSS_WB */ 315 - OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U | 316 - OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 | 317 - OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 | 318 - OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U | 319 - OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY | 320 - OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 | 321 - OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 | 322 - OMAP_DSS_COLOR_RGBX32, 323 + COLOR_ARRAY( 324 + DRM_FORMAT_RGB565, DRM_FORMAT_RGBX4444, 325 + DRM_FORMAT_YUYV, DRM_FORMAT_ARGB1555, 326 + DRM_FORMAT_RGBA8888, DRM_FORMAT_NV12, 327 + DRM_FORMAT_RGBA4444, DRM_FORMAT_XRGB8888, 328 + DRM_FORMAT_RGB888, DRM_FORMAT_UYVY, 329 + DRM_FORMAT_ARGB4444, DRM_FORMAT_XRGB1555, 330 + DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB4444, 331 + DRM_FORMAT_RGBX8888), 323 332 }; 324 333 325 334 static const enum omap_overlay_caps omap2_dss_overlay_caps[] = { ··· 609 602 .supported_color_modes = omap2_dss_supported_color_modes, 610 603 .overlay_caps = omap2_dss_overlay_caps, 611 604 .dss_params = omap2_dss_param_range, 612 - .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_VRFB, 613 605 .buffer_size_unit = 1, 614 606 .burst_size_unit = 8, 615 607 }; ··· 628 622 .supported_color_modes = omap3_dss_supported_color_modes, 629 623 .overlay_caps = omap3430_dss_overlay_caps, 630 624 .dss_params = omap3_dss_param_range, 631 - .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_VRFB, 632 625 .buffer_size_unit = 1, 633 626 .burst_size_unit = 8, 634 627 }; ··· 650 645 .supported_color_modes = omap3_dss_supported_color_modes, 651 646 .overlay_caps = omap3430_dss_overlay_caps, 652 647 .dss_params = omap3_dss_param_range, 653 - .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_VRFB, 654 648 .buffer_size_unit = 1, 655 649 .burst_size_unit = 8, 656 650 }; ··· 668 664 .supported_color_modes = omap3_dss_supported_color_modes, 669 665 .overlay_caps = omap3430_dss_overlay_caps, 670 666 .dss_params = am43xx_dss_param_range, 671 - .supported_rotation_types = OMAP_DSS_ROT_DMA, 672 667 .buffer_size_unit = 1, 673 668 .burst_size_unit = 8, 674 669 }; ··· 686 683 .supported_color_modes = omap3_dss_supported_color_modes, 687 684 .overlay_caps = omap3630_dss_overlay_caps, 688 685 .dss_params = omap3_dss_param_range, 689 - .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_VRFB, 690 686 .buffer_size_unit = 1, 691 687 .burst_size_unit = 8, 692 688 }; ··· 706 704 .supported_color_modes = omap4_dss_supported_color_modes, 707 705 .overlay_caps = omap4_dss_overlay_caps, 708 706 .dss_params = omap4_dss_param_range, 709 - .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_TILER, 710 707 .buffer_size_unit = 16, 711 708 .burst_size_unit = 16, 712 709 }; ··· 725 724 .supported_color_modes = omap4_dss_supported_color_modes, 726 725 .overlay_caps = omap4_dss_overlay_caps, 727 726 .dss_params = omap4_dss_param_range, 728 - .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_TILER, 729 727 .buffer_size_unit = 16, 730 728 .burst_size_unit = 16, 731 729 }; ··· 744 744 .supported_color_modes = omap4_dss_supported_color_modes, 745 745 .overlay_caps = omap4_dss_overlay_caps, 746 746 .dss_params = omap4_dss_param_range, 747 - .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_TILER, 748 747 .buffer_size_unit = 16, 749 748 .burst_size_unit = 16, 750 749 }; ··· 763 764 .supported_color_modes = omap4_dss_supported_color_modes, 764 765 .overlay_caps = omap4_dss_overlay_caps, 765 766 .dss_params = omap5_dss_param_range, 766 - .supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_TILER, 767 767 .buffer_size_unit = 16, 768 768 .burst_size_unit = 16, 769 769 }; ··· 798 800 return omap_current_dss_features->supported_outputs[channel]; 799 801 } 800 802 801 - enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane_id plane) 803 + const u32 *dss_feat_get_supported_color_modes(enum omap_plane_id plane) 802 804 { 803 805 return omap_current_dss_features->supported_color_modes[plane]; 804 806 } ··· 808 810 return omap_current_dss_features->overlay_caps[plane]; 809 811 } 810 812 811 - bool dss_feat_color_mode_supported(enum omap_plane_id plane, 812 - enum omap_color_mode color_mode) 813 + bool dss_feat_color_mode_supported(enum omap_plane_id plane, u32 fourcc) 813 814 { 814 - return omap_current_dss_features->supported_color_modes[plane] & 815 - color_mode; 815 + const u32 *modes; 816 + unsigned int i; 817 + 818 + modes = omap_current_dss_features->supported_color_modes[plane]; 819 + 820 + for (i = 0; modes[i]; ++i) { 821 + if (modes[i] == fourcc) 822 + return true; 823 + } 824 + 825 + return false; 816 826 } 817 827 818 828 u32 dss_feat_get_buffer_size_unit(void) ··· 855 849 856 850 *start = omap_current_dss_features->reg_fields[id].start; 857 851 *end = omap_current_dss_features->reg_fields[id].end; 858 - } 859 - 860 - bool dss_feat_rotation_type_supported(enum omap_dss_rotation_type rot_type) 861 - { 862 - return omap_current_dss_features->supported_rotation_types & rot_type; 863 852 } 864 853 865 854 void dss_features_init(enum omapdss_version version)
+2 -4
drivers/gpu/drm/omapdrm/dss/dss_features.h
··· 90 90 unsigned long dss_feat_get_param_max(enum dss_range_param param); 91 91 enum omap_overlay_caps dss_feat_get_overlay_caps(enum omap_plane_id plane); 92 92 bool dss_feat_color_mode_supported(enum omap_plane_id plane, 93 - enum omap_color_mode color_mode); 93 + u32 fourcc); 94 94 95 95 u32 dss_feat_get_buffer_size_unit(void); /* in bytes */ 96 96 u32 dss_feat_get_burst_size_unit(void); /* in bytes */ 97 - 98 - bool dss_feat_rotation_type_supported(enum omap_dss_rotation_type rot_type); 99 97 100 98 bool dss_has_feature(enum dss_feat_id id); 101 99 void dss_feat_get_reg_field(enum dss_feat_reg_field id, u8 *start, u8 *end); ··· 104 106 105 107 int dss_feat_get_num_mgrs(void); 106 108 int dss_feat_get_num_ovls(void); 107 - enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane_id plane); 109 + const u32 *dss_feat_get_supported_color_modes(enum omap_plane_id plane); 108 110 109 111 #endif
+3 -5
drivers/gpu/drm/omapdrm/dss/hdmi4.c
··· 696 696 mutex_init(&hdmi.lock); 697 697 spin_lock_init(&hdmi.audio_playing_lock); 698 698 699 - if (pdev->dev.of_node) { 700 - r = hdmi_probe_of(pdev); 701 - if (r) 702 - return r; 703 - } 699 + r = hdmi_probe_of(pdev); 700 + if (r) 701 + return r; 704 702 705 703 r = hdmi_wp_init(pdev, &hdmi.wp); 706 704 if (r)
+1 -8
drivers/gpu/drm/omapdrm/dss/hdmi4_core.c
··· 889 889 struct resource *res; 890 890 891 891 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "core"); 892 - if (!res) { 893 - DSSERR("can't get CORE mem resource\n"); 894 - return -EINVAL; 895 - } 896 - 897 892 core->base = devm_ioremap_resource(&pdev->dev, res); 898 - if (IS_ERR(core->base)) { 899 - DSSERR("can't ioremap CORE\n"); 893 + if (IS_ERR(core->base)) 900 894 return PTR_ERR(core->base); 901 - } 902 895 903 896 return 0; 904 897 }
+3 -5
drivers/gpu/drm/omapdrm/dss/hdmi5.c
··· 728 728 mutex_init(&hdmi.lock); 729 729 spin_lock_init(&hdmi.audio_playing_lock); 730 730 731 - if (pdev->dev.of_node) { 732 - r = hdmi_probe_of(pdev); 733 - if (r) 734 - return r; 735 - } 731 + r = hdmi_probe_of(pdev); 732 + if (r) 733 + return r; 736 734 737 735 r = hdmi_wp_init(pdev, &hdmi.wp); 738 736 if (r)
+1 -8
drivers/gpu/drm/omapdrm/dss/hdmi5_core.c
··· 910 910 struct resource *res; 911 911 912 912 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "core"); 913 - if (!res) { 914 - DSSERR("can't get CORE IORESOURCE_MEM HDMI\n"); 915 - return -EINVAL; 916 - } 917 - 918 913 core->base = devm_ioremap_resource(&pdev->dev, res); 919 - if (IS_ERR(core->base)) { 920 - DSSERR("can't ioremap HDMI core\n"); 914 + if (IS_ERR(core->base)) 921 915 return PTR_ERR(core->base); 922 - } 923 916 924 917 return 0; 925 918 }
+1 -8
drivers/gpu/drm/omapdrm/dss/hdmi_phy.c
··· 233 233 return r; 234 234 235 235 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phy"); 236 - if (!res) { 237 - DSSERR("can't get PHY mem resource\n"); 238 - return -EINVAL; 239 - } 240 - 241 236 phy->base = devm_ioremap_resource(&pdev->dev, res); 242 - if (IS_ERR(phy->base)) { 243 - DSSERR("can't ioremap TX PHY\n"); 237 + if (IS_ERR(phy->base)) 244 238 return PTR_ERR(phy->base); 245 - } 246 239 247 240 return 0; 248 241 }
+1 -8
drivers/gpu/drm/omapdrm/dss/hdmi_pll.c
··· 180 180 pll->wp = wp; 181 181 182 182 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pll"); 183 - if (!res) { 184 - DSSERR("can't get PLL mem resource\n"); 185 - return -EINVAL; 186 - } 187 - 188 183 pll->base = devm_ioremap_resource(&pdev->dev, res); 189 - if (IS_ERR(pll->base)) { 190 - DSSERR("can't ioremap PLLCTRL\n"); 184 + if (IS_ERR(pll->base)) 191 185 return PTR_ERR(pll->base); 192 - } 193 186 194 187 r = dsi_init_pll_data(pdev, pll); 195 188 if (r) {
+3 -9
drivers/gpu/drm/omapdrm/dss/hdmi_wp.c
··· 287 287 struct resource *res; 288 288 289 289 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "wp"); 290 - if (!res) { 291 - DSSERR("can't get WP mem resource\n"); 292 - return -EINVAL; 293 - } 294 - wp->phys_base = res->start; 295 - 296 290 wp->base = devm_ioremap_resource(&pdev->dev, res); 297 - if (IS_ERR(wp->base)) { 298 - DSSERR("can't ioremap HDMI WP\n"); 291 + if (IS_ERR(wp->base)) 299 292 return PTR_ERR(wp->base); 300 - } 293 + 294 + wp->phys_base = res->start; 301 295 302 296 return 0; 303 297 }
+8 -218
drivers/gpu/drm/omapdrm/dss/omapdss.h
··· 59 59 #define DISPC_IRQ_FRAMEDONE3 (1 << 30) 60 60 61 61 struct omap_dss_device; 62 - struct omap_overlay_manager; 63 62 struct dss_lcd_mgr_config; 64 63 struct snd_aes_iec958; 65 64 struct snd_cea_861_aud_if; ··· 92 93 }; 93 94 94 95 enum omap_color_mode { 95 - OMAP_DSS_COLOR_CLUT1 = 1 << 0, /* BITMAP 1 */ 96 - OMAP_DSS_COLOR_CLUT2 = 1 << 1, /* BITMAP 2 */ 97 - OMAP_DSS_COLOR_CLUT4 = 1 << 2, /* BITMAP 4 */ 98 - OMAP_DSS_COLOR_CLUT8 = 1 << 3, /* BITMAP 8 */ 99 - OMAP_DSS_COLOR_RGB12U = 1 << 4, /* RGB12, 16-bit container */ 100 - OMAP_DSS_COLOR_ARGB16 = 1 << 5, /* ARGB16 */ 101 - OMAP_DSS_COLOR_RGB16 = 1 << 6, /* RGB16 */ 102 - OMAP_DSS_COLOR_RGB24U = 1 << 7, /* RGB24, 32-bit container */ 103 - OMAP_DSS_COLOR_RGB24P = 1 << 8, /* RGB24, 24-bit container */ 104 - OMAP_DSS_COLOR_YUV2 = 1 << 9, /* YUV2 4:2:2 co-sited */ 105 - OMAP_DSS_COLOR_UYVY = 1 << 10, /* UYVY 4:2:2 co-sited */ 106 - OMAP_DSS_COLOR_ARGB32 = 1 << 11, /* ARGB32 */ 107 - OMAP_DSS_COLOR_RGBA32 = 1 << 12, /* RGBA32 */ 108 - OMAP_DSS_COLOR_RGBX32 = 1 << 13, /* RGBx32 */ 109 - OMAP_DSS_COLOR_NV12 = 1 << 14, /* NV12 format: YUV 4:2:0 */ 110 - OMAP_DSS_COLOR_RGBA16 = 1 << 15, /* RGBA16 - 4444 */ 111 - OMAP_DSS_COLOR_RGBX16 = 1 << 16, /* RGBx16 - 4444 */ 112 - OMAP_DSS_COLOR_ARGB16_1555 = 1 << 17, /* ARGB16 - 1555 */ 113 - OMAP_DSS_COLOR_XRGB16_1555 = 1 << 18, /* xRGB16 - 1555 */ 96 + _UNUSED_, 114 97 }; 115 98 116 99 enum omap_dss_load_mode { ··· 105 124 enum omap_dss_trans_key_type { 106 125 OMAP_DSS_COLOR_KEY_GFX_DST = 0, 107 126 OMAP_DSS_COLOR_KEY_VID_SRC = 1, 108 - }; 109 - 110 - enum omap_rfbi_te_mode { 111 - OMAP_DSS_RFBI_TE_MODE_1 = 1, 112 - OMAP_DSS_RFBI_TE_MODE_2 = 2, 113 127 }; 114 128 115 129 enum omap_dss_signal_level { ··· 145 169 }; 146 170 147 171 enum omap_dss_rotation_type { 148 - OMAP_DSS_ROT_DMA = 1 << 0, 149 - OMAP_DSS_ROT_VRFB = 1 << 1, 150 - OMAP_DSS_ROT_TILER = 1 << 2, 151 - }; 152 - 153 - /* clockwise rotation angle */ 154 - enum omap_dss_rotation_angle { 155 - OMAP_DSS_ROT_0 = 0, 156 - OMAP_DSS_ROT_90 = 1, 157 - OMAP_DSS_ROT_180 = 2, 158 - OMAP_DSS_ROT_270 = 3, 172 + OMAP_DSS_ROT_NONE = 0, 173 + OMAP_DSS_ROT_TILER = 1 << 0, 159 174 }; 160 175 161 176 enum omap_overlay_caps { ··· 156 189 OMAP_DSS_OVL_CAP_ZORDER = 1 << 3, 157 190 OMAP_DSS_OVL_CAP_POS = 1 << 4, 158 191 OMAP_DSS_OVL_CAP_REPLICATION = 1 << 5, 159 - }; 160 - 161 - enum omap_overlay_manager_caps { 162 - OMAP_DSS_DUMMY_VALUE, /* add a dummy value to prevent compiler error */ 163 192 }; 164 193 165 194 enum omap_dss_clk_source { ··· 181 218 OMAP_DSS_OUTPUT_DSI2 = 1 << 4, 182 219 OMAP_DSS_OUTPUT_VENC = 1 << 5, 183 220 OMAP_DSS_OUTPUT_HDMI = 1 << 6, 184 - }; 185 - 186 - /* RFBI */ 187 - 188 - struct rfbi_timings { 189 - int cs_on_time; 190 - int cs_off_time; 191 - int we_on_time; 192 - int we_off_time; 193 - int re_on_time; 194 - int re_off_time; 195 - int we_cycle_time; 196 - int re_cycle_time; 197 - int cs_pulse_width; 198 - int access_time; 199 - 200 - int clk_div; 201 - 202 - u32 tim[5]; /* set by rfbi_convert_timings() */ 203 - 204 - int converted; 205 221 }; 206 222 207 223 /* DSI */ ··· 260 318 u16 screen_width; 261 319 u16 width; 262 320 u16 height; 263 - enum omap_color_mode color_mode; 321 + u32 fourcc; 264 322 u8 rotation; 265 323 enum omap_dss_rotation_type rotation_type; 266 - bool mirror; 267 324 268 325 u16 pos_x; 269 326 u16 pos_y; ··· 271 330 u8 global_alpha; 272 331 u8 pre_mult_alpha; 273 332 u8 zorder; 274 - }; 275 - 276 - struct omap_overlay { 277 - struct kobject kobj; 278 - struct list_head list; 279 - 280 - /* static fields */ 281 - const char *name; 282 - enum omap_plane_id id; 283 - enum omap_color_mode supported_modes; 284 - enum omap_overlay_caps caps; 285 - 286 - /* dynamic fields */ 287 - struct omap_overlay_manager *manager; 288 - 289 - /* 290 - * The following functions do not block: 291 - * 292 - * is_enabled 293 - * set_overlay_info 294 - * get_overlay_info 295 - * 296 - * The rest of the functions may block and cannot be called from 297 - * interrupt context 298 - */ 299 - 300 - int (*enable)(struct omap_overlay *ovl); 301 - int (*disable)(struct omap_overlay *ovl); 302 - bool (*is_enabled)(struct omap_overlay *ovl); 303 - 304 - int (*set_manager)(struct omap_overlay *ovl, 305 - struct omap_overlay_manager *mgr); 306 - int (*unset_manager)(struct omap_overlay *ovl); 307 - 308 - int (*set_overlay_info)(struct omap_overlay *ovl, 309 - struct omap_overlay_info *info); 310 - void (*get_overlay_info)(struct omap_overlay *ovl, 311 - struct omap_overlay_info *info); 312 - 313 - int (*wait_for_go)(struct omap_overlay *ovl); 314 - 315 - struct omap_dss_device *(*get_device)(struct omap_overlay *ovl); 316 333 }; 317 334 318 335 struct omap_overlay_manager_info { ··· 284 385 285 386 bool cpr_enable; 286 387 struct omap_dss_cpr_coefs cpr_coefs; 287 - }; 288 - 289 - struct omap_overlay_manager { 290 - struct kobject kobj; 291 - 292 - /* static fields */ 293 - const char *name; 294 - enum omap_channel id; 295 - enum omap_overlay_manager_caps caps; 296 - struct list_head overlays; 297 - enum omap_display_type supported_displays; 298 - enum omap_dss_output_id supported_outputs; 299 - 300 - /* dynamic fields */ 301 - struct omap_dss_device *output; 302 - 303 - /* 304 - * The following functions do not block: 305 - * 306 - * set_manager_info 307 - * get_manager_info 308 - * apply 309 - * 310 - * The rest of the functions may block and cannot be called from 311 - * interrupt context 312 - */ 313 - 314 - int (*set_output)(struct omap_overlay_manager *mgr, 315 - struct omap_dss_device *output); 316 - int (*unset_output)(struct omap_overlay_manager *mgr); 317 - 318 - int (*set_manager_info)(struct omap_overlay_manager *mgr, 319 - struct omap_overlay_manager_info *info); 320 - void (*get_manager_info)(struct omap_overlay_manager *mgr, 321 - struct omap_overlay_manager_info *info); 322 - 323 - int (*apply)(struct omap_overlay_manager *mgr); 324 - int (*wait_for_go)(struct omap_overlay_manager *mgr); 325 - int (*wait_for_vsync)(struct omap_overlay_manager *mgr); 326 - 327 - struct omap_dss_device *(*get_device)(struct omap_overlay_manager *mgr); 328 388 }; 329 389 330 390 /* 22 pins means 1 clk lane and 10 data lanes */ ··· 307 449 u16 buf_width; 308 450 u16 width; 309 451 u16 height; 310 - enum omap_color_mode color_mode; 452 + u32 fourcc; 311 453 u8 rotation; 312 454 enum omap_dss_rotation_type rotation_type; 313 - bool mirror; 314 455 u8 pre_mult_alpha; 315 456 }; 316 457 ··· 328 471 struct videomode *vm); 329 472 void (*get_timings)(struct omap_dss_device *dssdev, 330 473 struct videomode *vm); 331 - 332 - void (*set_data_lines)(struct omap_dss_device *dssdev, int data_lines); 333 474 }; 334 475 335 476 struct omapdss_sdi_ops { ··· 345 490 struct videomode *vm); 346 491 void (*get_timings)(struct omap_dss_device *dssdev, 347 492 struct videomode *vm); 348 - 349 - void (*set_datapairs)(struct omap_dss_device *dssdev, int datapairs); 350 493 }; 351 494 352 495 struct omapdss_dvi_ops { ··· 379 526 struct videomode *vm); 380 527 void (*get_timings)(struct omap_dss_device *dssdev, 381 528 struct videomode *vm); 382 - 383 - void (*set_type)(struct omap_dss_device *dssdev, 384 - enum omap_dss_venc_type type); 385 - void (*invert_vid_out_polarity)(struct omap_dss_device *dssdev, 386 - bool invert_polarity); 387 529 388 530 int (*set_wss)(struct omap_dss_device *dssdev, u32 wss); 389 531 u32 (*get_wss)(struct omap_dss_device *dssdev); ··· 479 631 enum omap_display_type type; 480 632 enum omap_display_type output_type; 481 633 482 - union { 483 - struct { 484 - u8 data_lines; 485 - } dpi; 486 - 487 - struct { 488 - u8 channel; 489 - u8 data_lines; 490 - } rfbi; 491 - 492 - struct { 493 - u8 datapairs; 494 - } sdi; 495 - 496 - struct { 497 - int module; 498 - } dsi; 499 - 500 - struct { 501 - enum omap_dss_venc_type type; 502 - bool invert_polarity; 503 - } venc; 504 - } phy; 505 - 506 634 struct { 507 635 struct videomode vm; 508 636 ··· 486 662 enum omap_dss_dsi_mode dsi_mode; 487 663 } panel; 488 664 489 - struct { 490 - u8 pixel_size; 491 - struct rfbi_timings rfbi_timings; 492 - } ctrl; 493 - 494 665 const char *name; 495 - 496 - /* used to match device to driver */ 497 - const char *driver_name; 498 - 499 - void *data; 500 666 501 667 struct omap_dss_driver *driver; 502 668 ··· 523 709 int port_num; 524 710 525 711 /* dynamic fields */ 526 - struct omap_overlay_manager *manager; 527 - 528 712 struct omap_dss_device *dst; 529 713 }; 530 714 ··· 553 741 int (*memory_read)(struct omap_dss_device *dssdev, 554 742 void *buf, size_t size, 555 743 u16 x, u16 y, u16 w, u16 h); 556 - 557 - void (*get_resolution)(struct omap_dss_device *dssdev, 558 - u16 *xres, u16 *yres); 559 - void (*get_dimensions)(struct omap_dss_device *dssdev, 560 - u32 *width, u32 *height); 561 - int (*get_recommended_bpp)(struct omap_dss_device *dssdev); 562 744 563 745 int (*check_timings)(struct omap_dss_device *dssdev, 564 746 struct videomode *vm); ··· 587 781 struct omap_dss_device *omap_dss_get_next_device(struct omap_dss_device *from); 588 782 struct omap_dss_device *omap_dss_find_device(void *data, 589 783 int (*match)(struct omap_dss_device *dssdev, void *data)); 590 - const char *omapdss_get_default_display_name(void); 591 - 592 - int dss_feat_get_num_mgrs(void); 593 - int dss_feat_get_num_ovls(void); 594 - enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane_id plane); 595 - 596 784 597 785 598 786 int omap_dss_get_num_overlay_managers(void); 599 - struct omap_overlay_manager *omap_dss_get_overlay_manager(int num); 600 787 601 788 int omap_dss_get_num_overlays(void); 602 - struct omap_overlay *omap_dss_get_overlay(int num); 603 789 604 790 int omapdss_register_output(struct omap_dss_device *output); 605 791 void omapdss_unregister_output(struct omap_dss_device *output); 606 792 struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id); 607 - struct omap_dss_device *omap_dss_find_output(const char *name); 608 793 struct omap_dss_device *omap_dss_find_output_by_port_node(struct device_node *port); 609 794 int omapdss_output_set_device(struct omap_dss_device *out, 610 795 struct omap_dss_device *dssdev); 611 796 int omapdss_output_unset_device(struct omap_dss_device *out); 612 797 613 798 struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device *dssdev); 614 - struct omap_overlay_manager *omapdss_find_mgr_from_display(struct omap_dss_device *dssdev); 615 799 616 - void omapdss_default_get_resolution(struct omap_dss_device *dssdev, 617 - u16 *xres, u16 *yres); 618 - int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev); 619 800 void omapdss_default_get_timings(struct omap_dss_device *dssdev, 620 801 struct videomode *vm); 621 802 ··· 674 881 struct dispc_ops { 675 882 u32 (*read_irqstatus)(void); 676 883 void (*clear_irqstatus)(u32 mask); 677 - u32 (*read_irqenable)(void); 678 884 void (*write_irqenable)(u32 mask); 679 885 680 886 int (*request_irq)(irq_handler_t handler, void *dev_id); ··· 705 913 unsigned int length); 706 914 707 915 int (*ovl_enable)(enum omap_plane_id plane, bool enable); 708 - bool (*ovl_enabled)(enum omap_plane_id plane); 709 - void (*ovl_set_channel_out)(enum omap_plane_id plane, 710 - enum omap_channel channel); 711 916 int (*ovl_setup)(enum omap_plane_id plane, 712 917 const struct omap_overlay_info *oi, 713 - const struct videomode *vm, bool mem_to_mem); 918 + const struct videomode *vm, bool mem_to_mem, 919 + enum omap_channel channel); 714 920 715 - enum omap_color_mode (*ovl_get_color_modes)(enum omap_plane_id plane); 921 + const u32 *(*ovl_get_color_modes)(enum omap_plane_id plane); 716 922 }; 717 923 718 924 void dispc_set_ops(const struct dispc_ops *o);
-13
drivers/gpu/drm/omapdrm/dss/output.c
··· 133 133 } 134 134 EXPORT_SYMBOL(omap_dss_get_output); 135 135 136 - struct omap_dss_device *omap_dss_find_output(const char *name) 137 - { 138 - struct omap_dss_device *out; 139 - 140 - list_for_each_entry(out, &output_list, list) { 141 - if (strcmp(out->name, name) == 0) 142 - return omap_dss_get_device(out); 143 - } 144 - 145 - return NULL; 146 - } 147 - EXPORT_SYMBOL(omap_dss_find_output); 148 - 149 136 struct omap_dss_device *omap_dss_find_output_by_port_node(struct device_node *port) 150 137 { 151 138 struct device_node *src_node;
-1083
drivers/gpu/drm/omapdrm/dss/rfbi.c
··· 1 - /* 2 - * linux/drivers/video/omap2/dss/rfbi.c 3 - * 4 - * Copyright (C) 2009 Nokia Corporation 5 - * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> 6 - * 7 - * Some code and ideas taken from drivers/video/omap/ driver 8 - * by Imre Deak. 9 - * 10 - * This program is free software; you can redistribute it and/or modify it 11 - * under the terms of the GNU General Public License version 2 as published by 12 - * the Free Software Foundation. 13 - * 14 - * This program is distributed in the hope that it will be useful, but WITHOUT 15 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 16 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 17 - * more details. 18 - * 19 - * You should have received a copy of the GNU General Public License along with 20 - * this program. If not, see <http://www.gnu.org/licenses/>. 21 - */ 22 - 23 - #define DSS_SUBSYS_NAME "RFBI" 24 - 25 - #include <linux/kernel.h> 26 - #include <linux/dma-mapping.h> 27 - #include <linux/export.h> 28 - #include <linux/vmalloc.h> 29 - #include <linux/clk.h> 30 - #include <linux/io.h> 31 - #include <linux/delay.h> 32 - #include <linux/kfifo.h> 33 - #include <linux/ktime.h> 34 - #include <linux/hrtimer.h> 35 - #include <linux/seq_file.h> 36 - #include <linux/semaphore.h> 37 - #include <linux/platform_device.h> 38 - #include <linux/pm_runtime.h> 39 - #include <linux/component.h> 40 - 41 - #include "omapdss.h" 42 - #include "dss.h" 43 - 44 - struct rfbi_reg { u16 idx; }; 45 - 46 - #define RFBI_REG(idx) ((const struct rfbi_reg) { idx }) 47 - 48 - #define RFBI_REVISION RFBI_REG(0x0000) 49 - #define RFBI_SYSCONFIG RFBI_REG(0x0010) 50 - #define RFBI_SYSSTATUS RFBI_REG(0x0014) 51 - #define RFBI_CONTROL RFBI_REG(0x0040) 52 - #define RFBI_PIXEL_CNT RFBI_REG(0x0044) 53 - #define RFBI_LINE_NUMBER RFBI_REG(0x0048) 54 - #define RFBI_CMD RFBI_REG(0x004c) 55 - #define RFBI_PARAM RFBI_REG(0x0050) 56 - #define RFBI_DATA RFBI_REG(0x0054) 57 - #define RFBI_READ RFBI_REG(0x0058) 58 - #define RFBI_STATUS RFBI_REG(0x005c) 59 - 60 - #define RFBI_CONFIG(n) RFBI_REG(0x0060 + (n)*0x18) 61 - #define RFBI_ONOFF_TIME(n) RFBI_REG(0x0064 + (n)*0x18) 62 - #define RFBI_CYCLE_TIME(n) RFBI_REG(0x0068 + (n)*0x18) 63 - #define RFBI_DATA_CYCLE1(n) RFBI_REG(0x006c + (n)*0x18) 64 - #define RFBI_DATA_CYCLE2(n) RFBI_REG(0x0070 + (n)*0x18) 65 - #define RFBI_DATA_CYCLE3(n) RFBI_REG(0x0074 + (n)*0x18) 66 - 67 - #define RFBI_VSYNC_WIDTH RFBI_REG(0x0090) 68 - #define RFBI_HSYNC_WIDTH RFBI_REG(0x0094) 69 - 70 - #define REG_FLD_MOD(idx, val, start, end) \ 71 - rfbi_write_reg(idx, FLD_MOD(rfbi_read_reg(idx), val, start, end)) 72 - 73 - enum omap_rfbi_cycleformat { 74 - OMAP_DSS_RFBI_CYCLEFORMAT_1_1 = 0, 75 - OMAP_DSS_RFBI_CYCLEFORMAT_2_1 = 1, 76 - OMAP_DSS_RFBI_CYCLEFORMAT_3_1 = 2, 77 - OMAP_DSS_RFBI_CYCLEFORMAT_3_2 = 3, 78 - }; 79 - 80 - enum omap_rfbi_datatype { 81 - OMAP_DSS_RFBI_DATATYPE_12 = 0, 82 - OMAP_DSS_RFBI_DATATYPE_16 = 1, 83 - OMAP_DSS_RFBI_DATATYPE_18 = 2, 84 - OMAP_DSS_RFBI_DATATYPE_24 = 3, 85 - }; 86 - 87 - enum omap_rfbi_parallelmode { 88 - OMAP_DSS_RFBI_PARALLELMODE_8 = 0, 89 - OMAP_DSS_RFBI_PARALLELMODE_9 = 1, 90 - OMAP_DSS_RFBI_PARALLELMODE_12 = 2, 91 - OMAP_DSS_RFBI_PARALLELMODE_16 = 3, 92 - }; 93 - 94 - static int rfbi_convert_timings(struct rfbi_timings *t); 95 - static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div); 96 - 97 - static struct { 98 - struct platform_device *pdev; 99 - void __iomem *base; 100 - 101 - unsigned long l4_khz; 102 - 103 - enum omap_rfbi_datatype datatype; 104 - enum omap_rfbi_parallelmode parallelmode; 105 - 106 - enum omap_rfbi_te_mode te_mode; 107 - int te_enabled; 108 - 109 - void (*framedone_callback)(void *data); 110 - void *framedone_callback_data; 111 - 112 - struct omap_dss_device *dssdev[2]; 113 - 114 - struct semaphore bus_lock; 115 - 116 - struct videomode vm; 117 - int pixel_size; 118 - int data_lines; 119 - struct rfbi_timings intf_timings; 120 - 121 - struct omap_dss_device output; 122 - } rfbi; 123 - 124 - static inline void rfbi_write_reg(const struct rfbi_reg idx, u32 val) 125 - { 126 - __raw_writel(val, rfbi.base + idx.idx); 127 - } 128 - 129 - static inline u32 rfbi_read_reg(const struct rfbi_reg idx) 130 - { 131 - return __raw_readl(rfbi.base + idx.idx); 132 - } 133 - 134 - static int rfbi_runtime_get(void) 135 - { 136 - int r; 137 - 138 - DSSDBG("rfbi_runtime_get\n"); 139 - 140 - r = pm_runtime_get_sync(&rfbi.pdev->dev); 141 - WARN_ON(r < 0); 142 - return r < 0 ? r : 0; 143 - } 144 - 145 - static void rfbi_runtime_put(void) 146 - { 147 - int r; 148 - 149 - DSSDBG("rfbi_runtime_put\n"); 150 - 151 - r = pm_runtime_put_sync(&rfbi.pdev->dev); 152 - WARN_ON(r < 0 && r != -ENOSYS); 153 - } 154 - 155 - static void rfbi_bus_lock(void) 156 - { 157 - down(&rfbi.bus_lock); 158 - } 159 - 160 - static void rfbi_bus_unlock(void) 161 - { 162 - up(&rfbi.bus_lock); 163 - } 164 - 165 - static void rfbi_write_command(const void *buf, u32 len) 166 - { 167 - switch (rfbi.parallelmode) { 168 - case OMAP_DSS_RFBI_PARALLELMODE_8: 169 - { 170 - const u8 *b = buf; 171 - for (; len; len--) 172 - rfbi_write_reg(RFBI_CMD, *b++); 173 - break; 174 - } 175 - 176 - case OMAP_DSS_RFBI_PARALLELMODE_16: 177 - { 178 - const u16 *w = buf; 179 - BUG_ON(len & 1); 180 - for (; len; len -= 2) 181 - rfbi_write_reg(RFBI_CMD, *w++); 182 - break; 183 - } 184 - 185 - case OMAP_DSS_RFBI_PARALLELMODE_9: 186 - case OMAP_DSS_RFBI_PARALLELMODE_12: 187 - default: 188 - BUG(); 189 - } 190 - } 191 - 192 - static void rfbi_read_data(void *buf, u32 len) 193 - { 194 - switch (rfbi.parallelmode) { 195 - case OMAP_DSS_RFBI_PARALLELMODE_8: 196 - { 197 - u8 *b = buf; 198 - for (; len; len--) { 199 - rfbi_write_reg(RFBI_READ, 0); 200 - *b++ = rfbi_read_reg(RFBI_READ); 201 - } 202 - break; 203 - } 204 - 205 - case OMAP_DSS_RFBI_PARALLELMODE_16: 206 - { 207 - u16 *w = buf; 208 - BUG_ON(len & ~1); 209 - for (; len; len -= 2) { 210 - rfbi_write_reg(RFBI_READ, 0); 211 - *w++ = rfbi_read_reg(RFBI_READ); 212 - } 213 - break; 214 - } 215 - 216 - case OMAP_DSS_RFBI_PARALLELMODE_9: 217 - case OMAP_DSS_RFBI_PARALLELMODE_12: 218 - default: 219 - BUG(); 220 - } 221 - } 222 - 223 - static void rfbi_write_data(const void *buf, u32 len) 224 - { 225 - switch (rfbi.parallelmode) { 226 - case OMAP_DSS_RFBI_PARALLELMODE_8: 227 - { 228 - const u8 *b = buf; 229 - for (; len; len--) 230 - rfbi_write_reg(RFBI_PARAM, *b++); 231 - break; 232 - } 233 - 234 - case OMAP_DSS_RFBI_PARALLELMODE_16: 235 - { 236 - const u16 *w = buf; 237 - BUG_ON(len & 1); 238 - for (; len; len -= 2) 239 - rfbi_write_reg(RFBI_PARAM, *w++); 240 - break; 241 - } 242 - 243 - case OMAP_DSS_RFBI_PARALLELMODE_9: 244 - case OMAP_DSS_RFBI_PARALLELMODE_12: 245 - default: 246 - BUG(); 247 - 248 - } 249 - } 250 - 251 - static void rfbi_write_pixels(const void __iomem *buf, int scr_width, 252 - u16 x, u16 y, 253 - u16 w, u16 h) 254 - { 255 - int start_offset = scr_width * y + x; 256 - int horiz_offset = scr_width - w; 257 - int i; 258 - 259 - if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_16 && 260 - rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_8) { 261 - const u16 __iomem *pd = buf; 262 - pd += start_offset; 263 - 264 - for (; h; --h) { 265 - for (i = 0; i < w; ++i) { 266 - const u8 __iomem *b = (const u8 __iomem *)pd; 267 - rfbi_write_reg(RFBI_PARAM, __raw_readb(b+1)); 268 - rfbi_write_reg(RFBI_PARAM, __raw_readb(b+0)); 269 - ++pd; 270 - } 271 - pd += horiz_offset; 272 - } 273 - } else if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_24 && 274 - rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_8) { 275 - const u32 __iomem *pd = buf; 276 - pd += start_offset; 277 - 278 - for (; h; --h) { 279 - for (i = 0; i < w; ++i) { 280 - const u8 __iomem *b = (const u8 __iomem *)pd; 281 - rfbi_write_reg(RFBI_PARAM, __raw_readb(b+2)); 282 - rfbi_write_reg(RFBI_PARAM, __raw_readb(b+1)); 283 - rfbi_write_reg(RFBI_PARAM, __raw_readb(b+0)); 284 - ++pd; 285 - } 286 - pd += horiz_offset; 287 - } 288 - } else if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_16 && 289 - rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_16) { 290 - const u16 __iomem *pd = buf; 291 - pd += start_offset; 292 - 293 - for (; h; --h) { 294 - for (i = 0; i < w; ++i) { 295 - rfbi_write_reg(RFBI_PARAM, __raw_readw(pd)); 296 - ++pd; 297 - } 298 - pd += horiz_offset; 299 - } 300 - } else { 301 - BUG(); 302 - } 303 - } 304 - 305 - static int rfbi_transfer_area(struct omap_dss_device *dssdev, 306 - void (*callback)(void *data), void *data) 307 - { 308 - u32 l; 309 - int r; 310 - struct omap_overlay_manager *mgr = rfbi.output.manager; 311 - u16 width = rfbi.vm.hactive; 312 - u16 height = rfbi.vm.vactive; 313 - 314 - /*BUG_ON(callback == 0);*/ 315 - BUG_ON(rfbi.framedone_callback != NULL); 316 - 317 - DSSDBG("rfbi_transfer_area %dx%d\n", width, height); 318 - 319 - dss_mgr_set_timings(mgr, &rfbi.vm); 320 - 321 - r = dss_mgr_enable(mgr); 322 - if (r) 323 - return r; 324 - 325 - rfbi.framedone_callback = callback; 326 - rfbi.framedone_callback_data = data; 327 - 328 - rfbi_write_reg(RFBI_PIXEL_CNT, width * height); 329 - 330 - l = rfbi_read_reg(RFBI_CONTROL); 331 - l = FLD_MOD(l, 1, 0, 0); /* enable */ 332 - if (!rfbi.te_enabled) 333 - l = FLD_MOD(l, 1, 4, 4); /* ITE */ 334 - 335 - rfbi_write_reg(RFBI_CONTROL, l); 336 - 337 - return 0; 338 - } 339 - 340 - static void framedone_callback(void *data) 341 - { 342 - void (*callback)(void *data); 343 - 344 - DSSDBG("FRAMEDONE\n"); 345 - 346 - REG_FLD_MOD(RFBI_CONTROL, 0, 0, 0); 347 - 348 - callback = rfbi.framedone_callback; 349 - rfbi.framedone_callback = NULL; 350 - 351 - if (callback != NULL) 352 - callback(rfbi.framedone_callback_data); 353 - } 354 - 355 - #if 1 /* VERBOSE */ 356 - static void rfbi_print_timings(void) 357 - { 358 - u32 l; 359 - u32 time; 360 - 361 - l = rfbi_read_reg(RFBI_CONFIG(0)); 362 - time = 1000000000 / rfbi.l4_khz; 363 - if (l & (1 << 4)) 364 - time *= 2; 365 - 366 - DSSDBG("Tick time %u ps\n", time); 367 - l = rfbi_read_reg(RFBI_ONOFF_TIME(0)); 368 - DSSDBG("CSONTIME %d, CSOFFTIME %d, WEONTIME %d, WEOFFTIME %d, " 369 - "REONTIME %d, REOFFTIME %d\n", 370 - l & 0x0f, (l >> 4) & 0x3f, (l >> 10) & 0x0f, (l >> 14) & 0x3f, 371 - (l >> 20) & 0x0f, (l >> 24) & 0x3f); 372 - 373 - l = rfbi_read_reg(RFBI_CYCLE_TIME(0)); 374 - DSSDBG("WECYCLETIME %d, RECYCLETIME %d, CSPULSEWIDTH %d, " 375 - "ACCESSTIME %d\n", 376 - (l & 0x3f), (l >> 6) & 0x3f, (l >> 12) & 0x3f, 377 - (l >> 22) & 0x3f); 378 - } 379 - #else 380 - static void rfbi_print_timings(void) {} 381 - #endif 382 - 383 - 384 - 385 - 386 - static u32 extif_clk_period; 387 - 388 - static inline unsigned long round_to_extif_ticks(unsigned long ps, int div) 389 - { 390 - int bus_tick = extif_clk_period * div; 391 - return (ps + bus_tick - 1) / bus_tick * bus_tick; 392 - } 393 - 394 - static int calc_reg_timing(struct rfbi_timings *t, int div) 395 - { 396 - t->clk_div = div; 397 - 398 - t->cs_on_time = round_to_extif_ticks(t->cs_on_time, div); 399 - 400 - t->we_on_time = round_to_extif_ticks(t->we_on_time, div); 401 - t->we_off_time = round_to_extif_ticks(t->we_off_time, div); 402 - t->we_cycle_time = round_to_extif_ticks(t->we_cycle_time, div); 403 - 404 - t->re_on_time = round_to_extif_ticks(t->re_on_time, div); 405 - t->re_off_time = round_to_extif_ticks(t->re_off_time, div); 406 - t->re_cycle_time = round_to_extif_ticks(t->re_cycle_time, div); 407 - 408 - t->access_time = round_to_extif_ticks(t->access_time, div); 409 - t->cs_off_time = round_to_extif_ticks(t->cs_off_time, div); 410 - t->cs_pulse_width = round_to_extif_ticks(t->cs_pulse_width, div); 411 - 412 - DSSDBG("[reg]cson %d csoff %d reon %d reoff %d\n", 413 - t->cs_on_time, t->cs_off_time, t->re_on_time, t->re_off_time); 414 - DSSDBG("[reg]weon %d weoff %d recyc %d wecyc %d\n", 415 - t->we_on_time, t->we_off_time, t->re_cycle_time, 416 - t->we_cycle_time); 417 - DSSDBG("[reg]rdaccess %d cspulse %d\n", 418 - t->access_time, t->cs_pulse_width); 419 - 420 - return rfbi_convert_timings(t); 421 - } 422 - 423 - static int calc_extif_timings(struct rfbi_timings *t) 424 - { 425 - u32 max_clk_div; 426 - int div; 427 - 428 - rfbi_get_clk_info(&extif_clk_period, &max_clk_div); 429 - for (div = 1; div <= max_clk_div; div++) { 430 - if (calc_reg_timing(t, div) == 0) 431 - break; 432 - } 433 - 434 - if (div <= max_clk_div) 435 - return 0; 436 - 437 - DSSERR("can't setup timings\n"); 438 - return -1; 439 - } 440 - 441 - 442 - static void rfbi_set_timings(int rfbi_module, struct rfbi_timings *t) 443 - { 444 - int r; 445 - 446 - if (!t->converted) { 447 - r = calc_extif_timings(t); 448 - if (r < 0) 449 - DSSERR("Failed to calc timings\n"); 450 - } 451 - 452 - BUG_ON(!t->converted); 453 - 454 - rfbi_write_reg(RFBI_ONOFF_TIME(rfbi_module), t->tim[0]); 455 - rfbi_write_reg(RFBI_CYCLE_TIME(rfbi_module), t->tim[1]); 456 - 457 - /* TIMEGRANULARITY */ 458 - REG_FLD_MOD(RFBI_CONFIG(rfbi_module), 459 - (t->tim[2] ? 1 : 0), 4, 4); 460 - 461 - rfbi_print_timings(); 462 - } 463 - 464 - static int ps_to_rfbi_ticks(int time, int div) 465 - { 466 - unsigned long tick_ps; 467 - int ret; 468 - 469 - /* Calculate in picosecs to yield more exact results */ 470 - tick_ps = 1000000000 / (rfbi.l4_khz) * div; 471 - 472 - ret = (time + tick_ps - 1) / tick_ps; 473 - 474 - return ret; 475 - } 476 - 477 - static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div) 478 - { 479 - *clk_period = 1000000000 / rfbi.l4_khz; 480 - *max_clk_div = 2; 481 - } 482 - 483 - static int rfbi_convert_timings(struct rfbi_timings *t) 484 - { 485 - u32 l; 486 - int reon, reoff, weon, weoff, cson, csoff, cs_pulse; 487 - int actim, recyc, wecyc; 488 - int div = t->clk_div; 489 - 490 - if (div <= 0 || div > 2) 491 - return -1; 492 - 493 - /* Make sure that after conversion it still holds that: 494 - * weoff > weon, reoff > reon, recyc >= reoff, wecyc >= weoff, 495 - * csoff > cson, csoff >= max(weoff, reoff), actim > reon 496 - */ 497 - weon = ps_to_rfbi_ticks(t->we_on_time, div); 498 - weoff = ps_to_rfbi_ticks(t->we_off_time, div); 499 - if (weoff <= weon) 500 - weoff = weon + 1; 501 - if (weon > 0x0f) 502 - return -1; 503 - if (weoff > 0x3f) 504 - return -1; 505 - 506 - reon = ps_to_rfbi_ticks(t->re_on_time, div); 507 - reoff = ps_to_rfbi_ticks(t->re_off_time, div); 508 - if (reoff <= reon) 509 - reoff = reon + 1; 510 - if (reon > 0x0f) 511 - return -1; 512 - if (reoff > 0x3f) 513 - return -1; 514 - 515 - cson = ps_to_rfbi_ticks(t->cs_on_time, div); 516 - csoff = ps_to_rfbi_ticks(t->cs_off_time, div); 517 - if (csoff <= cson) 518 - csoff = cson + 1; 519 - if (csoff < max(weoff, reoff)) 520 - csoff = max(weoff, reoff); 521 - if (cson > 0x0f) 522 - return -1; 523 - if (csoff > 0x3f) 524 - return -1; 525 - 526 - l = cson; 527 - l |= csoff << 4; 528 - l |= weon << 10; 529 - l |= weoff << 14; 530 - l |= reon << 20; 531 - l |= reoff << 24; 532 - 533 - t->tim[0] = l; 534 - 535 - actim = ps_to_rfbi_ticks(t->access_time, div); 536 - if (actim <= reon) 537 - actim = reon + 1; 538 - if (actim > 0x3f) 539 - return -1; 540 - 541 - wecyc = ps_to_rfbi_ticks(t->we_cycle_time, div); 542 - if (wecyc < weoff) 543 - wecyc = weoff; 544 - if (wecyc > 0x3f) 545 - return -1; 546 - 547 - recyc = ps_to_rfbi_ticks(t->re_cycle_time, div); 548 - if (recyc < reoff) 549 - recyc = reoff; 550 - if (recyc > 0x3f) 551 - return -1; 552 - 553 - cs_pulse = ps_to_rfbi_ticks(t->cs_pulse_width, div); 554 - if (cs_pulse > 0x3f) 555 - return -1; 556 - 557 - l = wecyc; 558 - l |= recyc << 6; 559 - l |= cs_pulse << 12; 560 - l |= actim << 22; 561 - 562 - t->tim[1] = l; 563 - 564 - t->tim[2] = div - 1; 565 - 566 - t->converted = 1; 567 - 568 - return 0; 569 - } 570 - 571 - /* xxx FIX module selection missing */ 572 - static int rfbi_setup_te(enum omap_rfbi_te_mode mode, 573 - unsigned hs_pulse_time, unsigned vs_pulse_time, 574 - int hs_pol_inv, int vs_pol_inv, int extif_div) 575 - { 576 - int hs, vs; 577 - int min; 578 - u32 l; 579 - 580 - hs = ps_to_rfbi_ticks(hs_pulse_time, 1); 581 - vs = ps_to_rfbi_ticks(vs_pulse_time, 1); 582 - if (hs < 2) 583 - return -EDOM; 584 - if (mode == OMAP_DSS_RFBI_TE_MODE_2) 585 - min = 2; 586 - else /* OMAP_DSS_RFBI_TE_MODE_1 */ 587 - min = 4; 588 - if (vs < min) 589 - return -EDOM; 590 - if (vs == hs) 591 - return -EINVAL; 592 - rfbi.te_mode = mode; 593 - DSSDBG("setup_te: mode %d hs %d vs %d hs_inv %d vs_inv %d\n", 594 - mode, hs, vs, hs_pol_inv, vs_pol_inv); 595 - 596 - rfbi_write_reg(RFBI_HSYNC_WIDTH, hs); 597 - rfbi_write_reg(RFBI_VSYNC_WIDTH, vs); 598 - 599 - l = rfbi_read_reg(RFBI_CONFIG(0)); 600 - if (hs_pol_inv) 601 - l &= ~(1 << 21); 602 - else 603 - l |= 1 << 21; 604 - if (vs_pol_inv) 605 - l &= ~(1 << 20); 606 - else 607 - l |= 1 << 20; 608 - 609 - return 0; 610 - } 611 - 612 - /* xxx FIX module selection missing */ 613 - static int rfbi_enable_te(bool enable, unsigned line) 614 - { 615 - u32 l; 616 - 617 - DSSDBG("te %d line %d mode %d\n", enable, line, rfbi.te_mode); 618 - if (line > (1 << 11) - 1) 619 - return -EINVAL; 620 - 621 - l = rfbi_read_reg(RFBI_CONFIG(0)); 622 - l &= ~(0x3 << 2); 623 - if (enable) { 624 - rfbi.te_enabled = 1; 625 - l |= rfbi.te_mode << 2; 626 - } else 627 - rfbi.te_enabled = 0; 628 - rfbi_write_reg(RFBI_CONFIG(0), l); 629 - rfbi_write_reg(RFBI_LINE_NUMBER, line); 630 - 631 - return 0; 632 - } 633 - 634 - static int rfbi_configure_bus(int rfbi_module, int bpp, int lines) 635 - { 636 - u32 l; 637 - int cycle1 = 0, cycle2 = 0, cycle3 = 0; 638 - enum omap_rfbi_cycleformat cycleformat; 639 - enum omap_rfbi_datatype datatype; 640 - enum omap_rfbi_parallelmode parallelmode; 641 - 642 - switch (bpp) { 643 - case 12: 644 - datatype = OMAP_DSS_RFBI_DATATYPE_12; 645 - break; 646 - case 16: 647 - datatype = OMAP_DSS_RFBI_DATATYPE_16; 648 - break; 649 - case 18: 650 - datatype = OMAP_DSS_RFBI_DATATYPE_18; 651 - break; 652 - case 24: 653 - datatype = OMAP_DSS_RFBI_DATATYPE_24; 654 - break; 655 - default: 656 - BUG(); 657 - return 1; 658 - } 659 - rfbi.datatype = datatype; 660 - 661 - switch (lines) { 662 - case 8: 663 - parallelmode = OMAP_DSS_RFBI_PARALLELMODE_8; 664 - break; 665 - case 9: 666 - parallelmode = OMAP_DSS_RFBI_PARALLELMODE_9; 667 - break; 668 - case 12: 669 - parallelmode = OMAP_DSS_RFBI_PARALLELMODE_12; 670 - break; 671 - case 16: 672 - parallelmode = OMAP_DSS_RFBI_PARALLELMODE_16; 673 - break; 674 - default: 675 - BUG(); 676 - return 1; 677 - } 678 - rfbi.parallelmode = parallelmode; 679 - 680 - if ((bpp % lines) == 0) { 681 - switch (bpp / lines) { 682 - case 1: 683 - cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_1_1; 684 - break; 685 - case 2: 686 - cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_2_1; 687 - break; 688 - case 3: 689 - cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_3_1; 690 - break; 691 - default: 692 - BUG(); 693 - return 1; 694 - } 695 - } else if ((2 * bpp % lines) == 0) { 696 - if ((2 * bpp / lines) == 3) 697 - cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_3_2; 698 - else { 699 - BUG(); 700 - return 1; 701 - } 702 - } else { 703 - BUG(); 704 - return 1; 705 - } 706 - 707 - switch (cycleformat) { 708 - case OMAP_DSS_RFBI_CYCLEFORMAT_1_1: 709 - cycle1 = lines; 710 - break; 711 - 712 - case OMAP_DSS_RFBI_CYCLEFORMAT_2_1: 713 - cycle1 = lines; 714 - cycle2 = lines; 715 - break; 716 - 717 - case OMAP_DSS_RFBI_CYCLEFORMAT_3_1: 718 - cycle1 = lines; 719 - cycle2 = lines; 720 - cycle3 = lines; 721 - break; 722 - 723 - case OMAP_DSS_RFBI_CYCLEFORMAT_3_2: 724 - cycle1 = lines; 725 - cycle2 = (lines / 2) | ((lines / 2) << 16); 726 - cycle3 = (lines << 16); 727 - break; 728 - } 729 - 730 - REG_FLD_MOD(RFBI_CONTROL, 0, 3, 2); /* clear CS */ 731 - 732 - l = 0; 733 - l |= FLD_VAL(parallelmode, 1, 0); 734 - l |= FLD_VAL(0, 3, 2); /* TRIGGERMODE: ITE */ 735 - l |= FLD_VAL(0, 4, 4); /* TIMEGRANULARITY */ 736 - l |= FLD_VAL(datatype, 6, 5); 737 - /* l |= FLD_VAL(2, 8, 7); */ /* L4FORMAT, 2pix/L4 */ 738 - l |= FLD_VAL(0, 8, 7); /* L4FORMAT, 1pix/L4 */ 739 - l |= FLD_VAL(cycleformat, 10, 9); 740 - l |= FLD_VAL(0, 12, 11); /* UNUSEDBITS */ 741 - l |= FLD_VAL(0, 16, 16); /* A0POLARITY */ 742 - l |= FLD_VAL(0, 17, 17); /* REPOLARITY */ 743 - l |= FLD_VAL(0, 18, 18); /* WEPOLARITY */ 744 - l |= FLD_VAL(0, 19, 19); /* CSPOLARITY */ 745 - l |= FLD_VAL(1, 20, 20); /* TE_VSYNC_POLARITY */ 746 - l |= FLD_VAL(1, 21, 21); /* HSYNCPOLARITY */ 747 - rfbi_write_reg(RFBI_CONFIG(rfbi_module), l); 748 - 749 - rfbi_write_reg(RFBI_DATA_CYCLE1(rfbi_module), cycle1); 750 - rfbi_write_reg(RFBI_DATA_CYCLE2(rfbi_module), cycle2); 751 - rfbi_write_reg(RFBI_DATA_CYCLE3(rfbi_module), cycle3); 752 - 753 - 754 - l = rfbi_read_reg(RFBI_CONTROL); 755 - l = FLD_MOD(l, rfbi_module+1, 3, 2); /* Select CSx */ 756 - l = FLD_MOD(l, 0, 1, 1); /* clear bypass */ 757 - rfbi_write_reg(RFBI_CONTROL, l); 758 - 759 - 760 - DSSDBG("RFBI config: bpp %d, lines %d, cycles: 0x%x 0x%x 0x%x\n", 761 - bpp, lines, cycle1, cycle2, cycle3); 762 - 763 - return 0; 764 - } 765 - 766 - static int rfbi_configure(struct omap_dss_device *dssdev) 767 - { 768 - return rfbi_configure_bus(dssdev->phy.rfbi.channel, rfbi.pixel_size, 769 - rfbi.data_lines); 770 - } 771 - 772 - static int rfbi_update(struct omap_dss_device *dssdev, void (*callback)(void *), 773 - void *data) 774 - { 775 - return rfbi_transfer_area(dssdev, callback, data); 776 - } 777 - 778 - static void rfbi_set_size(struct omap_dss_device *dssdev, u16 w, u16 h) 779 - { 780 - rfbi.vm.hactive = w; 781 - rfbi.vm.vactive = h; 782 - } 783 - 784 - static void rfbi_set_pixel_size(struct omap_dss_device *dssdev, int pixel_size) 785 - { 786 - rfbi.pixel_size = pixel_size; 787 - } 788 - 789 - static void rfbi_set_data_lines(struct omap_dss_device *dssdev, int data_lines) 790 - { 791 - rfbi.data_lines = data_lines; 792 - } 793 - 794 - static void rfbi_set_interface_timings(struct omap_dss_device *dssdev, 795 - struct rfbi_timings *timings) 796 - { 797 - rfbi.intf_timings = *timings; 798 - } 799 - 800 - static void rfbi_dump_regs(struct seq_file *s) 801 - { 802 - #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, rfbi_read_reg(r)) 803 - 804 - if (rfbi_runtime_get()) 805 - return; 806 - 807 - DUMPREG(RFBI_REVISION); 808 - DUMPREG(RFBI_SYSCONFIG); 809 - DUMPREG(RFBI_SYSSTATUS); 810 - DUMPREG(RFBI_CONTROL); 811 - DUMPREG(RFBI_PIXEL_CNT); 812 - DUMPREG(RFBI_LINE_NUMBER); 813 - DUMPREG(RFBI_CMD); 814 - DUMPREG(RFBI_PARAM); 815 - DUMPREG(RFBI_DATA); 816 - DUMPREG(RFBI_READ); 817 - DUMPREG(RFBI_STATUS); 818 - 819 - DUMPREG(RFBI_CONFIG(0)); 820 - DUMPREG(RFBI_ONOFF_TIME(0)); 821 - DUMPREG(RFBI_CYCLE_TIME(0)); 822 - DUMPREG(RFBI_DATA_CYCLE1(0)); 823 - DUMPREG(RFBI_DATA_CYCLE2(0)); 824 - DUMPREG(RFBI_DATA_CYCLE3(0)); 825 - 826 - DUMPREG(RFBI_CONFIG(1)); 827 - DUMPREG(RFBI_ONOFF_TIME(1)); 828 - DUMPREG(RFBI_CYCLE_TIME(1)); 829 - DUMPREG(RFBI_DATA_CYCLE1(1)); 830 - DUMPREG(RFBI_DATA_CYCLE2(1)); 831 - DUMPREG(RFBI_DATA_CYCLE3(1)); 832 - 833 - DUMPREG(RFBI_VSYNC_WIDTH); 834 - DUMPREG(RFBI_HSYNC_WIDTH); 835 - 836 - rfbi_runtime_put(); 837 - #undef DUMPREG 838 - } 839 - 840 - static void rfbi_config_lcd_manager(struct omap_dss_device *dssdev) 841 - { 842 - struct omap_overlay_manager *mgr = rfbi.output.manager; 843 - struct dss_lcd_mgr_config mgr_config; 844 - 845 - mgr_config.io_pad_mode = DSS_IO_PAD_MODE_RFBI; 846 - 847 - mgr_config.stallmode = true; 848 - /* Do we need fifohandcheck for RFBI? */ 849 - mgr_config.fifohandcheck = false; 850 - 851 - mgr_config.video_port_width = rfbi.pixel_size; 852 - mgr_config.lcden_sig_polarity = 0; 853 - 854 - dss_mgr_set_lcd_config(mgr, &mgr_config); 855 - 856 - /* 857 - * Set rfbi.timings with default values, the hactive and vactive fields 858 - * are expected to be already configured by the panel driver via 859 - * omapdss_rfbi_set_size() 860 - */ 861 - rfbi.vm.hsync_len = 1; 862 - rfbi.vm.hfront_porch = 1; 863 - rfbi.vm.hback_porch = 1; 864 - rfbi.vm.vsync_len = 1; 865 - rfbi.vm.vfront_porch = 0; 866 - rfbi.vm.vback_porch = 0; 867 - 868 - rfbi.vm.flags &= ~DISPLAY_FLAGS_INTERLACED; 869 - rfbi.vm.flags &= ~DISPLAY_FLAGS_HSYNC_LOW; 870 - rfbi.vm.flags |= DISPLAY_FLAGS_HSYNC_HIGH; 871 - rfbi.vm.flags &= ~DISPLAY_FLAGS_VSYNC_LOW; 872 - rfbi.vm.flags |= DISPLAY_FLAGS_VSYNC_HIGH; 873 - rfbi.vm.flags &= ~DISPLAY_FLAGS_PIXDATA_NEGEDGE; 874 - rfbi.vm.flags |= DISPLAY_FLAGS_PIXDATA_POSEDGE; 875 - rfbi.vm.flags &= ~DISPLAY_FLAGS_DE_LOW; 876 - rfbi.vm.flags |= DISPLAY_FLAGS_DE_HIGH; 877 - rfbi.vm.flags &= ~DISPLAY_FLAGS_SYNC_POSEDGE; 878 - rfbi.vm.flags |= DISPLAY_FLAGS_SYNC_NEGEDGE; 879 - 880 - dss_mgr_set_timings(mgr, &rfbi.vm); 881 - } 882 - 883 - static int rfbi_display_enable(struct omap_dss_device *dssdev) 884 - { 885 - struct omap_dss_device *out = &rfbi.output; 886 - int r; 887 - 888 - if (!out->dispc_channel_connected) { 889 - DSSERR("failed to enable display: no output/manager\n"); 890 - return -ENODEV; 891 - } 892 - 893 - r = rfbi_runtime_get(); 894 - if (r) 895 - return r; 896 - 897 - r = dss_mgr_register_framedone_handler(out->manager, 898 - framedone_callback, NULL); 899 - if (r) { 900 - DSSERR("can't get FRAMEDONE irq\n"); 901 - goto err1; 902 - } 903 - 904 - rfbi_config_lcd_manager(dssdev); 905 - 906 - rfbi_configure_bus(dssdev->phy.rfbi.channel, rfbi.pixel_size, 907 - rfbi.data_lines); 908 - 909 - rfbi_set_timings(dssdev->phy.rfbi.channel, &rfbi.intf_timings); 910 - 911 - return 0; 912 - err1: 913 - rfbi_runtime_put(); 914 - return r; 915 - } 916 - 917 - static void rfbi_display_disable(struct omap_dss_device *dssdev) 918 - { 919 - struct omap_dss_device *out = &rfbi.output; 920 - 921 - dss_mgr_unregister_framedone_handler(out->manager, 922 - framedone_callback, NULL); 923 - 924 - rfbi_runtime_put(); 925 - } 926 - 927 - static int rfbi_init_display(struct omap_dss_device *dssdev) 928 - { 929 - rfbi.dssdev[dssdev->phy.rfbi.channel] = dssdev; 930 - return 0; 931 - } 932 - 933 - static void rfbi_init_output(struct platform_device *pdev) 934 - { 935 - struct omap_dss_device *out = &rfbi.output; 936 - 937 - out->dev = &pdev->dev; 938 - out->id = OMAP_DSS_OUTPUT_DBI; 939 - out->output_type = OMAP_DISPLAY_TYPE_DBI; 940 - out->name = "rfbi.0"; 941 - out->dispc_channel = OMAP_DSS_CHANNEL_LCD; 942 - out->owner = THIS_MODULE; 943 - 944 - omapdss_register_output(out); 945 - } 946 - 947 - static void rfbi_uninit_output(struct platform_device *pdev) 948 - { 949 - struct omap_dss_device *out = &rfbi.output; 950 - 951 - omapdss_unregister_output(out); 952 - } 953 - 954 - /* RFBI HW IP initialisation */ 955 - static int rfbi_bind(struct device *dev, struct device *master, void *data) 956 - { 957 - struct platform_device *pdev = to_platform_device(dev); 958 - u32 rev; 959 - struct resource *rfbi_mem; 960 - struct clk *clk; 961 - int r; 962 - 963 - rfbi.pdev = pdev; 964 - 965 - sema_init(&rfbi.bus_lock, 1); 966 - 967 - rfbi_mem = platform_get_resource(rfbi.pdev, IORESOURCE_MEM, 0); 968 - if (!rfbi_mem) { 969 - DSSERR("can't get IORESOURCE_MEM RFBI\n"); 970 - return -EINVAL; 971 - } 972 - 973 - rfbi.base = devm_ioremap(&pdev->dev, rfbi_mem->start, 974 - resource_size(rfbi_mem)); 975 - if (!rfbi.base) { 976 - DSSERR("can't ioremap RFBI\n"); 977 - return -ENOMEM; 978 - } 979 - 980 - clk = clk_get(&pdev->dev, "ick"); 981 - if (IS_ERR(clk)) { 982 - DSSERR("can't get ick\n"); 983 - return PTR_ERR(clk); 984 - } 985 - 986 - rfbi.l4_khz = clk_get_rate(clk) / 1000; 987 - 988 - clk_put(clk); 989 - 990 - pm_runtime_enable(&pdev->dev); 991 - 992 - r = rfbi_runtime_get(); 993 - if (r) 994 - goto err_runtime_get; 995 - 996 - msleep(10); 997 - 998 - rev = rfbi_read_reg(RFBI_REVISION); 999 - dev_dbg(&pdev->dev, "OMAP RFBI rev %d.%d\n", 1000 - FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); 1001 - 1002 - rfbi_runtime_put(); 1003 - 1004 - dss_debugfs_create_file("rfbi", rfbi_dump_regs); 1005 - 1006 - rfbi_init_output(pdev); 1007 - 1008 - return 0; 1009 - 1010 - err_runtime_get: 1011 - pm_runtime_disable(&pdev->dev); 1012 - return r; 1013 - } 1014 - 1015 - static void rfbi_unbind(struct device *dev, struct device *master, void *data) 1016 - { 1017 - struct platform_device *pdev = to_platform_device(dev); 1018 - 1019 - rfbi_uninit_output(pdev); 1020 - 1021 - pm_runtime_disable(&pdev->dev); 1022 - 1023 - return 0; 1024 - } 1025 - 1026 - static const struct component_ops rfbi_component_ops = { 1027 - .bind = rfbi_bind, 1028 - .unbind = rfbi_unbind, 1029 - }; 1030 - 1031 - static int rfbi_probe(struct platform_device *pdev) 1032 - { 1033 - return component_add(&pdev->dev, &rfbi_component_ops); 1034 - } 1035 - 1036 - static int rfbi_remove(struct platform_device *pdev) 1037 - { 1038 - component_del(&pdev->dev, &rfbi_component_ops); 1039 - return 0; 1040 - } 1041 - 1042 - static int rfbi_runtime_suspend(struct device *dev) 1043 - { 1044 - dispc_runtime_put(); 1045 - 1046 - return 0; 1047 - } 1048 - 1049 - static int rfbi_runtime_resume(struct device *dev) 1050 - { 1051 - int r; 1052 - 1053 - r = dispc_runtime_get(); 1054 - if (r < 0) 1055 - return r; 1056 - 1057 - return 0; 1058 - } 1059 - 1060 - static const struct dev_pm_ops rfbi_pm_ops = { 1061 - .runtime_suspend = rfbi_runtime_suspend, 1062 - .runtime_resume = rfbi_runtime_resume, 1063 - }; 1064 - 1065 - static struct platform_driver omap_rfbihw_driver = { 1066 - .probe = rfbi_probe, 1067 - .remove = rfbi_remove, 1068 - .driver = { 1069 - .name = "omapdss_rfbi", 1070 - .pm = &rfbi_pm_ops, 1071 - .suppress_bind_attrs = true, 1072 - }, 1073 - }; 1074 - 1075 - int __init rfbi_init_platform_driver(void) 1076 - { 1077 - return platform_driver_register(&omap_rfbihw_driver); 1078 - } 1079 - 1080 - void rfbi_uninit_platform_driver(void) 1081 - { 1082 - platform_driver_unregister(&omap_rfbihw_driver); 1083 - }
-61
drivers/gpu/drm/omapdrm/dss/sdi.c
··· 27 27 #include <linux/platform_device.h> 28 28 #include <linux/string.h> 29 29 #include <linux/of.h> 30 - #include <linux/component.h> 31 30 32 31 #include "omapdss.h" 33 32 #include "dss.h" ··· 252 253 return 0; 253 254 } 254 255 255 - static void sdi_set_datapairs(struct omap_dss_device *dssdev, int datapairs) 256 - { 257 - sdi.datapairs = datapairs; 258 - } 259 - 260 256 static int sdi_init_regulator(void) 261 257 { 262 258 struct regulator *vdds_sdi; ··· 321 327 .check_timings = sdi_check_timings, 322 328 .set_timings = sdi_set_timings, 323 329 .get_timings = sdi_get_timings, 324 - 325 - .set_datapairs = sdi_set_datapairs, 326 330 }; 327 331 328 332 static void sdi_init_output(struct platform_device *pdev) ··· 345 353 struct omap_dss_device *out = &sdi.output; 346 354 347 355 omapdss_unregister_output(out); 348 - } 349 - 350 - static int sdi_bind(struct device *dev, struct device *master, void *data) 351 - { 352 - struct platform_device *pdev = to_platform_device(dev); 353 - 354 - sdi.pdev = pdev; 355 - 356 - sdi_init_output(pdev); 357 - 358 - return 0; 359 - } 360 - 361 - static void sdi_unbind(struct device *dev, struct device *master, void *data) 362 - { 363 - struct platform_device *pdev = to_platform_device(dev); 364 - 365 - sdi_uninit_output(pdev); 366 - } 367 - 368 - static const struct component_ops sdi_component_ops = { 369 - .bind = sdi_bind, 370 - .unbind = sdi_unbind, 371 - }; 372 - 373 - static int sdi_probe(struct platform_device *pdev) 374 - { 375 - return component_add(&pdev->dev, &sdi_component_ops); 376 - } 377 - 378 - static int sdi_remove(struct platform_device *pdev) 379 - { 380 - component_del(&pdev->dev, &sdi_component_ops); 381 - return 0; 382 - } 383 - 384 - static struct platform_driver omap_sdi_driver = { 385 - .probe = sdi_probe, 386 - .remove = sdi_remove, 387 - .driver = { 388 - .name = "omapdss_sdi", 389 - .suppress_bind_attrs = true, 390 - }, 391 - }; 392 - 393 - int __init sdi_init_platform_driver(void) 394 - { 395 - return platform_driver_register(&omap_sdi_driver); 396 - } 397 - 398 - void sdi_uninit_platform_driver(void) 399 - { 400 - platform_driver_unregister(&omap_sdi_driver); 401 356 } 402 357 403 358 int sdi_init_port(struct platform_device *pdev, struct device_node *port)
+8 -45
drivers/gpu/drm/omapdrm/dss/venc.c
··· 616 616 return r; 617 617 } 618 618 619 - static void venc_set_type(struct omap_dss_device *dssdev, 620 - enum omap_dss_venc_type type) 621 - { 622 - mutex_lock(&venc.venc_lock); 623 - 624 - venc.type = type; 625 - 626 - mutex_unlock(&venc.venc_lock); 627 - } 628 - 629 - static void venc_invert_vid_out_polarity(struct omap_dss_device *dssdev, 630 - bool invert_polarity) 631 - { 632 - mutex_lock(&venc.venc_lock); 633 - 634 - venc.invert_polarity = invert_polarity; 635 - 636 - mutex_unlock(&venc.venc_lock); 637 - } 638 - 639 619 static int venc_init_regulator(void) 640 620 { 641 621 struct regulator *vdda_dac; ··· 623 643 if (venc.vdda_dac_reg != NULL) 624 644 return 0; 625 645 626 - if (venc.pdev->dev.of_node) 627 - vdda_dac = devm_regulator_get(&venc.pdev->dev, "vdda"); 628 - else 629 - vdda_dac = devm_regulator_get(&venc.pdev->dev, "vdda_dac"); 630 - 646 + vdda_dac = devm_regulator_get(&venc.pdev->dev, "vdda"); 631 647 if (IS_ERR(vdda_dac)) { 632 648 if (PTR_ERR(vdda_dac) != -EPROBE_DEFER) 633 649 DSSERR("can't get VDDA_DAC regulator\n"); ··· 759 783 .set_timings = venc_set_timings, 760 784 .get_timings = venc_get_timings, 761 785 762 - .set_type = venc_set_type, 763 - .invert_vid_out_polarity = venc_invert_vid_out_polarity, 764 - 765 786 .set_wss = venc_set_wss, 766 787 .get_wss = venc_get_wss, 767 788 }; ··· 842 869 venc.wss_data = 0; 843 870 844 871 venc_mem = platform_get_resource(venc.pdev, IORESOURCE_MEM, 0); 845 - if (!venc_mem) { 846 - DSSERR("can't get IORESOURCE_MEM VENC\n"); 847 - return -EINVAL; 848 - } 849 - 850 - venc.base = devm_ioremap(&pdev->dev, venc_mem->start, 851 - resource_size(venc_mem)); 852 - if (!venc.base) { 853 - DSSERR("can't ioremap VENC\n"); 854 - return -ENOMEM; 855 - } 872 + venc.base = devm_ioremap_resource(&pdev->dev, venc_mem); 873 + if (IS_ERR(venc.base)) 874 + return PTR_ERR(venc.base); 856 875 857 876 r = venc_get_clocks(pdev); 858 877 if (r) ··· 861 896 862 897 venc_runtime_put(); 863 898 864 - if (pdev->dev.of_node) { 865 - r = venc_probe_of(pdev); 866 - if (r) { 867 - DSSERR("Invalid DT data\n"); 868 - goto err_probe_of; 869 - } 899 + r = venc_probe_of(pdev); 900 + if (r) { 901 + DSSERR("Invalid DT data\n"); 902 + goto err_probe_of; 870 903 } 871 904 872 905 dss_debugfs_create_file("venc", venc_dump_regs);
+2 -18
drivers/gpu/drm/omapdrm/dss/video-pll.c
··· 150 150 /* PLL CONTROL */ 151 151 152 152 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, reg_name[id]); 153 - if (!res) { 154 - dev_err(&pdev->dev, 155 - "missing platform resource data for pll%d\n", id); 156 - return ERR_PTR(-ENODEV); 157 - } 158 - 159 153 pll_base = devm_ioremap_resource(&pdev->dev, res); 160 - if (IS_ERR(pll_base)) { 161 - dev_err(&pdev->dev, "failed to ioremap pll%d reg_name\n", id); 154 + if (IS_ERR(pll_base)) 162 155 return ERR_CAST(pll_base); 163 - } 164 156 165 157 /* CLOCK CONTROL */ 166 158 167 159 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, 168 160 clkctrl_name[id]); 169 - if (!res) { 170 - dev_err(&pdev->dev, 171 - "missing platform resource data for pll%d\n", id); 172 - return ERR_PTR(-ENODEV); 173 - } 174 - 175 161 clkctrl_base = devm_ioremap_resource(&pdev->dev, res); 176 - if (IS_ERR(clkctrl_base)) { 177 - dev_err(&pdev->dev, "failed to ioremap pll%d clkctrl\n", id); 162 + if (IS_ERR(clkctrl_base)) 178 163 return ERR_CAST(clkctrl_base); 179 - } 180 164 181 165 /* CLKIN */ 182 166
+22 -8
drivers/gpu/drm/omapdrm/omap_crtc.c
··· 343 343 kfree(omap_crtc); 344 344 } 345 345 346 + static void omap_crtc_arm_event(struct drm_crtc *crtc) 347 + { 348 + struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 349 + 350 + WARN_ON(omap_crtc->pending); 351 + omap_crtc->pending = true; 352 + 353 + if (crtc->state->event) { 354 + omap_crtc->event = crtc->state->event; 355 + crtc->state->event = NULL; 356 + } 357 + } 358 + 346 359 static void omap_crtc_enable(struct drm_crtc *crtc) 347 360 { 348 361 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); ··· 368 355 ret = drm_crtc_vblank_get(crtc); 369 356 WARN_ON(ret != 0); 370 357 371 - WARN_ON(omap_crtc->pending); 372 - omap_crtc->pending = true; 358 + omap_crtc_arm_event(crtc); 373 359 spin_unlock_irq(&crtc->dev->event_lock); 374 360 } 375 361 ··· 377 365 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 378 366 379 367 DBG("%s", omap_crtc->name); 368 + 369 + spin_lock_irq(&crtc->dev->event_lock); 370 + if (crtc->state->event) { 371 + drm_crtc_send_vblank_event(crtc, crtc->state->event); 372 + crtc->state->event = NULL; 373 + } 374 + spin_unlock_irq(&crtc->dev->event_lock); 380 375 381 376 drm_crtc_vblank_off(crtc); 382 377 } ··· 492 473 493 474 spin_lock_irq(&crtc->dev->event_lock); 494 475 priv->dispc_ops->mgr_go(omap_crtc->channel); 495 - 496 - WARN_ON(omap_crtc->pending); 497 - omap_crtc->pending = true; 498 - 499 - if (crtc->state->event) 500 - omap_crtc->event = crtc->state->event; 476 + omap_crtc_arm_event(crtc); 501 477 spin_unlock_irq(&crtc->dev->event_lock); 502 478 } 503 479
+1 -1
drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
··· 388 388 u32 min_align = 128; 389 389 int ret; 390 390 unsigned long flags; 391 - size_t slot_bytes; 391 + u32 slot_bytes; 392 392 393 393 BUG_ON(!validfmt(fmt)); 394 394
+42 -149
drivers/gpu/drm/omapdrm/omap_drv.c
··· 17 17 * this program. If not, see <http://www.gnu.org/licenses/>. 18 18 */ 19 19 20 - #include <linux/wait.h> 20 + #include <linux/sys_soc.h> 21 21 22 22 #include <drm/drm_atomic.h> 23 23 #include <drm/drm_atomic_helper.h> ··· 54 54 drm_fb_helper_hotplug_event(priv->fbdev); 55 55 } 56 56 57 - struct omap_atomic_state_commit { 58 - struct work_struct work; 59 - struct drm_device *dev; 60 - struct drm_atomic_state *state; 61 - u32 crtcs; 62 - }; 63 - 64 57 static void omap_atomic_wait_for_completion(struct drm_device *dev, 65 58 struct drm_atomic_state *old_state) 66 59 { ··· 74 81 } 75 82 } 76 83 77 - static void omap_atomic_complete(struct omap_atomic_state_commit *commit) 84 + static void omap_atomic_commit_tail(struct drm_atomic_state *old_state) 78 85 { 79 - struct drm_device *dev = commit->dev; 86 + struct drm_device *dev = old_state->dev; 80 87 struct omap_drm_private *priv = dev->dev_private; 81 - struct drm_atomic_state *old_state = commit->state; 82 88 83 - /* Apply the atomic update. */ 84 89 priv->dispc_ops->runtime_get(); 85 90 91 + /* Apply the atomic update. */ 86 92 drm_atomic_helper_commit_modeset_disables(dev, old_state); 87 93 88 94 /* With the current dss dispc implementation we have to enable ··· 100 108 101 109 drm_atomic_helper_commit_planes(dev, old_state, 0); 102 110 111 + drm_atomic_helper_commit_hw_done(old_state); 112 + 113 + /* 114 + * Wait for completion of the page flips to ensure that old buffers 115 + * can't be touched by the hardware anymore before cleaning up planes. 116 + */ 103 117 omap_atomic_wait_for_completion(dev, old_state); 104 118 105 119 drm_atomic_helper_cleanup_planes(dev, old_state); 106 120 107 121 priv->dispc_ops->runtime_put(); 108 - 109 - drm_atomic_state_put(old_state); 110 - 111 - /* Complete the commit, wake up any waiter. */ 112 - spin_lock(&priv->commit.lock); 113 - priv->commit.pending &= ~commit->crtcs; 114 - spin_unlock(&priv->commit.lock); 115 - 116 - wake_up_all(&priv->commit.wait); 117 - 118 - kfree(commit); 119 122 } 120 123 121 - static void omap_atomic_work(struct work_struct *work) 122 - { 123 - struct omap_atomic_state_commit *commit = 124 - container_of(work, struct omap_atomic_state_commit, work); 125 - 126 - omap_atomic_complete(commit); 127 - } 128 - 129 - static bool omap_atomic_is_pending(struct omap_drm_private *priv, 130 - struct omap_atomic_state_commit *commit) 131 - { 132 - bool pending; 133 - 134 - spin_lock(&priv->commit.lock); 135 - pending = priv->commit.pending & commit->crtcs; 136 - spin_unlock(&priv->commit.lock); 137 - 138 - return pending; 139 - } 140 - 141 - static int omap_atomic_commit(struct drm_device *dev, 142 - struct drm_atomic_state *state, bool nonblock) 143 - { 144 - struct omap_drm_private *priv = dev->dev_private; 145 - struct omap_atomic_state_commit *commit; 146 - struct drm_crtc *crtc; 147 - struct drm_crtc_state *crtc_state; 148 - int i, ret; 149 - 150 - ret = drm_atomic_helper_prepare_planes(dev, state); 151 - if (ret) 152 - return ret; 153 - 154 - /* Allocate the commit object. */ 155 - commit = kzalloc(sizeof(*commit), GFP_KERNEL); 156 - if (commit == NULL) { 157 - ret = -ENOMEM; 158 - goto error; 159 - } 160 - 161 - INIT_WORK(&commit->work, omap_atomic_work); 162 - commit->dev = dev; 163 - commit->state = state; 164 - 165 - /* Wait until all affected CRTCs have completed previous commits and 166 - * mark them as pending. 167 - */ 168 - for_each_crtc_in_state(state, crtc, crtc_state, i) 169 - commit->crtcs |= drm_crtc_mask(crtc); 170 - 171 - wait_event(priv->commit.wait, !omap_atomic_is_pending(priv, commit)); 172 - 173 - spin_lock(&priv->commit.lock); 174 - priv->commit.pending |= commit->crtcs; 175 - spin_unlock(&priv->commit.lock); 176 - 177 - /* Swap the state, this is the point of no return. */ 178 - drm_atomic_helper_swap_state(state, true); 179 - 180 - drm_atomic_state_get(state); 181 - if (nonblock) 182 - schedule_work(&commit->work); 183 - else 184 - omap_atomic_complete(commit); 185 - 186 - return 0; 187 - 188 - error: 189 - drm_atomic_helper_cleanup_planes(dev, state); 190 - return ret; 191 - } 124 + static const struct drm_mode_config_helper_funcs omap_mode_config_helper_funcs = { 125 + .atomic_commit_tail = omap_atomic_commit_tail, 126 + }; 192 127 193 128 static const struct drm_mode_config_funcs omap_mode_config_funcs = { 194 129 .fb_create = omap_framebuffer_create, 195 130 .output_poll_changed = omap_fb_output_poll_changed, 196 131 .atomic_check = drm_atomic_helper_check, 197 - .atomic_commit = omap_atomic_commit, 132 + .atomic_commit = drm_atomic_helper_commit, 198 133 }; 199 134 200 135 static int get_connector_type(struct omap_dss_device *dssdev) ··· 133 214 return DRM_MODE_CONNECTOR_DVID; 134 215 case OMAP_DISPLAY_TYPE_DSI: 135 216 return DRM_MODE_CONNECTOR_DSI; 217 + case OMAP_DISPLAY_TYPE_DPI: 218 + case OMAP_DISPLAY_TYPE_DBI: 219 + return DRM_MODE_CONNECTOR_DPI; 220 + case OMAP_DISPLAY_TYPE_VENC: 221 + /* TODO: This could also be composite */ 222 + return DRM_MODE_CONNECTOR_SVIDEO; 223 + case OMAP_DISPLAY_TYPE_SDI: 224 + return DRM_MODE_CONNECTOR_LVDS; 136 225 default: 137 226 return DRM_MODE_CONNECTOR_Unknown; 138 227 } ··· 188 261 static int omap_modeset_init_properties(struct drm_device *dev) 189 262 { 190 263 struct omap_drm_private *priv = dev->dev_private; 264 + unsigned int num_planes = priv->dispc_ops->get_num_ovls(); 191 265 192 - priv->zorder_prop = drm_property_create_range(dev, 0, "zorder", 0, 3); 266 + priv->zorder_prop = drm_property_create_range(dev, 0, "zorder", 0, 267 + num_planes - 1); 193 268 if (!priv->zorder_prop) 194 269 return -ENOMEM; 195 270 ··· 314 385 dev->mode_config.max_height = 2048; 315 386 316 387 dev->mode_config.funcs = &omap_mode_config_funcs; 388 + dev->mode_config.helper_private = &omap_mode_config_helper_funcs; 317 389 318 390 drm_mode_config_reset(dev); 319 391 ··· 377 447 &args->handle); 378 448 } 379 449 380 - static int ioctl_gem_cpu_prep(struct drm_device *dev, void *data, 381 - struct drm_file *file_priv) 382 - { 383 - struct drm_omap_gem_cpu_prep *args = data; 384 - struct drm_gem_object *obj; 385 - int ret; 386 - 387 - VERB("%p:%p: handle=%d, op=%x", dev, file_priv, args->handle, args->op); 388 - 389 - obj = drm_gem_object_lookup(file_priv, args->handle); 390 - if (!obj) 391 - return -ENOENT; 392 - 393 - ret = omap_gem_op_sync(obj, args->op); 394 - 395 - if (!ret) 396 - ret = omap_gem_op_start(obj, args->op); 397 - 398 - drm_gem_object_unreference_unlocked(obj); 399 - 400 - return ret; 401 - } 402 - 403 - static int ioctl_gem_cpu_fini(struct drm_device *dev, void *data, 404 - struct drm_file *file_priv) 405 - { 406 - struct drm_omap_gem_cpu_fini *args = data; 407 - struct drm_gem_object *obj; 408 - int ret; 409 - 410 - VERB("%p:%p: handle=%d", dev, file_priv, args->handle); 411 - 412 - obj = drm_gem_object_lookup(file_priv, args->handle); 413 - if (!obj) 414 - return -ENOENT; 415 - 416 - /* XXX flushy, flushy */ 417 - ret = 0; 418 - 419 - if (!ret) 420 - ret = omap_gem_op_finish(obj, args->op); 421 - 422 - drm_gem_object_unreference_unlocked(obj); 423 - 424 - return ret; 425 - } 426 - 427 450 static int ioctl_gem_info(struct drm_device *dev, void *data, 428 451 struct drm_file *file_priv) 429 452 { ··· 405 522 DRM_AUTH | DRM_MASTER | DRM_ROOT_ONLY), 406 523 DRM_IOCTL_DEF_DRV(OMAP_GEM_NEW, ioctl_gem_new, 407 524 DRM_AUTH | DRM_RENDER_ALLOW), 408 - DRM_IOCTL_DEF_DRV(OMAP_GEM_CPU_PREP, ioctl_gem_cpu_prep, 525 + /* Deprecated, to be removed. */ 526 + DRM_IOCTL_DEF_DRV(OMAP_GEM_CPU_PREP, drm_noop, 409 527 DRM_AUTH | DRM_RENDER_ALLOW), 410 - DRM_IOCTL_DEF_DRV(OMAP_GEM_CPU_FINI, ioctl_gem_cpu_fini, 528 + /* Deprecated, to be removed. */ 529 + DRM_IOCTL_DEF_DRV(OMAP_GEM_CPU_FINI, drm_noop, 411 530 DRM_AUTH | DRM_RENDER_ALLOW), 412 531 DRM_IOCTL_DEF_DRV(OMAP_GEM_INFO, ioctl_gem_info, 413 532 DRM_AUTH | DRM_RENDER_ALLOW), ··· 493 608 .owner = THIS_MODULE, 494 609 .open = drm_open, 495 610 .unlocked_ioctl = drm_ioctl, 611 + .compat_ioctl = drm_compat_ioctl, 496 612 .release = drm_release, 497 613 .mmap = omap_gem_mmap, 498 614 .poll = drm_poll, ··· 529 643 .patchlevel = DRIVER_PATCHLEVEL, 530 644 }; 531 645 646 + static const struct soc_device_attribute omapdrm_soc_devices[] = { 647 + { .family = "OMAP3", .data = (void *)0x3430 }, 648 + { .family = "OMAP4", .data = (void *)0x4430 }, 649 + { .family = "OMAP5", .data = (void *)0x5430 }, 650 + { .family = "DRA7", .data = (void *)0x0752 }, 651 + { /* sentinel */ } 652 + }; 653 + 532 654 static int pdev_probe(struct platform_device *pdev) 533 655 { 534 - struct omap_drm_platform_data *pdata = pdev->dev.platform_data; 656 + const struct soc_device_attribute *soc; 535 657 struct omap_drm_private *priv; 536 658 struct drm_device *ddev; 537 659 unsigned int i; ··· 565 671 566 672 priv->dispc_ops = dispc_get_ops(); 567 673 568 - priv->omaprev = pdata->omaprev; 674 + soc = soc_device_match(omapdrm_soc_devices); 675 + priv->omaprev = soc ? (unsigned int)soc->data : 0; 569 676 priv->wq = alloc_ordered_workqueue("omapdrm", 0); 570 677 571 - init_waitqueue_head(&priv->commit.wait); 572 - spin_lock_init(&priv->commit.lock); 573 678 spin_lock_init(&priv->list_lock); 574 679 INIT_LIST_HEAD(&priv->obj_list); 575 680
+8 -33
drivers/gpu/drm/omapdrm/omap_drv.h
··· 21 21 #define __OMAP_DRV_H__ 22 22 23 23 #include <linux/module.h> 24 - #include <linux/platform_data/omap_drm.h> 25 24 #include <linux/types.h> 26 - #include <linux/wait.h> 25 + #include <linux/workqueue.h> 27 26 28 27 #include <drm/drmP.h> 29 28 #include <drm/drm_crtc_helper.h> ··· 37 38 #define MODULE_NAME "omapdrm" 38 39 39 40 struct omap_drm_usergart; 40 - 41 - /* parameters which describe (unrotated) coordinates of scanout within a fb: */ 42 - struct omap_drm_window { 43 - uint32_t rotation; 44 - int32_t crtc_x, crtc_y; /* signed because can be offscreen */ 45 - uint32_t crtc_w, crtc_h; 46 - uint32_t src_x, src_y; 47 - uint32_t src_w, src_h; 48 - }; 49 41 50 42 /* For KMS code that needs to wait for a certain # of IRQs: 51 43 */ ··· 83 93 spinlock_t wait_lock; /* protects the wait_list */ 84 94 struct list_head wait_list; /* list of omap_irq_wait */ 85 95 uint32_t irq_mask; /* enabled irqs in addition to wait_list */ 86 - 87 - /* atomic commit */ 88 - struct { 89 - wait_queue_head_t wait; 90 - u32 pending; 91 - spinlock_t lock; /* Protects commit.pending */ 92 - } commit; 93 96 }; 94 97 95 98 ··· 141 158 struct drm_connector *connector); 142 159 bool omap_connector_get_hdmi_mode(struct drm_connector *connector); 143 160 144 - uint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats, 145 - uint32_t max_formats, enum omap_color_mode supported_modes); 146 161 struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev, 147 162 struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd); 148 163 struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, ··· 148 167 int omap_framebuffer_pin(struct drm_framebuffer *fb); 149 168 void omap_framebuffer_unpin(struct drm_framebuffer *fb); 150 169 void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, 151 - struct omap_drm_window *win, struct omap_overlay_info *info); 170 + struct drm_plane_state *state, struct omap_overlay_info *info); 152 171 struct drm_connector *omap_framebuffer_get_next_connector( 153 172 struct drm_framebuffer *fb, struct drm_connector *from); 154 173 bool omap_framebuffer_supports_rotation(struct drm_framebuffer *fb); ··· 172 191 int omap_gem_mmap_obj(struct drm_gem_object *obj, 173 192 struct vm_area_struct *vma); 174 193 int omap_gem_fault(struct vm_fault *vmf); 175 - int omap_gem_op_start(struct drm_gem_object *obj, enum omap_gem_op op); 176 - int omap_gem_op_finish(struct drm_gem_object *obj, enum omap_gem_op op); 177 - int omap_gem_op_sync(struct drm_gem_object *obj, enum omap_gem_op op); 178 - int omap_gem_op_async(struct drm_gem_object *obj, enum omap_gem_op op, 179 - void (*fxn)(void *arg), void *arg); 180 194 int omap_gem_roll(struct drm_gem_object *obj, uint32_t roll); 181 - void omap_gem_cpu_sync(struct drm_gem_object *obj, int pgoff); 182 - void omap_gem_dma_sync(struct drm_gem_object *obj, 195 + void omap_gem_cpu_sync_page(struct drm_gem_object *obj, int pgoff); 196 + void omap_gem_dma_sync_buffer(struct drm_gem_object *obj, 183 197 enum dma_data_direction dir); 184 - int omap_gem_get_paddr(struct drm_gem_object *obj, 185 - dma_addr_t *paddr, bool remap); 186 - void omap_gem_put_paddr(struct drm_gem_object *obj); 198 + int omap_gem_pin(struct drm_gem_object *obj, dma_addr_t *dma_addr); 199 + void omap_gem_unpin(struct drm_gem_object *obj); 187 200 int omap_gem_get_pages(struct drm_gem_object *obj, struct page ***pages, 188 201 bool remap); 189 202 int omap_gem_put_pages(struct drm_gem_object *obj); 190 203 uint32_t omap_gem_flags(struct drm_gem_object *obj); 191 - int omap_gem_rotated_paddr(struct drm_gem_object *obj, uint32_t orient, 192 - int x, int y, dma_addr_t *paddr); 204 + int omap_gem_rotated_dma_addr(struct drm_gem_object *obj, uint32_t orient, 205 + int x, int y, dma_addr_t *dma_addr); 193 206 uint64_t omap_gem_mmap_offset(struct drm_gem_object *obj); 194 207 size_t omap_gem_mmap_size(struct drm_gem_object *obj); 195 208 int omap_gem_tiled_stride(struct drm_gem_object *obj, uint32_t orient);
+100 -99
drivers/gpu/drm/omapdrm/omap_fb.c
··· 29 29 * framebuffer funcs 30 30 */ 31 31 32 - /* DSS to DRM formats mapping */ 33 - static const struct { 34 - enum omap_color_mode dss_format; 35 - uint32_t pixel_format; 36 - } formats[] = { 32 + static const u32 formats[] = { 37 33 /* 16bpp [A]RGB: */ 38 - { OMAP_DSS_COLOR_RGB16, DRM_FORMAT_RGB565 }, /* RGB16-565 */ 39 - { OMAP_DSS_COLOR_RGB12U, DRM_FORMAT_RGBX4444 }, /* RGB12x-4444 */ 40 - { OMAP_DSS_COLOR_RGBX16, DRM_FORMAT_XRGB4444 }, /* xRGB12-4444 */ 41 - { OMAP_DSS_COLOR_RGBA16, DRM_FORMAT_RGBA4444 }, /* RGBA12-4444 */ 42 - { OMAP_DSS_COLOR_ARGB16, DRM_FORMAT_ARGB4444 }, /* ARGB16-4444 */ 43 - { OMAP_DSS_COLOR_XRGB16_1555, DRM_FORMAT_XRGB1555 }, /* xRGB15-1555 */ 44 - { OMAP_DSS_COLOR_ARGB16_1555, DRM_FORMAT_ARGB1555 }, /* ARGB16-1555 */ 34 + DRM_FORMAT_RGB565, /* RGB16-565 */ 35 + DRM_FORMAT_RGBX4444, /* RGB12x-4444 */ 36 + DRM_FORMAT_XRGB4444, /* xRGB12-4444 */ 37 + DRM_FORMAT_RGBA4444, /* RGBA12-4444 */ 38 + DRM_FORMAT_ARGB4444, /* ARGB16-4444 */ 39 + DRM_FORMAT_XRGB1555, /* xRGB15-1555 */ 40 + DRM_FORMAT_ARGB1555, /* ARGB16-1555 */ 45 41 /* 24bpp RGB: */ 46 - { OMAP_DSS_COLOR_RGB24P, DRM_FORMAT_RGB888 }, /* RGB24-888 */ 42 + DRM_FORMAT_RGB888, /* RGB24-888 */ 47 43 /* 32bpp [A]RGB: */ 48 - { OMAP_DSS_COLOR_RGBX32, DRM_FORMAT_RGBX8888 }, /* RGBx24-8888 */ 49 - { OMAP_DSS_COLOR_RGB24U, DRM_FORMAT_XRGB8888 }, /* xRGB24-8888 */ 50 - { OMAP_DSS_COLOR_RGBA32, DRM_FORMAT_RGBA8888 }, /* RGBA32-8888 */ 51 - { OMAP_DSS_COLOR_ARGB32, DRM_FORMAT_ARGB8888 }, /* ARGB32-8888 */ 44 + DRM_FORMAT_RGBX8888, /* RGBx24-8888 */ 45 + DRM_FORMAT_XRGB8888, /* xRGB24-8888 */ 46 + DRM_FORMAT_RGBA8888, /* RGBA32-8888 */ 47 + DRM_FORMAT_ARGB8888, /* ARGB32-8888 */ 52 48 /* YUV: */ 53 - { OMAP_DSS_COLOR_NV12, DRM_FORMAT_NV12 }, 54 - { OMAP_DSS_COLOR_YUV2, DRM_FORMAT_YUYV }, 55 - { OMAP_DSS_COLOR_UYVY, DRM_FORMAT_UYVY }, 49 + DRM_FORMAT_NV12, 50 + DRM_FORMAT_YUYV, 51 + DRM_FORMAT_UYVY, 56 52 }; 57 - 58 - /* convert from overlay's pixel formats bitmask to an array of fourcc's */ 59 - uint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats, 60 - uint32_t max_formats, enum omap_color_mode supported_modes) 61 - { 62 - uint32_t nformats = 0; 63 - int i = 0; 64 - 65 - for (i = 0; i < ARRAY_SIZE(formats) && nformats < max_formats; i++) 66 - if (formats[i].dss_format & supported_modes) 67 - pixel_formats[nformats++] = formats[i].pixel_format; 68 - 69 - return nformats; 70 - } 71 53 72 54 /* per-plane info for the fb: */ 73 55 struct plane { 74 56 struct drm_gem_object *bo; 75 57 uint32_t pitch; 76 58 uint32_t offset; 77 - dma_addr_t paddr; 59 + dma_addr_t dma_addr; 78 60 }; 79 61 80 62 #define to_omap_framebuffer(x) container_of(x, struct omap_framebuffer, base) ··· 65 83 struct drm_framebuffer base; 66 84 int pin_count; 67 85 const struct drm_format_info *format; 68 - enum omap_color_mode dss_format; 69 86 struct plane planes[2]; 70 - /* lock for pinning (pin_count and planes.paddr) */ 87 + /* lock for pinning (pin_count and planes.dma_addr) */ 71 88 struct mutex lock; 72 89 }; 73 90 ··· 111 130 + (x * format->cpp[n] / (n == 0 ? 1 : format->hsub)) 112 131 + (y * plane->pitch / (n == 0 ? 1 : format->vsub)); 113 132 114 - return plane->paddr + offset; 133 + return plane->dma_addr + offset; 115 134 } 116 135 117 136 bool omap_framebuffer_supports_rotation(struct drm_framebuffer *fb) ··· 122 141 return omap_gem_flags(plane->bo) & OMAP_BO_TILED; 123 142 } 124 143 144 + /* Note: DRM rotates counter-clockwise, TILER & DSS rotates clockwise */ 145 + static uint32_t drm_rotation_to_tiler(unsigned int drm_rot) 146 + { 147 + uint32_t orient; 148 + 149 + switch (drm_rot & DRM_MODE_ROTATE_MASK) { 150 + default: 151 + case DRM_MODE_ROTATE_0: 152 + orient = 0; 153 + break; 154 + case DRM_MODE_ROTATE_90: 155 + orient = MASK_XY_FLIP | MASK_X_INVERT; 156 + break; 157 + case DRM_MODE_ROTATE_180: 158 + orient = MASK_X_INVERT | MASK_Y_INVERT; 159 + break; 160 + case DRM_MODE_ROTATE_270: 161 + orient = MASK_XY_FLIP | MASK_Y_INVERT; 162 + break; 163 + } 164 + 165 + if (drm_rot & DRM_MODE_REFLECT_X) 166 + orient ^= MASK_X_INVERT; 167 + 168 + if (drm_rot & DRM_MODE_REFLECT_Y) 169 + orient ^= MASK_Y_INVERT; 170 + 171 + return orient; 172 + } 173 + 125 174 /* update ovl info for scanout, handles cases of multi-planar fb's, etc. 126 175 */ 127 176 void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, 128 - struct omap_drm_window *win, struct omap_overlay_info *info) 177 + struct drm_plane_state *state, struct omap_overlay_info *info) 129 178 { 130 179 struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); 131 180 const struct drm_format_info *format = omap_fb->format; 132 181 struct plane *plane = &omap_fb->planes[0]; 133 182 uint32_t x, y, orient = 0; 134 183 135 - info->color_mode = omap_fb->dss_format; 184 + info->fourcc = fb->format->format; 136 185 137 - info->pos_x = win->crtc_x; 138 - info->pos_y = win->crtc_y; 139 - info->out_width = win->crtc_w; 140 - info->out_height = win->crtc_h; 141 - info->width = win->src_w; 142 - info->height = win->src_h; 186 + info->pos_x = state->crtc_x; 187 + info->pos_y = state->crtc_y; 188 + info->out_width = state->crtc_w; 189 + info->out_height = state->crtc_h; 190 + info->width = state->src_w >> 16; 191 + info->height = state->src_h >> 16; 143 192 144 - x = win->src_x; 145 - y = win->src_y; 193 + /* DSS driver wants the w & h in rotated orientation */ 194 + if (drm_rotation_90_or_270(state->rotation)) 195 + swap(info->width, info->height); 196 + 197 + x = state->src_x >> 16; 198 + y = state->src_y >> 16; 146 199 147 200 if (omap_gem_flags(plane->bo) & OMAP_BO_TILED) { 148 - uint32_t w = win->src_w; 149 - uint32_t h = win->src_h; 201 + uint32_t w = state->src_w >> 16; 202 + uint32_t h = state->src_h >> 16; 150 203 151 - switch (win->rotation & DRM_MODE_ROTATE_MASK) { 152 - default: 153 - dev_err(fb->dev->dev, "invalid rotation: %02x", 154 - (uint32_t)win->rotation); 155 - /* fallthru to default to no rotation */ 156 - case 0: 157 - case DRM_MODE_ROTATE_0: 158 - orient = 0; 159 - break; 160 - case DRM_MODE_ROTATE_90: 161 - orient = MASK_XY_FLIP | MASK_X_INVERT; 162 - break; 163 - case DRM_MODE_ROTATE_180: 164 - orient = MASK_X_INVERT | MASK_Y_INVERT; 165 - break; 166 - case DRM_MODE_ROTATE_270: 167 - orient = MASK_XY_FLIP | MASK_Y_INVERT; 168 - break; 204 + orient = drm_rotation_to_tiler(state->rotation); 205 + 206 + /* 207 + * omap_gem_rotated_paddr() wants the x & y in tiler units. 208 + * Usually tiler unit size is the same as the pixel size, except 209 + * for YUV422 formats, for which the tiler unit size is 32 bits 210 + * and pixel size is 16 bits. 211 + */ 212 + if (fb->format->format == DRM_FORMAT_UYVY || 213 + fb->format->format == DRM_FORMAT_YUYV) { 214 + x /= 2; 215 + w /= 2; 169 216 } 170 217 171 - if (win->rotation & DRM_MODE_REFLECT_X) 172 - orient ^= MASK_X_INVERT; 173 - 174 - if (win->rotation & DRM_MODE_REFLECT_Y) 175 - orient ^= MASK_Y_INVERT; 176 - 177 - /* adjust x,y offset for flip/invert: */ 178 - if (orient & MASK_XY_FLIP) 179 - swap(w, h); 218 + /* adjust x,y offset for invert: */ 180 219 if (orient & MASK_Y_INVERT) 181 220 y += h - 1; 182 221 if (orient & MASK_X_INVERT) 183 222 x += w - 1; 184 223 185 - omap_gem_rotated_paddr(plane->bo, orient, x, y, &info->paddr); 224 + /* Note: x and y are in TILER units, not pixels */ 225 + omap_gem_rotated_dma_addr(plane->bo, orient, x, y, 226 + &info->paddr); 186 227 info->rotation_type = OMAP_DSS_ROT_TILER; 228 + info->rotation = state->rotation ?: DRM_MODE_ROTATE_0; 229 + /* Note: stride in TILER units, not pixels */ 187 230 info->screen_width = omap_gem_tiled_stride(plane->bo, orient); 188 231 } else { 189 - switch (win->rotation & DRM_MODE_ROTATE_MASK) { 232 + switch (state->rotation & DRM_MODE_ROTATE_MASK) { 190 233 case 0: 191 234 case DRM_MODE_ROTATE_0: 192 235 /* OK */ ··· 219 214 default: 220 215 dev_warn(fb->dev->dev, 221 216 "rotation '%d' ignored for non-tiled fb\n", 222 - win->rotation); 223 - win->rotation = 0; 217 + state->rotation); 224 218 break; 225 219 } 226 220 227 221 info->paddr = get_linear_addr(plane, format, 0, x, y); 228 - info->rotation_type = OMAP_DSS_ROT_DMA; 222 + info->rotation_type = OMAP_DSS_ROT_NONE; 223 + info->rotation = DRM_MODE_ROTATE_0; 229 224 info->screen_width = plane->pitch; 230 225 } 231 226 232 227 /* convert to pixels: */ 233 228 info->screen_width /= format->cpp[0]; 234 229 235 - if (omap_fb->dss_format == OMAP_DSS_COLOR_NV12) { 230 + if (fb->format->format == DRM_FORMAT_NV12) { 236 231 plane = &omap_fb->planes[1]; 237 232 238 233 if (info->rotation_type == OMAP_DSS_ROT_TILER) { 239 234 WARN_ON(!(omap_gem_flags(plane->bo) & OMAP_BO_TILED)); 240 - omap_gem_rotated_paddr(plane->bo, orient, 241 - x/2, y/2, &info->p_uv_addr); 235 + omap_gem_rotated_dma_addr(plane->bo, orient, x/2, y/2, 236 + &info->p_uv_addr); 242 237 } else { 243 238 info->p_uv_addr = get_linear_addr(plane, format, 1, x, y); 244 239 } ··· 263 258 264 259 for (i = 0; i < n; i++) { 265 260 struct plane *plane = &omap_fb->planes[i]; 266 - ret = omap_gem_get_paddr(plane->bo, &plane->paddr, true); 261 + ret = omap_gem_pin(plane->bo, &plane->dma_addr); 267 262 if (ret) 268 263 goto fail; 269 - omap_gem_dma_sync(plane->bo, DMA_TO_DEVICE); 264 + omap_gem_dma_sync_buffer(plane->bo, DMA_TO_DEVICE); 270 265 } 271 266 272 267 omap_fb->pin_count++; ··· 278 273 fail: 279 274 for (i--; i >= 0; i--) { 280 275 struct plane *plane = &omap_fb->planes[i]; 281 - omap_gem_put_paddr(plane->bo); 282 - plane->paddr = 0; 276 + omap_gem_unpin(plane->bo); 277 + plane->dma_addr = 0; 283 278 } 284 279 285 280 mutex_unlock(&omap_fb->lock); ··· 304 299 305 300 for (i = 0; i < n; i++) { 306 301 struct plane *plane = &omap_fb->planes[i]; 307 - omap_gem_put_paddr(plane->bo); 308 - plane->paddr = 0; 302 + omap_gem_unpin(plane->bo); 303 + plane->dma_addr = 0; 309 304 } 310 305 311 306 mutex_unlock(&omap_fb->lock); ··· 391 386 const struct drm_format_info *format = NULL; 392 387 struct omap_framebuffer *omap_fb = NULL; 393 388 struct drm_framebuffer *fb = NULL; 394 - enum omap_color_mode dss_format = 0; 395 389 unsigned int pitch = mode_cmd->pitches[0]; 396 390 int ret, i; 397 391 ··· 401 397 format = drm_format_info(mode_cmd->pixel_format); 402 398 403 399 for (i = 0; i < ARRAY_SIZE(formats); i++) { 404 - if (formats[i].pixel_format == mode_cmd->pixel_format) { 405 - dss_format = formats[i].dss_format; 400 + if (formats[i] == mode_cmd->pixel_format) 406 401 break; 407 - } 408 402 } 409 403 410 - if (!format || !dss_format) { 404 + if (!format || i == ARRAY_SIZE(formats)) { 411 405 dev_dbg(dev->dev, "unsupported pixel format: %4.4s\n", 412 406 (char *)&mode_cmd->pixel_format); 413 407 ret = -EINVAL; ··· 420 418 421 419 fb = &omap_fb->base; 422 420 omap_fb->format = format; 423 - omap_fb->dss_format = dss_format; 424 421 mutex_init(&omap_fb->lock); 425 422 426 423 /* ··· 450 449 451 450 if (size > omap_gem_mmap_size(bos[i]) - mode_cmd->offsets[i]) { 452 451 dev_dbg(dev->dev, 453 - "provided buffer object is too small! %d < %d\n", 452 + "provided buffer object is too small! %zu < %d\n", 454 453 bos[i]->size - mode_cmd->offsets[i], size); 455 454 ret = -EINVAL; 456 455 goto fail; ··· 459 458 plane->bo = bos[i]; 460 459 plane->offset = mode_cmd->offsets[i]; 461 460 plane->pitch = pitch; 462 - plane->paddr = 0; 461 + plane->dma_addr = 0; 463 462 } 464 463 465 464 drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
+7 -8
drivers/gpu/drm/omapdrm/omap_fbdev.c
··· 106 106 union omap_gem_size gsize; 107 107 struct fb_info *fbi = NULL; 108 108 struct drm_mode_fb_cmd2 mode_cmd = {0}; 109 - dma_addr_t paddr; 109 + dma_addr_t dma_addr; 110 110 int ret; 111 111 112 112 sizes->surface_bpp = 32; ··· 162 162 * to it). Then we just need to be sure that we are able to re- 163 163 * pin it in case of an opps. 164 164 */ 165 - ret = omap_gem_get_paddr(fbdev->bo, &paddr, true); 165 + ret = omap_gem_pin(fbdev->bo, &dma_addr); 166 166 if (ret) { 167 - dev_err(dev->dev, 168 - "could not map (paddr)! Skipping framebuffer alloc\n"); 167 + dev_err(dev->dev, "could not pin framebuffer\n"); 169 168 ret = -ENOMEM; 170 169 goto fail; 171 170 } ··· 192 193 drm_fb_helper_fill_fix(fbi, fb->pitches[0], fb->format->depth); 193 194 drm_fb_helper_fill_var(fbi, helper, sizes->fb_width, sizes->fb_height); 194 195 195 - dev->mode_config.fb_base = paddr; 196 + dev->mode_config.fb_base = dma_addr; 196 197 197 198 fbi->screen_base = omap_gem_vaddr(fbdev->bo); 198 199 fbi->screen_size = fbdev->bo->size; 199 - fbi->fix.smem_start = paddr; 200 + fbi->fix.smem_start = dma_addr; 200 201 fbi->fix.smem_len = fbdev->bo->size; 201 202 202 203 /* if we have DMM, then we can use it for scrolling by just ··· 302 303 303 304 fbdev = to_omap_fbdev(priv->fbdev); 304 305 305 - /* release the ref taken in omap_fbdev_create() */ 306 - omap_gem_put_paddr(fbdev->bo); 306 + /* unpin the GEM object pinned in omap_fbdev_create() */ 307 + omap_gem_unpin(fbdev->bo); 307 308 308 309 /* this will free the backing object */ 309 310 if (fbdev->fb)
+115 -314
drivers/gpu/drm/omapdrm/omap_gem.c
··· 50 50 uint32_t roll; 51 51 52 52 /** 53 - * paddr contains the buffer DMA address. It is valid for 53 + * dma_addr contains the buffer DMA address. It is valid for 54 54 * 55 55 * - buffers allocated through the DMA mapping API (with the 56 56 * OMAP_BO_MEM_DMA_API flag set) ··· 58 58 * - buffers imported from dmabuf (with the OMAP_BO_MEM_DMABUF flag set) 59 59 * if they are physically contiguous (when sgt->orig_nents == 1) 60 60 * 61 - * - buffers mapped through the TILER when paddr_cnt is not zero, in 61 + * - buffers mapped through the TILER when dma_addr_cnt is not zero, in 62 62 * which case the DMA address points to the TILER aperture 63 63 * 64 64 * Physically contiguous buffers have their DMA address equal to the 65 65 * physical address as we don't remap those buffers through the TILER. 66 66 * 67 67 * Buffers mapped to the TILER have their DMA address pointing to the 68 - * TILER aperture. As TILER mappings are refcounted (through paddr_cnt) 69 - * the DMA address must be accessed through omap_get_get_paddr() to 70 - * ensure that the mapping won't disappear unexpectedly. References must 71 - * be released with omap_gem_put_paddr(). 68 + * TILER aperture. As TILER mappings are refcounted (through 69 + * dma_addr_cnt) the DMA address must be accessed through omap_gem_pin() 70 + * to ensure that the mapping won't disappear unexpectedly. References 71 + * must be released with omap_gem_unpin(). 72 72 */ 73 - dma_addr_t paddr; 73 + dma_addr_t dma_addr; 74 74 75 75 /** 76 - * # of users of paddr 76 + * # of users of dma_addr 77 77 */ 78 - uint32_t paddr_cnt; 78 + uint32_t dma_addr_cnt; 79 79 80 80 /** 81 81 * If the buffer has been imported from a dmabuf the OMAP_DB_DMABUF flag ··· 95 95 struct page **pages; 96 96 97 97 /** addresses corresponding to pages in above array */ 98 - dma_addr_t *addrs; 98 + dma_addr_t *dma_addrs; 99 99 100 100 /** 101 101 * Virtual address, if mapped. 102 102 */ 103 103 void *vaddr; 104 - 105 - /** 106 - * sync-object allocated on demand (if needed) 107 - * 108 - * Per-buffer sync-object for tracking pending and completed hw/dma 109 - * read and write operations. 110 - */ 111 - struct { 112 - uint32_t write_pending; 113 - uint32_t write_complete; 114 - uint32_t read_pending; 115 - uint32_t read_complete; 116 - } *sync; 117 104 }; 118 105 119 106 #define to_omap_bo(x) container_of(x, struct omap_gem_object, base) ··· 119 132 #define NUM_USERGART_ENTRIES 2 120 133 struct omap_drm_usergart_entry { 121 134 struct tiler_block *block; /* the reserved tiler block */ 122 - dma_addr_t paddr; 135 + dma_addr_t dma_addr; 123 136 struct drm_gem_object *obj; /* the current pinned obj */ 124 137 pgoff_t obj_pgoff; /* page offset of obj currently 125 138 mapped in */ ··· 182 195 size_t size = PAGE_SIZE * n; 183 196 loff_t off = mmap_offset(obj) + 184 197 (entry->obj_pgoff << PAGE_SHIFT); 185 - const int m = 1 + ((omap_obj->width << fmt) / PAGE_SIZE); 198 + const int m = DIV_ROUND_UP(omap_obj->width << fmt, PAGE_SIZE); 186 199 187 200 if (m > 1) { 188 201 int i; ··· 254 267 255 268 for (i = 0; i < npages; i++) { 256 269 addrs[i] = dma_map_page(dev->dev, pages[i], 257 - 0, PAGE_SIZE, DMA_BIDIRECTIONAL); 270 + 0, PAGE_SIZE, DMA_TO_DEVICE); 258 271 259 272 if (dma_mapping_error(dev->dev, addrs[i])) { 260 273 dev_warn(dev->dev, ··· 262 275 263 276 for (i = i - 1; i >= 0; --i) { 264 277 dma_unmap_page(dev->dev, addrs[i], 265 - PAGE_SIZE, DMA_BIDIRECTIONAL); 278 + PAGE_SIZE, DMA_TO_DEVICE); 266 279 } 267 280 268 281 ret = -ENOMEM; ··· 277 290 } 278 291 } 279 292 280 - omap_obj->addrs = addrs; 293 + omap_obj->dma_addrs = addrs; 281 294 omap_obj->pages = pages; 282 295 283 296 return 0; ··· 316 329 static void omap_gem_detach_pages(struct drm_gem_object *obj) 317 330 { 318 331 struct omap_gem_object *omap_obj = to_omap_bo(obj); 332 + unsigned int npages = obj->size >> PAGE_SHIFT; 333 + unsigned int i; 319 334 320 - /* for non-cached buffers, ensure the new pages are clean because 321 - * DSS, GPU, etc. are not cache coherent: 322 - */ 323 - if (omap_obj->flags & (OMAP_BO_WC|OMAP_BO_UNCACHED)) { 324 - int i, npages = obj->size >> PAGE_SHIFT; 325 - for (i = 0; i < npages; i++) { 326 - if (omap_obj->addrs[i]) 327 - dma_unmap_page(obj->dev->dev, 328 - omap_obj->addrs[i], 329 - PAGE_SIZE, DMA_BIDIRECTIONAL); 330 - } 335 + for (i = 0; i < npages; i++) { 336 + if (omap_obj->dma_addrs[i]) 337 + dma_unmap_page(obj->dev->dev, omap_obj->dma_addrs[i], 338 + PAGE_SIZE, DMA_TO_DEVICE); 331 339 } 332 340 333 - kfree(omap_obj->addrs); 334 - omap_obj->addrs = NULL; 341 + kfree(omap_obj->dma_addrs); 342 + omap_obj->dma_addrs = NULL; 335 343 336 344 drm_gem_put_pages(obj, omap_obj->pages, true, false); 337 345 omap_obj->pages = NULL; ··· 383 401 pgoff = (vmf->address - vma->vm_start) >> PAGE_SHIFT; 384 402 385 403 if (omap_obj->pages) { 386 - omap_gem_cpu_sync(obj, pgoff); 404 + omap_gem_cpu_sync_page(obj, pgoff); 387 405 pfn = page_to_pfn(omap_obj->pages[pgoff]); 388 406 } else { 389 407 BUG_ON(!is_contiguous(omap_obj)); 390 - pfn = (omap_obj->paddr >> PAGE_SHIFT) + pgoff; 408 + pfn = (omap_obj->dma_addr >> PAGE_SHIFT) + pgoff; 391 409 } 392 410 393 411 VERB("Inserting %p pfn %lx, pa %lx", (void *)vmf->address, ··· 424 442 * into account in some of the math, so figure out virtual stride 425 443 * in pages 426 444 */ 427 - const int m = 1 + ((omap_obj->width << fmt) / PAGE_SIZE); 445 + const int m = DIV_ROUND_UP(omap_obj->width << fmt, PAGE_SIZE); 428 446 429 447 /* We don't use vmf->pgoff since that has the fake offset: */ 430 448 pgoff = (vmf->address - vma->vm_start) >> PAGE_SHIFT; ··· 480 498 return ret; 481 499 } 482 500 483 - pfn = entry->paddr >> PAGE_SHIFT; 501 + pfn = entry->dma_addr >> PAGE_SHIFT; 484 502 485 503 VERB("Inserting %p pfn %lx, pa %lx", (void *)vmf->address, 486 504 pfn, pfn << PAGE_SHIFT); ··· 714 732 * Memory Management & DMA Sync 715 733 */ 716 734 717 - /** 718 - * shmem buffers that are mapped cached can simulate coherency via using 719 - * page faulting to keep track of dirty pages 735 + /* 736 + * shmem buffers that are mapped cached are not coherent. 737 + * 738 + * We keep track of dirty pages using page faulting to perform cache management. 739 + * When a page is mapped to the CPU in read/write mode the device can't access 740 + * it and omap_obj->dma_addrs[i] is NULL. When a page is mapped to the device 741 + * the omap_obj->dma_addrs[i] is set to the DMA address, and the page is 742 + * unmapped from the CPU. 720 743 */ 721 744 static inline bool is_cached_coherent(struct drm_gem_object *obj) 722 745 { 723 746 struct omap_gem_object *omap_obj = to_omap_bo(obj); 724 747 725 - return (omap_obj->flags & OMAP_BO_MEM_SHMEM) && 726 - ((omap_obj->flags & OMAP_BO_CACHE_MASK) == OMAP_BO_CACHED); 748 + return !((omap_obj->flags & OMAP_BO_MEM_SHMEM) && 749 + ((omap_obj->flags & OMAP_BO_CACHE_MASK) == OMAP_BO_CACHED)); 727 750 } 728 751 729 752 /* Sync the buffer for CPU access.. note pages should already be 730 753 * attached, ie. omap_gem_get_pages() 731 754 */ 732 - void omap_gem_cpu_sync(struct drm_gem_object *obj, int pgoff) 755 + void omap_gem_cpu_sync_page(struct drm_gem_object *obj, int pgoff) 733 756 { 734 757 struct drm_device *dev = obj->dev; 735 758 struct omap_gem_object *omap_obj = to_omap_bo(obj); 736 759 737 - if (is_cached_coherent(obj) && omap_obj->addrs[pgoff]) { 738 - dma_unmap_page(dev->dev, omap_obj->addrs[pgoff], 739 - PAGE_SIZE, DMA_BIDIRECTIONAL); 740 - omap_obj->addrs[pgoff] = 0; 760 + if (is_cached_coherent(obj)) 761 + return; 762 + 763 + if (omap_obj->dma_addrs[pgoff]) { 764 + dma_unmap_page(dev->dev, omap_obj->dma_addrs[pgoff], 765 + PAGE_SIZE, DMA_TO_DEVICE); 766 + omap_obj->dma_addrs[pgoff] = 0; 741 767 } 742 768 } 743 769 744 770 /* sync the buffer for DMA access */ 745 - void omap_gem_dma_sync(struct drm_gem_object *obj, 771 + void omap_gem_dma_sync_buffer(struct drm_gem_object *obj, 746 772 enum dma_data_direction dir) 747 773 { 748 774 struct drm_device *dev = obj->dev; 749 775 struct omap_gem_object *omap_obj = to_omap_bo(obj); 776 + int i, npages = obj->size >> PAGE_SHIFT; 777 + struct page **pages = omap_obj->pages; 778 + bool dirty = false; 750 779 751 - if (is_cached_coherent(obj)) { 752 - int i, npages = obj->size >> PAGE_SHIFT; 753 - struct page **pages = omap_obj->pages; 754 - bool dirty = false; 780 + if (is_cached_coherent(obj)) 781 + return; 755 782 756 - for (i = 0; i < npages; i++) { 757 - if (!omap_obj->addrs[i]) { 758 - dma_addr_t addr; 783 + for (i = 0; i < npages; i++) { 784 + if (!omap_obj->dma_addrs[i]) { 785 + dma_addr_t addr; 759 786 760 - addr = dma_map_page(dev->dev, pages[i], 0, 761 - PAGE_SIZE, DMA_BIDIRECTIONAL); 762 - 763 - if (dma_mapping_error(dev->dev, addr)) { 764 - dev_warn(dev->dev, 765 - "%s: failed to map page\n", 766 - __func__); 767 - break; 768 - } 769 - 770 - dirty = true; 771 - omap_obj->addrs[i] = addr; 787 + addr = dma_map_page(dev->dev, pages[i], 0, 788 + PAGE_SIZE, dir); 789 + if (dma_mapping_error(dev->dev, addr)) { 790 + dev_warn(dev->dev, "%s: failed to map page\n", 791 + __func__); 792 + break; 772 793 } 773 - } 774 794 775 - if (dirty) { 776 - unmap_mapping_range(obj->filp->f_mapping, 0, 777 - omap_gem_mmap_size(obj), 1); 795 + dirty = true; 796 + omap_obj->dma_addrs[i] = addr; 778 797 } 798 + } 799 + 800 + if (dirty) { 801 + unmap_mapping_range(obj->filp->f_mapping, 0, 802 + omap_gem_mmap_size(obj), 1); 779 803 } 780 804 } 781 805 782 - /* Get physical address for DMA.. if 'remap' is true, and the buffer is not 783 - * already contiguous, remap it to pin in physically contiguous memory.. (ie. 784 - * map in TILER) 806 + /** 807 + * omap_gem_pin() - Pin a GEM object in memory 808 + * @obj: the GEM object 809 + * @dma_addr: the DMA address 810 + * 811 + * Pin the given GEM object in memory and fill the dma_addr pointer with the 812 + * object's DMA address. If the buffer is not physically contiguous it will be 813 + * remapped through the TILER to provide a contiguous view. 814 + * 815 + * Pins are reference-counted, calling this function multiple times is allowed 816 + * as long the corresponding omap_gem_unpin() calls are balanced. 817 + * 818 + * Return 0 on success or a negative error code otherwise. 785 819 */ 786 - int omap_gem_get_paddr(struct drm_gem_object *obj, 787 - dma_addr_t *paddr, bool remap) 820 + int omap_gem_pin(struct drm_gem_object *obj, dma_addr_t *dma_addr) 788 821 { 789 822 struct omap_drm_private *priv = obj->dev->dev_private; 790 823 struct omap_gem_object *omap_obj = to_omap_bo(obj); ··· 807 810 808 811 mutex_lock(&obj->dev->struct_mutex); 809 812 810 - if (!is_contiguous(omap_obj) && remap && priv->has_dmm) { 811 - if (omap_obj->paddr_cnt == 0) { 813 + if (!is_contiguous(omap_obj) && priv->has_dmm) { 814 + if (omap_obj->dma_addr_cnt == 0) { 812 815 struct page **pages; 813 816 uint32_t npages = obj->size >> PAGE_SHIFT; 814 817 enum tiler_fmt fmt = gem2fmt(omap_obj->flags); ··· 845 848 goto fail; 846 849 } 847 850 848 - omap_obj->paddr = tiler_ssptr(block); 851 + omap_obj->dma_addr = tiler_ssptr(block); 849 852 omap_obj->block = block; 850 853 851 - DBG("got paddr: %pad", &omap_obj->paddr); 854 + DBG("got dma address: %pad", &omap_obj->dma_addr); 852 855 } 853 856 854 - omap_obj->paddr_cnt++; 857 + omap_obj->dma_addr_cnt++; 855 858 856 - *paddr = omap_obj->paddr; 859 + *dma_addr = omap_obj->dma_addr; 857 860 } else if (is_contiguous(omap_obj)) { 858 - *paddr = omap_obj->paddr; 861 + *dma_addr = omap_obj->dma_addr; 859 862 } else { 860 863 ret = -EINVAL; 861 864 goto fail; ··· 867 870 return ret; 868 871 } 869 872 870 - /* Release physical address, when DMA is no longer being performed.. this 871 - * could potentially unpin and unmap buffers from TILER 873 + /** 874 + * omap_gem_unpin() - Unpin a GEM object from memory 875 + * @obj: the GEM object 876 + * 877 + * Unpin the given GEM object previously pinned with omap_gem_pin(). Pins are 878 + * reference-counted, the actualy unpin will only be performed when the number 879 + * of calls to this function matches the number of calls to omap_gem_pin(). 872 880 */ 873 - void omap_gem_put_paddr(struct drm_gem_object *obj) 881 + void omap_gem_unpin(struct drm_gem_object *obj) 874 882 { 875 883 struct omap_gem_object *omap_obj = to_omap_bo(obj); 876 884 int ret; 877 885 878 886 mutex_lock(&obj->dev->struct_mutex); 879 - if (omap_obj->paddr_cnt > 0) { 880 - omap_obj->paddr_cnt--; 881 - if (omap_obj->paddr_cnt == 0) { 887 + if (omap_obj->dma_addr_cnt > 0) { 888 + omap_obj->dma_addr_cnt--; 889 + if (omap_obj->dma_addr_cnt == 0) { 882 890 ret = tiler_unpin(omap_obj->block); 883 891 if (ret) { 884 892 dev_err(obj->dev->dev, ··· 894 892 dev_err(obj->dev->dev, 895 893 "could not release unmap: %d\n", ret); 896 894 } 897 - omap_obj->paddr = 0; 895 + omap_obj->dma_addr = 0; 898 896 omap_obj->block = NULL; 899 897 } 900 898 } ··· 906 904 * specified orientation and x,y offset from top-left corner of buffer 907 905 * (only valid for tiled 2d buffers) 908 906 */ 909 - int omap_gem_rotated_paddr(struct drm_gem_object *obj, uint32_t orient, 910 - int x, int y, dma_addr_t *paddr) 907 + int omap_gem_rotated_dma_addr(struct drm_gem_object *obj, uint32_t orient, 908 + int x, int y, dma_addr_t *dma_addr) 911 909 { 912 910 struct omap_gem_object *omap_obj = to_omap_bo(obj); 913 911 int ret = -EINVAL; 914 912 915 913 mutex_lock(&obj->dev->struct_mutex); 916 - if ((omap_obj->paddr_cnt > 0) && omap_obj->block && 914 + if ((omap_obj->dma_addr_cnt > 0) && omap_obj->block && 917 915 (omap_obj->flags & OMAP_BO_TILED)) { 918 - *paddr = tiler_tsptr(omap_obj->block, orient, x, y); 916 + *dma_addr = tiler_tsptr(omap_obj->block, orient, x, y); 919 917 ret = 0; 920 918 } 921 919 mutex_unlock(&obj->dev->struct_mutex); ··· 936 934 * increasing the pin count (which we don't really do yet anyways, 937 935 * because we don't support swapping pages back out). And 'remap' 938 936 * might not be quite the right name, but I wanted to keep it working 939 - * similarly to omap_gem_get_paddr(). Note though that mutex is not 937 + * similarly to omap_gem_pin(). Note though that mutex is not 940 938 * aquired if !remap (because this can be called in atomic ctxt), 941 - * but probably omap_gem_get_paddr() should be changed to work in the 939 + * but probably omap_gem_unpin() should be changed to work in the 942 940 * same way. If !remap, a matching omap_gem_put_pages() call is not 943 941 * required (and should not be made). 944 942 */ ··· 1036 1034 1037 1035 seq_printf(m, "%08x: %2d (%2d) %08llx %pad (%2d) %p %4d", 1038 1036 omap_obj->flags, obj->name, kref_read(&obj->refcount), 1039 - off, &omap_obj->paddr, omap_obj->paddr_cnt, 1037 + off, &omap_obj->dma_addr, omap_obj->dma_addr_cnt, 1040 1038 omap_obj->vaddr, omap_obj->roll); 1041 1039 1042 1040 if (omap_obj->flags & OMAP_BO_TILED) { ··· 1048 1046 area->p1.x, area->p1.y); 1049 1047 } 1050 1048 } else { 1051 - seq_printf(m, " %d", obj->size); 1049 + seq_printf(m, " %zu", obj->size); 1052 1050 } 1053 1051 1054 1052 seq_printf(m, "\n"); ··· 1073 1071 #endif 1074 1072 1075 1073 /* ----------------------------------------------------------------------------- 1076 - * Buffer Synchronization 1077 - */ 1078 - 1079 - static DEFINE_SPINLOCK(sync_lock); 1080 - 1081 - struct omap_gem_sync_waiter { 1082 - struct list_head list; 1083 - struct omap_gem_object *omap_obj; 1084 - enum omap_gem_op op; 1085 - uint32_t read_target, write_target; 1086 - /* notify called w/ sync_lock held */ 1087 - void (*notify)(void *arg); 1088 - void *arg; 1089 - }; 1090 - 1091 - /* list of omap_gem_sync_waiter.. the notify fxn gets called back when 1092 - * the read and/or write target count is achieved which can call a user 1093 - * callback (ex. to kick 3d and/or 2d), wakeup blocked task (prep for 1094 - * cpu access), etc. 1095 - */ 1096 - static LIST_HEAD(waiters); 1097 - 1098 - static inline bool is_waiting(struct omap_gem_sync_waiter *waiter) 1099 - { 1100 - struct omap_gem_object *omap_obj = waiter->omap_obj; 1101 - if ((waiter->op & OMAP_GEM_READ) && 1102 - (omap_obj->sync->write_complete < waiter->write_target)) 1103 - return true; 1104 - if ((waiter->op & OMAP_GEM_WRITE) && 1105 - (omap_obj->sync->read_complete < waiter->read_target)) 1106 - return true; 1107 - return false; 1108 - } 1109 - 1110 - /* macro for sync debug.. */ 1111 - #define SYNCDBG 0 1112 - #define SYNC(fmt, ...) do { if (SYNCDBG) \ 1113 - pr_err("%s:%d: " fmt "\n", __func__, __LINE__, ##__VA_ARGS__); \ 1114 - } while (0) 1115 - 1116 - 1117 - static void sync_op_update(void) 1118 - { 1119 - struct omap_gem_sync_waiter *waiter, *n; 1120 - list_for_each_entry_safe(waiter, n, &waiters, list) { 1121 - if (!is_waiting(waiter)) { 1122 - list_del(&waiter->list); 1123 - SYNC("notify: %p", waiter); 1124 - waiter->notify(waiter->arg); 1125 - kfree(waiter); 1126 - } 1127 - } 1128 - } 1129 - 1130 - static inline int sync_op(struct drm_gem_object *obj, 1131 - enum omap_gem_op op, bool start) 1132 - { 1133 - struct omap_gem_object *omap_obj = to_omap_bo(obj); 1134 - int ret = 0; 1135 - 1136 - spin_lock(&sync_lock); 1137 - 1138 - if (!omap_obj->sync) { 1139 - omap_obj->sync = kzalloc(sizeof(*omap_obj->sync), GFP_ATOMIC); 1140 - if (!omap_obj->sync) { 1141 - ret = -ENOMEM; 1142 - goto unlock; 1143 - } 1144 - } 1145 - 1146 - if (start) { 1147 - if (op & OMAP_GEM_READ) 1148 - omap_obj->sync->read_pending++; 1149 - if (op & OMAP_GEM_WRITE) 1150 - omap_obj->sync->write_pending++; 1151 - } else { 1152 - if (op & OMAP_GEM_READ) 1153 - omap_obj->sync->read_complete++; 1154 - if (op & OMAP_GEM_WRITE) 1155 - omap_obj->sync->write_complete++; 1156 - sync_op_update(); 1157 - } 1158 - 1159 - unlock: 1160 - spin_unlock(&sync_lock); 1161 - 1162 - return ret; 1163 - } 1164 - 1165 - /* mark the start of read and/or write operation */ 1166 - int omap_gem_op_start(struct drm_gem_object *obj, enum omap_gem_op op) 1167 - { 1168 - return sync_op(obj, op, true); 1169 - } 1170 - 1171 - int omap_gem_op_finish(struct drm_gem_object *obj, enum omap_gem_op op) 1172 - { 1173 - return sync_op(obj, op, false); 1174 - } 1175 - 1176 - static DECLARE_WAIT_QUEUE_HEAD(sync_event); 1177 - 1178 - static void sync_notify(void *arg) 1179 - { 1180 - struct task_struct **waiter_task = arg; 1181 - *waiter_task = NULL; 1182 - wake_up_all(&sync_event); 1183 - } 1184 - 1185 - int omap_gem_op_sync(struct drm_gem_object *obj, enum omap_gem_op op) 1186 - { 1187 - struct omap_gem_object *omap_obj = to_omap_bo(obj); 1188 - int ret = 0; 1189 - if (omap_obj->sync) { 1190 - struct task_struct *waiter_task = current; 1191 - struct omap_gem_sync_waiter *waiter = 1192 - kzalloc(sizeof(*waiter), GFP_KERNEL); 1193 - 1194 - if (!waiter) 1195 - return -ENOMEM; 1196 - 1197 - waiter->omap_obj = omap_obj; 1198 - waiter->op = op; 1199 - waiter->read_target = omap_obj->sync->read_pending; 1200 - waiter->write_target = omap_obj->sync->write_pending; 1201 - waiter->notify = sync_notify; 1202 - waiter->arg = &waiter_task; 1203 - 1204 - spin_lock(&sync_lock); 1205 - if (is_waiting(waiter)) { 1206 - SYNC("waited: %p", waiter); 1207 - list_add_tail(&waiter->list, &waiters); 1208 - spin_unlock(&sync_lock); 1209 - ret = wait_event_interruptible(sync_event, 1210 - (waiter_task == NULL)); 1211 - spin_lock(&sync_lock); 1212 - if (waiter_task) { 1213 - SYNC("interrupted: %p", waiter); 1214 - /* we were interrupted */ 1215 - list_del(&waiter->list); 1216 - waiter_task = NULL; 1217 - } else { 1218 - /* freed in sync_op_update() */ 1219 - waiter = NULL; 1220 - } 1221 - } 1222 - spin_unlock(&sync_lock); 1223 - kfree(waiter); 1224 - } 1225 - return ret; 1226 - } 1227 - 1228 - /* call fxn(arg), either synchronously or asynchronously if the op 1229 - * is currently blocked.. fxn() can be called from any context 1230 - * 1231 - * (TODO for now fxn is called back from whichever context calls 1232 - * omap_gem_op_finish().. but this could be better defined later 1233 - * if needed) 1234 - * 1235 - * TODO more code in common w/ _sync().. 1236 - */ 1237 - int omap_gem_op_async(struct drm_gem_object *obj, enum omap_gem_op op, 1238 - void (*fxn)(void *arg), void *arg) 1239 - { 1240 - struct omap_gem_object *omap_obj = to_omap_bo(obj); 1241 - if (omap_obj->sync) { 1242 - struct omap_gem_sync_waiter *waiter = 1243 - kzalloc(sizeof(*waiter), GFP_ATOMIC); 1244 - 1245 - if (!waiter) 1246 - return -ENOMEM; 1247 - 1248 - waiter->omap_obj = omap_obj; 1249 - waiter->op = op; 1250 - waiter->read_target = omap_obj->sync->read_pending; 1251 - waiter->write_target = omap_obj->sync->write_pending; 1252 - waiter->notify = fxn; 1253 - waiter->arg = arg; 1254 - 1255 - spin_lock(&sync_lock); 1256 - if (is_waiting(waiter)) { 1257 - SYNC("waited: %p", waiter); 1258 - list_add_tail(&waiter->list, &waiters); 1259 - spin_unlock(&sync_lock); 1260 - return 0; 1261 - } 1262 - 1263 - spin_unlock(&sync_lock); 1264 - 1265 - kfree(waiter); 1266 - } 1267 - 1268 - /* no waiting.. */ 1269 - fxn(arg); 1270 - 1271 - return 0; 1272 - } 1273 - 1274 - /* ----------------------------------------------------------------------------- 1275 1074 * Constructor & Destructor 1276 1075 */ 1277 1076 ··· 1093 1290 /* this means the object is still pinned.. which really should 1094 1291 * not happen. I think.. 1095 1292 */ 1096 - WARN_ON(omap_obj->paddr_cnt > 0); 1293 + WARN_ON(omap_obj->dma_addr_cnt > 0); 1097 1294 1098 1295 if (omap_obj->pages) { 1099 1296 if (omap_obj->flags & OMAP_BO_MEM_DMABUF) ··· 1104 1301 1105 1302 if (omap_obj->flags & OMAP_BO_MEM_DMA_API) { 1106 1303 dma_free_wc(dev->dev, obj->size, omap_obj->vaddr, 1107 - omap_obj->paddr); 1304 + omap_obj->dma_addr); 1108 1305 } else if (omap_obj->vaddr) { 1109 1306 vunmap(omap_obj->vaddr); 1110 1307 } else if (obj->import_attach) { 1111 1308 drm_prime_gem_destroy(obj, omap_obj->sgt); 1112 1309 } 1113 - 1114 - kfree(omap_obj->sync); 1115 1310 1116 1311 drm_gem_object_release(obj); 1117 1312 ··· 1201 1400 /* Allocate memory if needed. */ 1202 1401 if (flags & OMAP_BO_MEM_DMA_API) { 1203 1402 omap_obj->vaddr = dma_alloc_wc(dev->dev, size, 1204 - &omap_obj->paddr, 1403 + &omap_obj->dma_addr, 1205 1404 GFP_KERNEL); 1206 1405 if (!omap_obj->vaddr) 1207 1406 goto err_release; ··· 1245 1444 omap_obj->sgt = sgt; 1246 1445 1247 1446 if (sgt->orig_nents == 1) { 1248 - omap_obj->paddr = sg_dma_address(sgt->sgl); 1447 + omap_obj->dma_addr = sg_dma_address(sgt->sgl); 1249 1448 } else { 1250 1449 /* Create pages list from sgt */ 1251 1450 struct sg_page_iter iter; ··· 1352 1551 i, j, PTR_ERR(block)); 1353 1552 return; 1354 1553 } 1355 - entry->paddr = tiler_ssptr(block); 1554 + entry->dma_addr = tiler_ssptr(block); 1356 1555 entry->block = block; 1357 1556 1358 - DBG("%d:%d: %dx%d: paddr=%pad stride=%d", i, j, w, h, 1359 - &entry->paddr, 1557 + DBG("%d:%d: %dx%d: dma_addr=%pad stride=%d", i, j, w, h, 1558 + &entry->dma_addr, 1360 1559 usergart[i].stride_pfn << PAGE_SHIFT); 1361 1560 } 1362 1561 }
+13 -23
drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c
··· 31 31 { 32 32 struct drm_gem_object *obj = attachment->dmabuf->priv; 33 33 struct sg_table *sg; 34 - dma_addr_t paddr; 34 + dma_addr_t dma_addr; 35 35 int ret; 36 36 37 37 sg = kzalloc(sizeof(*sg), GFP_KERNEL); ··· 41 41 /* camera, etc, need physically contiguous.. but we need a 42 42 * better way to know this.. 43 43 */ 44 - ret = omap_gem_get_paddr(obj, &paddr, true); 44 + ret = omap_gem_pin(obj, &dma_addr); 45 45 if (ret) 46 46 goto out; 47 47 ··· 51 51 52 52 sg_init_table(sg->sgl, 1); 53 53 sg_dma_len(sg->sgl) = obj->size; 54 - sg_set_page(sg->sgl, pfn_to_page(PFN_DOWN(paddr)), obj->size, 0); 55 - sg_dma_address(sg->sgl) = paddr; 54 + sg_set_page(sg->sgl, pfn_to_page(PFN_DOWN(dma_addr)), obj->size, 0); 55 + sg_dma_address(sg->sgl) = dma_addr; 56 56 57 - /* this should be after _get_paddr() to ensure we have pages attached */ 58 - omap_gem_dma_sync(obj, dir); 57 + /* this must be after omap_gem_pin() to ensure we have pages attached */ 58 + omap_gem_dma_sync_buffer(obj, dir); 59 59 60 60 return sg; 61 61 out: ··· 67 67 struct sg_table *sg, enum dma_data_direction dir) 68 68 { 69 69 struct drm_gem_object *obj = attachment->dmabuf->priv; 70 - omap_gem_put_paddr(obj); 70 + omap_gem_unpin(obj); 71 71 sg_free_table(sg); 72 72 kfree(sg); 73 73 } 74 - 75 - static void omap_gem_dmabuf_release(struct dma_buf *buffer) 76 - { 77 - struct drm_gem_object *obj = buffer->priv; 78 - /* release reference that was taken when dmabuf was exported 79 - * in omap_gem_prime_set().. 80 - */ 81 - drm_gem_object_unreference_unlocked(obj); 82 - } 83 - 84 74 85 75 static int omap_gem_dmabuf_begin_cpu_access(struct dma_buf *buffer, 86 76 enum dma_data_direction dir) ··· 102 112 struct drm_gem_object *obj = buffer->priv; 103 113 struct page **pages; 104 114 omap_gem_get_pages(obj, &pages, false); 105 - omap_gem_cpu_sync(obj, page_num); 115 + omap_gem_cpu_sync_page(obj, page_num); 106 116 return kmap_atomic(pages[page_num]); 107 117 } 108 118 ··· 118 128 struct drm_gem_object *obj = buffer->priv; 119 129 struct page **pages; 120 130 omap_gem_get_pages(obj, &pages, false); 121 - omap_gem_cpu_sync(obj, page_num); 131 + omap_gem_cpu_sync_page(obj, page_num); 122 132 return kmap(pages[page_num]); 123 133 } 124 134 ··· 147 157 static struct dma_buf_ops omap_dmabuf_ops = { 148 158 .map_dma_buf = omap_gem_map_dma_buf, 149 159 .unmap_dma_buf = omap_gem_unmap_dma_buf, 150 - .release = omap_gem_dmabuf_release, 160 + .release = drm_gem_dmabuf_release, 151 161 .begin_cpu_access = omap_gem_dmabuf_begin_cpu_access, 152 162 .end_cpu_access = omap_gem_dmabuf_end_cpu_access, 153 163 .map_atomic = omap_gem_dmabuf_kmap_atomic, ··· 167 177 exp_info.flags = flags; 168 178 exp_info.priv = obj; 169 179 170 - return dma_buf_export(&exp_info); 180 + return drm_gem_dmabuf_export(dev, &exp_info); 171 181 } 172 182 173 183 /* ----------------------------------------------------------------------------- ··· 200 210 201 211 get_dma_buf(dma_buf); 202 212 203 - sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL); 213 + sgt = dma_buf_map_attachment(attach, DMA_TO_DEVICE); 204 214 if (IS_ERR(sgt)) { 205 215 ret = PTR_ERR(sgt); 206 216 goto fail_detach; ··· 217 227 return obj; 218 228 219 229 fail_unmap: 220 - dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL); 230 + dma_buf_unmap_attachment(attach, sgt, DMA_TO_DEVICE); 221 231 fail_detach: 222 232 dma_buf_detach(dma_buf, attach); 223 233 dma_buf_put(dma_buf);
+4 -4
drivers/gpu/drm/omapdrm/omap_irq.c
··· 41 41 DBG("irqmask=%08x", irqmask); 42 42 43 43 priv->dispc_ops->write_irqenable(irqmask); 44 - priv->dispc_ops->read_irqenable(); /* flush posted write */ 45 44 } 46 45 47 46 static void omap_irq_wait_handler(struct omap_irq_wait *wait) ··· 182 183 pr_cont("(0x%08x)\n", irqstatus); 183 184 } 184 185 185 - static void omap_irq_ocp_error_handler(u32 irqstatus) 186 + static void omap_irq_ocp_error_handler(struct drm_device *dev, 187 + u32 irqstatus) 186 188 { 187 189 if (!(irqstatus & DISPC_IRQ_OCP_ERR)) 188 190 return; 189 191 190 - DRM_ERROR("OCP error\n"); 192 + dev_err_ratelimited(dev->dev, "OCP error\n"); 191 193 } 192 194 193 195 static irqreturn_t omap_irq_handler(int irq, void *arg) ··· 219 219 omap_crtc_error_irq(crtc, irqstatus); 220 220 } 221 221 222 - omap_irq_ocp_error_handler(irqstatus); 222 + omap_irq_ocp_error_handler(dev, irqstatus); 223 223 omap_irq_fifo_underflow(priv, irqstatus); 224 224 225 225 spin_lock_irqsave(&priv->wait_lock, flags);
+24 -102
drivers/gpu/drm/omapdrm/omap_plane.c
··· 34 34 struct drm_plane base; 35 35 enum omap_plane_id id; 36 36 const char *name; 37 - 38 - uint32_t nformats; 39 - uint32_t formats[32]; 40 37 }; 41 - 42 - struct omap_plane_state { 43 - struct drm_plane_state base; 44 - 45 - unsigned int zorder; 46 - }; 47 - 48 - static inline struct omap_plane_state * 49 - to_omap_plane_state(struct drm_plane_state *state) 50 - { 51 - return container_of(state, struct omap_plane_state, base); 52 - } 53 38 54 39 static int omap_plane_prepare_fb(struct drm_plane *plane, 55 40 struct drm_plane_state *new_state) ··· 58 73 struct omap_drm_private *priv = plane->dev->dev_private; 59 74 struct omap_plane *omap_plane = to_omap_plane(plane); 60 75 struct drm_plane_state *state = plane->state; 61 - struct omap_plane_state *omap_state = to_omap_plane_state(state); 62 76 struct omap_overlay_info info; 63 - struct omap_drm_window win; 64 77 int ret; 65 78 66 79 DBG("%s, crtc=%p fb=%p", omap_plane->name, state->crtc, state->fb); 67 80 68 81 memset(&info, 0, sizeof(info)); 69 - info.rotation_type = OMAP_DSS_ROT_DMA; 70 - info.rotation = OMAP_DSS_ROT_0; 82 + info.rotation_type = OMAP_DSS_ROT_NONE; 83 + info.rotation = DRM_MODE_ROTATE_0; 71 84 info.global_alpha = 0xff; 72 - info.mirror = 0; 73 - info.zorder = omap_state->zorder; 74 - 75 - memset(&win, 0, sizeof(win)); 76 - win.rotation = state->rotation; 77 - win.crtc_x = state->crtc_x; 78 - win.crtc_y = state->crtc_y; 79 - win.crtc_w = state->crtc_w; 80 - win.crtc_h = state->crtc_h; 81 - 82 - /* 83 - * src values are in Q16 fixed point, convert to integer. 84 - * omap_framebuffer_update_scanout() takes adjusted src. 85 - */ 86 - win.src_x = state->src_x >> 16; 87 - win.src_y = state->src_y >> 16; 88 - 89 - if (drm_rotation_90_or_270(state->rotation)) { 90 - win.src_w = state->src_h >> 16; 91 - win.src_h = state->src_w >> 16; 92 - } else { 93 - win.src_w = state->src_w >> 16; 94 - win.src_h = state->src_h >> 16; 95 - } 85 + info.zorder = state->zpos; 96 86 97 87 /* update scanout: */ 98 - omap_framebuffer_update_scanout(state->fb, &win, &info); 88 + omap_framebuffer_update_scanout(state->fb, state, &info); 99 89 100 90 DBG("%dx%d -> %dx%d (%d)", info.width, info.height, 101 91 info.out_width, info.out_height, ··· 78 118 DBG("%d,%d %pad %pad", info.pos_x, info.pos_y, 79 119 &info.paddr, &info.p_uv_addr); 80 120 81 - priv->dispc_ops->ovl_set_channel_out(omap_plane->id, 82 - omap_crtc_channel(state->crtc)); 83 - 84 121 /* and finally, update omapdss: */ 85 122 ret = priv->dispc_ops->ovl_setup(omap_plane->id, &info, 86 - omap_crtc_timings(state->crtc), false); 123 + omap_crtc_timings(state->crtc), false, 124 + omap_crtc_channel(state->crtc)); 87 125 if (ret) { 88 126 dev_err(plane->dev->dev, "Failed to setup plane %s\n", 89 127 omap_plane->name); ··· 96 138 struct drm_plane_state *old_state) 97 139 { 98 140 struct omap_drm_private *priv = plane->dev->dev_private; 99 - struct omap_plane_state *omap_state = to_omap_plane_state(plane->state); 100 141 struct omap_plane *omap_plane = to_omap_plane(plane); 101 142 102 143 plane->state->rotation = DRM_MODE_ROTATE_0; 103 - omap_state->zorder = plane->type == DRM_PLANE_TYPE_PRIMARY 144 + plane->state->zpos = plane->type == DRM_PLANE_TYPE_PRIMARY 104 145 ? 0 : omap_plane->id; 105 146 106 147 priv->dispc_ops->ovl_enable(omap_plane->id, false); ··· 184 227 drm_object_attach_property(obj, priv->zorder_prop, 0); 185 228 } 186 229 187 - static struct drm_plane_state * 188 - omap_plane_atomic_duplicate_state(struct drm_plane *plane) 189 - { 190 - struct omap_plane_state *state; 191 - struct omap_plane_state *copy; 192 - 193 - if (WARN_ON(!plane->state)) 194 - return NULL; 195 - 196 - state = to_omap_plane_state(plane->state); 197 - copy = kmemdup(state, sizeof(*state), GFP_KERNEL); 198 - if (copy == NULL) 199 - return NULL; 200 - 201 - __drm_atomic_helper_plane_duplicate_state(plane, &copy->base); 202 - 203 - return &copy->base; 204 - } 205 - 206 - static void omap_plane_atomic_destroy_state(struct drm_plane *plane, 207 - struct drm_plane_state *state) 208 - { 209 - __drm_atomic_helper_plane_destroy_state(state); 210 - kfree(to_omap_plane_state(state)); 211 - } 212 - 213 230 static void omap_plane_reset(struct drm_plane *plane) 214 231 { 215 232 struct omap_plane *omap_plane = to_omap_plane(plane); 216 - struct omap_plane_state *omap_state; 217 233 218 - if (plane->state) { 219 - omap_plane_atomic_destroy_state(plane, plane->state); 220 - plane->state = NULL; 221 - } 222 - 223 - omap_state = kzalloc(sizeof(*omap_state), GFP_KERNEL); 224 - if (omap_state == NULL) 234 + drm_atomic_helper_plane_reset(plane); 235 + if (!plane->state) 225 236 return; 226 237 227 238 /* 228 - * Set defaults depending on whether we are a primary or overlay 239 + * Set the zpos default depending on whether we are a primary or overlay 229 240 * plane. 230 241 */ 231 - omap_state->zorder = plane->type == DRM_PLANE_TYPE_PRIMARY 242 + plane->state->zpos = plane->type == DRM_PLANE_TYPE_PRIMARY 232 243 ? 0 : omap_plane->id; 233 - omap_state->base.rotation = DRM_MODE_ROTATE_0; 234 - 235 - plane->state = &omap_state->base; 236 - plane->state->plane = plane; 237 244 } 238 245 239 246 static int omap_plane_atomic_set_property(struct drm_plane *plane, ··· 206 285 uint64_t val) 207 286 { 208 287 struct omap_drm_private *priv = plane->dev->dev_private; 209 - struct omap_plane_state *omap_state = to_omap_plane_state(state); 210 288 211 289 if (property == priv->zorder_prop) 212 - omap_state->zorder = val; 290 + state->zpos = val; 213 291 else 214 292 return -EINVAL; 215 293 ··· 221 301 uint64_t *val) 222 302 { 223 303 struct omap_drm_private *priv = plane->dev->dev_private; 224 - const struct omap_plane_state *omap_state = 225 - container_of(state, const struct omap_plane_state, base); 226 304 227 305 if (property == priv->zorder_prop) 228 - *val = omap_state->zorder; 306 + *val = state->zpos; 229 307 else 230 308 return -EINVAL; 231 309 ··· 236 318 .reset = omap_plane_reset, 237 319 .destroy = omap_plane_destroy, 238 320 .set_property = drm_atomic_helper_plane_set_property, 239 - .atomic_duplicate_state = omap_plane_atomic_duplicate_state, 240 - .atomic_destroy_state = omap_plane_atomic_destroy_state, 321 + .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state, 322 + .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, 241 323 .atomic_set_property = omap_plane_atomic_set_property, 242 324 .atomic_get_property = omap_plane_atomic_get_property, 243 325 }; ··· 262 344 u32 possible_crtcs) 263 345 { 264 346 struct omap_drm_private *priv = dev->dev_private; 347 + unsigned int num_planes = priv->dispc_ops->get_num_ovls(); 265 348 struct drm_plane *plane; 266 349 struct omap_plane *omap_plane; 267 350 enum omap_plane_id id; 268 351 int ret; 352 + u32 nformats; 353 + const u32 *formats; 269 354 270 355 if (WARN_ON(idx >= ARRAY_SIZE(plane_idx_to_id))) 271 356 return ERR_PTR(-EINVAL); ··· 281 360 if (!omap_plane) 282 361 return ERR_PTR(-ENOMEM); 283 362 284 - omap_plane->nformats = omap_framebuffer_get_formats( 285 - omap_plane->formats, ARRAY_SIZE(omap_plane->formats), 286 - priv->dispc_ops->ovl_get_color_modes(id)); 363 + formats = priv->dispc_ops->ovl_get_color_modes(id); 364 + for (nformats = 0; formats[nformats]; ++nformats) 365 + ; 287 366 omap_plane->id = id; 288 367 omap_plane->name = plane_id_to_name[id]; 289 368 290 369 plane = &omap_plane->base; 291 370 292 371 ret = drm_universal_plane_init(dev, plane, possible_crtcs, 293 - &omap_plane_funcs, omap_plane->formats, 294 - omap_plane->nformats, type, NULL); 372 + &omap_plane_funcs, formats, 373 + nformats, type, NULL); 295 374 if (ret < 0) 296 375 goto error; 297 376 298 377 drm_plane_helper_add(plane, &omap_plane_helper_funcs); 299 378 300 379 omap_plane_install_properties(plane, &plane->base); 380 + drm_plane_create_zpos_property(plane, 0, 0, num_planes - 1); 301 381 302 382 return plane; 303 383
-2
drivers/video/fbdev/omap2/omapfb/dss/core.c
··· 206 206 207 207 if (def_disp_name) 208 208 core.default_display_name = def_disp_name; 209 - else if (pdata->default_display_name) 210 - core.default_display_name = pdata->default_display_name; 211 209 212 210 register_pm_notifier(&omap_dss_pm_notif_block); 213 211
-1
include/linux/platform_data/omapdss.h
··· 27 27 28 28 /* Board specific data */ 29 29 struct omap_dss_board_info { 30 - const char *default_display_name; 31 30 int (*dsi_enable_pads)(int dsi_id, unsigned int lane_mask); 32 31 void (*dsi_disable_pads)(int dsi_id, unsigned int lane_mask); 33 32 int (*set_min_bus_tput)(struct device *dev, unsigned long r);
+2 -2
include/uapi/drm/omap_drm.h
··· 106 106 #define DRM_OMAP_GET_PARAM 0x00 107 107 #define DRM_OMAP_SET_PARAM 0x01 108 108 #define DRM_OMAP_GEM_NEW 0x03 109 - #define DRM_OMAP_GEM_CPU_PREP 0x04 110 - #define DRM_OMAP_GEM_CPU_FINI 0x05 109 + #define DRM_OMAP_GEM_CPU_PREP 0x04 /* Deprecated, to be removed */ 110 + #define DRM_OMAP_GEM_CPU_FINI 0x05 /* Deprecated, to be removed */ 111 111 #define DRM_OMAP_GEM_INFO 0x06 112 112 #define DRM_OMAP_NUM_IOCTLS 0x07 113 113