diff options
Diffstat (limited to 'drivers/spi/spi-sc18is602.c')
| -rw-r--r-- | drivers/spi/spi-sc18is602.c | 51 | 
1 files changed, 10 insertions, 41 deletions
diff --git a/drivers/spi/spi-sc18is602.c b/drivers/spi/spi-sc18is602.c index 9eda21d739c..237f2e7a717 100644 --- a/drivers/spi/spi-sc18is602.c +++ b/drivers/spi/spi-sc18is602.c @@ -183,24 +183,9 @@ static int sc18is602_setup_transfer(struct sc18is602 *hw, u32 hz, u8 mode)  static int sc18is602_check_transfer(struct spi_device *spi,  				    struct spi_transfer *t, int tlen)  { -	int bpw; -	uint32_t hz; -  	if (t && t->len + tlen > SC18IS602_BUFSIZ)  		return -EINVAL; -	bpw = spi->bits_per_word; -	if (t && t->bits_per_word) -		bpw = t->bits_per_word; -	if (bpw != 8) -		return -EINVAL; - -	hz = spi->max_speed_hz; -	if (t && t->speed_hz) -		hz = t->speed_hz; -	if (hz == 0) -		return -EINVAL; -  	return 0;  } @@ -212,22 +197,15 @@ static int sc18is602_transfer_one(struct spi_master *master,  	struct spi_transfer *t;  	int status = 0; -	/* SC18IS602 does not support CS2 */ -	if (hw->id == sc18is602 && spi->chip_select == 2) { -		status = -ENXIO; -		goto error; -	} -  	hw->tlen = 0;  	list_for_each_entry(t, &m->transfers, transfer_list) { -		u32 hz = t->speed_hz ? : spi->max_speed_hz;  		bool do_transfer;  		status = sc18is602_check_transfer(spi, t, hw->tlen);  		if (status < 0)  			break; -		status = sc18is602_setup_transfer(hw, hz, spi->mode); +		status = sc18is602_setup_transfer(hw, t->speed_hz, spi->mode);  		if (status < 0)  			break; @@ -245,7 +223,6 @@ static int sc18is602_transfer_one(struct spi_master *master,  		if (t->delay_usecs)  			udelay(t->delay_usecs);  	} -error:  	m->status = status;  	spi_finalize_current_message(master); @@ -254,13 +231,13 @@ error:  static int sc18is602_setup(struct spi_device *spi)  { -	if (!spi->bits_per_word) -		spi->bits_per_word = 8; +	struct sc18is602 *hw = spi_master_get_devdata(spi->master); -	if (spi->mode & ~(SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST)) -		return -EINVAL; +	/* SC18IS602 does not support CS2 */ +	if (hw->id == sc18is602 && spi->chip_select == 2) +		return -ENXIO; -	return sc18is602_check_transfer(spi, NULL, 0); +	return 0;  }  static int sc18is602_probe(struct i2c_client *client, @@ -315,11 +292,14 @@ static int sc18is602_probe(struct i2c_client *client,  	}  	master->bus_num = client->adapter->nr;  	master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST; +	master->bits_per_word_mask = SPI_BPW_MASK(8);  	master->setup = sc18is602_setup;  	master->transfer_one_message = sc18is602_transfer_one;  	master->dev.of_node = np; +	master->min_speed_hz = hw->freq / 128; +	master->max_speed_hz = hw->freq / 4; -	error = spi_register_master(master); +	error = devm_spi_register_master(dev, master);  	if (error)  		goto error_reg; @@ -330,16 +310,6 @@ error_reg:  	return error;  } -static int sc18is602_remove(struct i2c_client *client) -{ -	struct sc18is602 *hw = i2c_get_clientdata(client); -	struct spi_master *master = hw->master; - -	spi_unregister_master(master); - -	return 0; -} -  static const struct i2c_device_id sc18is602_id[] = {  	{ "sc18is602", sc18is602 },  	{ "sc18is602b", sc18is602b }, @@ -353,7 +323,6 @@ static struct i2c_driver sc18is602_driver = {  		.name = "sc18is602",  	},  	.probe = sc18is602_probe, -	.remove = sc18is602_remove,  	.id_table = sc18is602_id,  };  | 
