Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 27c730c2 authored by derfelot's avatar derfelot
Browse files

pinctrl: Add Sony pinctrl driver

Taken from Sony 47.2.A.10.107 stock kernel
parent 6ac29dad
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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
+26 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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");
	}
@@ -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);
@@ -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);
+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");