aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/exynos/exynos_drm_dsi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_dsi.c')
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_dsi.c129
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
270struct exynos_dsi { 270struct 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
307static inline struct exynos_dsi *display_to_dsi(struct exynos_drm_display *d)
308{
309 return container_of(d, struct exynos_dsi, display);
310}
311
307static struct exynos_dsi_driver_data exynos3_dsi_driver_data = { 312static 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
324static struct exynos_dsi_driver_data exynos4415_dsi_driver_data = {
325 .plltmr_reg = 0x58,
326 .has_clklane_stop = 1,
327};
328
319static struct exynos_dsi_driver_data exynos5_dsi_driver_data = { 329static 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)
1104static irqreturn_t exynos_dsi_te_irq_handler(int irq, void *dev_id) 1116static 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)
1143static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi) 1155static 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
1238static ssize_t exynos_dsi_host_transfer(struct mipi_dsi_host *host, 1247static 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
1398static void exynos_dsi_dpms(struct exynos_drm_display *display, int mode) 1408static 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
1480static struct drm_connector_helper_funcs exynos_dsi_connector_helper_funcs = { 1490static 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 = {
1486static int exynos_dsi_create_connector(struct exynos_drm_display *display, 1496static 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,
1512static void exynos_dsi_mode_set(struct exynos_drm_display *display, 1520static 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
1534static struct exynos_drm_display exynos_dsi_display = {
1535 .type = EXYNOS_DISPLAY_TYPE_LCD,
1536 .ops = &exynos_dsi_display_ops,
1537};
1538MODULE_DEVICE_TABLE(of, exynos_dsi_of_match); 1542MODULE_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:
1640static int exynos_dsi_bind(struct device *dev, struct device *master, 1644static 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
1659static void exynos_dsi_unbind(struct device *dev, struct device *master, 1662static 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
1674static int exynos_dsi_probe(struct platform_device *pdev) 1678static 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
1773err_del_component: 1776err_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