def_bool y
 
 config GPIO_SH_PFC
-       tristate "SuperH PFC GPIO support"
+       bool "SuperH PFC GPIO support"
        depends on SH_PFC && GPIOLIB
        help
          This enables support for GPIOs within the SoC's pin function
 
 sh-pfc-objs                    = core.o pinctrl.o
+ifeq ($(CONFIG_GPIO_SH_PFC),y)
+sh-pfc-objs                    += gpio.o
+endif
 obj-y                          += sh-pfc.o
-obj-$(CONFIG_GPIO_SH_PFC)      += gpio.o
 
 
        return (gpio_read_raw_reg(dr->mapped_reg, dr->reg_width) >> pos) & 1;
 }
-EXPORT_SYMBOL_GPL(sh_pfc_read_bit);
 
 void sh_pfc_write_bit(struct pinmux_data_reg *dr, unsigned long in_pos,
                      unsigned long value)
 
        gpio_write_raw_reg(dr->mapped_reg, dr->reg_width, dr->reg_shadow);
 }
-EXPORT_SYMBOL_GPL(sh_pfc_write_bit);
 
 static void config_reg_helper(struct sh_pfc *pfc,
                              struct pinmux_cfg_reg *crp,
        *bitp = n;
        return 0;
 }
-EXPORT_SYMBOL_GPL(sh_pfc_get_data_reg);
 
 static int get_config_reg(struct sh_pfc *pfc, pinmux_enum_t enum_id,
                          struct pinmux_cfg_reg **crp,
        pr_err("cannot locate data/mark enum_id for gpio %d\n", gpio);
        return -1;
 }
-EXPORT_SYMBOL_GPL(sh_pfc_gpio_to_enum);
 
 int sh_pfc_config_gpio(struct sh_pfc *pfc, unsigned gpio, int pinmux_type,
                       int cfg_mode)
 
 int register_sh_pfc(struct sh_pfc_platform_data *pdata)
 {
-       int (*initroutine)(struct sh_pfc *) = NULL;
        int ret;
 
        /*
        if (unlikely(ret != 0))
                goto err;
 
+#ifdef CONFIG_GPIO_SH_PFC
        /*
         * Then the GPIO chip
         */
-       initroutine = symbol_request(sh_pfc_register_gpiochip);
-       if (initroutine) {
-               ret = (*initroutine)(&sh_pfc);
-               symbol_put_addr(initroutine);
-
+       ret = sh_pfc_register_gpiochip(&sh_pfc);
+       if (unlikely(ret != 0)) {
                /*
                 * If the GPIO chip fails to come up we still leave the
                 * PFC state as it is, given that there are already
                 * extant users of it that have succeeded by this point.
                 */
-               if (unlikely(ret != 0)) {
-                       pr_notice("failed to init GPIO chip, ignoring...\n");
-                       ret = 0;
-               }
+               pr_notice("failed to init GPIO chip, ignoring...\n");
        }
+#endif
 
        pr_info("%s support registered\n", sh_pfc.pdata->name);
 
 
        return ret;
 }
+
+MODULE_AUTHOR("Magnus Damm, Paul Mundt, Laurent Pinchart");
+MODULE_DESCRIPTION("Pin Control and GPIO driver for SuperH pin function controller");
+MODULE_LICENSE("GPL v2");
 
        unsigned long size;
 };
 
+struct sh_pfc_chip;
+
 struct sh_pfc {
        struct sh_pfc_platform_data *pdata;
        spinlock_t lock;
 
        struct pfc_window *window;
+       struct sh_pfc_chip *gpio;
 };
 
 int sh_pfc_register_gpiochip(struct sh_pfc *pfc);
+int sh_pfc_unregister_gpiochip(struct sh_pfc *pfc);
 
 int sh_pfc_register_pinctrl(struct sh_pfc *pfc);
 
 
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/module.h>
-#include <linux/platform_device.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/sh_pfc.h>
 
        sh_pfc_gpio_setup(chip);
 
        ret = gpiochip_add(&chip->gpio_chip);
-       if (unlikely(ret < 0))
+       if (unlikely(ret < 0)) {
                kfree(chip);
+               return ret;
+       }
+
+       pfc->gpio = chip;
 
        pr_info("%s handling gpio %d -> %d\n",
                pfc->pdata->name, pfc->pdata->first_gpio,
                pfc->pdata->last_gpio);
 
-       return ret;
-}
-EXPORT_SYMBOL_GPL(sh_pfc_register_gpiochip);
-
-static int sh_pfc_gpio_match(struct gpio_chip *gc, void *data)
-{
-       return !!strstr(gc->label, data);
-}
-
-static int sh_pfc_gpio_probe(struct platform_device *pdev)
-{
-       struct sh_pfc_chip *chip;
-       struct gpio_chip *gc;
-
-       gc = gpiochip_find("_pfc", sh_pfc_gpio_match);
-       if (unlikely(!gc)) {
-               pr_err("Cant find gpio chip\n");
-               return -ENODEV;
-       }
-
-       chip = gpio_to_pfc_chip(gc);
-       platform_set_drvdata(pdev, chip);
-
-       pr_info("attaching to GPIO chip %s\n", chip->pfc->pdata->name);
-
        return 0;
 }
 
-static int sh_pfc_gpio_remove(struct platform_device *pdev)
+int sh_pfc_unregister_gpiochip(struct sh_pfc *pfc)
 {
-       struct sh_pfc_chip *chip = platform_get_drvdata(pdev);
+       struct sh_pfc_chip *chip = pfc->gpio;
        int ret;
 
        ret = gpiochip_remove(&chip->gpio_chip);
                return ret;
 
        kfree(chip);
+       pfc->gpio = NULL;
        return 0;
 }
-
-static struct platform_driver sh_pfc_gpio_driver = {
-       .probe          = sh_pfc_gpio_probe,
-       .remove         = sh_pfc_gpio_remove,
-       .driver         = {
-               .name   = KBUILD_MODNAME,
-               .owner  = THIS_MODULE,
-       },
-};
-
-static struct platform_device sh_pfc_gpio_device = {
-       .name           = KBUILD_MODNAME,
-       .id             = -1,
-};
-
-static int __init sh_pfc_gpio_init(void)
-{
-       int rc;
-
-       rc = platform_driver_register(&sh_pfc_gpio_driver);
-       if (likely(!rc)) {
-               rc = platform_device_register(&sh_pfc_gpio_device);
-               if (unlikely(rc))
-                       platform_driver_unregister(&sh_pfc_gpio_driver);
-       }
-
-       return rc;
-}
-
-static void __exit sh_pfc_gpio_exit(void)
-{
-       platform_device_unregister(&sh_pfc_gpio_device);
-       platform_driver_unregister(&sh_pfc_gpio_driver);
-}
-
-module_init(sh_pfc_gpio_init);
-module_exit(sh_pfc_gpio_exit);
-
-MODULE_AUTHOR("Magnus Damm, Paul Mundt");
-MODULE_DESCRIPTION("GPIO driver for SuperH pin function controller");
-MODULE_LICENSE("GPL v2");
-MODULE_ALIAS("platform:pfc-gpio");