Loading drivers/pinctrl/Kconfig +6 −0 Original line number Diff line number Diff line Loading @@ -272,4 +272,10 @@ config PINCTRL_TB10X depends on OF && ARC_PLAT_TB10X select GPIOLIB config PINCTRL_SOMC bool "SoMC pinctrl driver" default n help Select this to enable SoMC pinctrl driver. endmenu drivers/pinctrl/qcom/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -17,3 +17,4 @@ obj-$(CONFIG_PINCTRL_MSM8998) += pinctrl-msm8998.o obj-$(CONFIG_PINCTRL_SDM660) += pinctrl-sdm660.o obj-$(CONFIG_PINCTRL_WCD) += pinctrl-wcd.o obj-$(CONFIG_PINCTRL_LPI) += pinctrl-lpi.o obj-$(CONFIG_PINCTRL_SOMC) += pinctrl-somc.o drivers/pinctrl/qcom/pinctrl-msm.c +26 −1 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ struct msm_pinctrl { DECLARE_BITMAP(dual_edge_irqs, MAX_NR_GPIO); DECLARE_BITMAP(enabled_irqs, MAX_NR_GPIO); DECLARE_BITMAP(disabled_pins, MAX_NR_GPIO); const struct msm_pinctrl_soc_data *soc; void __iomem *regs; Loading Loading @@ -502,8 +503,13 @@ static void msm_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) { unsigned gpio = chip->base; unsigned i; struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip); for (i = 0; i < chip->ngpio; i++, gpio++) { if (test_bit(i, pctrl->disabled_pins)) seq_printf(s, " gpio%d is not accessible.", i); else msm_gpio_dbg_show_one(s, NULL, chip, i, gpio); seq_puts(s, "\n"); } Loading Loading @@ -964,6 +970,8 @@ int msm_pinctrl_probe(struct platform_device *pdev, struct msm_pinctrl *pctrl; struct resource *res; int ret; int disabled_pins_num; const struct device_node *np = pdev->dev.of_node; msm_pinctrl_data = pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL); Loading Loading @@ -999,6 +1007,23 @@ int msm_pinctrl_probe(struct platform_device *pdev, return PTR_ERR(pctrl->pctrl); } disabled_pins_num = of_property_count_u32_elems(np, "disabled-pins"); if (disabled_pins_num > 0) { int i; u32 pin; for (i = 0; i < disabled_pins_num; i++) { of_property_read_u32_index(np, "disabled-pins", i, &pin); if (pin < MAX_NR_GPIO) { set_bit(pin, pctrl->disabled_pins); dev_info(&pdev->dev, "pin %d disabled\n", pin); } else { dev_err(&pdev->dev, "pin %d out of range\n", pin); } } } ret = msm_gpio_init(pctrl); if (ret) { pinctrl_unregister(pctrl->pctrl); Loading drivers/pinctrl/qcom/pinctrl-somc.c 0 → 100644 +101 −0 Original line number Diff line number Diff line /* * Copyright (C) 2015 Sony Mobile Communications Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. */ #include <linux/module.h> #include <linux/platform_device.h> #include <linux/pinctrl/consumer.h> #define PLATFORM_COMMON_DEFAULT "platform_common_default" #define PRODUCT_COMMON_DEFAULT "product_common_default" #define VARIANT_DEFAULT "variant_default" static int somc_pinctrl_probe(struct platform_device *pdev) { struct pinctrl *pin; struct pinctrl_state *plat_default, *prod_default, *variant_default; int ret = 0; pin = devm_pinctrl_get(&pdev->dev); if (IS_ERR(pin)) { dev_err(&pdev->dev, "faild to get pinctrl handle\n"); ret = -EPROBE_DEFER; goto out; }; /* Platform common settings */ plat_default = pinctrl_lookup_state(pin, PLATFORM_COMMON_DEFAULT); if (IS_ERR(plat_default)) { dev_dbg(&pdev->dev, "Can not lookup %s state\n", PLATFORM_COMMON_DEFAULT); } else { ret = pinctrl_select_state(pin, plat_default); if (ret) dev_err(&pdev->dev, "failed to select %s state\n", PLATFORM_COMMON_DEFAULT); } /* Product common settings */ prod_default = pinctrl_lookup_state(pin, PRODUCT_COMMON_DEFAULT); if (IS_ERR(prod_default)) { dev_dbg(&pdev->dev, "Can not lookup %s state\n", PRODUCT_COMMON_DEFAULT); } else { ret = pinctrl_select_state(pin, prod_default); if (ret) dev_err(&pdev->dev, "failed to select %s state\n", PRODUCT_COMMON_DEFAULT); } /* Variant specific settings */ variant_default = pinctrl_lookup_state(pin, VARIANT_DEFAULT); if (IS_ERR(variant_default)) { dev_dbg(&pdev->dev, "Can not lookup %s state\n", VARIANT_DEFAULT); } else { ret = pinctrl_select_state(pin, variant_default); if (ret) dev_err(&pdev->dev, "failed to select %s state\n", VARIANT_DEFAULT); } devm_pinctrl_put(pin); out: return ret; }; static const struct of_device_id somc_pinctrl_dt_match[] = { { .compatible = "somc-pinctrl", }, { }, }; static struct platform_driver somc_pinctrl_drv = { .probe = somc_pinctrl_probe, .driver = { .name = "somc-pinctrl", .owner = THIS_MODULE, .of_match_table = somc_pinctrl_dt_match, }, }; static int __init somc_pinctrl_drv_register(void) { return platform_driver_register(&somc_pinctrl_drv); } arch_initcall(somc_pinctrl_drv_register); static void __exit somc_pinctrl_drv_unregister(void) { platform_driver_unregister(&somc_pinctrl_drv); } module_exit(somc_pinctrl_drv_unregister); MODULE_LICENSE("GPL v2"); Loading
drivers/pinctrl/Kconfig +6 −0 Original line number Diff line number Diff line Loading @@ -272,4 +272,10 @@ config PINCTRL_TB10X depends on OF && ARC_PLAT_TB10X select GPIOLIB config PINCTRL_SOMC bool "SoMC pinctrl driver" default n help Select this to enable SoMC pinctrl driver. endmenu
drivers/pinctrl/qcom/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -17,3 +17,4 @@ obj-$(CONFIG_PINCTRL_MSM8998) += pinctrl-msm8998.o obj-$(CONFIG_PINCTRL_SDM660) += pinctrl-sdm660.o obj-$(CONFIG_PINCTRL_WCD) += pinctrl-wcd.o obj-$(CONFIG_PINCTRL_LPI) += pinctrl-lpi.o obj-$(CONFIG_PINCTRL_SOMC) += pinctrl-somc.o
drivers/pinctrl/qcom/pinctrl-msm.c +26 −1 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ struct msm_pinctrl { DECLARE_BITMAP(dual_edge_irqs, MAX_NR_GPIO); DECLARE_BITMAP(enabled_irqs, MAX_NR_GPIO); DECLARE_BITMAP(disabled_pins, MAX_NR_GPIO); const struct msm_pinctrl_soc_data *soc; void __iomem *regs; Loading Loading @@ -502,8 +503,13 @@ static void msm_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) { unsigned gpio = chip->base; unsigned i; struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip); for (i = 0; i < chip->ngpio; i++, gpio++) { if (test_bit(i, pctrl->disabled_pins)) seq_printf(s, " gpio%d is not accessible.", i); else msm_gpio_dbg_show_one(s, NULL, chip, i, gpio); seq_puts(s, "\n"); } Loading Loading @@ -964,6 +970,8 @@ int msm_pinctrl_probe(struct platform_device *pdev, struct msm_pinctrl *pctrl; struct resource *res; int ret; int disabled_pins_num; const struct device_node *np = pdev->dev.of_node; msm_pinctrl_data = pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL); Loading Loading @@ -999,6 +1007,23 @@ int msm_pinctrl_probe(struct platform_device *pdev, return PTR_ERR(pctrl->pctrl); } disabled_pins_num = of_property_count_u32_elems(np, "disabled-pins"); if (disabled_pins_num > 0) { int i; u32 pin; for (i = 0; i < disabled_pins_num; i++) { of_property_read_u32_index(np, "disabled-pins", i, &pin); if (pin < MAX_NR_GPIO) { set_bit(pin, pctrl->disabled_pins); dev_info(&pdev->dev, "pin %d disabled\n", pin); } else { dev_err(&pdev->dev, "pin %d out of range\n", pin); } } } ret = msm_gpio_init(pctrl); if (ret) { pinctrl_unregister(pctrl->pctrl); Loading
drivers/pinctrl/qcom/pinctrl-somc.c 0 → 100644 +101 −0 Original line number Diff line number Diff line /* * Copyright (C) 2015 Sony Mobile Communications Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. */ #include <linux/module.h> #include <linux/platform_device.h> #include <linux/pinctrl/consumer.h> #define PLATFORM_COMMON_DEFAULT "platform_common_default" #define PRODUCT_COMMON_DEFAULT "product_common_default" #define VARIANT_DEFAULT "variant_default" static int somc_pinctrl_probe(struct platform_device *pdev) { struct pinctrl *pin; struct pinctrl_state *plat_default, *prod_default, *variant_default; int ret = 0; pin = devm_pinctrl_get(&pdev->dev); if (IS_ERR(pin)) { dev_err(&pdev->dev, "faild to get pinctrl handle\n"); ret = -EPROBE_DEFER; goto out; }; /* Platform common settings */ plat_default = pinctrl_lookup_state(pin, PLATFORM_COMMON_DEFAULT); if (IS_ERR(plat_default)) { dev_dbg(&pdev->dev, "Can not lookup %s state\n", PLATFORM_COMMON_DEFAULT); } else { ret = pinctrl_select_state(pin, plat_default); if (ret) dev_err(&pdev->dev, "failed to select %s state\n", PLATFORM_COMMON_DEFAULT); } /* Product common settings */ prod_default = pinctrl_lookup_state(pin, PRODUCT_COMMON_DEFAULT); if (IS_ERR(prod_default)) { dev_dbg(&pdev->dev, "Can not lookup %s state\n", PRODUCT_COMMON_DEFAULT); } else { ret = pinctrl_select_state(pin, prod_default); if (ret) dev_err(&pdev->dev, "failed to select %s state\n", PRODUCT_COMMON_DEFAULT); } /* Variant specific settings */ variant_default = pinctrl_lookup_state(pin, VARIANT_DEFAULT); if (IS_ERR(variant_default)) { dev_dbg(&pdev->dev, "Can not lookup %s state\n", VARIANT_DEFAULT); } else { ret = pinctrl_select_state(pin, variant_default); if (ret) dev_err(&pdev->dev, "failed to select %s state\n", VARIANT_DEFAULT); } devm_pinctrl_put(pin); out: return ret; }; static const struct of_device_id somc_pinctrl_dt_match[] = { { .compatible = "somc-pinctrl", }, { }, }; static struct platform_driver somc_pinctrl_drv = { .probe = somc_pinctrl_probe, .driver = { .name = "somc-pinctrl", .owner = THIS_MODULE, .of_match_table = somc_pinctrl_dt_match, }, }; static int __init somc_pinctrl_drv_register(void) { return platform_driver_register(&somc_pinctrl_drv); } arch_initcall(somc_pinctrl_drv_register); static void __exit somc_pinctrl_drv_unregister(void) { platform_driver_unregister(&somc_pinctrl_drv); } module_exit(somc_pinctrl_drv_unregister); MODULE_LICENSE("GPL v2");