Hello. Понедельник, 3 марта 2014, 12:11 +01:00 от Richard Genoud <noreply.rgenoud@xxxxxxxxx>: > This patch add some helpers to control modem lines (CTS/RTS/DSR...) via > GPIO. > This will be useful for many boards which have a serial controller that > only handle CTS/RTS pins (or even just RX/TX). > > Signed-off-by: Richard Genoud <richard.genoud@xxxxxxxxx> ... > +struct mctrl_gpios *mctrl_gpio_init(struct device *dev, unsigned int idx) > +{ > + struct mctrl_gpios *gpios; > + enum mctrl_gpio_idx i; > + int err; > + > + gpios = devm_kzalloc(dev, sizeof(*gpios), GFP_KERNEL); > + if (!gpios) > + goto out; if (!gpios) return ERR_PTR(-ENOMEM); > + for (i = 0; i < UART_GPIO_MAX; i++) { > + gpios->gpio[i] = devm_gpiod_get_index(dev, > + mctrl_gpios_desc[i].name, > + idx); > + > + /* > + * The GPIOs are maybe not all filled, > + * this is not an error. > + */ > + if (IS_ERR_OR_NULL(gpios->gpio[i])) > + continue; > + > + if (mctrl_gpios_desc[i].dir_out) > + err = gpiod_direction_output(gpios->gpio[i], 0); > + else > + err = gpiod_direction_input(gpios->gpio[i]); > + if (err) { > + dev_warn(dev, "Unable to set direction for %s GPIO", > + mctrl_gpios_desc[i].name); > + devm_gpiod_put(dev, gpios->gpio[i]); > + gpios->gpio[i] = NULL; > + } > + } > + > +out: > + return gpios; > +} > +EXPORT_SYMBOL_GPL(mctrl_gpio_init); > + > +void mctrl_gpio_free(struct device *dev, struct mctrl_gpios *gpios) > +{ > + enum mctrl_gpio_idx i; > + > + if (!gpios) > + return; > + > + for (i = 0; i < UART_GPIO_MAX; i++) > + if (!IS_ERR_OR_NULL(gpios->gpio[i])) { > + devm_gpiod_put(dev, gpios->gpio[i]); > + gpios->gpio[i] = NULL; No need to NULL this variable. Instead, you should NULL "gpios" entirely at the end of this function. > + } > + devm_kfree(dev, gpios); gpios = NULL; So this will indicate that its no more valid. > +} ... Thanks. --- ��.n��������+%������w��{.n�����{��ǫ����{ay�ʇڙ���f���h������_�(�階�ݢj"��������G����?���&��