From: "Bryan O'Donoghue" <pure.logic@nexus-software.ie>
To: "Dan O'Donovan" <dan@emutex.com>,
platform-driver-x86@vger.kernel.org, dvhart@infradead.org
Cc: lee.jones@linaro.org, andriy.shevchenko@linux.intel.com,
mika.westerberg@linux.intel.com, linux-kernel@vger.kernel.org
Subject: Re: [RESEND RFC PATCH 1/5] platform: x86: add driver for UP Board I/O CPLD
Date: Thu, 07 Jul 2016 14:43:36 +0100 [thread overview]
Message-ID: <1467899016.17253.135.camel@nexus-software.ie> (raw)
In-Reply-To: <1467648434-29080-2-git-send-email-dan@emutex.com>
On Mon, 2016-07-04 at 17:07 +0100, Dan O'Donovan wrote:
> +static int cpld_reg_update(struct up_board_cpld *cpld)
> +{
> + u64 dir_reg_verify = 0;
> + int i;
> +
> + /* Reset the CPLD internal counters */
> + gpiod_set_value(cpld->reset_gpio.soc_gpiod, 0);
> + gpiod_set_value(cpld->reset_gpio.soc_gpiod, 1);
> +
> + /*
> + * Update the CPLD dir register
> + * data_in will be sampled on each rising edge of the strobe
> signal
> + */
> + for (i = cpld->dir_reg_size - 1; i >= 0; i--) {
> + gpiod_set_value(cpld->strobe_gpio.soc_gpiod, 0);
> + gpiod_set_value(cpld->data_in_gpio.soc_gpiod,
> + (cpld->dir_reg >> i) & 0x1);
> + gpiod_set_value(cpld->strobe_gpio.soc_gpiod, 1);
> + }
> +
> + /*
> + * Read back and verify the value
> + * data_out will be set on each rising edge of the strobe
> signal
> + */
> + for (i = cpld->dir_reg_size - 1; i >= 0; i--) {
> + int data_out;
> +
> + gpiod_set_value(cpld->strobe_gpio.soc_gpiod, 0);
> + gpiod_set_value(cpld->strobe_gpio.soc_gpiod, 1);
> + data_out = gpiod_get_value(cpld-
> >data_out_gpio.soc_gpiod);
> + dir_reg_verify |= (u64)data_out << i;
> + }
> +
> + if (dir_reg_verify != cpld->dir_reg) {
> + pr_err("CPLD verify error (expected: %llX, actual:
> %llX)\n",
> + cpld->dir_reg, dir_reg_verify);
dev_err();
> + return -EIO;
> + }
> +
> + /* Issue a dummy STB cycle to latch the dir register updates
> */
> + gpiod_set_value(cpld->strobe_gpio.soc_gpiod, 0);
> + gpiod_set_value(cpld->strobe_gpio.soc_gpiod, 1);
> +
> + return 0;
> +}
> +
> +/**
> + * up_board_cpld_reg_set_bit() - update CPLD configuration
> + * @cpld: CPLD internal context info reference
> + * @offset: bit offset in CPLD register to set
> + * @value: boolean value to set in CPLD register bit selected
> by offset
> + *
> + * Return: Returns 0 if successful, or negative error value
> otherwise
> + */
> +static int up_board_cpld_reg_set_bit(struct up_board_cpld *cpld,
> + unsigned int offset, int value)
> +{
> + u64 old_regval;
> + int ret = 0;
> +
> + spin_lock(&cpld->lock);
> +
> + old_regval = cpld->dir_reg;
> +
> + if (value)
> + cpld->dir_reg |= 1ULL << offset;
> + else
> + cpld->dir_reg &= ~(1ULL << offset);
> +
> + /* Only update the CPLD register if it has changed */
> + if (cpld->dir_reg != old_regval)
> + ret = cpld_reg_update(cpld);
> +
> + spin_unlock(&cpld->lock);
Seems to me as though cpld_reg_update() could be quite lengthy. Would a
mutex be a better choice here ?
> +static int up_board_cpld_setup(struct up_board_cpld *cpld)
> +{
> + struct up_board_gpio_info *cpld_gpios[] = {
> + &cpld->strobe_gpio,
> + &cpld->reset_gpio,
> + &cpld->data_in_gpio,
> + &cpld->data_out_gpio,
> + &cpld->oe_gpio,
> + };
> + int i, ret;
> +
> + spin_lock_init(&cpld->lock);
> +
> + /* Initialise the CPLD config input GPIOs as outputs,
> initially low */
> + for (i = 0; i < ARRAY_SIZE(cpld_gpios); i++) {
> + struct up_board_gpio_info *gpio = cpld_gpios[i];
> +
> + ret = up_board_soc_gpio_setup(cpld, gpio);
> + if (ret)
> + return ret;
> +
> + ret = devm_gpio_request_one(cpld->dev, gpio-
> >soc_gpio,
> + gpio->soc_gpio_flags,
> + dev_name(cpld->dev));
> + if (ret)
> + return ret;
> + }
> +
> + /* Load initial CPLD configuration (all pins set for GPIO
> input) */
> + ret = cpld_reg_update(cpld);
> + if (ret) {
devm_gpio_free() ?
---
bod
next prev parent reply other threads:[~2016-07-07 13:43 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1465762392-9205-1-git-send-email-dan@emutex.com>
2016-07-04 16:07 ` [RESEND RFC PATCH 0/5] platform drivers for UP Board Dan O'Donovan
2016-07-04 16:07 ` [RESEND RFC PATCH 1/5] platform: x86: add driver for UP Board I/O CPLD Dan O'Donovan
2016-07-07 13:43 ` Bryan O'Donoghue [this message]
2016-07-08 17:05 ` Bryan O'Donoghue
2016-07-22 20:52 ` Darren Hart
2016-07-22 21:11 ` Paul Gortmaker
2016-07-04 16:07 ` [RESEND RFC PATCH 2/5] platform: x86: add UP Board I/O pinctrl driver Dan O'Donovan
2016-07-04 16:07 ` [RESEND RFC PATCH 3/5] platform: x86: add UP Board I/O gpio driver Dan O'Donovan
2016-07-04 16:07 ` [RESEND RFC PATCH 4/5] platform: x86: add UP Board CPLD LED driver Dan O'Donovan
2016-07-04 16:07 ` [RESEND RFC PATCH 5/5] platform: x86: add platform driver for UP Board Dan O'Donovan
2016-07-07 1:57 ` Bryan O'Donoghue
2016-07-04 16:17 ` [RESEND RFC PATCH 0/5] platform drivers " Andy Shevchenko
2016-09-13 9:42 ` Andy Shevchenko
2016-09-13 9:55 ` Mika Westerberg
2016-09-13 21:51 ` Dan O'Donovan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1467899016.17253.135.camel@nexus-software.ie \
--to=pure.logic@nexus-software.ie \
--cc=andriy.shevchenko@linux.intel.com \
--cc=dan@emutex.com \
--cc=dvhart@infradead.org \
--cc=lee.jones@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mika.westerberg@linux.intel.com \
--cc=platform-driver-x86@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®