Merge branch 'rmobile' of git://git.denx.de/u-boot-sh
[platform/kernel/u-boot.git] / drivers / pinctrl / uniphier / pinctrl-uniphier-core.c
index b8e26d9..3f891f1 100644 (file)
@@ -1,11 +1,10 @@
 /*
- * Copyright (C) 2015 Masahiro Yamada <yamada.masahiro@socionext.com>
+ * Copyright (C) 2015-2016 Socionext Inc.
+ *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
-#include <common.h>
-#include <mapmem.h>
 #include <linux/io.h>
 #include <linux/err.h>
 #include <linux/sizes.h>
@@ -14,6 +13,8 @@
 
 #include "pinctrl-uniphier.h"
 
+static const char *uniphier_pinctrl_dummy_name = "_dummy";
+
 static int uniphier_pinctrl_get_groups_count(struct udevice *dev)
 {
        struct uniphier_pinctrl_priv *priv = dev_get_priv(dev);
@@ -26,6 +27,9 @@ static const char *uniphier_pinctrl_get_group_name(struct udevice *dev,
 {
        struct uniphier_pinctrl_priv *priv = dev_get_priv(dev);
 
+       if (!priv->socdata->groups[selector].name)
+               return uniphier_pinctrl_dummy_name;
+
        return priv->socdata->groups[selector].name;
 }
 
@@ -41,6 +45,9 @@ static const char *uniphier_pinmux_get_function_name(struct udevice *dev,
 {
        struct uniphier_pinctrl_priv *priv = dev_get_priv(dev);
 
+       if (!priv->socdata->functions[selector])
+               return uniphier_pinctrl_dummy_name;
+
        return priv->socdata->functions[selector];
 }
 
@@ -91,7 +98,7 @@ static void uniphier_pinconf_input_enable(struct udevice *dev, unsigned pin)
 }
 
 static void uniphier_pinmux_set_one(struct udevice *dev, unsigned pin,
-                                   unsigned muxval)
+                                   int muxval)
 {
        struct uniphier_pinctrl_priv *priv = dev_get_priv(dev);
        unsigned mux_bits, reg_stride, reg, reg_end, shift, mask;
@@ -101,6 +108,9 @@ static void uniphier_pinmux_set_one(struct udevice *dev, unsigned pin,
        /* some pins need input-enabling */
        uniphier_pinconf_input_enable(dev, pin);
 
+       if (muxval < 0)
+               return;         /* dedicated pin; nothing to do for pin-mux */
+
        if (priv->socdata->caps & UNIPHIER_PINCTRL_CAPS_DBGMUX_SEPARATE) {
                /*
                 *  Mode       offset        bit
@@ -173,11 +183,11 @@ int uniphier_pinctrl_probe(struct udevice *dev,
        struct uniphier_pinctrl_priv *priv = dev_get_priv(dev);
        fdt_addr_t addr;
 
-       addr = dev_get_addr(dev);
+       addr = dev_get_addr(dev->parent);
        if (addr == FDT_ADDR_T_NONE)
                return -EINVAL;
 
-       priv->base = map_sysmem(addr, SZ_4K);
+       priv->base = devm_ioremap(dev, addr, SZ_4K);
        if (!priv->base)
                return -ENOMEM;
 
@@ -185,12 +195,3 @@ int uniphier_pinctrl_probe(struct udevice *dev,
 
        return 0;
 }
-
-int uniphier_pinctrl_remove(struct udevice *dev)
-{
-       struct uniphier_pinctrl_priv *priv = dev_get_priv(dev);
-
-       unmap_sysmem(priv->base);
-
-       return 0;
-}