Re: [PATCH v3 2/4] mfd: add Gateworks System Controller core driver
From: Tim Harvey
Date: Tue Apr 03 2018 - 13:29:54 EST
On Tue, Apr 3, 2018 at 9:47 AM, Andrew Lunn <andrew@xxxxxxx> wrote:
> On Tue, Apr 03, 2018 at 08:48:27AM -0700, Tim Harvey wrote:
>> On Wed, Mar 28, 2018 at 8:14 AM, Tim Harvey <tharvey@xxxxxxxxxxxxx> wrote:
>> > The Gateworks System Controller (GSC) is an I2C slave controller
>> > implemented with an MSP430 micro-controller whose firmware embeds the
>> > following features:
>> > - I/O expander (16 GPIO's) using PCA955x protocol
>> > - Real Time Clock using DS1672 protocol
>> > - User EEPROM using AT24 protocol
>> > - HWMON using custom protocol
>> > - Interrupt controller with tamper detect, user pushbotton
>> > - Watchdog controller capable of full board power-cycle
>> > - Power Control capable of full board power-cycle
>> >
>> > see http://trac.gateworks.com/wiki/gsc for more details
>> >
>> <snip>
>> > +
>> > +/*
>> > + * gsc_powerdown - API to use GSC to power down board for a specific time
>> > + *
>> > + * secs - number of seconds to remain powered off
>> > + */
>> > +static int gsc_powerdown(struct gsc_dev *gsc, unsigned long secs)
>> > +{
>> > + int ret;
>> > + unsigned char regs[4];
>> > +
>> > + dev_info(&gsc->i2c->dev, "GSC powerdown for %ld seconds\n",
>> > + secs);
>> > + regs[0] = secs & 0xff;
>> > + regs[1] = (secs >> 8) & 0xff;
>> > + regs[2] = (secs >> 16) & 0xff;
>> > + regs[3] = (secs >> 24) & 0xff;
>> > + ret = regmap_bulk_write(gsc->regmap, GSC_TIME_ADD, regs, 4);
>> > +
>> > + return ret;
>> > +}
>>
>> Any feedback on the 'powerdown' sysfs attribute that hooks to this
>> function? This allows the GSC to disable the board primary power
>> supply for 2^32 seconds and is often used to 'reset' the board
>> although it could also be used to put the board in a power down state
>> longer. I'm wondering if there is a more appropriate API for this in
>> the kernel that I don't know about.
>
> Hi Tim
>
> RTC can cause wakeup when an alarm is set. It looks like the DS1672
> does not have this. But you are emulating the DS1672 right? You could
> add a second emulated RTC which does support an alarm? DS3232?
Andrew,
Thanks for the response!
An RTC alarm may indeed be a good route for the overall sleep
functionality I will look into that.
What about the 'reset' functionality? Is there something in the power
supply API for hooking in a GPIO based power switch (in my case it
would be i2c) as I would think that would be common for ATX supplies?
I didn't see anything in Documentation/power.
This is what led me to the restart handler idea. Ultimately when
someone issues a 'reboot' I would like it to use the GSC to
power-cycle the board.
>
>> I would also like to register a restart handler using this but I
>> believe that ARM restart handlers currently can not use I2C - is that
>> correct?
>
> There are plenty which use GPIOs, or UARTs. Not seen any which use
> i2c. What do you think does not work at this point?
I'll have to dig around for the e-mail thread. I recall someone else
trying to implement a restart handler for something hanging off i2c
and the issue was that by the time the (ARM) restart handler got
called interrupts were disabled making i2c unreliable. I have hooked
the ARM restart handler to my GSC powerdown in some kernels and have
had mixed results. When the handler gets called from a clean 'reboot'
things seem fine but if its called from some error condition that
halts the kernel it seems that i2c may not be reliable anymore.
Regards,
Tim