brintos

brintos / linux-shallow public Read only

0
0
Text · 5.5 KiB · 4d103ac Raw
188 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3  nubus.h: various definitions and prototypes for NuBus drivers to use.4 5  Originally written by Alan Cox.6 7  Hacked to death by C. Scott Ananian and David Huggins-Daines.8*/9 10#ifndef LINUX_NUBUS_H11#define LINUX_NUBUS_H12 13#include <linux/device.h>14#include <asm/nubus.h>15#include <uapi/linux/nubus.h>16 17struct proc_dir_entry;18struct seq_file;19 20struct nubus_dir {21	unsigned char *base;22	unsigned char *ptr;23	int done;24	int mask;25	struct proc_dir_entry *procdir;26};27 28struct nubus_dirent {29	unsigned char *base;30	unsigned char type;31	__u32 data;	/* Actually 24 bits used */32	int mask;33};34 35struct nubus_board {36	struct device dev;37 38	/* Only 9-E actually exist, though 0-8 are also theoretically39	   possible, and 0 is a special case which represents the40	   motherboard and onboard peripherals (Ethernet, video) */41	int slot;42	/* For slot 0, this is bogus. */43	char name[64];44 45	/* Format block */46	unsigned char *fblock;47	/* Root directory (does *not* always equal fblock + doffset!) */48	unsigned char *directory;49 50	unsigned long slot_addr;51	/* Offset to root directory (sometimes) */52	unsigned long doffset;53	/* Length over which to compute the crc */54	unsigned long rom_length;55	/* Completely useless most of the time */56	unsigned long crc;57	unsigned char rev;58	unsigned char format;59	unsigned char lanes;60 61	/* Directory entry in /proc/bus/nubus */62	struct proc_dir_entry *procdir;63};64 65struct nubus_rsrc {66	struct list_head list;67 68	/* The functional resource ID */69	unsigned char resid;70	/* These are mostly here for convenience; we could always read71	   them from the ROMs if we wanted to */72	unsigned short category;73	unsigned short type;74	unsigned short dr_sw;75	unsigned short dr_hw;76 77	/* Functional directory */78	unsigned char *directory;79	/* Much of our info comes from here */80	struct nubus_board *board;81};82 83/* This is all NuBus functional resources (used to find devices later on) */84extern struct list_head nubus_func_rsrcs;85 86struct nubus_driver {87	struct device_driver driver;88	int (*probe)(struct nubus_board *board);89	void (*remove)(struct nubus_board *board);90};91 92/* Generic NuBus interface functions, modelled after the PCI interface */93#ifdef CONFIG_PROC_FS94extern bool nubus_populate_procfs;95void nubus_proc_init(void);96struct proc_dir_entry *nubus_proc_add_board(struct nubus_board *board);97struct proc_dir_entry *nubus_proc_add_rsrc_dir(struct proc_dir_entry *procdir,98					       const struct nubus_dirent *ent,99					       struct nubus_board *board);100void nubus_proc_add_rsrc_mem(struct proc_dir_entry *procdir,101			     const struct nubus_dirent *ent,102			     unsigned int size);103void nubus_proc_add_rsrc(struct proc_dir_entry *procdir,104			 const struct nubus_dirent *ent);105#else106static inline void nubus_proc_init(void) {}107static inline108struct proc_dir_entry *nubus_proc_add_board(struct nubus_board *board)109{ return NULL; }110static inline111struct proc_dir_entry *nubus_proc_add_rsrc_dir(struct proc_dir_entry *procdir,112					       const struct nubus_dirent *ent,113					       struct nubus_board *board)114{ return NULL; }115static inline void nubus_proc_add_rsrc_mem(struct proc_dir_entry *procdir,116					   const struct nubus_dirent *ent,117					   unsigned int size) {}118static inline void nubus_proc_add_rsrc(struct proc_dir_entry *procdir,119				       const struct nubus_dirent *ent) {}120#endif121 122struct nubus_rsrc *nubus_first_rsrc_or_null(void);123struct nubus_rsrc *nubus_next_rsrc_or_null(struct nubus_rsrc *from);124 125#define for_each_func_rsrc(f) \126	for (f = nubus_first_rsrc_or_null(); f; f = nubus_next_rsrc_or_null(f))127 128#define for_each_board_func_rsrc(b, f) \129	for_each_func_rsrc(f) if (f->board != b) {} else130 131/* These are somewhat more NuBus-specific.  They all return 0 for132   success and -1 for failure, as you'd expect. */133 134/* The root directory which contains the board and functional135   directories */136int nubus_get_root_dir(const struct nubus_board *board,137		       struct nubus_dir *dir);138/* The board directory */139int nubus_get_board_dir(const struct nubus_board *board,140			struct nubus_dir *dir);141/* The functional directory */142int nubus_get_func_dir(const struct nubus_rsrc *fres, struct nubus_dir *dir);143 144/* These work on any directory gotten via the above */145int nubus_readdir(struct nubus_dir *dir,146		  struct nubus_dirent *ent);147int nubus_find_rsrc(struct nubus_dir *dir,148		    unsigned char rsrc_type,149		    struct nubus_dirent *ent);150int nubus_rewinddir(struct nubus_dir *dir);151 152/* Things to do with directory entries */153int nubus_get_subdir(const struct nubus_dirent *ent,154		     struct nubus_dir *dir);155void nubus_get_rsrc_mem(void *dest, const struct nubus_dirent *dirent,156			unsigned int len);157unsigned int nubus_get_rsrc_str(char *dest, const struct nubus_dirent *dirent,158				unsigned int len);159void nubus_seq_write_rsrc_mem(struct seq_file *m,160			      const struct nubus_dirent *dirent,161			      unsigned int len);162unsigned char *nubus_dirptr(const struct nubus_dirent *nd);163 164/* Declarations relating to driver model objects */165int nubus_parent_device_register(void);166int nubus_device_register(struct nubus_board *board);167int nubus_driver_register(struct nubus_driver *ndrv);168void nubus_driver_unregister(struct nubus_driver *ndrv);169int nubus_proc_show(struct seq_file *m, void *data);170 171static inline void nubus_set_drvdata(struct nubus_board *board, void *data)172{173	dev_set_drvdata(&board->dev, data);174}175 176static inline void *nubus_get_drvdata(struct nubus_board *board)177{178	return dev_get_drvdata(&board->dev);179}180 181/* Returns a pointer to the "standard" slot space. */182static inline void *nubus_slot_addr(int slot)183{184	return (void *)(0xF0000000 | (slot << 24));185}186 187#endif /* LINUX_NUBUS_H */188