@ -219,6 +219,9 @@ struct at86rf230_local {
# define IRQ_PLL_UNL (1 << 1)
# define IRQ_PLL_LOCK (1 << 0)
# define IRQ_ACTIVE_HIGH 0
# define IRQ_ACTIVE_LOW 1
# define STATE_P_ON 0x00 /* BUSY */
# define STATE_BUSY_RX 0x01
# define STATE_BUSY_TX 0x02
@ -726,11 +729,16 @@ static irqreturn_t at86rf230_isr(int irq, void *data)
return IRQ_HANDLED ;
}
static int at86rf230_irq_polarity ( struct at86rf230_local * lp , int pol )
{
return at86rf230_write_subreg ( lp , SR_IRQ_POLARITY , pol ) ;
}
static int at86rf230_hw_init ( struct at86rf230_local * lp )
{
struct at86rf230_platform_data * pdata = lp - > spi - > dev . platform_data ;
int rc , irq_pol ;
u8 status ;
int rc ;
rc = at86rf230_read_subreg ( lp , SR_TRX_STATUS , & status ) ;
if ( rc )
@ -748,6 +756,16 @@ static int at86rf230_hw_init(struct at86rf230_local *lp)
dev_info ( & lp - > spi - > dev , " Status: %02x \n " , status ) ;
}
/* configure irq polarity, defaults to high active */
if ( pdata - > irq_type & ( IRQF_TRIGGER_FALLING | IRQF_TRIGGER_LOW ) )
irq_pol = IRQ_ACTIVE_LOW ;
else
irq_pol = IRQ_ACTIVE_HIGH ;
rc = at86rf230_irq_polarity ( lp , irq_pol ) ;
if ( rc )
return rc ;
rc = at86rf230_write_subreg ( lp , SR_IRQ_MASK , 0xff ) ; /* IRQ_TRX_UR |
* IRQ_CCA_ED |
* IRQ_TRX_END |
@ -798,37 +816,36 @@ static int at86rf230_hw_init(struct at86rf230_local *lp)
return 0 ;
}
static int at86rf230_fill_data ( struct spi_device * spi )
static void at86rf230_fill_data ( struct spi_device * spi )
{
struct at86rf230_local * lp = spi_get_drvdata ( spi ) ;
struct at86rf230_platform_data * pdata = spi - > dev . platform_data ;
if ( ! pdata ) {
dev_err ( & spi - > dev , " no platform_data \n " ) ;
return - EINVAL ;
}
lp - > rstn = pdata - > rstn ;
lp - > slp_tr = pdata - > slp_tr ;
lp - > dig2 = pdata - > dig2 ;
return 0 ;
}
static int at86rf230_probe ( struct spi_device * spi )
{
struct at86rf230_platform_data * pdata ;
struct ieee802154_dev * dev ;
struct at86rf230_local * lp ;
u8 man_id_0 , man_id_1 ;
int rc ;
int rc , supported = 0 ;
const char * chip ;
int supported = 0 ;
if ( ! spi - > irq ) {
dev_err ( & spi - > dev , " no IRQ specified \n " ) ;
return - EINVAL ;
}
pdata = spi - > dev . platform_data ;
if ( ! pdata ) {
dev_err ( & spi - > dev , " no platform_data \n " ) ;
return - EINVAL ;
}
dev = ieee802154_alloc_device ( sizeof ( * lp ) , & at86rf230_ops ) ;
if ( ! dev )
return - ENOMEM ;
@ -851,9 +868,7 @@ static int at86rf230_probe(struct spi_device *spi)
spi_set_drvdata ( spi , lp ) ;
rc = at86rf230_fill_data ( spi ) ;
if ( rc )
goto err_fill ;
at86rf230_fill_data ( spi ) ;
rc = gpio_request ( lp - > rstn , " rstn " ) ;
if ( rc )
@ -928,7 +943,8 @@ static int at86rf230_probe(struct spi_device *spi)
if ( rc )
goto err_gpio_dir ;
rc = request_irq ( spi - > irq , at86rf230_isr , IRQF_SHARED ,
rc = request_irq ( spi - > irq , at86rf230_isr ,
IRQF_SHARED | pdata - > irq_type ,
dev_name ( & spi - > dev ) , lp ) ;
if ( rc )
goto err_gpio_dir ;
@ -948,7 +964,6 @@ err_gpio_dir:
err_slp_tr :
gpio_free ( lp - > rstn ) ;
err_rstn :
err_fill :
spi_set_drvdata ( spi , NULL ) ;
mutex_destroy ( & lp - > bmux ) ;
ieee802154_free_device ( lp - > dev ) ;