Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/power/reset/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 2 kB image not shown  

Quelle  brcmstb-reboot.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-only
// Copyright (C) 2013 Broadcom Corporation

#include <linux/bitops.h>
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/jiffies.h>
#include <linux/notifier.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/printk.h>
#include <linux/reboot.h>
#include <linux/regmap.h>
#include <linux/smp.h>
#include <linux/mfd/syscon.h>

static struct regmap *regmap;
static u32 rst_src_en;
static u32 sw_mstr_rst;

struct reset_reg_mask {
 u32 rst_src_en_mask;
 u32 sw_mstr_rst_mask;
};

static const struct reset_reg_mask *reset_masks;

static int brcmstb_restart_handler(struct sys_off_data *data)
{
 int rc;
 u32 tmp;

 rc = regmap_write(regmap, rst_src_en, reset_masks->rst_src_en_mask);
 if (rc) {
  pr_err("failed to write rst_src_en (%d)\n", rc);
  return NOTIFY_DONE;
 }

 rc = regmap_read(regmap, rst_src_en, &tmp);
 if (rc) {
  pr_err("failed to read rst_src_en (%d)\n", rc);
  return NOTIFY_DONE;
 }

 rc = regmap_write(regmap, sw_mstr_rst, reset_masks->sw_mstr_rst_mask);
 if (rc) {
  pr_err("failed to write sw_mstr_rst (%d)\n", rc);
  return NOTIFY_DONE;
 }

 rc = regmap_read(regmap, sw_mstr_rst, &tmp);
 if (rc) {
  pr_err("failed to read sw_mstr_rst (%d)\n", rc);
  return NOTIFY_DONE;
 }

 return NOTIFY_DONE;
}

static const struct reset_reg_mask reset_bits_40nm = {
 .rst_src_en_mask = BIT(0),
 .sw_mstr_rst_mask = BIT(0),
};

static const struct reset_reg_mask reset_bits_65nm = {
 .rst_src_en_mask = BIT(3),
 .sw_mstr_rst_mask = BIT(31),
};

static int brcmstb_reboot_probe(struct platform_device *pdev)
{
 int rc;
 struct device_node *np = pdev->dev.of_node;
 unsigned int args[2];

 reset_masks = device_get_match_data(&pdev->dev);
 if (!reset_masks) {
  pr_err("failed to get match data\n");
  return -EINVAL;
 }

 regmap = syscon_regmap_lookup_by_phandle_args(np, "syscon", ARRAY_SIZE(args), args);
 if (IS_ERR(regmap)) {
  pr_err("failed to get syscon phandle\n");
  return -EINVAL;
 }
 rst_src_en = args[0];
 sw_mstr_rst = args[1];

 rc = devm_register_sys_off_handler(&pdev->dev, SYS_OFF_MODE_RESTART,
        128, brcmstb_restart_handler, NULL);
 if (rc)
  dev_err(&pdev->dev,
   "cannot register restart handler (err=%d)\n", rc);

 return rc;
}

static const struct of_device_id of_match[] = {
 { .compatible = "brcm,brcmstb-reboot", .data = &reset_bits_40nm },
 { .compatible = "brcm,bcm7038-reboot", .data = &reset_bits_65nm },
 {},
};

static struct platform_driver brcmstb_reboot_driver = {
 .probe = brcmstb_reboot_probe,
 .driver = {
  .name = "brcmstb-reboot",
  .of_match_table = of_match,
 },
};

static int __init brcmstb_reboot_init(void)
{
 return platform_driver_register(&brcmstb_reboot_driver);
}
subsys_initcall(brcmstb_reboot_init);

Messung V0.5
C=97 H=97 G=96

¤ Dauer der Verarbeitung: 0.3 Sekunden  ¤

*© 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.