Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  stpmic1_wdt.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
// Copyright (C) STMicroelectronics 2018
// Author: Pascal Paillet <p.paillet@st.com> for STMicroelectronics.

#include <linux/kernel.h>
#include <linux/mfd/stpmic1.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/regmap.h>
#include <linux/slab.h>
#include <linux/watchdog.h>

/* WATCHDOG CONTROL REGISTER bit */
#define WDT_START  BIT(0)
#define WDT_PING  BIT(1)
#define WDT_START_MASK  BIT(0)
#define WDT_PING_MASK  BIT(1)
#define WDT_STOP  0

#define PMIC_WDT_MIN_TIMEOUT 1
#define PMIC_WDT_MAX_TIMEOUT 256
#define PMIC_WDT_DEFAULT_TIMEOUT 30

static bool nowayout = WATCHDOG_NOWAYOUT;
module_param(nowayout, bool, 0);
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
   __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");

struct stpmic1_wdt {
 struct stpmic1 *pmic;
 struct watchdog_device wdtdev;
};

static int pmic_wdt_start(struct watchdog_device *wdd)
{
 struct stpmic1_wdt *wdt = watchdog_get_drvdata(wdd);

 return regmap_update_bits(wdt->pmic->regmap,
      WCHDG_CR, WDT_START_MASK, WDT_START);
}

static int pmic_wdt_stop(struct watchdog_device *wdd)
{
 struct stpmic1_wdt *wdt = watchdog_get_drvdata(wdd);

 return regmap_update_bits(wdt->pmic->regmap,
      WCHDG_CR, WDT_START_MASK, WDT_STOP);
}

static int pmic_wdt_ping(struct watchdog_device *wdd)
{
 struct stpmic1_wdt *wdt = watchdog_get_drvdata(wdd);

 return regmap_update_bits(wdt->pmic->regmap,
      WCHDG_CR, WDT_PING_MASK, WDT_PING);
}

static int pmic_wdt_set_timeout(struct watchdog_device *wdd,
    unsigned int timeout)
{
 struct stpmic1_wdt *wdt = watchdog_get_drvdata(wdd);

 wdd->timeout = timeout;
 /* timeout is equal to register value + 1 */
 return regmap_write(wdt->pmic->regmap, WCHDG_TIMER_CR, timeout - 1);
}

static const struct watchdog_info pmic_watchdog_info = {
 .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
 .identity = "STPMIC1 PMIC Watchdog",
};

static const struct watchdog_ops pmic_watchdog_ops = {
 .owner = THIS_MODULE,
 .start = pmic_wdt_start,
 .stop = pmic_wdt_stop,
 .ping = pmic_wdt_ping,
 .set_timeout = pmic_wdt_set_timeout,
};

static int pmic_wdt_probe(struct platform_device *pdev)
{
 struct device *dev = &pdev->dev;
 int ret;
 struct stpmic1 *pmic;
 struct stpmic1_wdt *wdt;

 if (!dev->parent)
  return -EINVAL;

 pmic = dev_get_drvdata(dev->parent);
 if (!pmic)
  return -EINVAL;

 wdt = devm_kzalloc(dev, sizeof(struct stpmic1_wdt), GFP_KERNEL);
 if (!wdt)
  return -ENOMEM;

 wdt->pmic = pmic;

 wdt->wdtdev.info = &pmic_watchdog_info;
 wdt->wdtdev.ops = &pmic_watchdog_ops;
 wdt->wdtdev.min_timeout = PMIC_WDT_MIN_TIMEOUT;
 wdt->wdtdev.max_timeout = PMIC_WDT_MAX_TIMEOUT;
 wdt->wdtdev.parent = dev;

 wdt->wdtdev.timeout = PMIC_WDT_DEFAULT_TIMEOUT;
 watchdog_init_timeout(&wdt->wdtdev, 0, dev);

 watchdog_set_nowayout(&wdt->wdtdev, nowayout);
 watchdog_set_drvdata(&wdt->wdtdev, wdt);

 ret = devm_watchdog_register_device(dev, &wdt->wdtdev);
 if (ret)
  return ret;

 dev_dbg(wdt->pmic->dev, "PMIC Watchdog driver probed\n");
 return 0;
}

static const struct of_device_id of_pmic_wdt_match[] = {
 { .compatible = "st,stpmic1-wdt" },
 { },
};

MODULE_DEVICE_TABLE(of, of_pmic_wdt_match);

static struct platform_driver stpmic1_wdt_driver = {
 .probe = pmic_wdt_probe,
 .driver = {
  .name = "stpmic1-wdt",
  .of_match_table = of_pmic_wdt_match,
 },
};
module_platform_driver(stpmic1_wdt_driver);

MODULE_DESCRIPTION("Watchdog driver for STPMIC1 device");
MODULE_AUTHOR("Pascal Paillet ");
MODULE_LICENSE("GPL v2");

Messung V0.5
C=95 H=91 G=92

¤ Dauer der Verarbeitung: 0.12 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge