Linux Audio

Check our new training course

Loading...
v6.8
  1/* SPDX-License-Identifier: GPL-2.0+ */
  2/*
  3 * Driver for Realtek PCI-Express card reader
  4 *
  5 * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
  6 *
 
 
 
 
 
 
 
 
 
 
 
 
 
  7 * Author:
  8 *   Wei WANG (wei_wang@realsil.com.cn)
  9 *   Micky Ching (micky_ching@realsil.com.cn)
 10 */
 11
 12#ifndef __REALTEK_RTSX_H
 13#define __REALTEK_RTSX_H
 14
 15#include <linux/io.h>
 16#include <linux/bitops.h>
 17#include <linux/delay.h>
 18#include <linux/interrupt.h>
 19#include <linux/kernel.h>
 20#include <linux/module.h>
 21#include <linux/moduleparam.h>
 22#include <linux/slab.h>
 23#include <linux/pci.h>
 24#include <linux/mutex.h>
 25#include <linux/cdrom.h>
 26#include <linux/workqueue.h>
 27#include <linux/timer.h>
 28#include <linux/time64.h>
 29
 30#include <scsi/scsi.h>
 31#include <scsi/scsi_cmnd.h>
 32#include <scsi/scsi_device.h>
 33#include <scsi/scsi_devinfo.h>
 34#include <scsi/scsi_eh.h>
 35#include <scsi/scsi_host.h>
 36
 
 
 
 
 37#define CR_DRIVER_NAME		"rts5208"
 38
 
 
 
 39/*
 40 * macros for easy use
 41 */
 42#define wait_timeout_x(task_state, msecs)	\
 43do {						\
 44	set_current_state((task_state));	\
 45	schedule_timeout((msecs) * HZ / 1000);	\
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 46} while (0)
 47#define wait_timeout(msecs)	wait_timeout_x(TASK_INTERRUPTIBLE, (msecs))
 48
 
 49#define STATE_TRANS_NONE	0
 50#define STATE_TRANS_CMD		1
 51#define STATE_TRANS_BUF		2
 52#define STATE_TRANS_SG		3
 53
 54#define TRANS_NOT_READY		0
 55#define TRANS_RESULT_OK		1
 56#define TRANS_RESULT_FAIL	2
 57
 58#define SCSI_LUN(srb)		((srb)->device->lun)
 59
 
 
 60struct rtsx_chip;
 61
 62struct rtsx_dev {
 63	struct pci_dev *pci;
 64
 65	/* pci resources */
 66	unsigned long		addr;
 67	void __iomem		*remap_addr;
 68	int irq;
 69
 70	/* locks */
 71	spinlock_t		reg_lock;
 72
 73	struct task_struct	*ctl_thread;	 /* the control thread   */
 74	struct task_struct	*polling_thread; /* the polling thread   */
 75
 76	/* mutual exclusion and synchronization structures */
 77	struct completion	cmnd_ready;	 /* to sleep thread on	    */
 78	struct completion	control_exit;	 /* control thread exit	    */
 79	struct completion	polling_exit;	 /* polling thread exit	    */
 80	struct completion	notify;		 /* thread begin/end	    */
 81	struct completion	scanning_done;	 /* wait for scan thread    */
 82
 83	wait_queue_head_t	delay_wait;	 /* wait during scan, reset */
 84	struct mutex		dev_mutex;
 85
 86	/* host reserved buffer */
 87	void			*rtsx_resv_buf;
 88	dma_addr_t		rtsx_resv_buf_addr;
 89
 90	char			trans_result;
 91	char			trans_state;
 92
 93	struct completion	*done;
 94	/* Whether interrupt handler should care card cd info */
 95	u32			check_card_cd;
 96
 97	struct rtsx_chip	*chip;
 98};
 99
 
 
100/* Convert between rtsx_dev and the corresponding Scsi_Host */
101static inline struct Scsi_Host *rtsx_to_host(struct rtsx_dev *dev)
102{
103	return container_of((void *)dev, struct Scsi_Host, hostdata);
104}
105
106static inline struct rtsx_dev *host_to_rtsx(struct Scsi_Host *host)
107{
108	return (struct rtsx_dev *)host->hostdata;
109}
110
111#define lock_state(chip)	spin_lock_irq(&((chip)->rtsx->reg_lock))
112#define unlock_state(chip)	spin_unlock_irq(&((chip)->rtsx->reg_lock))
113
114/* struct scsi_cmnd transfer buffer access utilities */
115enum xfer_buf_dir	{TO_XFER_BUF, FROM_XFER_BUF};
116
117#include "rtsx_chip.h"
118#include "rtsx_transport.h"
119#include "rtsx_scsi.h"
120#include "rtsx_card.h"
121#include "rtsx_sys.h"
122#include "general.h"
123
124static inline void rtsx_writel(struct rtsx_chip *chip, u32 reg, u32 value)
125{
126	iowrite32(value, chip->rtsx->remap_addr + reg);
127}
128
129static inline u32 rtsx_readl(struct rtsx_chip *chip, u32 reg)
130{
131	return ioread32(chip->rtsx->remap_addr + reg);
132}
133
134static inline void rtsx_writew(struct rtsx_chip *chip, u32 reg, u16 value)
135{
136	iowrite16(value, chip->rtsx->remap_addr + reg);
137}
138
139static inline u16 rtsx_readw(struct rtsx_chip *chip, u32 reg)
140{
141	return ioread16(chip->rtsx->remap_addr + reg);
 
 
 
 
 
142}
143
144static inline void rtsx_writeb(struct rtsx_chip *chip, u32 reg, u8 value)
145{
146	iowrite8(value, chip->rtsx->remap_addr + reg);
147}
148
149static inline u8 rtsx_readb(struct rtsx_chip *chip, u32 reg)
150{
151	return ioread8((chip)->rtsx->remap_addr + reg);
152}
153
154static inline int rtsx_read_config_byte(struct rtsx_chip *chip, int where, u8 *val)
155{
156	return pci_read_config_byte(chip->rtsx->pci, where, val);
157}
158
159static inline int rtsx_write_config_byte(struct rtsx_chip *chip, int where, u8 val)
160{
161	return pci_write_config_byte(chip->rtsx->pci, where, val);
162}
163
164#endif  /* __REALTEK_RTSX_H */
v3.15
  1/* Driver for Realtek PCI-Express card reader
  2 * Header file
 
  3 *
  4 * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
  5 *
  6 * This program is free software; you can redistribute it and/or modify it
  7 * under the terms of the GNU General Public License as published by the
  8 * Free Software Foundation; either version 2, or (at your option) any
  9 * later version.
 10 *
 11 * This program is distributed in the hope that it will be useful, but
 12 * WITHOUT ANY WARRANTY; without even the implied warranty of
 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 14 * General Public License for more details.
 15 *
 16 * You should have received a copy of the GNU General Public License along
 17 * with this program; if not, see <http://www.gnu.org/licenses/>.
 18 *
 19 * Author:
 20 *   Wei WANG (wei_wang@realsil.com.cn)
 21 *   Micky Ching (micky_ching@realsil.com.cn)
 22 */
 23
 24#ifndef __REALTEK_RTSX_H
 25#define __REALTEK_RTSX_H
 26
 27#include <linux/io.h>
 28#include <linux/bitops.h>
 29#include <linux/delay.h>
 30#include <linux/interrupt.h>
 31#include <linux/kernel.h>
 32#include <linux/module.h>
 33#include <linux/moduleparam.h>
 34#include <linux/slab.h>
 35#include <linux/pci.h>
 36#include <linux/mutex.h>
 37#include <linux/cdrom.h>
 38#include <linux/workqueue.h>
 39#include <linux/timer.h>
 40#include <linux/time.h>
 41
 42#include <scsi/scsi.h>
 43#include <scsi/scsi_cmnd.h>
 44#include <scsi/scsi_device.h>
 45#include <scsi/scsi_devinfo.h>
 46#include <scsi/scsi_eh.h>
 47#include <scsi/scsi_host.h>
 48
 49#include "debug.h"
 50#include "trace.h"
 51#include "general.h"
 52
 53#define CR_DRIVER_NAME		"rts5208"
 54
 55#define pci_get_bus_and_slot(bus, devfn)	\
 56	pci_get_domain_bus_and_slot(0, (bus), (devfn))
 57
 58/*
 59 * macros for easy use
 60 */
 61#define rtsx_writel(chip, reg, value) \
 62	iowrite32(value, (chip)->rtsx->remap_addr + reg)
 63#define rtsx_readl(chip, reg) \
 64	ioread32((chip)->rtsx->remap_addr + reg)
 65#define rtsx_writew(chip, reg, value) \
 66	iowrite16(value, (chip)->rtsx->remap_addr + reg)
 67#define rtsx_readw(chip, reg) \
 68	ioread16((chip)->rtsx->remap_addr + reg)
 69#define rtsx_writeb(chip, reg, value) \
 70	iowrite8(value, (chip)->rtsx->remap_addr + reg)
 71#define rtsx_readb(chip, reg) \
 72	ioread8((chip)->rtsx->remap_addr + reg)
 73
 74#define rtsx_read_config_byte(chip, where, val) \
 75	pci_read_config_byte((chip)->rtsx->pci, where, val)
 76
 77#define rtsx_write_config_byte(chip, where, val) \
 78	pci_write_config_byte((chip)->rtsx->pci, where, val)
 79
 80#define wait_timeout_x(task_state, msecs)		\
 81do {							\
 82		set_current_state((task_state));	\
 83		schedule_timeout((msecs) * HZ / 1000);	\
 84} while (0)
 85#define wait_timeout(msecs)	wait_timeout_x(TASK_INTERRUPTIBLE, (msecs))
 86
 87
 88#define STATE_TRANS_NONE	0
 89#define STATE_TRANS_CMD		1
 90#define STATE_TRANS_BUF		2
 91#define STATE_TRANS_SG		3
 92
 93#define TRANS_NOT_READY		0
 94#define TRANS_RESULT_OK		1
 95#define TRANS_RESULT_FAIL	2
 96
 97#define SCSI_LUN(srb)		((srb)->device->lun)
 98
 99typedef unsigned long DELAY_PARA_T;
100
101struct rtsx_chip;
102
103struct rtsx_dev {
104	struct pci_dev *pci;
105
106	/* pci resources */
107	unsigned long		addr;
108	void __iomem		*remap_addr;
109	int irq;
110
111	/* locks */
112	spinlock_t		reg_lock;
113
114	struct task_struct	*ctl_thread;	 /* the control thread   */
115	struct task_struct	*polling_thread; /* the polling thread   */
116
117	/* mutual exclusion and synchronization structures */
118	struct completion	cmnd_ready;	 /* to sleep thread on	    */
119	struct completion	control_exit;	 /* control thread exit	    */
120	struct completion	polling_exit;	 /* polling thread exit	    */
121	struct completion	notify;		 /* thread begin/end	    */
122	struct completion	scanning_done;	 /* wait for scan thread    */
123
124	wait_queue_head_t	delay_wait;	 /* wait during scan, reset */
125	struct mutex		dev_mutex;
126
127	/* host reserved buffer */
128	void			*rtsx_resv_buf;
129	dma_addr_t		rtsx_resv_buf_addr;
130
131	char			trans_result;
132	char			trans_state;
133
134	struct completion	*done;
135	/* Whether interrupt handler should care card cd info */
136	u32			check_card_cd;
137
138	struct rtsx_chip	*chip;
139};
140
141typedef struct rtsx_dev rtsx_dev_t;
142
143/* Convert between rtsx_dev and the corresponding Scsi_Host */
144static inline struct Scsi_Host *rtsx_to_host(struct rtsx_dev *dev)
145{
146	return container_of((void *) dev, struct Scsi_Host, hostdata);
147}
 
148static inline struct rtsx_dev *host_to_rtsx(struct Scsi_Host *host)
149{
150	return (struct rtsx_dev *) host->hostdata;
151}
152
153static inline void get_current_time(u8 *timeval_buf, int buf_len)
 
 
 
 
 
 
 
 
 
 
 
 
 
154{
155	struct timeval tv;
 
156
157	if (!timeval_buf || (buf_len < 8))
158		return;
 
 
159
160	do_gettimeofday(&tv);
 
 
 
161
162	timeval_buf[0] = (u8)(tv.tv_sec >> 24);
163	timeval_buf[1] = (u8)(tv.tv_sec >> 16);
164	timeval_buf[2] = (u8)(tv.tv_sec >> 8);
165	timeval_buf[3] = (u8)(tv.tv_sec);
166	timeval_buf[4] = (u8)(tv.tv_usec >> 24);
167	timeval_buf[5] = (u8)(tv.tv_usec >> 16);
168	timeval_buf[6] = (u8)(tv.tv_usec >> 8);
169	timeval_buf[7] = (u8)(tv.tv_usec);
170}
171
172/* The scsi_lock() and scsi_unlock() macros protect the sm_state and the
173 * single queue element srb for write access */
174#define scsi_unlock(host)	spin_unlock_irq(host->host_lock)
175#define scsi_lock(host)		spin_lock_irq(host->host_lock)
176
177#define lock_state(chip)	spin_lock_irq(&((chip)->rtsx->reg_lock))
178#define unlock_state(chip)	spin_unlock_irq(&((chip)->rtsx->reg_lock))
 
 
179
180/* struct scsi_cmnd transfer buffer access utilities */
181enum xfer_buf_dir	{TO_XFER_BUF, FROM_XFER_BUF};
 
 
182
183int rtsx_read_pci_cfg_byte(u8 bus, u8 dev, u8 func, u8 offset, u8 *val);
 
 
 
184
185#endif  /* __REALTEK_RTSX_H */