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


Quelle  mux.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Utility to set the DAVINCI MUX register from a table in mux.h
 *
 * Author: Vladimir Barinov, MontaVista Software, Inc. <source@mvista.com>
 *
 * Based on linux/arch/arm/plat-omap/mux.c:
 * Copyright (C) 2003 - 2005 Nokia Corporation
 *
 * Written by Tony Lindgren
 *
 * 2007 (c) MontaVista Software, Inc.
 *
 * Copyright (C) 2008 Texas Instruments.
 */


#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/io.h>
#include <linux/module.h>
#include <linux/spinlock.h>

#include "mux.h"
#include "common.h"

static void __iomem *pinmux_base;

/*
 * Sets the DAVINCI MUX register based on the table
 */

int davinci_cfg_reg(const unsigned long index)
{
 static DEFINE_SPINLOCK(mux_spin_lock);
 struct davinci_soc_info *soc_info = &davinci_soc_info;
 unsigned long flags;
 const struct mux_config *cfg;
 unsigned int reg_orig = 0, reg = 0;
 unsigned int mask, warn = 0;

 if (WARN_ON(!soc_info->pinmux_pins))
  return -ENODEV;

 if (!pinmux_base) {
  pinmux_base = ioremap(soc_info->pinmux_base, SZ_4K);
  if (WARN_ON(!pinmux_base))
   return -ENOMEM;
 }

 if (index >= soc_info->pinmux_pins_num) {
  pr_err("Invalid pin mux index: %lu (%lu)\n",
         index, soc_info->pinmux_pins_num);
  dump_stack();
  return -ENODEV;
 }

 cfg = &soc_info->pinmux_pins[index];

 if (cfg->name == NULL) {
  pr_err("No entry for the specified index\n");
  return -ENODEV;
 }

 /* Update the mux register in question */
 if (cfg->mask) {
  unsigned tmp1, tmp2;

  spin_lock_irqsave(&mux_spin_lock, flags);
  reg_orig = __raw_readl(pinmux_base + cfg->mux_reg);

  mask = (cfg->mask << cfg->mask_offset);
  tmp1 = reg_orig & mask;
  reg = reg_orig & ~mask;

  tmp2 = (cfg->mode << cfg->mask_offset);
  reg |= tmp2;

  if (tmp1 != tmp2)
   warn = 1;

  __raw_writel(reg, pinmux_base + cfg->mux_reg);
  spin_unlock_irqrestore(&mux_spin_lock, flags);
 }

 if (warn) {
#ifdef CONFIG_DAVINCI_MUX_WARNINGS
  pr_warn("initialized %s\n", cfg->name);
#endif
 }

#ifdef CONFIG_DAVINCI_MUX_DEBUG
 if (cfg->debug || warn) {
  pr_warn("Setting register %s\n", cfg->name);
  pr_warn(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
   cfg->mux_reg_name, cfg->mux_reg, reg_orig, reg);
 }
#endif

 return 0;
}

Messung V0.5
C=97 H=100 G=98

¤ Dauer der Verarbeitung: 0.1 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