2019-06-04 11:11:33 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2008-01-09 22:10:41 +03:00
/*
* OF - platform PATA driver
*
* Copyright ( c ) 2007 MontaVista Software , Inc .
* Anton Vorontsov < avorontsov @ ru . mvista . com >
*/
# include <linux/kernel.h>
# include <linux/module.h>
2011-09-07 16:36:26 +04:00
# include <linux/of_address.h>
2011-12-23 00:07:00 +04:00
# include <linux/platform_device.h>
2008-02-02 02:02:30 +03:00
# include <linux/ata_platform.h>
2012-12-03 22:34:42 +04:00
# include <linux/libata.h>
2008-01-09 22:10:41 +03:00
2015-01-29 02:30:30 +03:00
# define DRV_NAME "pata_of_platform"
2023-03-22 22:53:59 +03:00
static const struct scsi_host_template pata_platform_sht = {
2015-01-29 02:30:30 +03:00
ATA_PIO_SHT ( DRV_NAME ) ,
} ;
2012-12-22 01:19:58 +04:00
static int pata_of_platform_probe ( struct platform_device * ofdev )
2008-01-09 22:10:41 +03:00
{
int ret ;
2010-04-14 03:12:29 +04:00
struct device_node * dn = ofdev - > dev . of_node ;
2008-01-09 22:10:41 +03:00
struct resource io_res ;
struct resource ctl_res ;
2022-01-05 21:17:21 +03:00
struct resource irq_res ;
2008-01-09 22:10:41 +03:00
unsigned int reg_shift = 0 ;
int pio_mode = 0 ;
int pio_mask ;
2019-01-19 07:52:01 +03:00
bool use16bit ;
2022-01-05 21:17:21 +03:00
int irq ;
2008-01-09 22:10:41 +03:00
ret = of_address_to_resource ( dn , 0 , & io_res ) ;
if ( ret ) {
dev_err ( & ofdev - > dev , " can't get IO address from "
" device tree \n " ) ;
return - EINVAL ;
}
2014-08-23 14:46:10 +04:00
ret = of_address_to_resource ( dn , 1 , & ctl_res ) ;
if ( ret ) {
dev_err ( & ofdev - > dev , " can't get CTL address from "
" device tree \n " ) ;
return - EINVAL ;
2008-01-09 22:10:41 +03:00
}
2022-01-05 21:17:21 +03:00
memset ( & irq_res , 0 , sizeof ( irq_res ) ) ;
irq = platform_get_irq_optional ( ofdev , 0 ) ;
if ( irq < 0 & & irq ! = - ENXIO )
return irq ;
if ( irq > 0 ) {
irq_res . start = irq ;
irq_res . end = irq ;
}
2008-01-09 22:10:41 +03:00
2017-01-24 15:08:29 +03:00
of_property_read_u32 ( dn , " reg-shift " , & reg_shift ) ;
2008-01-09 22:10:41 +03:00
2017-01-24 15:08:29 +03:00
if ( ! of_property_read_u32 ( dn , " pio-mode " , & pio_mode ) ) {
2008-01-09 22:10:41 +03:00
if ( pio_mode > 6 ) {
dev_err ( & ofdev - > dev , " invalid pio-mode \n " ) ;
return - EINVAL ;
}
} else {
dev_info ( & ofdev - > dev , " pio-mode unspecified, assuming PIO0 \n " ) ;
}
2019-01-19 07:52:01 +03:00
use16bit = of_property_read_bool ( dn , " ata-generic,use16bit " ) ;
2008-01-09 22:10:41 +03:00
pio_mask = 1 < < pio_mode ;
pio_mask | = ( 1 < < pio_mode ) - 1 ;
2022-01-05 21:17:21 +03:00
return __pata_platform_probe ( & ofdev - > dev , & io_res , & ctl_res , irq > 0 ? & irq_res : NULL ,
2019-01-19 07:52:01 +03:00
reg_shift , pio_mask , & pata_platform_sht ,
use16bit ) ;
2008-01-09 22:10:41 +03:00
}
2017-03-01 22:33:28 +03:00
static const struct of_device_id pata_of_platform_match [ ] = {
2008-01-09 22:10:41 +03:00
{ . compatible = " ata-generic " , } ,
2022-03-03 11:36:35 +03:00
{ /* sentinel */ }
2008-01-09 22:10:41 +03:00
} ;
MODULE_DEVICE_TABLE ( of , pata_of_platform_match ) ;
2011-02-17 12:43:24 +03:00
static struct platform_driver pata_of_platform_driver = {
2010-04-14 03:13:02 +04:00
. driver = {
2015-01-29 02:30:30 +03:00
. name = DRV_NAME ,
2010-04-14 03:13:02 +04:00
. of_match_table = pata_of_platform_match ,
} ,
2008-01-09 22:10:41 +03:00
. probe = pata_of_platform_probe ,
2023-05-12 23:46:46 +03:00
. remove_new = ata_platform_remove_one ,
2008-01-09 22:10:41 +03:00
} ;
2011-11-27 10:44:26 +04:00
module_platform_driver ( pata_of_platform_driver ) ;
2008-01-09 22:10:41 +03:00
MODULE_DESCRIPTION ( " OF-platform PATA driver " ) ;
MODULE_AUTHOR ( " Anton Vorontsov <avorontsov@ru.mvista.com> " ) ;
MODULE_LICENSE ( " GPL " ) ;