| /* |
| ** $Id: si3226_spi.c,v 1.1 2008/11/27 07:29:39 rajivkumar.vishwakarma Exp $ |
| ** |
| ** SPI driver implementation file |
| ** |
| ** Author(s): |
| ** laj (lajordan@silabs.com) |
| ** |
| ** Distributed by: |
| ** Silicon Laboratories, Inc |
| ** |
| ** File Description: |
| ** This is the implementation file for the SPI driver used |
| ** in the ProSLIC API. It calls the generic SPI driver |
| ** provided my Mindspeed. |
| ** |
| ** Platform: |
| ** Mindspeed FE Router |
| ** |
| ** Copyright (c) 2008 Silicon Laboratories, Inc |
| ** |
| */ |
| #include <common.h> |
| #include <config.h> |
| #include <mach/hardware.h> |
| #include <malloc.h> |
| #include <net.h> |
| #include <command.h> |
| #include <mach/comcerto_spi.h> |
| |
| #include "proslic_mspd.h" |
| //#include "proslic_api/proslic_ctrl.h" |
| #include "proslic_api/si_voice_ctrl.h" |
| |
| |
| #define CNUM_TO_CID_QUAD(channelNumber) (((channelNumber<<4)&0x10)|((channelNumber<<2)&0x8)|((channelNumber>>2)&0x2)|((channelNumber>>4)&0x1)|(channelNumber&0x4)) |
| |
| /* |
| ** Function: spiGci_ResetWrapper |
| ** |
| ** Description: |
| ** Sets the reset pin of the ProSLIC |
| */ |
| int ctrl_ResetWrapper (void *client, int status) |
| { |
| /* If this function is filled in daisyChain should be |
| * reset to 0 when the ProSLIC is reset |
| */ |
| //client->daisyChain = 0; |
| return 0; |
| } |
| |
| /* |
| ** SPI/GCI register read |
| ** |
| ** Description: |
| ** Reads a single ProSLIC register |
| ** |
| ** Return: |
| ** none |
| */ |
| uInt8 ctrl_ReadRegisterWrapper (void *clientPtr, uInt8 ch, uInt8 reg) |
| { |
| |
| u8 val; |
| char buf[1]; |
| struct spi_itf *spiInt = clientPtr; |
| struct device_d *client = &spiInt->spi_client; |
| unsigned long irqflags; |
| if (ch <=31 ) |
| ch = CNUM_TO_CID_QUAD(ch)|0x60; |
| // spin_lock_irqsave(&spiInt->lock, irqflags); |
| buf[0] = ch; |
| spi_write((struct spi_device *)client->type_data, &buf, 1); |
| buf[0] = reg; |
| spi_write((struct spi_device *)client->type_data, &buf, 1); |
| spi_read((struct spi_device *)client->type_data, &val, 1); |
| // spin_unlock_irqrestore(&spiInt->lock, irqflags);
|
| //SI3215_debug("si3215: read ctrl:%02x register:%0d value:%02x daisyChain %d\n", ch, reg, val,spiInt->daisyChain); |
| |
| return val; |
| } |
| |
| /* |
| ** Function: spiGci_WriteRegisterWrapper |
| ** |
| ** Description: |
| ** Writes a single ProSLIC register |
| ** |
| ** Return: |
| ** none |
| */ |
| int ctrl_WriteRegisterWrapper (void *clientPtr, uInt8 ch, uInt8 reg, uInt8 val) |
| { |
| char buf[1]; |
| unsigned long irqflags; |
| struct spi_itf *spiInt = clientPtr; |
| struct device_d *client = &spiInt->spi_client; |
| if (ch <=31 ) |
| ch = CNUM_TO_CID_QUAD(ch)|0x20; |
| if (ch == 0xff) /*broadcast*/ |
| ch = 0x20 | 0x80; |
| // SI3215_debug("Si3215: write ch:%x register:%d value:%x\n", ch, reg, val); |
| // spin_lock_irqsave(&spiInt->lock, irqflags); |
| buf[0] = ch; |
| spi_write((struct spi_device *)client->type_data, &buf, 1); |
| buf[0] = reg; |
| spi_write((struct spi_device *)client->type_data, &buf, 1); |
| buf[0] = val; |
| spi_write((struct spi_device *)client->type_data, &buf, 1); |
| |
| // spin_unlock_irqrestore(&spiInt->lock, irqflags); |
| |
| return 0; |
| } |
| |
| static void RAMwait (struct spi_itf *client, uInt8 channel) |
| { |
| unsigned char regVal; |
| |
| do |
| { |
| regVal = ctrl_ReadRegisterWrapper (client,channel,4); |
| }while (regVal&0x01);//wait for indirect registers. TODO: Add timeout? |
| |
| } |
| |
| |
| |
| /* |
| ** Function: SPI_ReadRAMWrapper |
| ** |
| ** Description: |
| ** Reads a single ProSLIC RAM location |
| ** |
| ** Return: |
| ** none |
| */ |
| |
| ramData ctrl_ReadRAMWrapper (void *client, uInt8 ch, uInt16 reg) |
| { |
| |
| uInt32 RegVal; |
| |
| RAMwait(client, ch); |
| |
| ctrl_WriteRegisterWrapper(client, ch, 5, (reg>>3)&0xE0); |
| ctrl_WriteRegisterWrapper(client, ch, 10, reg); |
| |
| RAMwait(client, ch); |
| |
| reg=ctrl_ReadRegisterWrapper(client,ch,6); |
| RegVal = reg>>3; |
| reg=ctrl_ReadRegisterWrapper(client,ch,7); |
| RegVal |= ((unsigned long)reg)<<5; |
| reg=ctrl_ReadRegisterWrapper(client,ch,8); |
| RegVal |= ((unsigned long)reg)<<13; |
| reg=ctrl_ReadRegisterWrapper(client,ch,9); |
| RegVal |= ((unsigned long)reg)<<21; |
| return RegVal; |
| } |
| |
| |
| /* |
| ** Function: SPI_WriteRAMWrapper |
| ** |
| ** Description: |
| ** Writes a single ProSLIC RAM location |
| ** |
| ** Return: |
| ** none |
| */ |
| |
| int ctrl_WriteRAMWrapper (void *client, uInt8 ch, uInt16 reg, ramData val) |
| { |
| |
| |
| RAMwait(client, ch); |
| ctrl_WriteRegisterWrapper(client, ch, 5, (reg>>3)&0xE0); |
| ctrl_WriteRegisterWrapper(client, ch, 6,(val<<3)&0xff); |
| ctrl_WriteRegisterWrapper(client, ch, 7,(val>>5)&0xff); |
| ctrl_WriteRegisterWrapper(client, ch, 8,(val>>13)&0xff); |
| ctrl_WriteRegisterWrapper(client, ch, 9,(val>>21)&0xff); |
| |
| ctrl_WriteRegisterWrapper(client, ch, 10, reg); |
| return 0; |
| } |
| |
| |
| |
| /* |
| ** $Log: si3226_spi.c,v $ |
| ** Revision 1.1 2008/11/27 07:29:39 rajivkumar.vishwakarma |
| ** LOG: ProSlic driver integrated to DiagTool for POTS testing |
| ** |
| ** Revision 1.1.2.1 2008/11/19 12:51:07 mouli.burla |
| ** LOG: 42063 |
| ** Few compilation errors are removed for Si3226. |
| ** |
| ** Revision 1.1 2008/04/28 13:46:36 appalaraju.chapala |
| ** proslic initial checkin from silabs ver5.00.1 |
| ** |
| ** |
| */ |