brintos

brintos / linux-shallow public Read only

0
0
Text · 4.1 KiB · ec6f5b0 Raw
165 lines · c
1/* SPDX-License-Identifier: GPL-2.0+ */2/*3 * Driver for Realtek PCI-Express card reader4 *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_H13#define __REALTEK_RTSX_H14 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 use41 */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	050#define STATE_TRANS_CMD		151#define STATE_TRANS_BUF		252#define STATE_TRANS_SG		353 54#define TRANS_NOT_READY		055#define TRANS_RESULT_OK		156#define TRANS_RESULT_FAIL	257 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 */165