2005-04-17 02:20:36 +04:00
/* -*- mode: c; c-basic-offset: 8 -*- */
/*
* MCA device support functions
*
* These functions support the ongoing device access API .
*
* ( C ) 2002 James Bottomley < James . Bottomley @ HansenPartnership . com >
*
* * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* *
* * This program is free software ; you can redistribute it and / or modify
* * it under the terms of the GNU General Public License as published by
* * the Free Software Foundation ; either version 2 of the License , or
* * ( at your option ) any later version .
* *
* * This program is distributed in the hope that it will be useful ,
* * but WITHOUT ANY WARRANTY ; without even the implied warranty of
* * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* * GNU General Public License for more details .
* *
* * You should have received a copy of the GNU General Public License
* * along with this program ; if not , write to the Free Software
* * Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
* *
* * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
# include <linux/module.h>
# include <linux/device.h>
# include <linux/mca.h>
2005-10-31 02:03:48 +03:00
# include <linux/string.h>
2005-04-17 02:20:36 +04:00
/**
* mca_device_read_stored_pos - read POS register from stored data
* @ mca_dev : device to read from
* @ reg : register to read from
*
* Fetch a POS value that was stored at boot time by the kernel
* when it scanned the MCA space . The register value is returned .
* Missing or invalid registers report 0.
*/
unsigned char mca_device_read_stored_pos ( struct mca_device * mca_dev , int reg )
{
if ( reg < 0 | | reg > = 8 )
return 0 ;
return mca_dev - > pos [ reg ] ;
}
EXPORT_SYMBOL ( mca_device_read_stored_pos ) ;
/**
* mca_device_read_pos - read POS register from card
* @ mca_dev : device to read from
* @ reg : register to read from
*
* Fetch a POS value directly from the hardware to obtain the
* current value . This is much slower than
* mca_device_read_stored_pos and may not be invoked from
* interrupt context . It handles the deep magic required for
* onboard devices transparently .
*/
unsigned char mca_device_read_pos ( struct mca_device * mca_dev , int reg )
{
struct mca_bus * mca_bus = to_mca_bus ( mca_dev - > dev . parent ) ;
return mca_bus - > f . mca_read_pos ( mca_dev , reg ) ;
return mca_dev - > pos [ reg ] ;
}
EXPORT_SYMBOL ( mca_device_read_pos ) ;
/**
* mca_device_write_pos - read POS register from card
* @ mca_dev : device to write pos register to
* @ reg : register to write to
* @ byte : byte to write to the POS registers
*
* Store a POS value directly to the hardware . You should not
* normally need to use this function and should have a very good
* knowledge of MCA bus before you do so . Doing this wrongly can
* damage the hardware .
*
* This function may not be used from interrupt context .
*
*/
void mca_device_write_pos ( struct mca_device * mca_dev , int reg ,
unsigned char byte )
{
struct mca_bus * mca_bus = to_mca_bus ( mca_dev - > dev . parent ) ;
mca_bus - > f . mca_write_pos ( mca_dev , reg , byte ) ;
}
EXPORT_SYMBOL ( mca_device_write_pos ) ;
/**
* mca_device_transform_irq - transform the ADF obtained IRQ
* @ mca_device : device whose irq needs transforming
* @ irq : input irq from ADF
*
* MCA Adapter Definition Files ( ADF ) contain irq , ioport , memory
* etc . definitions . In systems with more than one bus , these need
* to be transformed through bus mapping functions to get the real
* system global quantities .
*
* This function transforms the interrupt number and returns the
* transformed system global interrupt
*/
int mca_device_transform_irq ( struct mca_device * mca_dev , int irq )
{
struct mca_bus * mca_bus = to_mca_bus ( mca_dev - > dev . parent ) ;
return mca_bus - > f . mca_transform_irq ( mca_dev , irq ) ;
}
EXPORT_SYMBOL ( mca_device_transform_irq ) ;
/**
* mca_device_transform_ioport - transform the ADF obtained I / O port
* @ mca_device : device whose port needs transforming
* @ ioport : input I / O port from ADF
*
* MCA Adapter Definition Files ( ADF ) contain irq , ioport , memory
* etc . definitions . In systems with more than one bus , these need
* to be transformed through bus mapping functions to get the real
* system global quantities .
*
* This function transforms the I / O port number and returns the
* transformed system global port number .
*
* This transformation can be assumed to be linear for port ranges .
*/
int mca_device_transform_ioport ( struct mca_device * mca_dev , int port )
{
struct mca_bus * mca_bus = to_mca_bus ( mca_dev - > dev . parent ) ;
return mca_bus - > f . mca_transform_ioport ( mca_dev , port ) ;
}
EXPORT_SYMBOL ( mca_device_transform_ioport ) ;
/**
* mca_device_transform_memory - transform the ADF obtained memory
* @ mca_device : device whose memory region needs transforming
* @ mem : memory region start from ADF
*
* MCA Adapter Definition Files ( ADF ) contain irq , ioport , memory
* etc . definitions . In systems with more than one bus , these need
* to be transformed through bus mapping functions to get the real
* system global quantities .
*
* This function transforms the memory region start and returns the
* transformed system global memory region ( physical ) .
*
* This transformation can be assumed to be linear for region ranges .
*/
void * mca_device_transform_memory ( struct mca_device * mca_dev , void * mem )
{
struct mca_bus * mca_bus = to_mca_bus ( mca_dev - > dev . parent ) ;
return mca_bus - > f . mca_transform_memory ( mca_dev , mem ) ;
}
EXPORT_SYMBOL ( mca_device_transform_memory ) ;
/**
* mca_device_claimed - check if claimed by driver
* @ mca_dev : device to check
*
* Returns 1 if the slot has been claimed by a driver
*/
int mca_device_claimed ( struct mca_device * mca_dev )
{
return mca_dev - > driver_loaded ;
}
EXPORT_SYMBOL ( mca_device_claimed ) ;
/**
* mca_device_set_claim - set the claim value of the driver
* @ mca_dev : device to set value for
* @ val : claim value to set ( 1 claimed , 0 unclaimed )
*/
void mca_device_set_claim ( struct mca_device * mca_dev , int val )
{
mca_dev - > driver_loaded = val ;
}
EXPORT_SYMBOL ( mca_device_set_claim ) ;
/**
* mca_device_status - get the status of the device
* @ mca_device : device to get
*
* returns an enumeration of the device status :
*
* MCA_ADAPTER_NORMAL adapter is OK .
* MCA_ADAPTER_NONE no adapter at device ( should never happen ) .
* MCA_ADAPTER_DISABLED adapter is disabled .
* MCA_ADAPTER_ERROR adapter cannot be initialised .
*/
enum MCA_AdapterStatus mca_device_status ( struct mca_device * mca_dev )
{
return mca_dev - > status ;
}
EXPORT_SYMBOL ( mca_device_status ) ;
/**
* mca_device_set_name - set the name of the device
* @ mca_device : device to set the name of
* @ name : name to set
*/
void mca_device_set_name ( struct mca_device * mca_dev , const char * name )
{
if ( ! mca_dev )
return ;
strlcpy ( mca_dev - > name , name , sizeof ( mca_dev - > name ) ) ;
}
EXPORT_SYMBOL ( mca_device_set_name ) ;