summaryrefslogtreecommitdiffstats
path: root/drivers/hte/hte-tegra194.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hte/hte-tegra194.c')
-rw-r--r--drivers/hte/hte-tegra194.c56
1 files changed, 29 insertions, 27 deletions
diff --git a/drivers/hte/hte-tegra194.c b/drivers/hte/hte-tegra194.c
index 6fe6897047..690eb9be30 100644
--- a/drivers/hte/hte-tegra194.c
+++ b/drivers/hte/hte-tegra194.c
@@ -132,7 +132,7 @@ struct tegra_hte_soc {
const struct tegra_hte_data *prov_data;
struct tegra_hte_line_data *line_data;
struct hte_chip *chip;
- struct gpio_chip *c;
+ struct gpio_device *gdev;
void __iomem *regs;
};
@@ -407,18 +407,21 @@ static int tegra_hte_line_xlate(struct hte_chip *gc,
return -EINVAL;
/*
+ * GPIO consumers can access GPIOs in two ways:
*
- * There are two paths GPIO consumers can take as follows:
- * 1) The consumer (gpiolib-cdev for example) which uses GPIO global
- * number which gets assigned run time.
- * 2) The consumer passing GPIO from the DT which is assigned
- * statically for example by using TEGRA194_AON_GPIO gpio DT binding.
+ * 1) Using the global GPIO numberspace.
+ *
+ * This is the old, now DEPRECATED method and should not be used in
+ * new code. TODO: Check if tegra is even concerned by this.
+ *
+ * 2) Using GPIO descriptors that can be assigned to consumer devices
+ * using device-tree, ACPI or lookup tables.
*
* The code below addresses both the consumer use cases and maps into
* HTE/GTE namespace.
*/
if (gs->prov_data->type == HTE_TEGRA_TYPE_GPIO && !args) {
- line_id = desc->attr.line_id - gs->c->base;
+ line_id = desc->attr.line_id - gpio_device_get_base(gs->gdev);
map = gs->prov_data->map;
map_sz = gs->prov_data->map_sz;
} else if (gs->prov_data->type == HTE_TEGRA_TYPE_GPIO && args) {
@@ -645,7 +648,7 @@ static bool tegra_hte_match_from_linedata(const struct hte_chip *chip,
if (!hte_dev || (hte_dev->prov_data->type != HTE_TEGRA_TYPE_GPIO))
return false;
- return hte_dev->c == gpiod_to_chip(hdesc->attr.line_data);
+ return hte_dev->gdev == gpiod_to_gpio_device(hdesc->attr.line_data);
}
static const struct of_device_id tegra_hte_of_match[] = {
@@ -673,14 +676,11 @@ static void tegra_gte_disable(void *data)
tegra_hte_writel(gs, HTE_TECTRL, 0);
}
-static int tegra_get_gpiochip_from_name(struct gpio_chip *chip, void *data)
+static void tegra_hte_put_gpio_device(void *data)
{
- return !strcmp(chip->label, data);
-}
+ struct gpio_device *gdev = data;
-static int tegra_gpiochip_match(struct gpio_chip *chip, void *data)
-{
- return chip->fwnode == of_node_to_fwnode(data);
+ gpio_device_put(gdev);
}
static int tegra_hte_probe(struct platform_device *pdev)
@@ -728,10 +728,8 @@ static int tegra_hte_probe(struct platform_device *pdev)
return -ENOMEM;
ret = platform_get_irq(pdev, 0);
- if (ret < 0) {
- dev_err_probe(dev, ret, "failed to get irq\n");
+ if (ret < 0)
return ret;
- }
hte_dev->hte_irq = ret;
ret = devm_request_irq(dev, hte_dev->hte_irq, tegra_hte_isr, 0,
dev_name(dev), hte_dev);
@@ -760,8 +758,8 @@ static int tegra_hte_probe(struct platform_device *pdev)
if (of_device_is_compatible(dev->of_node,
"nvidia,tegra194-gte-aon")) {
- hte_dev->c = gpiochip_find("tegra194-gpio-aon",
- tegra_get_gpiochip_from_name);
+ hte_dev->gdev =
+ gpio_device_find_by_label("tegra194-gpio-aon");
} else {
gpio_ctrl = of_parse_phandle(dev->of_node,
"nvidia,gpio-controller",
@@ -772,14 +770,19 @@ static int tegra_hte_probe(struct platform_device *pdev)
return -ENODEV;
}
- hte_dev->c = gpiochip_find(gpio_ctrl,
- tegra_gpiochip_match);
+ hte_dev->gdev =
+ gpio_device_find_by_fwnode(of_fwnode_handle(gpio_ctrl));
of_node_put(gpio_ctrl);
}
- if (!hte_dev->c)
+ if (!hte_dev->gdev)
return dev_err_probe(dev, -EPROBE_DEFER,
"wait for gpio controller\n");
+
+ ret = devm_add_action_or_reset(dev, tegra_hte_put_gpio_device,
+ hte_dev->gdev);
+ if (ret)
+ return ret;
}
hte_dev->chip = gc;
@@ -809,7 +812,7 @@ static int tegra_hte_probe(struct platform_device *pdev)
return 0;
}
-static int __maybe_unused tegra_hte_resume_early(struct device *dev)
+static int tegra_hte_resume_early(struct device *dev)
{
u32 i;
struct tegra_hte_soc *gs = dev_get_drvdata(dev);
@@ -830,7 +833,7 @@ static int __maybe_unused tegra_hte_resume_early(struct device *dev)
return 0;
}
-static int __maybe_unused tegra_hte_suspend_late(struct device *dev)
+static int tegra_hte_suspend_late(struct device *dev)
{
u32 i;
struct tegra_hte_soc *gs = dev_get_drvdata(dev);
@@ -850,15 +853,14 @@ static int __maybe_unused tegra_hte_suspend_late(struct device *dev)
}
static const struct dev_pm_ops tegra_hte_pm = {
- SET_LATE_SYSTEM_SLEEP_PM_OPS(tegra_hte_suspend_late,
- tegra_hte_resume_early)
+ LATE_SYSTEM_SLEEP_PM_OPS(tegra_hte_suspend_late, tegra_hte_resume_early)
};
static struct platform_driver tegra_hte_driver = {
.probe = tegra_hte_probe,
.driver = {
.name = "tegra_hte",
- .pm = &tegra_hte_pm,
+ .pm = pm_sleep_ptr(&tegra_hte_pm),
.of_match_table = tegra_hte_of_match,
},
};