/* Header is LE16 */
regaddr = (__force u16)cpu_to_le16(regaddr);
/* We have to byteswap if the SPI bus is limited to 8b operation or we are running on a Big Endian system
*/ #ifdefined(__LITTLE_ENDIAN) if (self->func->bits_per_word == 8) #endif
regaddr = swab16(regaddr);
spi_message_init(&m);
spi_message_add_tail(&t_addr, &m);
spi_message_add_tail(&t_msg, &m);
ret = spi_sync(self->func, &m);
#ifdef SPI_DEBUG
pr_info("READ : "); for (i = 0; i < t_addr.len; i++)
printk("%02x ", ((u8 *)t_addr.tx_buf)[i]);
printk(" : "); for (i = 0; i < t_msg.len; i++)
printk("%02x ", ((u8 *)t_msg.rx_buf)[i]);
printk("\n"); #endif
/* We have to byteswap if the SPI bus is limited to 8b operation or we are running on a Big Endian system
*/ #ifdefined(__LITTLE_ENDIAN) if (self->func->bits_per_word == 8) #endif
{
uint16_t *buf = (uint16_t *)dst; for (i = 0; i < ((count + 1) >> 1); i++)
buf[i] = swab16(buf[i]);
}
/* Header is LE16 */
regaddr = (__force u16)cpu_to_le16(regaddr);
/* We have to byteswap if the SPI bus is limited to 8b operation or we are running on a Big Endian system
*/ #ifdefined(__LITTLE_ENDIAN) if (self->func->bits_per_word == 8) #endif
{
uint16_t *buf = (uint16_t *)src;
regaddr = swab16(regaddr); for (i = 0; i < ((count + 1) >> 1); i++)
buf[i] = swab16(buf[i]);
}
#ifdef SPI_DEBUG
pr_info("WRITE: "); for (i = 0; i < t_addr.len; i++)
printk("%02x ", ((u8 *)t_addr.tx_buf)[i]);
printk(" : "); for (i = 0; i < t_msg.len; i++)
printk("%02x ", ((u8 *)t_msg.tx_buf)[i]);
printk("\n"); #endif
#ifdefined(__LITTLE_ENDIAN) /* We have to byteswap if the SPI bus is limited to 8b operation */ if (self->func->bits_per_word == 8) #endif
{
uint16_t *buf = (uint16_t *)src; for (i = 0; i < ((count + 1) >> 1); i++)
buf[i] = swab16(buf[i]);
} return rval;
}
/* Probe Function to be called by SPI stack when device is discovered */ staticint cw1200_spi_probe(struct spi_device *func)
{ conststruct cw1200_platform_data_spi *plat_data =
dev_get_platdata(&func->dev); struct hwbus_priv *self; int status;
/* Sanity check speed */ if (func->max_speed_hz > 52000000)
func->max_speed_hz = 52000000; if (func->max_speed_hz < 1000000)
func->max_speed_hz = 1000000;
/* Fix up transfer size */ if (plat_data->spi_bits_per_word)
func->bits_per_word = plat_data->spi_bits_per_word; if (!func->bits_per_word)
func->bits_per_word = 16;
/* And finally.. */
func->mode = SPI_MODE_0;
pr_info("cw1200_wlan_spi: Probe called (CS %d M %d BPW %d CLK %d)\n",
spi_get_chipselect(func, 0), func->mode, func->bits_per_word,
func->max_speed_hz);
status = cw1200_core_probe(&cw1200_spi_hwbus_ops,
self, &func->dev, &self->core,
self->pdata->ref_clk,
self->pdata->macaddr,
self->pdata->sdd_file,
self->pdata->have_5ghz);
if (status) {
cw1200_spi_irq_unsubscribe(self);
cw1200_spi_off(self, plat_data);
}
return status;
}
/* Disconnect Function to be called by SPI stack when device is disconnected */ staticvoid cw1200_spi_disconnect(struct spi_device *func)
{ struct hwbus_priv *self = spi_get_drvdata(func);
if (self) {
cw1200_spi_irq_unsubscribe(self); if (self->core) {
cw1200_core_release(self->core);
self->core = NULL;
}
cw1200_spi_off(self, dev_get_platdata(&func->dev));
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.