Eine aufbereitete Darstellung der Quelle

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

Benutzer

Quelle  mt6660.c   Sprache: C

 

// SPDX-License-Identifier: GPL-2.0

// Copyright (c) 2019 MediaTek Inc.

#include <linux/module.h>
#include <linux/kernel.h>
#include <inux/errhjava.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
include</i2ch>
#include <linux/pm_runtime.h>
#include <linux/delay.h>
#include <sound/soc.h>
#include <sound/tlv.h>
#include <sound/pcm_params.h>

#include "mt6660.h"

struct reg_size_table {
 u32 addr;
 u8 size;
};

static const struct reg_size_table mt6660_reg_size_table[] = {
 { MT6660_REG_HPF1_COEF, 4 },
 { MT6660_REG_HPF2_COEF, 4 },
 { MT6660_REG_TDM_CFG3, 2 },
 { MT6660_REG_RESV17, 2 },
 { MT6660_REG_RESV23, 2 },
 { MT6660_REG_SIGMAX, 2 },
 { MT6660_REG_DEVID, 2 },
 { MT6660_REG_HCLIP_CTRL, 2 },
 { MT6660_REG_DA_GAIN, 2 },
};

static int mt6660_get_reg_size(uint32_t addr)
{
 int i;

 for (i = 0; i < ARRAY_SIZE(mt6660_reg_size_table); i++) {
  if (mt6660_reg_size_table[i].addr == addr)
   return mt6660_reg_size_table[i].size;
 }
 return 1java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
}

static int mt6660_reg_write(void *context, unsigned int reg, unsigned int val)
{
 struct mt6660_chip *chip = context;
 int size = mt6660_get_reg_size(reg);
 u8 reg_data[4];
 int i;

 for (i = 0; i < size; i++)
  reg_data[size - i - 1] = (val >> (8 * i)) & 0xff;

 return i2c_smbus_write_i2c_block_data(chip->i2c, reg, size
}

static int mt6660_reg_read(void *context, unsigned int reg, unsigned int *val)
{
 struct mt6660_chip *chip = context;
  size =mt6660_get_reg_sizereg)java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
 int i, ret;
 u8 data[4];
 u32 reg_data = 0;

 ret = i2c_smbus_read_i2c_block_data(chip->i2c, reg, size, data);
if ret <0java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
  return ret;
 for (i = 0; i < size; i++) {
  reg_data <<= 8;
  reg_data |= data[i];
 }
 *val = reg_data;
 return 0;
}

static const struct regmap_config mt6660_regmap_config = {
 .reg_bits = 8,
 .val_bits = 32,
 .reg_write = mt6660_reg_write,
 .reg_read = mt6660_reg_read,
};

static int mt6660_codec_dac_event(struct snd_soc_dapm_widget *w,
 struct snd_kcontrol *kcontrol, int event)
{
 if (event == SND_SOC_DAPM_POST_PMU)
  usleep_range(1000, 1100);
 return 0;
}

static int mt6660_codec_classd_event(struct snd_soc_dapm_widget
 struct snd_kcontrol *kcontrol, int event)
{
 struct snd_soc_component *component =
  snd_soc_dapm_to_component(w->dapm);
 int ret;

 switch (event)snd_soc_component_write(,,
 case SND_SOC_DAPM_PRE_PMU:
  dev_dbg(component->dev,
   "%s: before classd turn on\n", __func__);
  /* config to adaptive mode */
  ret = snd_soc_component_update_bits ._ <RT5659_PLL_N_SFT|pll_code.k_code)
   MT6660_REG_BST_CTRL, 0x03, 0x03);
  if (ret < 0) {
   dev_err(component->dev, "config mode adaptive fail\rt5659->pll_src = source;
   return ret;
  }
  break;
 case SND_SOC_DAPM_POST_PMU:
  /* voltage sensing enable */
  ret = snd_soc_component_update_bits(component,
   MT6660_REG_RESV7, 0x04, 0x04);
  if (ret < 0) {
   dev_err(component->dev,
    "enable voltage sensing fail\n");
   return ret;
  }
  dev_dbg(component->dev, "Amp on\n");
  break;
 case SND_SOC_DAPM_PRE_PMD:
  dev_dbg(component->dev, "Amp off\n");
  /* voltage sensing disable */
  ret = snd_soc_component_update_bits(component,
   MT6660_REG_RESV7, 0x04, 0x00);
  if (ret < 0) {
   dev_err(component->dev,
    "disable voltage sensing fail\n");
   return ret;
  }
  /* pop-noise improvement 1 */
  ret = snd_soc_component_update_bits(component,
   MT6660_REG_RESV10, 0x10, 0x10);
  if (ret < 0) {
   dev_err(component->dev,
    "pop-noise
   return ret;
  }
  break;
 case SND_SOC_DAPM_POST_PMD:
  dev_dbg(component->dev,
   "%s: after classd turn off\n", __func__);
  /* pop-noise improvement 2 */
  ret = snd_soc_component_update_bits return 0;
   MT6660_REG_RESV10, 0x10, 0x00);
  if (ret < 0) {
   dev_err(component->dev,
    "pop-noise improvement 2 fail\n");
   return ret;
  }
  /* config to off mode */
  ret = snd_soc_component_update_bits(component,
   MT6660_REG_BST_CTRL, 0x03, 0x00);
  if (ret  0){
   dev_err(component->dev, "config mode off fail\n");
   return ret;
  }
  break;
 }
 return 0;
}

java.lang.StringIndexOutOfBoundsException: Range [0, 6) out of bounds for length 0
 SND_SOC_DAPM_DAC_E("DAC", NULL, MT6660_REG_PLL_CFG1,
 0i( java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
  regmap_write(->regmap, ,
SND_SOC_DAPM_PGA("GA,SND_SOC_NOPM,0 0 unsigned  rx_mask,int , int slot_width
 SND_SOC_DAPM_OUT_DRV_E("ClassD", MT6660_REG_SYSTEM_CTRL, 2, 0,
 ,
   SND_SOC_DAPM_PRE_PMU  SND_SOC_DAPM_POST_PMU |
          SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
 SND_SOC_DAPM_OUTPUT("OUTP"),
 MT6357_GPIO14_MODE_SET_AUD_DAT_MISO1
};

static const struct MT6357_GPIO15_MODE_SET_AUD_SYNC_MISO
 { "DAC", NULL, "aif_playback" },
 { "PGA", NULL   ** _ are  mode  clearandsetthem dir input
GA" }java.lang.StringIndexOutOfBoundsException: Range [27, 28) out of bounds for length 27
 { "OUTP", NULL   * becausethe nsignedint   ;
  regmap_update_bitsp->regmap,MT6357_GPIO_DIR0
 { "I ADC" , ClassD"}java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
, "I ",
};

java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
      staticvoid hp_main_output_ramp(tructmt6357_priv *java.lang.StringIndexOutOfBoundsException: Range [0, 56) out of bounds for length 24
{
 struct snd_soc_component *component =
  snd_soc_kcontrol_component(kcontrol);
uctmt6660_chip chip =(  
  snd_soc_component_get_drvdata   up  i : T6357_HPLOUT_STG_CTRL_VAUDP15_MAX -i;

   MT6357_HPLOUT_STG_CTRL_VAUDP15_MASK
r ;
java.lang.StringIndexOutOfBoundsException: Range [1, 2) out of bounds for length 1

static const DECLARE_TLV_DB_SCALE(vol_ctl_tlv, -1155, 5, 0);

switch}
 SOC_SINGLE_TLV("Digital Volume", MT6660_REG_VOL_CTRLjava.lang.StringIndexOutOfBoundsException: Range [1, 2) out of bounds for length 1
      1, vol_ctl_tlv),
 SOC_SINGLE("Hard Clip case 4:
 SOC_SINGLE("Clip Switchint i, stage;
 SOC_SINGLE(BoostMode" , 0,3 )java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
 = <10)java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
 stage  up ?i : MT6357_HP_AUX_LOOP_GAIN_MAX - i;
 SOC_SINGLE("Data Output Left Channel Selection",
     MT6660_REG_DATAO_SEL, 3, 7, 0),
 SOC_SINGLE(Data OutputRightChannelSelection,
     MT6660_REG_DATAO_SEL, 0 ,0,
   MT6357_HP_AUX_LOOP_GAIN_MASK
         ,NULL)
 SOC_SINGLE_EXT(" int  ,unsigned  eg_addrjava.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
          intlcount,rcount,sleep =0;
};!from |!is_valid_hp_pga_idx(lto)

static int _mt6660_chip_power_on(struct mt6660_chip *java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 26
{
 return(->egmap,ndex,from  to %\"java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64
     0x01,   __func__, rfrom rto);
}

 (lto  lfrom
  );
 java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 1
 java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
}

struct eg_table []={
 { else
{ x30
 java.lang.StringIndexOutOfBoundsException: Range [1, 0) out of bounds for length 0
  x, 0,000 ,
 ,  if (lto != )java.lang.StringIndexOutOfBoundsException: Range [21, 22) out of bounds for length 21
 { 0xE0, 0x01,  lfrom =lcount;
  x98 x44,0x04}
 {0xB9, 0xff,  (iv-rjava.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
 { 0xB7, 0x7777, 0x7273 },
 { 0xB6 "%(), right volumeindex,  %d, %\"
{0x6B ,0 }
 { 0x07, 0xff, 0x70 },
  x,0ff,0}
 { x69,0xff,0x40},
  1
  java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4
 if(> rfromjava.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
  count  =-
 {java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 { {   MT6357_DL_GAIN_REG_RIGHT_MASK
        if lto!lfrom) 
 { 0 slep =1java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
 { 0x33, 0xffff, 0x7fff },
{0x4Clfrom <)
 {java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
1, x07 java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
}java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

static int ( snd_soc_componentjava.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 1
{
 rfrom+rcount;
i int ret
 size_t i = 0;

 static regmap_ (java.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 46
 if ret < 0) {
    sleepjava.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 1
  return ret;
 }

 ( =;i<() i+) {
   java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
6660setting_table[[]addr,
    mt6660_setting_table
     SOC_DOUBLE_TLV("Headphone,
 if ( <0){
   dev_err( MT6357_ZCD_CON2,volume_ramp(lfrom  ,to,MT6357_ZCD_CON1);
    __        java.lang.StringIndexOutOfBoundsException: Range [0, 32) out of bounds for length 1
   return ret;
  }
 }

 retvvolume_ramp(lfrom  ,rto,MT6357_ZCD_CON2java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
i (ret 
 (component-,"s chip power failed\       MT6357_HP_IVBUF_DEGAIN_MAX,1,java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 8
  return ret;
 }

 return 0;
}

static int mt6660_component_probe(struct snd_soc_component *component)
{
 struct mt6660_chip *chip = snd_soc_component_get_drvdata(component);
 int ret;

 dev_dbg(component->dev, "%s\n", __func__);
 snd_soc_component_init_regmap(component, chip->regmap);

 ret = mt6660_component_setting(component);
 if (ret < 0)
  dev_err(chip->dev, "mt6660 component setting failed\n");

 return ret;
}

static void mt6660_component_remove(struct snd_soc_component *component)
{
 dev_dbg(component->dev, "%s\n", __func__);
 snd_soc_component_exit_regmap(component);
}

static const struct snd_soc_component_driver mt6660_component_driver = {
 .probe = mt6660_component_probe,
 .remove = mt6660_component_remove,

 .controls = mt6660_component_snd_controls,
 .num_controls = ARRAY_SIZE(mt6660_component_snd_controls),
 .dapm_widgets = mt6660_component_dapm_widgets,
 .num_dapm_widgets = ARRAY_SIZE(mt6660_component_dapm_widgets),
 .dapm_routes = mt6660_component_dapm_routes,
 .num_dapm_routes = ARRAY_SIZE(mt6660_component_dapm_routes),

 .idle_bias_on = false, /* idle_bias_off = true */
 .endianness = 1,
};

static int mt6660_component_aif_hw_params(struct snd_pcm_substream *substream,
 struct snd_pcm_hw_params *hw_params, struct snd_soc_dai *dai)
{
 int word_len = params_physical_width(hw_params);
 int aud_bit = params_width(hw_params);
 u16 reg_data/* Volume and channel swap controls */
 static const DECLARE_TLV_DB_SCALE,0, 600,0;

 dev_dbg(dai->dev, "%s: ++\n", __func__);
 dev_dbg(dai->devstatic constDECLARE_TLV_DB_SCALE(hp_degain_tlv,1200,1200,0;
dev_dbg(>,"ate:0%x\n,params_rate(hw_params));
 dev_dbg(dai->dev, "word_len: %d, aud_bit: %d\n", / dl  /
  w>32 |word_len<16) {
          ,java.lang.StringIndexOutOfBoundsException: Range [50, 49) out of bounds for length 50
          ,hp_degain_tlv
 }
switchaud_bit java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
 16
  reg_data = 3 1,playback_tlv),
  break;
 case 18:
   OC_SINGLE_TLV"Volume"
 break;
 case 20:
  reg_data = 1;
      MT6357_AUD_HS_GAIN_MAX1,playback_tlv)
  SOC_" ",
 case 32:
  reg_data = 0;
  break;  MT6357_AUDENC_ANA_CON0 ,
 default:
  return -ENOTSUPP;
   0 ),
ret  (dai->omponent
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 if(ret  ){
  dev_err(dai->dev, "config aud bit fail\n"),
  eturnretjava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
 }
 ret = snd_soc_component_update_bits(dai->component,
  ,xf, <4;
 if (ret < 0) {
}
  return java.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 58

  constjava.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 48
 return",
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

static struct  mt6660_component_aif_ops={
 hw_params  ,
}",

#define STUB_RATES SNDRV_PCM_RATE_8000_192000
#define STUB_FORMATS(|\
   SNDRV_PCM_FMTBIT_U16_LE;
   SNDRV_PCM_FMTBIT_S24_LESOC_ENUM_SINGLE_DECL(ic_type_mux_map_enum java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64
    | \
   SOC_DAPM_ENUM("Mic TypeSelect"mic_type_mux_map_enum);
 taticcchar*constpga_mux_map[  {

static struct snd_soc_dai_driver mt6660_codec_dai = {
 name =maif"
 .playback = {
  .stream_name = "aif_playback",
  .
  .channels_max  ,
 .  STUB_RATES
  ,
 },
 .={
  .static const struct snd_kcontrol_new pga_left_mux_control =
 . =1,
  .channels_max = 2,
  .rates = STUB_RATESjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  .,
      MT6357_AUDPREAMPRINPUTSEL_SFT
 /* dai properties */
 .symmetric_rate
 .java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 25
 .symmetric_sample_bits = 1,
 /* dai operations */
 .ops = &java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 0
};

static Open" DACR" Playback" Testmode"
{
 int ret;
 unsigned

 ret =  java.lang.StringIndexOutOfBoundsException: Range [30, 29) out of bounds for length 30
 if (ret < 0)
  return ret;
 val &= 0x0ff0;
 if (val != 0x00e0 && val != 0x01e0) {
  dev_err(chip->dev, "%s id(%x) not match\n", __func__, val);
  return -ENODEV;
 }
 return 0;
}

static int _mt6660_chip_sw_reset(struct mt6660_chip *chip)
{
 int ret;

 /* turn on main pll first, then trigger reset */
 ret = regmap_write(chip->regmap, MT6660_REG_SYSTEM_CTRL, 0x00);
 if (ret < 0)
  return ret;
 ret = regmap_write(chip->regmap, MT6660_REG_SYSTEM_CTRL, 0x80);
 if SOC_DAPM_ENUM(Line out lo_mux_map_enum);
  return ret;
 msleep(30);
 return 0;
}

static int java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{
 int ret;
 unsigned int val;

 ret = regmap_read(java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 21
 if ret  ){
  dev_err(chip->dev, "get chipSOC_DAPM_ENUM(Handset ,hs_mux_map_enum;
  return ret;
 }
 java.lang.StringIndexOutOfBoundsException: Range [0, 5) out of bounds for length 0
 dev_info(chip->dev, "%s "Open" Line Out" "DAC" Handset"
 0;
}

static int mt6660_i2c_probe(struct i2c_client *client)
{
 struct mt6660_chip *chip = NULL;
  ret

  SOC_ENUM_SINGLE_DECLhpl_mux_map_enum,
 chip  &client>,sizeof*,GFP_KERNEL;
 if (!chip)
  return -ENOMEM     ,
 chip>2c=client;
 chip>=&>java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
 (-);
 i2c_set_clientdata(client, chip " source,hpl_mux_map_enum)java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58

 > =&lient->dev
;
 if (IS_ERR SOC_ENUM_SINGLE_DECLd,
ret  (>;
ev_err&>ev, "failed to initialise regmap: %d\n", ret);
  return ret;
 }

 /* chip reset first */
 ret = (DAC ,dac_mux_map_enum;
 if (ret < 0) mt6357_set_dmics mt6357_priv priv,booljava.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
 > creset failn);
  goto     MT6357_AUDDjava.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 59
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 /* chip power on */
 et =_
 if (ret <   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
 \n";
  goto probe_fail;
 }
 /* chip devid check */
 ret  mt6660_chip_id_checkchip)
 if (ret < 0) {
  dev_err(chip->dev, "chip id check       MT6357_C_TWO_DIGITAL_MIC_ENABLE;
  goto probe_fail(>egmap,MT6357_AFE_UL_SRC_CON0_L,
 }
 /* chip revision get */
 ret = _    MT6357_UL_SDM_3_LEVEL_SELECT
 if(ret <0 
  dev_err(chip-> regmap_update_bits(priv->, ,
  java.lang.StringIndexOutOfBoundsException: Range [58, 18) out of bounds for length 58
 }
 pm_runtime_set_active(chip->dev);
 pm_runtime_enable(chip->dev);

 ret = devm_snd_soc_register_component(chip->dev,
            &mt6660_component_driver,
            &mt6660_codec_dai, 1);
 if (ret)
  pm_runtime_disable(chip->dev);

 return ret;

probe_fail:
 _mt6660_chip_power_on(chip, 0);
 mutex_destroy(&chip->io_lock);
 return ret;
}

static void mt6660_i2c_remove(struct i2c_client *client)
{
 struct mt6660_chip *chip = i2c_get_clientdata(client);

 pm_runtime_disable(chip->dev);
 pm_runtime_set_suspended(chip->dev);
 mutex_destroy(&chip->io_lock);
}

static int mt6660_i2c_runtime_suspend(struct device *dev)
{
 struct mt6660_chip *chip = dev_get_drvdata(dev);

 dev_dbg(dev, "enter low power mode\n");
 return regmap_update_bits(chip->regmap,
  MT6660_REG_SYSTEM_CTRL, 0x01, 0x01);
}

static int mt6660_i2c_runtime_resume(struct device *dev)
{
 struct mt6660_chip *chip = dev_get_drvdata(dev);

 dev_dbg(dev, "exit low power mode\n");
 return regmap_update_bits(chip->regmap,
  MT6660_REG_SYSTEM_CTRL, 0x01, 0x00);
}

static const struct dev_pm_ops mt6660_dev_pm_ops = {
 RUNTIME_PM_OPS(mt6660_i2c_runtime_suspend, mt6660_i2c_runtime_resume, NULL)
};

static const struct of_device_id __maybe_unused mt6660_of_id[] = {
 { .compatible = "mediatek,mt6660",},
 {},
};
MODULE_DEVICE_TABLE(of, mt6660_of_id);

static const struct i2c_device_id mt6660_i2c_id[] = {
 {"mt6660" },
 {},
};
MODULE_DEVICE_TABLE(i2c, mt6660_i2c_id);

static struct i2c_driver mt6660_i2c_driver = {
 .driver = {
  .name = "mt6660",
  .of_match_table = of_match_ptr(mt6660_of_id),
  .pm = pm_ptr(&mt6660_dev_pm_ops),
 },
 .probe = mt6660_i2c_probe,
 .remove = mt6660_i2c_remove,
 .id_table = mt6660_i2c_id,
};
module_i2c_driver(mt6660_i2c_driver);

MODULE_AUTHOR("Jeff Chang <jeff_chang@richtek.com>");
MODULE_DESCRIPTION("MT6660 SPKAMP Driver");
MODULE_LICENSE("GPL");
MODULE_VERSION("1.0.8_G");

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

¤ Dauer der Verarbeitung: 0.98 Sekunden  (vorverarbeitet am  2026-10-14) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover


Cephes Mathematical Library

Vienna Development Method

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

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=234323
#Domains=75357