|
@@ -33,6 +33,7 @@
|
|
#include <linux/regulator/consumer.h>
|
|
#include <linux/regulator/consumer.h>
|
|
#include <linux/io.h>
|
|
#include <linux/io.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of.h>
|
|
|
|
+#include <linux/i2c.h>
|
|
#include <linux/of_gpio.h>
|
|
#include <linux/of_gpio.h>
|
|
#include <linux/hdmi.h>
|
|
#include <linux/hdmi.h>
|
|
|
|
|
|
@@ -41,8 +42,6 @@
|
|
#include "exynos_drm_drv.h"
|
|
#include "exynos_drm_drv.h"
|
|
#include "exynos_drm_hdmi.h"
|
|
#include "exynos_drm_hdmi.h"
|
|
|
|
|
|
-#include "exynos_hdmi.h"
|
|
|
|
-
|
|
|
|
#include <linux/gpio.h>
|
|
#include <linux/gpio.h>
|
|
#include <media/s5p_hdmi.h>
|
|
#include <media/s5p_hdmi.h>
|
|
|
|
|
|
@@ -1907,20 +1906,6 @@ fail:
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
}
|
|
}
|
|
|
|
|
|
-static struct i2c_client *hdmi_ddc, *hdmi_hdmiphy;
|
|
|
|
-
|
|
|
|
-void hdmi_attach_ddc_client(struct i2c_client *ddc)
|
|
|
|
-{
|
|
|
|
- if (ddc)
|
|
|
|
- hdmi_ddc = ddc;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void hdmi_attach_hdmiphy_client(struct i2c_client *hdmiphy)
|
|
|
|
-{
|
|
|
|
- if (hdmiphy)
|
|
|
|
- hdmi_hdmiphy = hdmiphy;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static struct s5p_hdmi_platform_data *drm_hdmi_dt_parse_pdata
|
|
static struct s5p_hdmi_platform_data *drm_hdmi_dt_parse_pdata
|
|
(struct device *dev)
|
|
(struct device *dev)
|
|
{
|
|
{
|
|
@@ -1965,6 +1950,7 @@ static int hdmi_probe(struct platform_device *pdev)
|
|
struct s5p_hdmi_platform_data *pdata;
|
|
struct s5p_hdmi_platform_data *pdata;
|
|
struct resource *res;
|
|
struct resource *res;
|
|
const struct of_device_id *match;
|
|
const struct of_device_id *match;
|
|
|
|
+ struct device_node *ddc_node, *phy_node;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
if (!dev->of_node)
|
|
if (!dev->of_node)
|
|
@@ -2015,21 +2001,30 @@ static int hdmi_probe(struct platform_device *pdev)
|
|
}
|
|
}
|
|
|
|
|
|
/* DDC i2c driver */
|
|
/* DDC i2c driver */
|
|
- if (i2c_add_driver(&ddc_driver)) {
|
|
|
|
- DRM_ERROR("failed to register ddc i2c driver\n");
|
|
|
|
- return -ENOENT;
|
|
|
|
|
|
+ ddc_node = of_parse_phandle(dev->of_node, "ddc", 0);
|
|
|
|
+ if (!ddc_node) {
|
|
|
|
+ DRM_ERROR("Failed to find ddc node in device tree\n");
|
|
|
|
+ return -ENODEV;
|
|
|
|
+ }
|
|
|
|
+ hdata->ddc_port = of_find_i2c_device_by_node(ddc_node);
|
|
|
|
+ if (!hdata->ddc_port) {
|
|
|
|
+ DRM_ERROR("Failed to get ddc i2c client by node\n");
|
|
|
|
+ return -ENODEV;
|
|
}
|
|
}
|
|
-
|
|
|
|
- hdata->ddc_port = hdmi_ddc;
|
|
|
|
|
|
|
|
/* hdmiphy i2c driver */
|
|
/* hdmiphy i2c driver */
|
|
- if (i2c_add_driver(&hdmiphy_driver)) {
|
|
|
|
- DRM_ERROR("failed to register hdmiphy i2c driver\n");
|
|
|
|
- ret = -ENOENT;
|
|
|
|
|
|
+ phy_node = of_parse_phandle(dev->of_node, "phy", 0);
|
|
|
|
+ if (!phy_node) {
|
|
|
|
+ DRM_ERROR("Failed to find hdmiphy node in device tree\n");
|
|
|
|
+ ret = -ENODEV;
|
|
|
|
+ goto err_ddc;
|
|
|
|
+ }
|
|
|
|
+ hdata->hdmiphy_port = of_find_i2c_device_by_node(phy_node);
|
|
|
|
+ if (!hdata->hdmiphy_port) {
|
|
|
|
+ DRM_ERROR("Failed to get hdmi phy i2c client from node\n");
|
|
|
|
+ ret = -ENODEV;
|
|
goto err_ddc;
|
|
goto err_ddc;
|
|
}
|
|
}
|
|
-
|
|
|
|
- hdata->hdmiphy_port = hdmi_hdmiphy;
|
|
|
|
|
|
|
|
hdata->irq = gpio_to_irq(hdata->hpd_gpio);
|
|
hdata->irq = gpio_to_irq(hdata->hpd_gpio);
|
|
if (hdata->irq < 0) {
|
|
if (hdata->irq < 0) {
|
|
@@ -2060,22 +2055,22 @@ static int hdmi_probe(struct platform_device *pdev)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
err_hdmiphy:
|
|
err_hdmiphy:
|
|
- i2c_del_driver(&hdmiphy_driver);
|
|
|
|
|
|
+ put_device(&hdata->hdmiphy_port->dev);
|
|
err_ddc:
|
|
err_ddc:
|
|
- i2c_del_driver(&ddc_driver);
|
|
|
|
|
|
+ put_device(&hdata->ddc_port->dev);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
static int hdmi_remove(struct platform_device *pdev)
|
|
static int hdmi_remove(struct platform_device *pdev)
|
|
{
|
|
{
|
|
struct device *dev = &pdev->dev;
|
|
struct device *dev = &pdev->dev;
|
|
|
|
+ struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
|
|
|
|
+ struct hdmi_context *hdata = ctx->ctx;
|
|
|
|
|
|
pm_runtime_disable(dev);
|
|
pm_runtime_disable(dev);
|
|
|
|
|
|
- /* hdmiphy i2c driver */
|
|
|
|
- i2c_del_driver(&hdmiphy_driver);
|
|
|
|
- /* DDC i2c driver */
|
|
|
|
- i2c_del_driver(&ddc_driver);
|
|
|
|
|
|
+ put_device(&hdata->hdmiphy_port->dev);
|
|
|
|
+ put_device(&hdata->ddc_port->dev);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|