drm/rockchip: lvds: Create an RK3288 specific probe function
The probe function is highly adapted to the RK3288 specificities, move all specific bits into an "rk3288_probe" function, also part of the platform data. The goal is to ease the addition of new flavors of Rockchip LVDS IPs. Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Signed-off-by: Heiko Stuebner <heiko@sntech.de> Link: https://patchwork.freedesktop.org/patch/msgid/20191224143900.23567-7-miquel.raynal@bootlin.com
This commit is contained in:
parent
36839e5788
commit
9b5cbdbb93
@ -31,6 +31,8 @@
|
||||
#define DISPLAY_OUTPUT_LVDS 1
|
||||
#define DISPLAY_OUTPUT_DUAL_LVDS 2
|
||||
|
||||
struct rockchip_lvds;
|
||||
|
||||
#define connector_to_lvds(c) \
|
||||
container_of(c, struct rockchip_lvds, connector)
|
||||
|
||||
@ -39,9 +41,11 @@
|
||||
|
||||
/**
|
||||
* rockchip_lvds_soc_data - rockchip lvds Soc private data
|
||||
* @probe: LVDS platform probe function
|
||||
* @helper_funcs: LVDS connector helper functions
|
||||
*/
|
||||
struct rockchip_lvds_soc_data {
|
||||
int (*probe)(struct platform_device *pdev, struct rockchip_lvds *lvds);
|
||||
const struct drm_encoder_helper_funcs *helper_funcs;
|
||||
};
|
||||
|
||||
@ -303,6 +307,52 @@ static void rk3288_lvds_encoder_disable(struct drm_encoder *encoder)
|
||||
drm_panel_unprepare(lvds->panel);
|
||||
}
|
||||
|
||||
static int rk3288_lvds_probe(struct platform_device *pdev,
|
||||
struct rockchip_lvds *lvds)
|
||||
{
|
||||
struct resource *res;
|
||||
int ret;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
lvds->regs = devm_ioremap_resource(lvds->dev, res);
|
||||
if (IS_ERR(lvds->regs))
|
||||
return PTR_ERR(lvds->regs);
|
||||
|
||||
lvds->pclk = devm_clk_get(lvds->dev, "pclk_lvds");
|
||||
if (IS_ERR(lvds->pclk)) {
|
||||
DRM_DEV_ERROR(lvds->dev, "could not get pclk_lvds\n");
|
||||
return PTR_ERR(lvds->pclk);
|
||||
}
|
||||
|
||||
lvds->pins = devm_kzalloc(lvds->dev, sizeof(*lvds->pins),
|
||||
GFP_KERNEL);
|
||||
if (!lvds->pins)
|
||||
return -ENOMEM;
|
||||
|
||||
lvds->pins->p = devm_pinctrl_get(lvds->dev);
|
||||
if (IS_ERR(lvds->pins->p)) {
|
||||
DRM_DEV_ERROR(lvds->dev, "no pinctrl handle\n");
|
||||
devm_kfree(lvds->dev, lvds->pins);
|
||||
lvds->pins = NULL;
|
||||
} else {
|
||||
lvds->pins->default_state =
|
||||
pinctrl_lookup_state(lvds->pins->p, "lcdc");
|
||||
if (IS_ERR(lvds->pins->default_state)) {
|
||||
DRM_DEV_ERROR(lvds->dev, "no default pinctrl state\n");
|
||||
devm_kfree(lvds->dev, lvds->pins);
|
||||
lvds->pins = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
ret = clk_prepare(lvds->pclk);
|
||||
if (ret < 0) {
|
||||
DRM_DEV_ERROR(lvds->dev, "failed to prepare pclk_lvds\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const
|
||||
struct drm_encoder_helper_funcs rk3288_lvds_encoder_helper_funcs = {
|
||||
.enable = rk3288_lvds_encoder_enable,
|
||||
@ -315,6 +365,7 @@ static const struct drm_encoder_funcs rockchip_lvds_encoder_funcs = {
|
||||
};
|
||||
|
||||
static const struct rockchip_lvds_soc_data rk3288_lvds_data = {
|
||||
.probe = rk3288_lvds_probe,
|
||||
.helper_funcs = &rk3288_lvds_encoder_helper_funcs,
|
||||
};
|
||||
|
||||
@ -488,7 +539,6 @@ static int rockchip_lvds_probe(struct platform_device *pdev)
|
||||
struct device *dev = &pdev->dev;
|
||||
struct rockchip_lvds *lvds;
|
||||
const struct of_device_id *match;
|
||||
struct resource *res;
|
||||
int ret;
|
||||
|
||||
if (!dev->of_node)
|
||||
@ -504,37 +554,6 @@ static int rockchip_lvds_probe(struct platform_device *pdev)
|
||||
return -ENODEV;
|
||||
lvds->soc_data = match->data;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
lvds->regs = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(lvds->regs))
|
||||
return PTR_ERR(lvds->regs);
|
||||
|
||||
lvds->pclk = devm_clk_get(&pdev->dev, "pclk_lvds");
|
||||
if (IS_ERR(lvds->pclk)) {
|
||||
DRM_DEV_ERROR(dev, "could not get pclk_lvds\n");
|
||||
return PTR_ERR(lvds->pclk);
|
||||
}
|
||||
|
||||
lvds->pins = devm_kzalloc(lvds->dev, sizeof(*lvds->pins),
|
||||
GFP_KERNEL);
|
||||
if (!lvds->pins)
|
||||
return -ENOMEM;
|
||||
|
||||
lvds->pins->p = devm_pinctrl_get(lvds->dev);
|
||||
if (IS_ERR(lvds->pins->p)) {
|
||||
DRM_DEV_ERROR(dev, "no pinctrl handle\n");
|
||||
devm_kfree(lvds->dev, lvds->pins);
|
||||
lvds->pins = NULL;
|
||||
} else {
|
||||
lvds->pins->default_state =
|
||||
pinctrl_lookup_state(lvds->pins->p, "lcdc");
|
||||
if (IS_ERR(lvds->pins->default_state)) {
|
||||
DRM_DEV_ERROR(dev, "no default pinctrl state\n");
|
||||
devm_kfree(lvds->dev, lvds->pins);
|
||||
lvds->pins = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
lvds->grf = syscon_regmap_lookup_by_phandle(dev->of_node,
|
||||
"rockchip,grf");
|
||||
if (IS_ERR(lvds->grf)) {
|
||||
@ -542,13 +561,14 @@ static int rockchip_lvds_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(lvds->grf);
|
||||
}
|
||||
|
||||
dev_set_drvdata(dev, lvds);
|
||||
|
||||
ret = clk_prepare(lvds->pclk);
|
||||
if (ret < 0) {
|
||||
DRM_DEV_ERROR(dev, "failed to prepare pclk_lvds\n");
|
||||
ret = lvds->soc_data->probe(pdev, lvds);
|
||||
if (ret) {
|
||||
DRM_DEV_ERROR(dev, "Platform initialization failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev_set_drvdata(dev, lvds);
|
||||
|
||||
ret = component_add(&pdev->dev, &rockchip_lvds_component_ops);
|
||||
if (ret < 0) {
|
||||
DRM_DEV_ERROR(dev, "failed to add component\n");
|
||||
|
Loading…
x
Reference in New Issue
Block a user