// SPDX-License-Identifier: GPL-2.0 /* * MediaTek Pinctrl Moore Driver, which implement the generic dt-binding * pinctrl-bindings.txt for MediaTek SoC. * * Copyright (C) 2017-2018 MediaTek Inc. * Author: Sean Wang <sean.wang@mediatek.com> *
*/
err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_SMT,
!!(arg & 2)); if (err) goto err; break; case PIN_CONFIG_DRIVE_STRENGTH: if (hw->soc->drive_set) {
err = hw->soc->drive_set(hw, desc, arg); if (err) return err;
} else {
err = -ENOTSUPP;
} break; case MTK_PIN_CONFIG_TDSEL: case MTK_PIN_CONFIG_RDSEL:
reg = (param == MTK_PIN_CONFIG_TDSEL) ?
PINCTRL_PIN_REG_TDSEL : PINCTRL_PIN_REG_RDSEL;
err = mtk_hw_set_value(hw, desc, reg, arg); if (err) goto err; break; case MTK_PIN_CONFIG_PU_ADV: case MTK_PIN_CONFIG_PD_ADV: if (hw->soc->adv_pull_set) { bool pullup;
ret = gpiochip_add_data(chip, hw); if (ret < 0) return ret;
/* Just for backward compatible for these old pinctrl nodes without * "gpio-ranges" property. Otherwise, called directly from a * DeviceTree-supported pinctrl driver is DEPRECATED. * Please see Section 2.1 of * Documentation/devicetree/bindings/gpio/gpio.txt on how to * bind pinctrl and gpio drivers via the "gpio-ranges" property.
*/ if (!of_property_present(hw->dev->of_node, "gpio-ranges")) {
ret = gpiochip_add_pin_range(chip, dev_name(hw->dev), 0, 0,
chip->ngpio); if (ret < 0) {
gpiochip_remove(chip); return ret;
}
}
return 0;
}
staticint mtk_build_groups(struct mtk_pinctrl *hw)
{ int err, i;
for (i = 0; i < hw->soc->ngrps; i++) { conststruct group_desc *group = hw->soc->grps + i; conststruct pingroup *grp = &group->grp;
err = pinctrl_generic_add_group(hw->pctrl, grp->name, grp->pins, grp->npins,
group->data); if (err < 0) {
dev_err(hw->dev, "Failed to register group %s\n", grp->name); return err;
}
}
return 0;
}
staticint mtk_build_functions(struct mtk_pinctrl *hw)
{ int i, err;
for (i = 0; i < hw->soc->nfuncs ; i++) { conststruct function_desc *function = hw->soc->funcs + i; conststruct pinfunction *func = &function->func;
err = pinmux_generic_add_pinfunction(hw->pctrl, func,
function->data); if (err < 0) {
dev_err(hw->dev, "Failed to register function %s\n",
func->name); return err;
}
}
hw = devm_kzalloc(&pdev->dev, sizeof(*hw), GFP_KERNEL); if (!hw) return -ENOMEM;
hw->soc = soc;
hw->dev = &pdev->dev;
if (!hw->soc->nbase_names) return dev_err_probe(dev, -EINVAL, "SoC should be assigned at least one register base\n");
hw->base = devm_kmalloc_array(&pdev->dev, hw->soc->nbase_names, sizeof(*hw->base), GFP_KERNEL); if (!hw->base) return -ENOMEM;
for (i = 0; i < hw->soc->nbase_names; i++) {
hw->base[i] = devm_platform_ioremap_resource_byname(pdev,
hw->soc->base_names[i]); if (IS_ERR(hw->base[i])) return PTR_ERR(hw->base[i]);
}
hw->nbase = hw->soc->nbase_names;
spin_lock_init(&hw->lock);
/* Copy from internal struct mtk_pin_desc to register to the core */
pins = devm_kmalloc_array(&pdev->dev, hw->soc->npins, sizeof(*pins),
GFP_KERNEL); if (!pins) return -ENOMEM;
for (i = 0; i < hw->soc->npins; i++) {
pins[i].number = hw->soc->pins[i].number;
pins[i].name = hw->soc->pins[i].name;
}
err = devm_pinctrl_register_and_init(&pdev->dev, &mtk_desc, hw,
&hw->pctrl); if (err) return err;
/* Setup groups descriptions per SoC types */
err = mtk_build_groups(hw); if (err) return dev_err_probe(dev, err, "Failed to build groups\n");
/* Setup functions descriptions per SoC types */
err = mtk_build_functions(hw); if (err) return dev_err_probe(dev, err, "Failed to build functions\n");
/* For able to make pinctrl_claim_hogs, we must not enable pinctrl * until all groups and functions are being added one.
*/
err = pinctrl_enable(hw->pctrl); if (err) return err;
err = mtk_build_eint(hw, pdev); if (err)
dev_warn(&pdev->dev, "Failed to add EINT, but pinctrl still can work\n");
/* Build gpiochip should be after pinctrl_enable is done */
err = mtk_build_gpiochip(hw); if (err) return dev_err_probe(dev, err, "Failed to add gpio_chip\n");
platform_set_drvdata(pdev, hw);
return 0;
}
Messung V0.5
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.17Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.