spin_lock_init(&pfc->lock);
 
+       if (info->ops && info->ops->init) {
+               ret = info->ops->init(pfc);
+               if (ret < 0)
+                       return ret;
+       }
+
        pinctrl_provide_dummies();
 
        /*
         */
        ret = sh_pfc_register_pinctrl(pfc);
        if (unlikely(ret != 0))
-               return ret;
+               goto error;
 
 #ifdef CONFIG_GPIO_SH_PFC
        /*
        dev_info(pfc->dev, "%s support registered\n", info->name);
 
        return 0;
+
+error:
+       if (info->ops && info->ops->exit)
+               info->ops->exit(pfc);
+       return ret;
 }
 
 static int sh_pfc_remove(struct platform_device *pdev)
 #endif
        sh_pfc_unregister_pinctrl(pfc);
 
+       if (pfc->info->ops && pfc->info->ops->exit)
+               pfc->info->ops->exit(pfc);
+
        platform_set_drvdata(pdev, NULL);
 
        return 0;
 
 struct sh_pfc;
 
 struct sh_pfc_soc_operations {
+       int (*init)(struct sh_pfc *pfc);
+       void (*exit)(struct sh_pfc *pfc);
        unsigned int (*get_bias)(struct sh_pfc *pfc, unsigned int pin);
        void (*set_bias)(struct sh_pfc *pfc, unsigned int pin,
                         unsigned int bias);