2006-10-28 06:08:48 +04:00
/*
* Generic platform device PATA driver
*
2007-11-08 05:15:21 +03:00
* Copyright ( C ) 2006 - 2007 Paul Mundt
2006-10-28 06:08:48 +04:00
*
* Based on pata_pcmcia :
*
2008-10-27 18:09:10 +03:00
* Copyright 2005 - 2006 Red Hat Inc , all rights reserved .
2006-10-28 06:08:48 +04:00
*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*/
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/blkdev.h>
# include <scsi/scsi_host.h>
# include <linux/ata.h>
# include <linux/libata.h>
# include <linux/platform_device.h>
2008-02-02 02:02:30 +03:00
# include <linux/ata_platform.h>
2006-10-28 06:08:48 +04:00
# define DRV_NAME "pata_platform"
2007-11-08 05:15:21 +03:00
# define DRV_VERSION "1.2"
2006-10-28 06:08:48 +04:00
static int pio_mask = 1 ;
2021-03-21 22:55:27 +03:00
module_param ( pio_mask , int , 0 ) ;
MODULE_PARM_DESC ( pio_mask , " PIO modes supported, mode 0 only by default " ) ;
2006-10-28 06:08:48 +04:00
/*
* Provide our own set_mode ( ) as we don ' t want to change anything that has
* already been configured . .
*/
2007-08-06 13:36:23 +04:00
static int pata_platform_set_mode ( struct ata_link * link , struct ata_device * * unused )
2006-10-28 06:08:48 +04:00
{
2007-08-06 13:36:23 +04:00
struct ata_device * dev ;
2006-10-28 06:08:48 +04:00
2008-11-03 14:03:17 +03:00
ata_for_each_dev ( dev , link , ENABLED ) {
/* We don't really care */
dev - > pio_mode = dev - > xfer_mode = XFER_PIO_0 ;
dev - > xfer_shift = ATA_SHIFT_PIO ;
dev - > flags | = ATA_DFLAG_PIO ;
ata: Convert ata_<foo>_printk(KERN_<LEVEL> to ata_<foo>_<level>
Saves text by removing nearly duplicated text format strings by
creating ata_<foo>_printk functions and printf extension %pV.
ata defconfig size shrinks ~5% (~8KB), allyesconfig ~2.5% (~13KB)
Format string duplication comes from:
#define ata_link_printk(link, lv, fmt, args...) do { \
if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link) \
printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id, \
(link)->pmp , ##args); \
else \
printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
} while(0)
Coalesce long formats.
$ size drivers/ata/built-in.*
text data bss dec hex filename
544969 73893 116584 735446 b38d6 drivers/ata/built-in.allyesconfig.ata.o
558429 73893 117864 750186 b726a drivers/ata/built-in.allyesconfig.dev_level.o
141328 14689 4220 160237 271ed drivers/ata/built-in.defconfig.ata.o
149567 14689 4220 168476 2921c drivers/ata/built-in.defconfig.dev_level.o
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
2011-04-16 02:51:59 +04:00
ata_dev_info ( dev , " configured for PIO \n " ) ;
2006-10-28 06:08:48 +04:00
}
2007-01-30 16:23:45 +03:00
return 0 ;
2006-10-28 06:08:48 +04:00
}
2023-03-22 22:53:59 +03:00
static const struct scsi_host_template pata_platform_sht = {
2008-03-25 06:22:49 +03:00
ATA_PIO_SHT ( DRV_NAME ) ,
2006-10-28 06:08:48 +04:00
} ;
static void pata_platform_setup_port ( struct ata_ioports * ioaddr ,
2008-01-09 22:10:22 +03:00
unsigned int shift )
2006-10-28 06:08:48 +04:00
{
/* Fixup the port shift for platforms that need it */
ioaddr - > data_addr = ioaddr - > cmd_addr + ( ATA_REG_DATA < < shift ) ;
ioaddr - > error_addr = ioaddr - > cmd_addr + ( ATA_REG_ERR < < shift ) ;
ioaddr - > feature_addr = ioaddr - > cmd_addr + ( ATA_REG_FEATURE < < shift ) ;
ioaddr - > nsect_addr = ioaddr - > cmd_addr + ( ATA_REG_NSECT < < shift ) ;
ioaddr - > lbal_addr = ioaddr - > cmd_addr + ( ATA_REG_LBAL < < shift ) ;
ioaddr - > lbam_addr = ioaddr - > cmd_addr + ( ATA_REG_LBAM < < shift ) ;
ioaddr - > lbah_addr = ioaddr - > cmd_addr + ( ATA_REG_LBAH < < shift ) ;
ioaddr - > device_addr = ioaddr - > cmd_addr + ( ATA_REG_DEVICE < < shift ) ;
ioaddr - > status_addr = ioaddr - > cmd_addr + ( ATA_REG_STATUS < < shift ) ;
ioaddr - > command_addr = ioaddr - > cmd_addr + ( ATA_REG_CMD < < shift ) ;
}
/**
2008-01-09 22:10:22 +03:00
* __pata_platform_probe - attach a platform interface
* @ dev : device
* @ io_res : Resource representing I / O base
* @ ctl_res : Resource representing CTL base
* @ irq_res : Resource representing IRQ and its flags
* @ ioport_shift : I / O port shift
* @ __pio_mask : PIO mask
2015-01-29 02:30:30 +03:00
* @ sht : scsi_host_template to use when registering
2019-01-19 07:52:01 +03:00
* @ use16bit : Flag to indicate 16 - bit IO instead of 32 - bit
2006-10-28 06:08:48 +04:00
*
* Register a platform bus IDE interface . Such interfaces are PIO and we
* assume do not support IRQ sharing .
*
2007-11-08 05:15:21 +03:00
* Platform devices are expected to contain at least 2 resources per port :
2006-10-28 06:08:48 +04:00
*
* - I / O Base ( IORESOURCE_IO or IORESOURCE_MEM )
* - CTL Base ( IORESOURCE_IO or IORESOURCE_MEM )
2007-11-08 05:15:21 +03:00
*
* and optionally :
*
2006-10-28 06:08:48 +04:00
* - IRQ ( IORESOURCE_IRQ )
*
* If the base resources are both mem types , the ioremap ( ) is handled
* here . For IORESOURCE_IO , it ' s assumed that there ' s no remapping
* necessary .
2007-11-08 05:15:21 +03:00
*
* If no IRQ resource is present , PIO polling mode is used instead .
2006-10-28 06:08:48 +04:00
*/
2012-12-22 01:19:58 +04:00
int __pata_platform_probe ( struct device * dev , struct resource * io_res ,
struct resource * ctl_res , struct resource * irq_res ,
2015-01-29 02:30:30 +03:00
unsigned int ioport_shift , int __pio_mask ,
2023-03-22 22:53:59 +03:00
const struct scsi_host_template * sht , bool use16bit )
2006-10-28 06:08:48 +04:00
{
libata: convert the remaining PATA drivers to new init model
Convert pdc_adma, pata_cs5520, pata_isapnp, pata_ixp4xx_cf,
pata_legacy, pata_mpc52xx, pata_mpiix, pata_pcmcia, pata_pdc2027x,
pata_platform, pata_qdi, pata_scc and pata_winbond to new init model.
* init_one()'s now follow more consistent init order
* cs5520 now registers one host with two ports, not two hosts. If any
of the two ports are disabled, it's made dummy as other drivers do.
Tested pdc_adma and pata_legacy. Both are as broken as before. The
rest are compile tested only.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
2007-04-17 18:44:08 +04:00
struct ata_host * host ;
struct ata_port * ap ;
2006-10-28 06:08:48 +04:00
unsigned int mmio ;
2008-01-09 22:10:22 +03:00
int irq = 0 ;
int irq_flags = 0 ;
2006-10-28 06:08:48 +04:00
/*
* Check for MMIO
*/
mmio = ( ( io_res - > flags = = IORESOURCE_MEM ) & &
( ctl_res - > flags = = IORESOURCE_MEM ) ) ;
2007-11-08 05:15:21 +03:00
/*
* And the IRQ
*/
2008-01-09 22:10:22 +03:00
if ( irq_res & & irq_res - > start > 0 ) {
irq = irq_res - > start ;
2019-01-19 07:52:02 +03:00
irq_flags = ( irq_res - > flags & IRQF_TRIGGER_MASK ) | IRQF_SHARED ;
2008-01-09 22:10:22 +03:00
}
2007-11-08 05:15:21 +03:00
2006-10-28 06:08:48 +04:00
/*
* Now that that ' s out of the way , wire up the port . .
*/
2008-01-09 22:10:22 +03:00
host = ata_host_alloc ( dev , 1 ) ;
libata: convert the remaining PATA drivers to new init model
Convert pdc_adma, pata_cs5520, pata_isapnp, pata_ixp4xx_cf,
pata_legacy, pata_mpc52xx, pata_mpiix, pata_pcmcia, pata_pdc2027x,
pata_platform, pata_qdi, pata_scc and pata_winbond to new init model.
* init_one()'s now follow more consistent init order
* cs5520 now registers one host with two ports, not two hosts. If any
of the two ports are disabled, it's made dummy as other drivers do.
Tested pdc_adma and pata_legacy. Both are as broken as before. The
rest are compile tested only.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
2007-04-17 18:44:08 +04:00
if ( ! host )
return - ENOMEM ;
ap = host - > ports [ 0 ] ;
2019-01-19 07:52:01 +03:00
ap - > ops = devm_kzalloc ( dev , sizeof ( * ap - > ops ) , GFP_KERNEL ) ;
2022-01-24 19:45:25 +03:00
if ( ! ap - > ops )
return - ENOMEM ;
2019-01-19 07:52:01 +03:00
ap - > ops - > inherits = & ata_sff_port_ops ;
ap - > ops - > cable_detect = ata_cable_unknown ;
ap - > ops - > set_mode = pata_platform_set_mode ;
if ( use16bit )
ap - > ops - > sff_data_xfer = ata_sff_data_xfer ;
else
ap - > ops - > sff_data_xfer = ata_sff_data_xfer32 ;
2008-01-09 22:10:22 +03:00
ap - > pio_mask = __pio_mask ;
libata: convert the remaining PATA drivers to new init model
Convert pdc_adma, pata_cs5520, pata_isapnp, pata_ixp4xx_cf,
pata_legacy, pata_mpc52xx, pata_mpiix, pata_pcmcia, pata_pdc2027x,
pata_platform, pata_qdi, pata_scc and pata_winbond to new init model.
* init_one()'s now follow more consistent init order
* cs5520 now registers one host with two ports, not two hosts. If any
of the two ports are disabled, it's made dummy as other drivers do.
Tested pdc_adma and pata_legacy. Both are as broken as before. The
rest are compile tested only.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
2007-04-17 18:44:08 +04:00
ap - > flags | = ATA_FLAG_SLAVE_POSS ;
2006-10-28 06:08:48 +04:00
2007-11-08 05:15:21 +03:00
/*
* Use polling mode if there ' s no IRQ
*/
if ( ! irq ) {
ap - > flags | = ATA_FLAG_PIO_POLLING ;
ata_port_desc ( ap , " no IRQ, using PIO polling " ) ;
}
2006-10-28 06:08:48 +04:00
/*
* Handle the MMIO case
*/
if ( mmio ) {
2008-01-09 22:10:22 +03:00
ap - > ioaddr . cmd_addr = devm_ioremap ( dev , io_res - > start ,
2009-08-07 03:05:08 +04:00
resource_size ( io_res ) ) ;
2008-01-09 22:10:22 +03:00
ap - > ioaddr . ctl_addr = devm_ioremap ( dev , ctl_res - > start ,
2009-08-07 03:05:08 +04:00
resource_size ( ctl_res ) ) ;
2006-10-28 06:08:48 +04:00
} else {
2008-01-09 22:10:22 +03:00
ap - > ioaddr . cmd_addr = devm_ioport_map ( dev , io_res - > start ,
2009-08-07 03:05:08 +04:00
resource_size ( io_res ) ) ;
2008-01-09 22:10:22 +03:00
ap - > ioaddr . ctl_addr = devm_ioport_map ( dev , ctl_res - > start ,
2009-08-07 03:05:08 +04:00
resource_size ( ctl_res ) ) ;
2007-02-01 09:06:36 +03:00
}
libata: convert the remaining PATA drivers to new init model
Convert pdc_adma, pata_cs5520, pata_isapnp, pata_ixp4xx_cf,
pata_legacy, pata_mpc52xx, pata_mpiix, pata_pcmcia, pata_pdc2027x,
pata_platform, pata_qdi, pata_scc and pata_winbond to new init model.
* init_one()'s now follow more consistent init order
* cs5520 now registers one host with two ports, not two hosts. If any
of the two ports are disabled, it's made dummy as other drivers do.
Tested pdc_adma and pata_legacy. Both are as broken as before. The
rest are compile tested only.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
2007-04-17 18:44:08 +04:00
if ( ! ap - > ioaddr . cmd_addr | | ! ap - > ioaddr . ctl_addr ) {
2008-01-09 22:10:22 +03:00
dev_err ( dev , " failed to map IO/CTL base \n " ) ;
2007-02-01 09:06:36 +03:00
return - ENOMEM ;
2006-10-28 06:08:48 +04:00
}
libata: convert the remaining PATA drivers to new init model
Convert pdc_adma, pata_cs5520, pata_isapnp, pata_ixp4xx_cf,
pata_legacy, pata_mpc52xx, pata_mpiix, pata_pcmcia, pata_pdc2027x,
pata_platform, pata_qdi, pata_scc and pata_winbond to new init model.
* init_one()'s now follow more consistent init order
* cs5520 now registers one host with two ports, not two hosts. If any
of the two ports are disabled, it's made dummy as other drivers do.
Tested pdc_adma and pata_legacy. Both are as broken as before. The
rest are compile tested only.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
2007-04-17 18:44:08 +04:00
ap - > ioaddr . altstatus_addr = ap - > ioaddr . ctl_addr ;
2006-10-28 06:08:48 +04:00
2008-01-09 22:10:22 +03:00
pata_platform_setup_port ( & ap - > ioaddr , ioport_shift ) ;
2006-10-28 06:08:48 +04:00
2007-08-18 08:14:55 +04:00
ata_port_desc ( ap , " %s cmd 0x%llx ctl 0x%llx " , mmio ? " mmio " : " ioport " ,
( unsigned long long ) io_res - > start ,
( unsigned long long ) ctl_res - > start ) ;
libata: convert the remaining PATA drivers to new init model
Convert pdc_adma, pata_cs5520, pata_isapnp, pata_ixp4xx_cf,
pata_legacy, pata_mpc52xx, pata_mpiix, pata_pcmcia, pata_pdc2027x,
pata_platform, pata_qdi, pata_scc and pata_winbond to new init model.
* init_one()'s now follow more consistent init order
* cs5520 now registers one host with two ports, not two hosts. If any
of the two ports are disabled, it's made dummy as other drivers do.
Tested pdc_adma and pata_legacy. Both are as broken as before. The
rest are compile tested only.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
2007-04-17 18:44:08 +04:00
/* activate */
2008-04-07 17:47:16 +04:00
return ata_host_activate ( host , irq , irq ? ata_sff_interrupt : NULL ,
2015-01-29 02:30:30 +03:00
irq_flags , sht ) ;
2006-10-28 06:08:48 +04:00
}
2008-01-09 22:10:22 +03:00
EXPORT_SYMBOL_GPL ( __pata_platform_probe ) ;
2006-10-28 06:08:48 +04:00
2012-12-22 01:19:58 +04:00
static int pata_platform_probe ( struct platform_device * pdev )
2008-01-09 22:10:22 +03:00
{
struct resource * io_res ;
struct resource * ctl_res ;
struct resource * irq_res ;
2013-07-30 12:16:05 +04:00
struct pata_platform_info * pp_info = dev_get_platdata ( & pdev - > dev ) ;
2008-01-09 22:10:22 +03:00
/*
* Simple resource validation . .
*/
if ( ( pdev - > num_resources ! = 3 ) & & ( pdev - > num_resources ! = 2 ) ) {
dev_err ( & pdev - > dev , " invalid number of resources \n " ) ;
return - EINVAL ;
}
/*
* Get the I / O base first
*/
2022-01-17 05:01:34 +03:00
io_res = platform_get_mem_or_io ( pdev , 0 ) ;
if ( ! io_res )
return - EINVAL ;
2008-01-09 22:10:22 +03:00
/*
* Then the CTL base
*/
2022-01-17 05:01:34 +03:00
ctl_res = platform_get_mem_or_io ( pdev , 1 ) ;
if ( ! ctl_res )
return - EINVAL ;
2008-01-09 22:10:22 +03:00
/*
* And the IRQ
*/
irq_res = platform_get_resource ( pdev , IORESOURCE_IRQ , 0 ) ;
return __pata_platform_probe ( & pdev - > dev , io_res , ctl_res , irq_res ,
pp_info ? pp_info - > ioport_shift : 0 ,
2019-01-19 07:52:01 +03:00
pio_mask , & pata_platform_sht , false ) ;
2008-01-09 22:10:22 +03:00
}
2006-10-28 06:08:48 +04:00
static struct platform_driver pata_platform_driver = {
. probe = pata_platform_probe ,
2012-11-02 11:46:23 +04:00
. remove = ata_platform_remove_one ,
2006-10-28 06:08:48 +04:00
. driver = {
. name = DRV_NAME ,
} ,
} ;
2011-11-27 10:44:26 +04:00
module_platform_driver ( pata_platform_driver ) ;
2006-10-28 06:08:48 +04:00
MODULE_AUTHOR ( " Paul Mundt " ) ;
MODULE_DESCRIPTION ( " low-level driver for platform device ATA " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_VERSION ( DRV_VERSION ) ;
2008-04-19 00:41:57 +04:00
MODULE_ALIAS ( " platform: " DRV_NAME ) ;