RE: [EXT] Re: [v2] rtc: pcf85363/pcf85263: fix error that failed to run hwclock -w

From: Biwen Li
Date: Mon Aug 26 2019 - 00:29:47 EST


>
> On 8/16/19 10:40 PM, Li Yang wrote:
> > On Fri, Aug 16, 2019 at 11:30 AM Alexandre Belloni
> > <alexandre.belloni@xxxxxxxxxxx> wrote:
> >>
> >> On 16/08/2019 10:50:49-0500, Li Yang wrote:
> >>> On Fri, Aug 16, 2019 at 3:05 AM Alexandre Belloni
> >>> <alexandre.belloni@xxxxxxxxxxx> wrote:
> >>>>
> >>>> On 16/08/2019 10:46:36+0800, Biwen Li wrote:
> >>>>> Issue:
> >>>>> - # hwclock -w
> >>>>> hwclock: RTC_SET_TIME: Invalid argument
> >>>>>
> >>>>> Why:
> >>>>> - Relative patch:
> https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flkml.org
> %2Flkml%2F2019%2F4%2F3%2F55&amp;data=02%7C01%7Cbiwen.li%40nxp.
> com%7Cff8cebc3f1034ae3fa9608d725ff9e5e%7C686ea1d3bc2b4c6fa92cd99
> c5c301635%7C0%7C0%7C637019652111923736&amp;sdata=spY6e22YOkOF
> 3%2BF7crSM0M6xPmOhgULDqMZLQw%2BAmdI%3D&amp;reserved=0 , this
> patch
> >>>>> will always check for unwritable registers, it will compare reg
> >>>>> with max_register in regmap_writeable.
> >>>>>
> >>>>> - In drivers/rtc/rtc-pcf85363.c, CTRL_STOP_EN is 0x2e, but
> DT_100THS
> >>>>> is 0, max_regiter is 0x2f, then reg will be equal to 0x30,
> >>>>> '0x30 < 0x2f' is false,so regmap_writeable will return false.
> >>>>>
> >>>>> - Root cause: the buf[] was written to a wrong place in the file
> >>>>> drivers/rtc/rtc-pcf85363.c
> >>>>>
> >>>>
> >>>> This is not true, the RTC wraps the register accesses properly and
> >>>> this
> >>>
> >>> This performance hack probably deserve some explanation in the code
> >>> comment. :)
> >>>
> >>>> is probably something that should be handled by regmap_writable.
> >>>
> >>> The address wrapping is specific to this RTC chip. Is it also
> >>> commonly used by other I2C devices? I'm not sure if regmap_writable
> >>> should handle the wrapping case if it is too special.
> >>>
> >>
> >> Most of the i2c RTCs do address wrapping which is sometimes the only
> >> way to properly set the time.
> >
> > Adding Mark and Nandor to the loop.
> >
> > Regards,
> > Leo
> >
>
> Hi,
> `regmap` provides couple of ways to validate the registers:
> max_register, callback function and write table. All of these are optional, so it
> gives you the freedom to customize it as needed.
>
> In this situation probably you could:
> 1. Avoid using the wrapping feature of pcf85363 (you can just provide
> separate calls for stop, reset and time confguration). In this way the
> `max_register` validation method will work fine.
Yes, I use this way. Path as follows:
Stop and reset - > set time > stop

> 2. Replace `max_register` method validation with `callback function`
> validation method, were you could make your own validation.
It is not work, show the code in as follows:

bool regmap_writeable(struct regmap *map, unsigned int reg)
{
if (map->max_register && reg > map->max_register)
return false;
Callback function (writeable_reg) will not be called.
if (map->writeable_reg)
return map->writeable_reg(map->dev, reg);

if (map->wr_table)
return regmap_check_range_table(map, reg, map->wr_table);

return true;
}

>
>
> Regards,
> Nandor
>