84 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * PC-Speaker driver for Linux4 *5 * Copyright (C) 1993-1997 Michael Beck6 * Copyright (C) 1997-2001 David Woodhouse7 * Copyright (C) 2001-2008 Stas Sergeev8 */9 10#ifndef __PCSP_H__11#define __PCSP_H__12 13#include <linux/hrtimer.h>14#include <linux/i8253.h>15#include <linux/timex.h>16 17#define PCSP_SOUND_VERSION 0x400 /* read 4.00 */18#define PCSP_DEBUG 019 20/* default timer freq for PC-Speaker: 18643 Hz */21#define DIV_18KHZ 6422#define MAX_DIV DIV_18KHZ23#define CALC_DIV(d) (MAX_DIV >> (d))24#define CUR_DIV() CALC_DIV(chip->treble)25#define PCSP_MAX_TREBLE 126 27/* unfortunately, with hrtimers 37KHz does not work very well :( */28#define PCSP_DEFAULT_TREBLE 029#define MIN_DIV (MAX_DIV >> PCSP_MAX_TREBLE)30 31/* wild guess */32#define PCSP_MIN_LPJ 100000033#define PCSP_DEFAULT_SDIV (DIV_18KHZ >> 1)34#define PCSP_DEFAULT_SRATE (PIT_TICK_RATE / PCSP_DEFAULT_SDIV)35#define PCSP_INDEX_INC() (1 << (PCSP_MAX_TREBLE - chip->treble))36#define PCSP_CALC_RATE(i) (PIT_TICK_RATE / CALC_DIV(i))37#define PCSP_RATE() PCSP_CALC_RATE(chip->treble)38#define PCSP_MIN_RATE__1 MAX_DIV/PIT_TICK_RATE39#define PCSP_MAX_RATE__1 MIN_DIV/PIT_TICK_RATE40#define PCSP_MAX_PERIOD_NS (1000000000ULL * PCSP_MIN_RATE__1)41#define PCSP_MIN_PERIOD_NS (1000000000ULL * PCSP_MAX_RATE__1)42#define PCSP_CALC_NS(div) ({ \43 u64 __val = 1000000000ULL * (div); \44 do_div(__val, PIT_TICK_RATE); \45 __val; \46})47#define PCSP_PERIOD_NS() PCSP_CALC_NS(CUR_DIV())48 49#define PCSP_MAX_PERIOD_SIZE (64*1024)50#define PCSP_MAX_PERIODS 51251#define PCSP_BUFFER_SIZE (128*1024)52 53struct snd_pcsp {54 struct snd_card *card;55 struct snd_pcm *pcm;56 struct input_dev *input_dev;57 struct hrtimer timer;58 unsigned short port, irq, dma;59 spinlock_t substream_lock;60 struct snd_pcm_substream *playback_substream;61 unsigned int fmt_size;62 unsigned int is_signed;63 size_t playback_ptr;64 size_t period_ptr;65 atomic_t timer_active;66 int thalf;67 u64 ns_rem;68 unsigned char val61;69 int enable;70 int max_treble;71 int treble;72 int pcspkr;73};74 75extern struct snd_pcsp pcsp_chip;76 77extern enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle);78extern void pcsp_sync_stop(struct snd_pcsp *chip);79 80extern int snd_pcsp_new_pcm(struct snd_pcsp *chip);81extern int snd_pcsp_new_mixer(struct snd_pcsp *chip, int nopcm);82 83#endif84