diff --git a/include/linux/sde_io_util.h b/include/linux/sde_io_util.h index 8bca51e522..76b1f2a808 100644 --- a/include/linux/sde_io_util.h +++ b/include/linux/sde_io_util.h @@ -107,6 +107,7 @@ int msm_dss_get_io_mem(struct platform_device *pdev, void msm_dss_clean_io_mem(struct list_head *mem_list); int msm_dss_get_pmic_io_mem(struct platform_device *pdev, struct list_head *mem_list); +int msm_dss_get_gpio_io_mem(const int gpio_pin, struct list_head *mem_list); int msm_dss_get_io_irq(struct platform_device *pdev, struct list_head *irq_list, u32 label); void msm_dss_clean_io_irq(struct list_head *irq_list); diff --git a/msm/sde_io_util.c b/msm/sde_io_util.c index b8b9fb8f25..d15b9cdbe0 100644 --- a/msm/sde_io_util.c +++ b/msm/sde_io_util.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -133,6 +134,40 @@ void msm_dss_iounmap(struct dss_io_data *io_data) } /* msm_dss_iounmap */ EXPORT_SYMBOL(msm_dss_iounmap); +int msm_dss_get_gpio_io_mem(const int gpio_pin, struct list_head *mem_list) +{ + struct msm_io_mem_entry *io_mem; + struct resource res; + bool gpio_pin_status = false; + int rc = 0; + + if (!gpio_is_valid(gpio_pin)) + return -EINVAL; + + io_mem = kzalloc(sizeof(struct msm_io_mem_entry), GFP_KERNEL); + if (!io_mem) + return -ENOMEM; + + gpio_pin_status = msm_gpio_get_pin_address(gpio_pin, &res); + if (!gpio_pin_status) { + rc = -ENODEV; + goto parse_fail; + } + + io_mem->base = res.start; + io_mem->size = resource_size(&res); + + list_add(&io_mem->list, mem_list); + + return 0; + +parse_fail: + kfree(io_mem); + + return rc; +} +EXPORT_SYMBOL(msm_dss_get_gpio_io_mem); + int msm_dss_get_pmic_io_mem(struct platform_device *pdev, struct list_head *mem_list) {