]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/ata/sata_gemini.c
ARM: dts: rockchip: Add pin names for rk3288-veyron-minnie
[linux.git] / drivers / ata / sata_gemini.c
index 8c704523bae7d496bfe1bea1de3e681512404465..46950e0267e0d281dc3aec3429e15be88b93d5a9 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/of_device.h>
 #include <linux/clk.h>
 #include <linux/io.h>
+#include <linux/pinctrl/consumer.h>
 #include "sata_gemini.h"
 
 #define DRV_NAME "gemini_sata_bridge"
@@ -43,17 +44,6 @@ struct sata_gemini {
        struct clk *sata1_pclk;
 };
 
-/* Global IDE PAD Skew Control Register */
-#define GEMINI_GLOBAL_IDE_SKEW_CTRL            0x18
-#define GEMINI_IDE1_HOST_STROBE_DELAY_SHIFT    28
-#define GEMINI_IDE1_DEVICE_STROBE_DELAY_SHIFT  24
-#define GEMINI_IDE1_OUTPUT_IO_SKEW_SHIFT       20
-#define GEMINI_IDE1_INPUT_IO_SKEW_SHIFT                16
-#define GEMINI_IDE0_HOST_STROBE_DELAY_SHIFT    12
-#define GEMINI_IDE0_DEVICE_STROBE_DELAY_SHIFT  8
-#define GEMINI_IDE0_OUTPUT_IO_SKEW_SHIFT       4
-#define GEMINI_IDE0_INPUT_IO_SKEW_SHIFT                0
-
 /* Miscellaneous Control Register */
 #define GEMINI_GLOBAL_MISC_CTRL                0x30
 /*
@@ -91,8 +81,6 @@ struct sata_gemini {
 #define GEMINI_IDE_IOMUX_MODE2                 (2 << 24)
 #define GEMINI_IDE_IOMUX_MODE3                 (3 << 24)
 #define GEMINI_IDE_IOMUX_SHIFT                 (24)
-#define GEMINI_IDE_PADS_ENABLE                 BIT(4)
-#define GEMINI_PFLASH_PADS_DISABLE             BIT(1)
 
 /*
  * Registers directly controlling the PATA<->SATA adapters
@@ -274,14 +262,14 @@ static int gemini_sata_bridge_init(struct sata_gemini *sg)
                return ret;
        }
 
-       sg->sata0_reset = devm_reset_control_get(dev, "sata0");
+       sg->sata0_reset = devm_reset_control_get_exclusive(dev, "sata0");
        if (IS_ERR(sg->sata0_reset)) {
                dev_err(dev, "no SATA0 reset controller\n");
                clk_disable_unprepare(sg->sata1_pclk);
                clk_disable_unprepare(sg->sata0_pclk);
                return PTR_ERR(sg->sata0_reset);
        }
-       sg->sata1_reset = devm_reset_control_get(dev, "sata1");
+       sg->sata1_reset = devm_reset_control_get_exclusive(dev, "sata1");
        if (IS_ERR(sg->sata1_reset)) {
                dev_err(dev, "no SATA1 reset controller\n");
                clk_disable_unprepare(sg->sata1_pclk);
@@ -300,17 +288,39 @@ static int gemini_sata_bridge_init(struct sata_gemini *sg)
        return 0;
 }
 
+static int gemini_setup_ide_pins(struct device *dev)
+{
+       struct pinctrl *p;
+       struct pinctrl_state *ide_state;
+       int ret;
+
+       p = devm_pinctrl_get(dev);
+       if (IS_ERR(p))
+               return PTR_ERR(p);
+
+       ide_state = pinctrl_lookup_state(p, "ide");
+       if (IS_ERR(ide_state))
+               return PTR_ERR(ide_state);
+
+       ret = pinctrl_select_state(p, ide_state);
+       if (ret) {
+               dev_err(dev, "could not select IDE state\n");
+               return ret;
+       }
+
+       return 0;
+}
+
 static int gemini_sata_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *np = dev->of_node;
        struct sata_gemini *sg;
-       static struct regmap *map;
+       struct regmap *map;
        struct resource *res;
        enum gemini_muxmode muxmode;
        u32 gmode;
        u32 gmask;
-       u32 val;
        int ret;
 
        sg = devm_kzalloc(dev, sizeof(*sg), GFP_KERNEL);
@@ -362,16 +372,6 @@ static int gemini_sata_probe(struct platform_device *pdev)
        gmask = GEMINI_IDE_IOMUX_MASK;
        gmode = (muxmode << GEMINI_IDE_IOMUX_SHIFT);
 
-       /*
-        * If we mux out the IDE, parallel flash must be disabled.
-        * SATA0 and SATA1 have dedicated pins and may coexist with
-        * parallel flash.
-        */
-       if (sg->ide_pins)
-               gmode |= GEMINI_IDE_PADS_ENABLE | GEMINI_PFLASH_PADS_DISABLE;
-       else
-               gmask |= GEMINI_IDE_PADS_ENABLE;
-
        ret = regmap_update_bits(map, GEMINI_GLOBAL_MISC_CTRL, gmask, gmode);
        if (ret) {
                dev_err(dev, "unable to set up IDE muxing\n");
@@ -379,14 +379,15 @@ static int gemini_sata_probe(struct platform_device *pdev)
                goto out_unprep_clk;
        }
 
-       /* FIXME: add more elaborate IDE skew control handling */
+       /*
+        * Route out the IDE pins if desired.
+        * This is done by looking up a special pin control state called
+        * "ide" that will route out the IDE pins.
+        */
        if (sg->ide_pins) {
-               ret = regmap_read(map, GEMINI_GLOBAL_IDE_SKEW_CTRL, &val);
-               if (ret) {
-                       dev_err(dev, "cannot read IDE skew control register\n");
+               ret = gemini_setup_ide_pins(dev);
+               if (ret)
                        return ret;
-               }
-               dev_info(dev, "IDE skew control: %08x\n", val);
        }
 
        dev_info(dev, "set up the Gemini IDE/SATA nexus\n");