diff options
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_dsi.c')
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_dsi.c | 129 |
1 files changed, 66 insertions, 63 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c index acf7e9e39dcd..05fe93dc57a8 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c | |||
@@ -268,9 +268,9 @@ struct exynos_dsi_driver_data { | |||
268 | }; | 268 | }; |
269 | 269 | ||
270 | struct exynos_dsi { | 270 | struct exynos_dsi { |
271 | struct exynos_drm_display display; | ||
271 | struct mipi_dsi_host dsi_host; | 272 | struct mipi_dsi_host dsi_host; |
272 | struct drm_connector connector; | 273 | struct drm_connector connector; |
273 | struct drm_encoder *encoder; | ||
274 | struct device_node *panel_node; | 274 | struct device_node *panel_node; |
275 | struct drm_panel *panel; | 275 | struct drm_panel *panel; |
276 | struct device *dev; | 276 | struct device *dev; |
@@ -304,6 +304,11 @@ struct exynos_dsi { | |||
304 | #define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host) | 304 | #define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host) |
305 | #define connector_to_dsi(c) container_of(c, struct exynos_dsi, connector) | 305 | #define connector_to_dsi(c) container_of(c, struct exynos_dsi, connector) |
306 | 306 | ||
307 | static inline struct exynos_dsi *display_to_dsi(struct exynos_drm_display *d) | ||
308 | { | ||
309 | return container_of(d, struct exynos_dsi, display); | ||
310 | } | ||
311 | |||
307 | static struct exynos_dsi_driver_data exynos3_dsi_driver_data = { | 312 | static struct exynos_dsi_driver_data exynos3_dsi_driver_data = { |
308 | .plltmr_reg = 0x50, | 313 | .plltmr_reg = 0x50, |
309 | .has_freqband = 1, | 314 | .has_freqband = 1, |
@@ -316,6 +321,11 @@ static struct exynos_dsi_driver_data exynos4_dsi_driver_data = { | |||
316 | .has_clklane_stop = 1, | 321 | .has_clklane_stop = 1, |
317 | }; | 322 | }; |
318 | 323 | ||
324 | static struct exynos_dsi_driver_data exynos4415_dsi_driver_data = { | ||
325 | .plltmr_reg = 0x58, | ||
326 | .has_clklane_stop = 1, | ||
327 | }; | ||
328 | |||
319 | static struct exynos_dsi_driver_data exynos5_dsi_driver_data = { | 329 | static struct exynos_dsi_driver_data exynos5_dsi_driver_data = { |
320 | .plltmr_reg = 0x58, | 330 | .plltmr_reg = 0x58, |
321 | }; | 331 | }; |
@@ -325,6 +335,8 @@ static struct of_device_id exynos_dsi_of_match[] = { | |||
325 | .data = &exynos3_dsi_driver_data }, | 335 | .data = &exynos3_dsi_driver_data }, |
326 | { .compatible = "samsung,exynos4210-mipi-dsi", | 336 | { .compatible = "samsung,exynos4210-mipi-dsi", |
327 | .data = &exynos4_dsi_driver_data }, | 337 | .data = &exynos4_dsi_driver_data }, |
338 | { .compatible = "samsung,exynos4415-mipi-dsi", | ||
339 | .data = &exynos4415_dsi_driver_data }, | ||
328 | { .compatible = "samsung,exynos5410-mipi-dsi", | 340 | { .compatible = "samsung,exynos5410-mipi-dsi", |
329 | .data = &exynos5_dsi_driver_data }, | 341 | .data = &exynos5_dsi_driver_data }, |
330 | { } | 342 | { } |
@@ -1104,7 +1116,7 @@ static irqreturn_t exynos_dsi_irq(int irq, void *dev_id) | |||
1104 | static irqreturn_t exynos_dsi_te_irq_handler(int irq, void *dev_id) | 1116 | static irqreturn_t exynos_dsi_te_irq_handler(int irq, void *dev_id) |
1105 | { | 1117 | { |
1106 | struct exynos_dsi *dsi = (struct exynos_dsi *)dev_id; | 1118 | struct exynos_dsi *dsi = (struct exynos_dsi *)dev_id; |
1107 | struct drm_encoder *encoder = dsi->encoder; | 1119 | struct drm_encoder *encoder = dsi->display.encoder; |
1108 | 1120 | ||
1109 | if (dsi->state & DSIM_STATE_ENABLED) | 1121 | if (dsi->state & DSIM_STATE_ENABLED) |
1110 | exynos_drm_crtc_te_handler(encoder->crtc); | 1122 | exynos_drm_crtc_te_handler(encoder->crtc); |
@@ -1143,6 +1155,7 @@ static int exynos_dsi_init(struct exynos_dsi *dsi) | |||
1143 | static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi) | 1155 | static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi) |
1144 | { | 1156 | { |
1145 | int ret; | 1157 | int ret; |
1158 | int te_gpio_irq; | ||
1146 | 1159 | ||
1147 | dsi->te_gpio = of_get_named_gpio(dsi->panel_node, "te-gpios", 0); | 1160 | dsi->te_gpio = of_get_named_gpio(dsi->panel_node, "te-gpios", 0); |
1148 | if (!gpio_is_valid(dsi->te_gpio)) { | 1161 | if (!gpio_is_valid(dsi->te_gpio)) { |
@@ -1157,14 +1170,10 @@ static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi) | |||
1157 | goto out; | 1170 | goto out; |
1158 | } | 1171 | } |
1159 | 1172 | ||
1160 | /* | 1173 | te_gpio_irq = gpio_to_irq(dsi->te_gpio); |
1161 | * This TE GPIO IRQ should not be set to IRQ_NOAUTOEN, because panel | 1174 | |
1162 | * calls drm_panel_init() first then calls mipi_dsi_attach() in probe(). | 1175 | irq_set_status_flags(te_gpio_irq, IRQ_NOAUTOEN); |
1163 | * It means that te_gpio is invalid when exynos_dsi_enable_irq() is | 1176 | ret = request_threaded_irq(te_gpio_irq, exynos_dsi_te_irq_handler, NULL, |
1164 | * called by drm_panel_init() before panel is attached. | ||
1165 | */ | ||
1166 | ret = request_threaded_irq(gpio_to_irq(dsi->te_gpio), | ||
1167 | exynos_dsi_te_irq_handler, NULL, | ||
1168 | IRQF_TRIGGER_RISING, "TE", dsi); | 1177 | IRQF_TRIGGER_RISING, "TE", dsi); |
1169 | if (ret) { | 1178 | if (ret) { |
1170 | dev_err(dsi->dev, "request interrupt failed with %d\n", ret); | 1179 | dev_err(dsi->dev, "request interrupt failed with %d\n", ret); |
@@ -1195,9 +1204,6 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host, | |||
1195 | dsi->mode_flags = device->mode_flags; | 1204 | dsi->mode_flags = device->mode_flags; |
1196 | dsi->panel_node = device->dev.of_node; | 1205 | dsi->panel_node = device->dev.of_node; |
1197 | 1206 | ||
1198 | if (dsi->connector.dev) | ||
1199 | drm_helper_hpd_irq_event(dsi->connector.dev); | ||
1200 | |||
1201 | /* | 1207 | /* |
1202 | * This is a temporary solution and should be made by more generic way. | 1208 | * This is a temporary solution and should be made by more generic way. |
1203 | * | 1209 | * |
@@ -1211,6 +1217,9 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host, | |||
1211 | return ret; | 1217 | return ret; |
1212 | } | 1218 | } |
1213 | 1219 | ||
1220 | if (dsi->connector.dev) | ||
1221 | drm_helper_hpd_irq_event(dsi->connector.dev); | ||
1222 | |||
1214 | return 0; | 1223 | return 0; |
1215 | } | 1224 | } |
1216 | 1225 | ||
@@ -1236,7 +1245,7 @@ static bool exynos_dsi_is_short_dsi_type(u8 type) | |||
1236 | } | 1245 | } |
1237 | 1246 | ||
1238 | static ssize_t exynos_dsi_host_transfer(struct mipi_dsi_host *host, | 1247 | static ssize_t exynos_dsi_host_transfer(struct mipi_dsi_host *host, |
1239 | struct mipi_dsi_msg *msg) | 1248 | const struct mipi_dsi_msg *msg) |
1240 | { | 1249 | { |
1241 | struct exynos_dsi *dsi = host_to_dsi(host); | 1250 | struct exynos_dsi *dsi = host_to_dsi(host); |
1242 | struct exynos_dsi_transfer xfer; | 1251 | struct exynos_dsi_transfer xfer; |
@@ -1369,16 +1378,17 @@ static int exynos_dsi_enable(struct exynos_dsi *dsi) | |||
1369 | exynos_dsi_set_display_mode(dsi); | 1378 | exynos_dsi_set_display_mode(dsi); |
1370 | exynos_dsi_set_display_enable(dsi, true); | 1379 | exynos_dsi_set_display_enable(dsi, true); |
1371 | 1380 | ||
1381 | dsi->state |= DSIM_STATE_ENABLED; | ||
1382 | |||
1372 | ret = drm_panel_enable(dsi->panel); | 1383 | ret = drm_panel_enable(dsi->panel); |
1373 | if (ret < 0) { | 1384 | if (ret < 0) { |
1385 | dsi->state &= ~DSIM_STATE_ENABLED; | ||
1374 | exynos_dsi_set_display_enable(dsi, false); | 1386 | exynos_dsi_set_display_enable(dsi, false); |
1375 | drm_panel_unprepare(dsi->panel); | 1387 | drm_panel_unprepare(dsi->panel); |
1376 | exynos_dsi_poweroff(dsi); | 1388 | exynos_dsi_poweroff(dsi); |
1377 | return ret; | 1389 | return ret; |
1378 | } | 1390 | } |
1379 | 1391 | ||
1380 | dsi->state |= DSIM_STATE_ENABLED; | ||
1381 | |||
1382 | return 0; | 1392 | return 0; |
1383 | } | 1393 | } |
1384 | 1394 | ||
@@ -1397,7 +1407,7 @@ static void exynos_dsi_disable(struct exynos_dsi *dsi) | |||
1397 | 1407 | ||
1398 | static void exynos_dsi_dpms(struct exynos_drm_display *display, int mode) | 1408 | static void exynos_dsi_dpms(struct exynos_drm_display *display, int mode) |
1399 | { | 1409 | { |
1400 | struct exynos_dsi *dsi = display->ctx; | 1410 | struct exynos_dsi *dsi = display_to_dsi(display); |
1401 | 1411 | ||
1402 | if (dsi->panel) { | 1412 | if (dsi->panel) { |
1403 | switch (mode) { | 1413 | switch (mode) { |
@@ -1474,7 +1484,7 @@ exynos_dsi_best_encoder(struct drm_connector *connector) | |||
1474 | { | 1484 | { |
1475 | struct exynos_dsi *dsi = connector_to_dsi(connector); | 1485 | struct exynos_dsi *dsi = connector_to_dsi(connector); |
1476 | 1486 | ||
1477 | return dsi->encoder; | 1487 | return dsi->display.encoder; |
1478 | } | 1488 | } |
1479 | 1489 | ||
1480 | static struct drm_connector_helper_funcs exynos_dsi_connector_helper_funcs = { | 1490 | static struct drm_connector_helper_funcs exynos_dsi_connector_helper_funcs = { |
@@ -1486,12 +1496,10 @@ static struct drm_connector_helper_funcs exynos_dsi_connector_helper_funcs = { | |||
1486 | static int exynos_dsi_create_connector(struct exynos_drm_display *display, | 1496 | static int exynos_dsi_create_connector(struct exynos_drm_display *display, |
1487 | struct drm_encoder *encoder) | 1497 | struct drm_encoder *encoder) |
1488 | { | 1498 | { |
1489 | struct exynos_dsi *dsi = display->ctx; | 1499 | struct exynos_dsi *dsi = display_to_dsi(display); |
1490 | struct drm_connector *connector = &dsi->connector; | 1500 | struct drm_connector *connector = &dsi->connector; |
1491 | int ret; | 1501 | int ret; |
1492 | 1502 | ||
1493 | dsi->encoder = encoder; | ||
1494 | |||
1495 | connector->polled = DRM_CONNECTOR_POLL_HPD; | 1503 | connector->polled = DRM_CONNECTOR_POLL_HPD; |
1496 | 1504 | ||
1497 | ret = drm_connector_init(encoder->dev, connector, | 1505 | ret = drm_connector_init(encoder->dev, connector, |
@@ -1512,7 +1520,7 @@ static int exynos_dsi_create_connector(struct exynos_drm_display *display, | |||
1512 | static void exynos_dsi_mode_set(struct exynos_drm_display *display, | 1520 | static void exynos_dsi_mode_set(struct exynos_drm_display *display, |
1513 | struct drm_display_mode *mode) | 1521 | struct drm_display_mode *mode) |
1514 | { | 1522 | { |
1515 | struct exynos_dsi *dsi = display->ctx; | 1523 | struct exynos_dsi *dsi = display_to_dsi(display); |
1516 | struct videomode *vm = &dsi->vm; | 1524 | struct videomode *vm = &dsi->vm; |
1517 | 1525 | ||
1518 | vm->hactive = mode->hdisplay; | 1526 | vm->hactive = mode->hdisplay; |
@@ -1531,10 +1539,6 @@ static struct exynos_drm_display_ops exynos_dsi_display_ops = { | |||
1531 | .dpms = exynos_dsi_dpms | 1539 | .dpms = exynos_dsi_dpms |
1532 | }; | 1540 | }; |
1533 | 1541 | ||
1534 | static struct exynos_drm_display exynos_dsi_display = { | ||
1535 | .type = EXYNOS_DISPLAY_TYPE_LCD, | ||
1536 | .ops = &exynos_dsi_display_ops, | ||
1537 | }; | ||
1538 | MODULE_DEVICE_TABLE(of, exynos_dsi_of_match); | 1542 | MODULE_DEVICE_TABLE(of, exynos_dsi_of_match); |
1539 | 1543 | ||
1540 | /* of_* functions will be removed after merge of of_graph patches */ | 1544 | /* of_* functions will be removed after merge of of_graph patches */ |
@@ -1640,28 +1644,28 @@ end: | |||
1640 | static int exynos_dsi_bind(struct device *dev, struct device *master, | 1644 | static int exynos_dsi_bind(struct device *dev, struct device *master, |
1641 | void *data) | 1645 | void *data) |
1642 | { | 1646 | { |
1647 | struct exynos_drm_display *display = dev_get_drvdata(dev); | ||
1648 | struct exynos_dsi *dsi = display_to_dsi(display); | ||
1643 | struct drm_device *drm_dev = data; | 1649 | struct drm_device *drm_dev = data; |
1644 | struct exynos_dsi *dsi; | ||
1645 | int ret; | 1650 | int ret; |
1646 | 1651 | ||
1647 | ret = exynos_drm_create_enc_conn(drm_dev, &exynos_dsi_display); | 1652 | ret = exynos_drm_create_enc_conn(drm_dev, display); |
1648 | if (ret) { | 1653 | if (ret) { |
1649 | DRM_ERROR("Encoder create [%d] failed with %d\n", | 1654 | DRM_ERROR("Encoder create [%d] failed with %d\n", |
1650 | exynos_dsi_display.type, ret); | 1655 | display->type, ret); |
1651 | return ret; | 1656 | return ret; |
1652 | } | 1657 | } |
1653 | 1658 | ||
1654 | dsi = exynos_dsi_display.ctx; | ||
1655 | |||
1656 | return mipi_dsi_host_register(&dsi->dsi_host); | 1659 | return mipi_dsi_host_register(&dsi->dsi_host); |
1657 | } | 1660 | } |
1658 | 1661 | ||
1659 | static void exynos_dsi_unbind(struct device *dev, struct device *master, | 1662 | static void exynos_dsi_unbind(struct device *dev, struct device *master, |
1660 | void *data) | 1663 | void *data) |
1661 | { | 1664 | { |
1662 | struct exynos_dsi *dsi = exynos_dsi_display.ctx; | 1665 | struct exynos_drm_display *display = dev_get_drvdata(dev); |
1666 | struct exynos_dsi *dsi = display_to_dsi(display); | ||
1663 | 1667 | ||
1664 | exynos_dsi_dpms(&exynos_dsi_display, DRM_MODE_DPMS_OFF); | 1668 | exynos_dsi_dpms(display, DRM_MODE_DPMS_OFF); |
1665 | 1669 | ||
1666 | mipi_dsi_host_unregister(&dsi->dsi_host); | 1670 | mipi_dsi_host_unregister(&dsi->dsi_host); |
1667 | } | 1671 | } |
@@ -1673,22 +1677,23 @@ static const struct component_ops exynos_dsi_component_ops = { | |||
1673 | 1677 | ||
1674 | static int exynos_dsi_probe(struct platform_device *pdev) | 1678 | static int exynos_dsi_probe(struct platform_device *pdev) |
1675 | { | 1679 | { |
1680 | struct device *dev = &pdev->dev; | ||
1676 | struct resource *res; | 1681 | struct resource *res; |
1677 | struct exynos_dsi *dsi; | 1682 | struct exynos_dsi *dsi; |
1678 | int ret; | 1683 | int ret; |
1679 | 1684 | ||
1680 | ret = exynos_drm_component_add(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR, | 1685 | dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); |
1681 | exynos_dsi_display.type); | 1686 | if (!dsi) |
1687 | return -ENOMEM; | ||
1688 | |||
1689 | dsi->display.type = EXYNOS_DISPLAY_TYPE_LCD; | ||
1690 | dsi->display.ops = &exynos_dsi_display_ops; | ||
1691 | |||
1692 | ret = exynos_drm_component_add(dev, EXYNOS_DEVICE_TYPE_CONNECTOR, | ||
1693 | dsi->display.type); | ||
1682 | if (ret) | 1694 | if (ret) |
1683 | return ret; | 1695 | return ret; |
1684 | 1696 | ||
1685 | dsi = devm_kzalloc(&pdev->dev, sizeof(*dsi), GFP_KERNEL); | ||
1686 | if (!dsi) { | ||
1687 | dev_err(&pdev->dev, "failed to allocate dsi object.\n"); | ||
1688 | ret = -ENOMEM; | ||
1689 | goto err_del_component; | ||
1690 | } | ||
1691 | |||
1692 | /* To be checked as invalid one */ | 1697 | /* To be checked as invalid one */ |
1693 | dsi->te_gpio = -ENOENT; | 1698 | dsi->te_gpio = -ENOENT; |
1694 | 1699 | ||
@@ -1697,9 +1702,9 @@ static int exynos_dsi_probe(struct platform_device *pdev) | |||
1697 | INIT_LIST_HEAD(&dsi->transfer_list); | 1702 | INIT_LIST_HEAD(&dsi->transfer_list); |
1698 | 1703 | ||
1699 | dsi->dsi_host.ops = &exynos_dsi_ops; | 1704 | dsi->dsi_host.ops = &exynos_dsi_ops; |
1700 | dsi->dsi_host.dev = &pdev->dev; | 1705 | dsi->dsi_host.dev = dev; |
1701 | 1706 | ||
1702 | dsi->dev = &pdev->dev; | 1707 | dsi->dev = dev; |
1703 | dsi->driver_data = exynos_dsi_get_driver_data(pdev); | 1708 | dsi->driver_data = exynos_dsi_get_driver_data(pdev); |
1704 | 1709 | ||
1705 | ret = exynos_dsi_parse_dt(dsi); | 1710 | ret = exynos_dsi_parse_dt(dsi); |
@@ -1708,70 +1713,68 @@ static int exynos_dsi_probe(struct platform_device *pdev) | |||
1708 | 1713 | ||
1709 | dsi->supplies[0].supply = "vddcore"; | 1714 | dsi->supplies[0].supply = "vddcore"; |
1710 | dsi->supplies[1].supply = "vddio"; | 1715 | dsi->supplies[1].supply = "vddio"; |
1711 | ret = devm_regulator_bulk_get(&pdev->dev, ARRAY_SIZE(dsi->supplies), | 1716 | ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies), |
1712 | dsi->supplies); | 1717 | dsi->supplies); |
1713 | if (ret) { | 1718 | if (ret) { |
1714 | dev_info(&pdev->dev, "failed to get regulators: %d\n", ret); | 1719 | dev_info(dev, "failed to get regulators: %d\n", ret); |
1715 | return -EPROBE_DEFER; | 1720 | return -EPROBE_DEFER; |
1716 | } | 1721 | } |
1717 | 1722 | ||
1718 | dsi->pll_clk = devm_clk_get(&pdev->dev, "pll_clk"); | 1723 | dsi->pll_clk = devm_clk_get(dev, "pll_clk"); |
1719 | if (IS_ERR(dsi->pll_clk)) { | 1724 | if (IS_ERR(dsi->pll_clk)) { |
1720 | dev_info(&pdev->dev, "failed to get dsi pll input clock\n"); | 1725 | dev_info(dev, "failed to get dsi pll input clock\n"); |
1721 | ret = PTR_ERR(dsi->pll_clk); | 1726 | ret = PTR_ERR(dsi->pll_clk); |
1722 | goto err_del_component; | 1727 | goto err_del_component; |
1723 | } | 1728 | } |
1724 | 1729 | ||
1725 | dsi->bus_clk = devm_clk_get(&pdev->dev, "bus_clk"); | 1730 | dsi->bus_clk = devm_clk_get(dev, "bus_clk"); |
1726 | if (IS_ERR(dsi->bus_clk)) { | 1731 | if (IS_ERR(dsi->bus_clk)) { |
1727 | dev_info(&pdev->dev, "failed to get dsi bus clock\n"); | 1732 | dev_info(dev, "failed to get dsi bus clock\n"); |
1728 | ret = PTR_ERR(dsi->bus_clk); | 1733 | ret = PTR_ERR(dsi->bus_clk); |
1729 | goto err_del_component; | 1734 | goto err_del_component; |
1730 | } | 1735 | } |
1731 | 1736 | ||
1732 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1737 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1733 | dsi->reg_base = devm_ioremap_resource(&pdev->dev, res); | 1738 | dsi->reg_base = devm_ioremap_resource(dev, res); |
1734 | if (IS_ERR(dsi->reg_base)) { | 1739 | if (IS_ERR(dsi->reg_base)) { |
1735 | dev_err(&pdev->dev, "failed to remap io region\n"); | 1740 | dev_err(dev, "failed to remap io region\n"); |
1736 | ret = PTR_ERR(dsi->reg_base); | 1741 | ret = PTR_ERR(dsi->reg_base); |
1737 | goto err_del_component; | 1742 | goto err_del_component; |
1738 | } | 1743 | } |
1739 | 1744 | ||
1740 | dsi->phy = devm_phy_get(&pdev->dev, "dsim"); | 1745 | dsi->phy = devm_phy_get(dev, "dsim"); |
1741 | if (IS_ERR(dsi->phy)) { | 1746 | if (IS_ERR(dsi->phy)) { |
1742 | dev_info(&pdev->dev, "failed to get dsim phy\n"); | 1747 | dev_info(dev, "failed to get dsim phy\n"); |
1743 | ret = PTR_ERR(dsi->phy); | 1748 | ret = PTR_ERR(dsi->phy); |
1744 | goto err_del_component; | 1749 | goto err_del_component; |
1745 | } | 1750 | } |
1746 | 1751 | ||
1747 | dsi->irq = platform_get_irq(pdev, 0); | 1752 | dsi->irq = platform_get_irq(pdev, 0); |
1748 | if (dsi->irq < 0) { | 1753 | if (dsi->irq < 0) { |
1749 | dev_err(&pdev->dev, "failed to request dsi irq resource\n"); | 1754 | dev_err(dev, "failed to request dsi irq resource\n"); |
1750 | ret = dsi->irq; | 1755 | ret = dsi->irq; |
1751 | goto err_del_component; | 1756 | goto err_del_component; |
1752 | } | 1757 | } |
1753 | 1758 | ||
1754 | irq_set_status_flags(dsi->irq, IRQ_NOAUTOEN); | 1759 | irq_set_status_flags(dsi->irq, IRQ_NOAUTOEN); |
1755 | ret = devm_request_threaded_irq(&pdev->dev, dsi->irq, NULL, | 1760 | ret = devm_request_threaded_irq(dev, dsi->irq, NULL, |
1756 | exynos_dsi_irq, IRQF_ONESHOT, | 1761 | exynos_dsi_irq, IRQF_ONESHOT, |
1757 | dev_name(&pdev->dev), dsi); | 1762 | dev_name(dev), dsi); |
1758 | if (ret) { | 1763 | if (ret) { |
1759 | dev_err(&pdev->dev, "failed to request dsi irq\n"); | 1764 | dev_err(dev, "failed to request dsi irq\n"); |
1760 | goto err_del_component; | 1765 | goto err_del_component; |
1761 | } | 1766 | } |
1762 | 1767 | ||
1763 | exynos_dsi_display.ctx = dsi; | 1768 | platform_set_drvdata(pdev, &dsi->display); |
1764 | |||
1765 | platform_set_drvdata(pdev, &exynos_dsi_display); | ||
1766 | 1769 | ||
1767 | ret = component_add(&pdev->dev, &exynos_dsi_component_ops); | 1770 | ret = component_add(dev, &exynos_dsi_component_ops); |
1768 | if (ret) | 1771 | if (ret) |
1769 | goto err_del_component; | 1772 | goto err_del_component; |
1770 | 1773 | ||
1771 | return ret; | 1774 | return ret; |
1772 | 1775 | ||
1773 | err_del_component: | 1776 | err_del_component: |
1774 | exynos_drm_component_del(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR); | 1777 | exynos_drm_component_del(dev, EXYNOS_DEVICE_TYPE_CONNECTOR); |
1775 | return ret; | 1778 | return ret; |
1776 | } | 1779 | } |
1777 | 1780 | ||