aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/memory
diff options
context:
space:
mode:
authorRoger Quadros <rogerq@ti.com>2015-08-06 06:21:40 -0400
committerRoger Quadros <rogerq@ti.com>2016-04-15 04:55:00 -0400
commit210325f0f4eb531f83ffb0b0f95612e2a8063983 (patch)
treeb433085564d9340632d9331ccfa64d859541873b /drivers/memory
parentd2d00862dfbbd22d80ee67f816cb7eeaea71f03b (diff)
memory: omap-gpmc: Reserve WAITPIN if needed for WAIT monitoring
If the device attached to GPMC wants to use the WAIT pin for WAIT monitoring then we reserve it internally for exclusive use. Signed-off-by: Roger Quadros <rogerq@ti.com> Acked-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'drivers/memory')
-rw-r--r--drivers/memory/omap-gpmc.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/memory/omap-gpmc.c b/drivers/memory/omap-gpmc.c
index 4dd1c65ee70c..784a64f31a8b 100644
--- a/drivers/memory/omap-gpmc.c
+++ b/drivers/memory/omap-gpmc.c
@@ -1911,6 +1911,8 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
1911 const char *name; 1911 const char *name;
1912 int ret, cs; 1912 int ret, cs;
1913 u32 val; 1913 u32 val;
1914 struct gpio_desc *waitpin_desc = NULL;
1915 struct gpmc_device *gpmc = platform_get_drvdata(pdev);
1914 1916
1915 if (of_property_read_u32(child, "reg", &cs) < 0) { 1917 if (of_property_read_u32(child, "reg", &cs) < 0) {
1916 dev_err(&pdev->dev, "%s has no 'reg' property\n", 1918 dev_err(&pdev->dev, "%s has no 'reg' property\n",
@@ -2020,16 +2022,30 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
2020 goto err; 2022 goto err;
2021 } 2023 }
2022 2024
2025 /* Reserve wait pin if it is required and valid */
2026 if (gpmc_s.wait_on_read || gpmc_s.wait_on_write) {
2027 unsigned int wait_pin = gpmc_s.wait_pin;
2028
2029 waitpin_desc = gpiochip_request_own_desc(&gpmc->gpio_chip,
2030 wait_pin, "WAITPIN");
2031 if (IS_ERR(waitpin_desc)) {
2032 dev_err(&pdev->dev, "invalid wait-pin: %d\n", wait_pin);
2033 ret = PTR_ERR(waitpin_desc);
2034 goto err;
2035 }
2036 }
2037
2023 gpmc_cs_show_timings(cs, "before gpmc_cs_program_settings"); 2038 gpmc_cs_show_timings(cs, "before gpmc_cs_program_settings");
2039
2024 ret = gpmc_cs_program_settings(cs, &gpmc_s); 2040 ret = gpmc_cs_program_settings(cs, &gpmc_s);
2025 if (ret < 0) 2041 if (ret < 0)
2026 goto err; 2042 goto err_cs;
2027 2043
2028 ret = gpmc_cs_set_timings(cs, &gpmc_t, &gpmc_s); 2044 ret = gpmc_cs_set_timings(cs, &gpmc_t, &gpmc_s);
2029 if (ret) { 2045 if (ret) {
2030 dev_err(&pdev->dev, "failed to set gpmc timings for: %s\n", 2046 dev_err(&pdev->dev, "failed to set gpmc timings for: %s\n",
2031 child->name); 2047 child->name);
2032 goto err; 2048 goto err_cs;
2033 } 2049 }
2034 2050
2035 /* Clear limited address i.e. enable A26-A11 */ 2051 /* Clear limited address i.e. enable A26-A11 */
@@ -2060,6 +2076,10 @@ err_child_fail:
2060 dev_err(&pdev->dev, "failed to create gpmc child %s\n", child->name); 2076 dev_err(&pdev->dev, "failed to create gpmc child %s\n", child->name);
2061 ret = -ENODEV; 2077 ret = -ENODEV;
2062 2078
2079err_cs:
2080 if (waitpin_desc)
2081 gpiochip_free_own_desc(waitpin_desc);
2082
2063err: 2083err:
2064 gpmc_cs_free(cs); 2084 gpmc_cs_free(cs);
2065 2085