linux/drivers/rtc/rtc-ds1511.c
<<
lue=.2lue=.2>>lulue=lue=.2 ">lue=.2lue=.2Searchlue=.2Prefs6 .2lulu ">le=.2 26
2 21/*2 22 * An rtc driver for the Dallas DS15112 23 *2 24 * Copyright (C) 2006 Atsushi Nemoto <anemo@mba.ocn.ne.jp>2 25 * Copyright (C) 2007 Andrew Sharp <andy.sharp@lsi.com>2 26 *2 27 * This program is free software; you ca2 redistribute it and/or modify2 28 * it under the terms of the GNU General Public License verstion2 as2 29 * published by the Free Software Founda v2.2 >a> *2 11 * Real time clock driver for the Dallas 1511 chip, which also2 12 * contains a watchdog timer. There is a tiny amount of code that2 13 * platform code could use to mess with the watchdog device a little2 14 * bit, but not a full watchdog driver.2 15 */2 1662 17#include <linux/bcd.h>62 18#include <linux/init.h>62 19#include <linux/kernel.h>62 20#include <linux/gfp.h>62 21#include <linux/delay.h>62 22#include <linux/interrupt.h>62 23#include <linux/rtc.h>62 24#include <linux/platform_device.h>62 25#include <linux/io.h>62 26#include <linux/module.h>62 2762 28#define2DRV_VERSION "0.6"2 2962 30enum2ds1511reg {62 31 DS1511_SEC = 0x0,62 32 DS1511_MIN = 0x1,62 33 DS1511_HOUR = 0x2,62 34 DS1511_DOW = 0x3,62 35 DS1511_DOM = 0x4,62 36 DS1511_MONTH = 0x5,62 37 DS1511_YEAR = 0x6,62 38 DS1511_CENTURY = 0x7,62 39 DS1511_AM1_SEC = 0x8,62 40 DS1511_AM2_MIN = 0x9,62 41 DS1511_AM3_HOUR = 0xa,62 42 DS1511_AM4_DATE = 0xb,62 43 DS1511_WD_MSEC = 0xc,62 44 DS1511_WD_SEC = 0xd,62 45 DS1511_CONTROL_A = 0xe,62 46 DS1511_CONTROL_B = 0xf,62 47 DS1511_RAMADDR_LSB = 0x10,62 48 DS1511_RAMDATA = 0x1362 49};62 5062 51#define2DS1511_BLF1 0x8062 52#define2DS1511_BLF2 0x4062 53#define2DS1511_PRS 0x2062 54#define2DS1511_PAB 0x1062 55#define2DS1511_TDF 0x0862 56#define2DS1511_KSF 0x0462 57#define2DS1511_WDF 0x0262 58#define2DS1511_IRQF 0x0162 59#define2DS1511_TE 0x8062 60#define2DS1511_CS 0x4062 61#define2DS1511_BME 0x2062 62#define2DS1511_TPE 0x1062 63#define2DS1511_TIE 0x0862 64#define2DS1511_KIE 0x0462 65#define2DS1511_WDE 0x0262 66#define2DS1511_WDS 0x0162 67#define2DS1511_RAM_MAX 0xff62 6862 69#define2RTC_CMD DS1511_CONTROL_B62 70#define2RTC_CMD1 DS1511_CONTROL_A62 7162 72#define2RTC_ALARM_SEC DS1511_AM1_SEC62 73#define2RTC_ALARM_MIN DS1511_AM2_MIN62 74#define2RTC_ALARM_HOUR DS1511_AM3_HOUR62 75#define2RTC_ALARM_DATE DS1511_AM4_DATE62 7662 77#define2RTC_SEC DS1511_SEC62 78#define2RTC_MIN DS1511_MIN62 79#define2RTC_HOUR DS1511_HOUR62 80#define2RTC_DOW DS1511_DOW62 81#define2RTC_DOM DS1511_DOM62 82#define2RTC_MON DS1511_MONTH62 83#define2RTC_YEAR DS1511_YEAR62 84#define2RTC_CENTURY DS1511_CENTURY62 8562 86#define2RTC_TIE DS1511_TIE62 87#define2RTC_TE DS1511_TE62 8862 89struct rtc_plat_data {62 90 struct rtc_device *rtc;62 91 void __iomem *ioaddr; /* virtual base address */2 92 int size; /* amount of memory mapped */2 93 int irq;62 94 unsigned int irqen;62 95 int alrm_sec;62 96 int alrm_min;62 97 int alrm_hour;62 98 int alrm_mday;62 99 spinlock_t lock;62100};6210162102static DEFINE_SPINLOCK(ds1511_lock);6210362104static __iomem char *ds1511_base;62105static u32 reg_spacing = 1;6210662107 static noinline void62108rtc_write(uint8_t val, uint32_t reg)62109{62110 writeb(val, ds1511_base + (reg * reg_spacing));62111}6211262113 static inline void62114rtc_write_alarm(uint8_t val, enum2ds1511reg reg)62115{62116 rtc_write((val | 0x80), reg);62117}6211862119 static noinline uint8_t62120rtc_read(enum2ds1511reg reg)62121{62122 return readb(ds1511_base + (reg * reg_spacing));62123}6212462125 static inline void62126rtc_disable_update(void)62127{62128 rtc_write((rtc_read(RTC_CMD) & ~RTC_TE), RTC_CMD);62129}6213062131 static void62132rtc_enable_update(void)62133{62134 rtc_write((rtc_read(RTC_CMD) |2RTC_TE), RTC_CMD);62135}6213662137/*2138 * #define2DS1511_WDOG_RESET_SUPPORT2139 *214 >a> * Uncomment this if you want to use these routines in2141 * some platform code.2142 */2143#ifdef2DS1511_WDOG_RESET_SUPPORT62144/*2145 * just enough code to set the watchdog timer so that it2146 * will reboot the system2147 */2148 void62149ds1511_wdog_set(unsigned long2deciseconds)62150{62151 /*2152 * the wdog timer ca2 take 99.99 seconds2153 */2154 deciseconds %=210000;62155 /*2156 * set the wdog > s in the wdog registers2157 */2158 rtc_write(bin2bcd(deciseconds %2100), DS1511_WD_MSEC);62159 rtc_write(bin2bcd(deciseconds /2100), DS1511_WD_SEC);62160 /*2161 * set wdog enable and wdog 'steering' bit to issue a reset2162 */2163 rtc_write(DS1511_WDE |2DS1511_WDS, RTC_CMD);62164}6216562166 void62167ds1511_wdog_disable(void)62168{62169 /*217 >a> * clear wdog enable and wdog 'steering' bits2171 */2172 rtc_write(rtc_read(RTC_CMD) & ~(DS1511_WDE |2DS1511_WDS), RTC_CMD);62173 /*2174 * clear the wdog counter2175 */2176 rtc_write(0, DS1511_WD_MSEC);62177 rtc_write(0, DS1511_WD_SEC);62178}62179#endif6218062181/*2182 * set the rtc chip's idea of the time.2183 * stupidly, some callers call with year unmolested;2184 * and some call with year = year - 1900. thanks.2185 */2186static int ds1511_rtc_set_time(struct device *dev, struct rtc_time *rtc_tm)62187{62188 u8 mon, day, dow, hrs, min, sec, yrs, cen;62189 unsigned long2flags;6219062191 /*2192 * won't have to change this for a while2193 */2194 if (rtc_tm->tm_year < 1900) {62195 rtc_tm->tm_year += 1900;62196 }6219762198 if (rtc_tm->tm_year < 1970) {62199 return -EINVAL;62200 }62201 yrs = rtc_tm->tm_year %2100;62202 cen = rtc_tm->tm_year /2100;62203 mon = rtc_tm->tm_mon + 1; /* tm_mon starts at zero */2204 day = rtc_tm->tm_mday;62205 dow = rtc_tm->tm_wday & 0x7;2/* automatic BCD */2206 hrs = rtc_tm->tm_hour;62207 min = rtc_tm->tm_min;62208 sec = rtc_tm->tm_sec;6220962210 if ((mon > 12) || (day == 0)) {62211 return -EINVAL;62212 }6221362214 if (day > rtc_month_days(rtc_tm->tm_mon, rtc_tm->tm_year)) {62215 return -EINVAL;62216 }6221762218 if ((hrs >= 24) || (min >= 60) || (sec >= 60)) {62219 return -EINVAL;62220 }6222162222 /*2223 * each register is a different number of > id bits2224 */2225 sec = bin2bcd(sec) & 0x7f;62226 min = bin2bcd(min) & 0x7f;62227 hrs = bin2bcd(hrs) & 0x3f;62228 day = bin2bcd(day) & 0x3f;62229 mon = bin2bcd(mon) & 0x1f;62230 yrs = bin2bcd(yrs) & 0xff;62231 cen = bin2bcd(cen) & 0xff;6223262233 spin_lock_irqsave(&ds1511_lock, flags);62234 rtc_disable_update();62235 rtc_write(cen, RTC_CENTURY);62236 rtc_write(yrs, RTC_YEAR);62237 rtc_write((rtc_read(RTC_MON) & 0xe0) |2mon, RTC_MON);62238 rtc_write(day, RTC_DOM);62239 rtc_write(hrs, RTC_HOUR);62240 rtc_write(min, RTC_MIN);62241 rtc_write(sec, RTC_SEC);62242 rtc_write(dow, RTC_DOW);62243 rtc_enable_update();62244 spin_unlock_irqrestore(&ds1511_lock, flags);6224562246 return 0;62247}6224862249static int ds1511_rtc_read_time(struct device *dev, struct rtc_time *rtc_tm)62250{62251 unsigned int century;62252 unsigned long2flags;6225362254 spin_lock_irqsave(&ds1511_lock, flags);62255 rtc_disable_update();6225662257 rtc_tm->tm_sec = rtc_read(RTC_SEC) & 0x7f;62258 rtc_tm->tm_min = rtc_read(RTC_MIN) & 0x7f;62259 rtc_tm->tm_hour = rtc_read(RTC_HOUR) & 0x3f;62260 rtc_tm->tm_mday = rtc_read(RTC_DOM) & 0x3f;62261 rtc_tm->tm_wday = rtc_read(RTC_DOW) & 0x7;62262 rtc_tm->tm_mon = rtc_read(RTC_MON) & 0x1f;62263 rtc_tm->tm_year = rtc_read(RTC_YEAR) & 0x7f;62264 century = rtc_read(RTC_CENTURY);6226562266 rtc_enable_update();62267 spin_unlock_irqrestore(&ds1511_lock, flags);6226862269 rtc_tm->tm_sec = bcd2bin(rtc_tm->tm_sec);62270 rtc_tm->tm_min = bcd2bin(rtc_tm->tm_min);62271 rtc_tm->tm_hour = bcd2bin(rtc_tm->tm_hour);62272 rtc_tm->tm_mday = bcd2bin(rtc_tm->tm_mday);62273 rtc_tm->tm_wday = bcd2bin(rtc_tm->tm_wday);62274 rtc_tm->tm_mon = bcd2bin(rtc_tm->tm_mon);62275 rtc_tm->tm_year = bcd2bin(rtc_tm->tm_year);62276 century = bcd2bin(century) *2100;6227762278 /*2279 * Account for differences between how the RTC uses the > s228 >a> * and how they are defined in a struct rtc_time;2281 */2282 century += rtc_tm->tm_year;62283 rtc_tm->tm_year = century - 1900;6228462285 rtc_tm->tm_mon--;6228662287 if (rtc_> id_tm(rtc_tm) < 0) {62288 dev_err(dev, "retrieved date/time is not > id.\n"2289 rtc_time_to_tm(0, rtc_tm);62290 }62291 return 0;62292}6229362294/*2295 * write the alarm register settings2296 *2297 * we only have the use to interrupt every second, otherwise2298 * known as the update interrupt, or the interrupt if the whole2299 * date/hours/mins/secs matches. the ds1511 has many more230 >a> * permutations, but the kernel doesn't.2301 */2302 static void62303ds1511_rtc_update_alarm(struct rtc_plat_data *pdata)62304{62305 unsigned long2flags;6230662307 spin_lock_irqsave(&pdata->lock, flags);62308 rtc_write(pdata->alrm_mday < 0 || (pdata->irqen & RTC_UF) ?62309 0x80 : bin2bcd(pdata->alrm_mday) & 0x3f,62310 RTC_ALARM_DATE);62311 rtc_write(pdata->alrm_hour < 0 || (pdata->irqen & RTC_UF) ?62312 0x80 : bin2bcd(pdata->alrm_hour) & 0x3f,62313 RTC_ALARM_HOUR);62314 rtc_write(pdata->alrm_min < 0 || (pdata->irqen & RTC_UF) ?62315 0x80 : bin2bcd(pdata->alrm_min) & 0x7f,62316 RTC_ALARM_MIN);62317 rtc_write(pdata->alrm_sec < 0 || (pdata->irqen & RTC_UF) ?62318 0x80 : bin2bcd(pdata->alrm_sec) & 0x7f,62319 RTC_ALARM_SEC);62320 rtc_write(rtc_read(RTC_CMD) | (pdata->irqen ? RTC_TIE : 0), RTC_CMD);62321 rtc_read(RTC_CMD1); /* clear interrupts */2322 spin_unlock_irqrestore(&pdata->lock, flags);62323}6232462325 static int62326ds1511_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)62327{62328 struct platform_device *pdev = to_platform_device(dev);62329 struct rtc_plat_data *pdata = platform_get_drvdata(pdev);6233062331 if (pdata->irq <= 0)62332 return -EINVAL;6233362334 pdata->alrm_mday = alrm->time.tm_mday;62335 pdata->alrm_hour = alrm->time.tm_hour;62336 pdata->alrm_min = alrm->time.tm_min;62337 pdata->alrm_sec = alrm->time.tm_sec;62338 if (alrm->enabled) {62339 pdata->irqen |= RTC_AF;62340 }62341 ds1511_rtc_update_alarm(pdata);62342 return 0;62343}6234462345 static int62346ds1511_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)62347{62348 struct platform_device *pdev = to_platform_device(dev);62349 struct rtc_plat_data *pdata = platform_get_drvdata(pdev);6235062351 if (pdata->irq <= 0)62352 return -EINVAL;6235362354 alrm->time.tm_mday = pdata->alrm_mday < 0 ? 0 : pdata->alrm_mday;62355 alrm->time.tm_hour = pdata->alrm_hour < 0 ? 0 : pdata->alrm_hour;62356 alrm->time.tm_min = pdata->alrm_min < 0 ? 0 : pdata->alrm_min;62357 alrm->time.tm_sec = pdata->alrm_sec < 0 ? 0 : pdata->alrm_sec;62358 alrm->enabled = (pdata->irqen & RTC_AF) ? 1 : 0;62359 return 0;62360}6236162362 static irqreturn_t62363ds1511_interrupt(int irq, void *dev_id)62364{62365 struct platform_device *pdev = dev_id;62366 struct rtc_plat_data *pdata = platform_get_drvdata(pdev);62367 unsigned long2events = 0;6236862369 spin_lock(&pdata->lock);62370 /*2371 * read and clear interrupt2372 */2373 if (rtc_read(RTC_CMD1) & DS1511_IRQF) {62374 events = RTC_IRQF;62375 if (rtc_read(RTC_ALARM_SEC) & 0x80)62376 events |= RTC_UF;62377 else62378 events |= RTC_AF;62379 if (likely(pdata->rtc))62380 rtc_update_irq(pdata->rtc, 1, events);62381 }62382 spin_unlock(&pdata->lock);62383 return events ? IRQ_HANDLED : IRQ_NONE;62384}6238562386static int ds1511_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)62387{62388 struct platform_device *pdev = to_platform_device(dev);62389 struct rtc_plat_data *pdata = platform_get_drvdata(pdev);6239062391 if (pdata->irq <= 0)62392 return -EINVAL;62393 if (enabled)62394 pdata->irqen |= RTC_AF;62395 else62396 pdata->irqen &= ~RTC_AF;62397 ds1511_rtc_update_alarm(pdata);62398 return 0;62399}6240062401static const struct rtc_class_ops ds1511_rtc_ops = {62402 .read_time = ds1511_rtc_read_time,62403 .set_time = ds1511_rtc_set_time,62404 .read_alarm = ds1511_rtc_read_alarm,62405 .set_alarm = ds1511_rtc_set_alarm,62406 .alarm_irq_enable = ds1511_rtc_alarm_irq_enable,62407};6240862409 static ssize_t62410ds1511_nvram_read(struct file *filp, struct kobject *kobj,62411 struct bin_attribute *ba,62412 char *buf, loff_t pos, size_t size)62413{62414 ssize_t count;6241562416 /*2417 * if count is more tha2 one, turn on "burst" mode2418 * turn it off when you're done2419 */2420 if (size > 1) {62421 rtc_write((rtc_read(RTC_CMD) | DS1511_BME), RTC_CMD);62422 }62423 if (pos > DS1511_RAM_MAX) {62424 pos = DS1511_RAM_MAX;62425 }62426 if (size + pos > DS1511_RAM_MAX + 1) {62427 size = DS1511_RAM_MAX - pos + 1;62428 }62429 rtc_write(pos, DS1511_RAMADDR_LSB);62430 for (count = 0; size > 0; count++, size--) {62431 *buf++ = rtc_read(DS1511_RAMDATA);62432 }62433 if (count > 1) {62434 rtc_write((rtc_read(RTC_CMD) & ~DS1511_BME), RTC_CMD);62435 }62436 return count;62437}6243862439 static ssize_t62440ds1511_nvram_write(struct file *filp, struct kobject *kobj,62441 struct bin_attribute *bin_attr,62442 char *buf, loff_t pos, size_t size)62443{62444 ssize_t count;6244562446 /*2447 * if count is more tha2 one, turn on "burst" mode2448 * turn it off when you're done2449 */2450 if (size > 1) {62451 rtc_write((rtc_read(RTC_CMD) | DS1511_BME), RTC_CMD);62452 }62453 if (pos > DS1511_RAM_MAX) {62454 pos = DS1511_RAM_MAX;62455 }62456 if (size + pos > DS1511_RAM_MAX + 1) {62457 size = DS1511_RAM_MAX - pos + 1;62458 }62459 rtc_write(pos, DS1511_RAMADDR_LSB);62460 for (count = 0; size > 0; count++, size--) {62461 rtc_write(*buf++, DS1511_RAMDATA);62462 }62463 if (count > 1) {62464 rtc_write((rtc_read(RTC_CMD) & ~DS1511_BME), RTC_CMD);62465 }62466 return count;62467}6246862469static struct bin_attribute ds1511_nvram_attr = {62470 .attr = {62471 .nam = "nvram"2472 .mode = S_IRUGO | S_IWUSR,62473 },62474 .size = DS1511_RAM_MAX,62475 .read = ds1511_nvram_read,62476 .write = ds1511_nvram_write,62477};6247862479 static int __devinit62480ds1511_rtc_probe(struct platform_device *pdev)62481{62482 struct rtc_device *rtc;62483 struct resource *res;62484 struct rtc_plat_data *pdata;62485 int ret = 0;6248662487 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);62488 if (!res) {62489 return -ENODEV;62490 }62491 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);62492 if (!pdata)62493 return -ENOMEM;62494 pdata->size = resource_size(res);62495 if (!devm_request_mem_region(&pdev->dev, res->start, pdata->size,62496 pdev->nam ))62497 return -EBUSY;62498 ds1511_base = devm_ioremap(&pdev->dev, res->start, pdata->size);62499 if (!ds1511_base)62500 return -ENOMEM;62501 pdata->ioaddr = ds1511_base;62502 pdata->irq = platform_get_irq(pdev, 0);6250362504 /*2505 * turn on the clock and the crystal, etc.2506 */2507 rtc_write(0, RTC_CMD);62508 rtc_write(0, RTC_CMD1);62509 /*2510 * clear the wdog counter2511 */2512 rtc_write(0, DS1511_WD_MSEC);62513 rtc_write(0, DS1511_WD_SEC);62514 /*2515 * start the clock2516 */2517 rtc_enable_update();6251862519 /*2520 * check for a dying bat-tree2521 */2522 if (rtc_read(RTC_CMD1) & DS1511_BLF1) {62523 dev_warn(&pdev->dev, "voltage-low detected.\n"2524 }6252562526 spin_lock_init(&pdata->lock);62527 platform_set_drvdata(pdev, pdata);62528 /*2529 * if the platform has an interrupt in mind for this device,2530 * then by all means, set it2531 */2532 if (pdata->irq > 0) {62533 rtc_read(RTC_CMD1);62534 if (devm_request_irq(&pdev->dev, pdata->irq, ds1511_interrupt,62535 IRQF_SHARED, pdev->nam , pdev) < 0) {6253662537 dev_warn(&pdev->dev, "interrupt not available.\n"2538 pdata->irq = 0;62539 }6254class="sref">pdata = pos = 2442 5 54 href="+code=rtc_write" class="rtc_read(pdev, nam , pdev->dev, ds1511_rtc_ops = {62443{65a hre54 DS1511_BME)THIS_MODUL>"drivers/rtc/rtc-ds1511.c#L534" id L534" class="lin5" nam L444">2444 5 5a href="+code=ode=devm_request_irIS_ER>S_IWUSR,6code=res" class="sref">rtc))624456<5 href54 rtc))62446 5 54 href="+code=spin_lock_init"ref">pdata->rtc, 1, , 1, 24472448ret = 0;6file *ef="+code=pdev" class="sref">pdev->dev, kobj,6ds1511_nvram_attr = {62449ret = 0;62450 5 55 return -pdata->rtc))62451 5 5 ret = 0;62452 5 562453 5 55drivers/rtc/rtc-ds1511.c#L504" id L504" class="lin5" nam L454">2454 5 5 ref="+code=__devinit" class="srex">__devinit6rivers/rtc/rtc-ds1511.c#L504" id L504" class="lin5" nam L455">2455 5 56platform_device *pdev)62456 5 5f (2457 5 5 rtc_plat_data *pdata = platform_get_drvdata(pdev);62458 5 55drivers/rtc/rtc-ds1511.c#L519" id L519" class="lin5" nam L459">2459 5 5a href="+code=rtc_write" clas ysfs_remov>_a> file *_a> ef="+code=pdev" class="sref">pdev->dev, kobj,6ds1511_nvram_attr = {62460 5 5or (pdata->rtc))62461 5 5 pdata->irq > 0) {62462 5 56 ./*2463 5 5f ( */ 2464 5 5 mment"> */2465 5 56 rtc_write(rtc_read();6RTC_CMD);62466 5 56 rtc_read(RTC_CMD1);62467}65a hre56 24686<5 href56turn 0;62469st5tic s56"drivers/rtc/rtc-ds1511.c#L400" id L400" 5lass="lin5" nam L470">2470 5 57drivers/rtc/rtc-ds1511.c#L401" id L401" 5lass="lin5" nam L471">2471 5 57s="comment"> */2472 5 5 RTC_CMD1" classMODUL>_ALIASRTC_CMD1);6MODUL>_ALIAScode=Ring">"interrupt not avdata2473 5 57drivers/rtc/rtc-ds1511.c#L504" id L504" class="lin5" nam L474">2474 5 5 * *2475 5 5ds1511_rtc_probt ds1511_rtc_probe(struct 2476 5 5_>devm_ioremap_>code=RTC_CMD1" classe(strucremov>ds1511_rtc_probe(strucremov>code)ers/rtc/rtc-ds1511.c#L535" id L535" class="lin5" nam L477">2477};524786<5 href57 nam = "nvram"2479 s5atic 57 }62480 = 2481{65a hre5="drivvers/rtc/rtc-ds1511.c#L478" id L478" 5lass="lin5" nam L482">2482 5 5truct rs/rtc/rtc-ds1511.c#L478" id L478" 5lass="lin5" nam L483">2483 5 5truct ds1511_rtc_alarmodule_ * *(struchds151platform_devicee(struchds151"+covers/rtc/rtc-ds1511.c#L538" id L538" class="lin5" nam L484">2484 5 5truct rs/rtc/rtc-ds1511.c#L538" id L538" class="lin5" nam L485">2485 5 58"interrupt not aAndrew Sharpref=", ey.sharp@lsi. ef="624866<5 href5"drivepdev" class="srMODUL>_DESCRIPTIONS_IWUSR,6_DESCRIPTIONcode=Ring">"interrupt not aDalquo ) {62487 5 5a hrefpdev" class="srMODUL>_LICENS>DS1511_BME)MODUL>_LICENS>code=Ring">"interrupt not aGPL62488 5 5f (! */2485 5 58 2485 ge.net/proobjes/lxf=>LXR 1">2unityF" clan intexperi2471al 5 io"comm85">2485lxf@ ux.node=de
subfooref=> lxf. ux.no kindlys="stedcomm85">2485Redpill L pro ssMODU, provider of L ux 1"nsult t"> oper" n"ns ser hres since 1995.