*参照元 [#a91c5505] #backlinks *説明 [#a39d0300] -パス: [[linux-4.4.1/drivers/pinctrl/core.c]] -FIXME: これは何? --説明 **引数 [#u9fe02d2] -struct pinctrl_desc *pctldesc -- --[[linux-4.4.1/pinctrl_desc]] -struct device *dev -- --[[linux-4.4.1/device]] -void *driver_data -- **返り値 [#he9118b7] -struct pinctrl_dev * -- --[[linux-4.4.1/pinctrl_dev]] **参考 [#e895af3e] *実装 [#of4cb504] /** * pinctrl_register() - register a pin controller device * @pctldesc: descriptor for this pin controller * @dev: parent device for this pin controller * @driver_data: private pin controller data for this pin controller */ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, struct device *dev, void *driver_data) { struct pinctrl_dev *pctldev; int ret; - --[[linux-4.4.1/pinctrl_dev]] if (!pctldesc) return ERR_PTR(-EINVAL); if (!pctldesc->name) return ERR_PTR(-EINVAL); - --[[linux-4.4.1/ERR_PTR()]] pctldev = kzalloc(sizeof(*pctldev), GFP_KERNEL); if (pctldev == NULL) { dev_err(dev, "failed to alloc struct pinctrl_dev\n"); return ERR_PTR(-ENOMEM); } - --[[linux-4.4.1/kzalloc()]] --[[linux-4.4.1/dev_err()]] /* Initialize pin control device struct */ pctldev->owner = pctldesc->owner; pctldev->desc = pctldesc; pctldev->driver_data = driver_data; INIT_RADIX_TREE(&pctldev->pin_desc_tree, GFP_KERNEL); INIT_LIST_HEAD(&pctldev->gpio_ranges); pctldev->dev = dev; mutex_init(&pctldev->mutex); - --[[linux-4.4.1/INIT_RADIX_TREE()]] --[[linux-4.4.1/INIT_LIST_HEAD()]] --[[linux-4.4.1/mutex_init()]] /* check core ops for sanity */ ret = pinctrl_check_ops(pctldev); if (ret) { dev_err(dev, "pinctrl ops lacks necessary functions\n"); goto out_err; } - --[[linux-4.4.1/pinctrl_check_ops()]] /* If we're implementing pinmuxing, check the ops for sanity */ if (pctldesc->pmxops) { ret = pinmux_check_ops(pctldev); if (ret) goto out_err; } - --[[linux-4.4.1/pinmux_check_ops()]] /* If we're implementing pinconfig, check the ops for sanity */ if (pctldesc->confops) { ret = pinconf_check_ops(pctldev); if (ret) goto out_err; } - --[[linux-4.4.1/pinconf_check_ops()]] /* Register all the pins */ dev_dbg(dev, "try to register %d pins ...\n", pctldesc->npins); ret = pinctrl_register_pins(pctldev, pctldesc->pins, pctldesc->npins); if (ret) { dev_err(dev, "error during pin registration\n"); pinctrl_free_pindescs(pctldev, pctldesc->pins, pctldesc->npins); goto out_err; } - --[[linux-4.4.1/dev_dbg()]] --[[linux-4.4.1/pinctrl_register_pins()]] --[[linux-4.4.1/pinctrl_free_pindescs()]] mutex_lock(&pinctrldev_list_mutex); list_add_tail(&pctldev->node, &pinctrldev_list); mutex_unlock(&pinctrldev_list_mutex); - --[[linux-4.4.1/mutex_lock()]] --[[linux-4.4.1/pinctrldev_list_mutex(global)]] --[[linux-4.4.1/list_add_tail()]] --[[linux-4.4.1/pinctrldev_list(global)]] --[[linux-4.4.1/mutex_unlock()]] pctldev->p = pinctrl_get(pctldev->dev); - --[[linux-4.4.1/pinctrl_get()]] if (!IS_ERR(pctldev->p)) { - --[[linux-4.4.1/IS_ERR()]] pctldev->hog_default = pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT); if (IS_ERR(pctldev->hog_default)) { dev_dbg(dev, "failed to lookup the default state\n"); } else { if (pinctrl_select_state(pctldev->p, pctldev->hog_default)) dev_err(dev, "failed to select default state\n"); } - --[[linux-4.4.1/pinctrl_lookup_state()]] --[[linux-4.4.1/IS_ERR()]] --[[linux-4.4.1/dev_dbg()]] --[[linux-4.4.1/pinctrl_select_state()]] pctldev->hog_sleep = pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_SLEEP); if (IS_ERR(pctldev->hog_sleep)) dev_dbg(dev, "failed to lookup the sleep state\n"); } pinctrl_init_device_debugfs(pctldev); - --[[linux-4.4.1/pinctrl_init_device_debugfs()]] return pctldev; out_err: mutex_destroy(&pctldev->mutex); kfree(pctldev); - --[[linux-4.4.1/mutex_destroy()]] --[[linux-4.4.1/kfree()]] return ERR_PTR(ret); } EXPORT_SYMBOL_GPL(pinctrl_register); - --[[linux-4.4.1/EXPORT_SYMBOL_GPL()]] *コメント [#odd7ee6e]