u-boot pinctrl_select_state函数


//

/**  * pinctrl_select_state_full() - full implementation of pinctrl_select_state  *  * @dev: peripheral device  * @statename: state name, like "default"  * @return: 0 on success, or negative error code on failure  */ static int pinctrl_select_state_full(struct udevice *dev, const char *statename) {     char propname[32]; /* long enough */     const fdt32_t *list;     uint32_t phandle;     struct udevice *config;     int state, size, i, ret;
    state = dev_read_stringlist_search(dev, "pinctrl-names", statename);     if (state < 0) {         char *end;         /*          * If statename is not found in "pinctrl-names",          * assume statename is just the integer state ID.          */         state = dectoul(statename, &end);         if (*end)             return -EINVAL;     }
    snprintf(propname, sizeof(propname), "pinctrl-%d", state);     list = dev_read_prop(dev, propname, &size);     if (!list)         return -EINVAL;
    size /= sizeof(*list);     for (i = 0; i < size; i++) {         phandle = fdt32_to_cpu(*list++);         ret = uclass_get_device_by_phandle_id(UCLASS_PINCONFIG, phandle,                               &config);         if (ret) {             dev_warn(dev, "%s: uclass_get_device_by_phandle_id: err=%d\n",                 __func__, ret);             continue;         }
        ret = pinctrl_config_one(config);         if (ret) {             dev_warn(dev, "%s: pinctrl_config_one: err=%d\n",                 __func__, ret);             continue;         }     }
    return 0; }       /**  * pinctrl_select_state_simple() - simple implementation of pinctrl_select_state  *  * @dev: peripheral device  * @return: 0 on success, or negative error code on failure  */ static int pinctrl_select_state_simple(struct udevice *dev) {     struct udevice *pctldev;     struct pinctrl_ops *ops;     int ret;
    /*      * For most system, there is only one pincontroller device. But in      * case of multiple pincontroller devices, probe the one with sequence      * number 0 (defined by alias) to avoid race condition.      */     ret = uclass_get_device_by_seq(UCLASS_PINCTRL, 0, &pctldev);     if (ret)         /* if not found, get the first one */         ret = uclass_get_device(UCLASS_PINCTRL, 0, &pctldev);     if (ret)         return ret;
    ops = pinctrl_get_ops(pctldev);     if (!ops->set_state_simple) {         dev_dbg(dev, "set_state_simple op missing\n");         return -ENOSYS;     }
    return ops->set_state_simple(pctldev, dev); }          

相关