diff options
| -rw-r--r-- | arch/powerpc/sysdev/bestcomm/gen_bd.c | 95 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/bestcomm/gen_bd.h | 5 |
2 files changed, 100 insertions, 0 deletions
diff --git a/arch/powerpc/sysdev/bestcomm/gen_bd.c b/arch/powerpc/sysdev/bestcomm/gen_bd.c index 8d33eafbb3f4..a3a134c35b0a 100644 --- a/arch/powerpc/sysdev/bestcomm/gen_bd.c +++ b/arch/powerpc/sysdev/bestcomm/gen_bd.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <asm/io.h> | 20 | #include <asm/io.h> |
| 21 | 21 | ||
| 22 | #include <asm/mpc52xx.h> | 22 | #include <asm/mpc52xx.h> |
| 23 | #include <asm/mpc52xx_psc.h> | ||
| 23 | 24 | ||
| 24 | #include "bestcomm.h" | 25 | #include "bestcomm.h" |
| 25 | #include "bestcomm_priv.h" | 26 | #include "bestcomm_priv.h" |
| @@ -253,6 +254,100 @@ bcom_gen_bd_tx_release(struct bcom_task *tsk) | |||
| 253 | } | 254 | } |
| 254 | EXPORT_SYMBOL_GPL(bcom_gen_bd_tx_release); | 255 | EXPORT_SYMBOL_GPL(bcom_gen_bd_tx_release); |
| 255 | 256 | ||
| 257 | /* --------------------------------------------------------------------- | ||
| 258 | * PSC support code | ||
| 259 | */ | ||
| 260 | |||
| 261 | /** | ||
| 262 | * bcom_psc_parameters - Bestcomm initialization value table for PSC devices | ||
| 263 | * | ||
| 264 | * This structure is only used internally. It is a lookup table for PSC | ||
| 265 | * specific parameters to bestcomm tasks. | ||
| 266 | */ | ||
| 267 | static struct bcom_psc_params { | ||
| 268 | int rx_initiator; | ||
| 269 | int rx_ipr; | ||
| 270 | int tx_initiator; | ||
| 271 | int tx_ipr; | ||
| 272 | } bcom_psc_params[] = { | ||
| 273 | [0] = { | ||
| 274 | .rx_initiator = BCOM_INITIATOR_PSC1_RX, | ||
| 275 | .rx_ipr = BCOM_IPR_PSC1_RX, | ||
| 276 | .tx_initiator = BCOM_INITIATOR_PSC1_TX, | ||
| 277 | .tx_ipr = BCOM_IPR_PSC1_TX, | ||
| 278 | }, | ||
| 279 | [1] = { | ||
| 280 | .rx_initiator = BCOM_INITIATOR_PSC2_RX, | ||
| 281 | .rx_ipr = BCOM_IPR_PSC2_RX, | ||
| 282 | .tx_initiator = BCOM_INITIATOR_PSC2_TX, | ||
| 283 | .tx_ipr = BCOM_IPR_PSC2_TX, | ||
| 284 | }, | ||
| 285 | [2] = { | ||
| 286 | .rx_initiator = BCOM_INITIATOR_PSC3_RX, | ||
| 287 | .rx_ipr = BCOM_IPR_PSC3_RX, | ||
| 288 | .tx_initiator = BCOM_INITIATOR_PSC3_TX, | ||
| 289 | .tx_ipr = BCOM_IPR_PSC3_TX, | ||
| 290 | }, | ||
| 291 | [3] = { | ||
| 292 | .rx_initiator = BCOM_INITIATOR_PSC4_RX, | ||
| 293 | .rx_ipr = BCOM_IPR_PSC4_RX, | ||
| 294 | .tx_initiator = BCOM_INITIATOR_PSC4_TX, | ||
| 295 | .tx_ipr = BCOM_IPR_PSC4_TX, | ||
| 296 | }, | ||
| 297 | [4] = { | ||
| 298 | .rx_initiator = BCOM_INITIATOR_PSC5_RX, | ||
| 299 | .rx_ipr = BCOM_IPR_PSC5_RX, | ||
| 300 | .tx_initiator = BCOM_INITIATOR_PSC5_TX, | ||
| 301 | .tx_ipr = BCOM_IPR_PSC5_TX, | ||
| 302 | }, | ||
| 303 | [5] = { | ||
| 304 | .rx_initiator = BCOM_INITIATOR_PSC6_RX, | ||
| 305 | .rx_ipr = BCOM_IPR_PSC6_RX, | ||
| 306 | .tx_initiator = BCOM_INITIATOR_PSC6_TX, | ||
| 307 | .tx_ipr = BCOM_IPR_PSC6_TX, | ||
| 308 | }, | ||
| 309 | }; | ||
| 310 | |||
| 311 | /** | ||
| 312 | * bcom_psc_gen_bd_rx_init - Allocate a receive bcom_task for a PSC port | ||
| 313 | * @psc_num: Number of the PSC to allocate a task for | ||
| 314 | * @queue_len: number of buffer descriptors to allocate for the task | ||
| 315 | * @fifo: physical address of FIFO register | ||
| 316 | * @maxbufsize: Maximum receive data size in bytes. | ||
| 317 | * | ||
| 318 | * Allocate a bestcomm task structure for receiving data from a PSC. | ||
| 319 | */ | ||
| 320 | struct bcom_task * bcom_psc_gen_bd_rx_init(unsigned psc_num, int queue_len, | ||
| 321 | phys_addr_t fifo, int maxbufsize) | ||
| 322 | { | ||
| 323 | if (psc_num >= MPC52xx_PSC_MAXNUM) | ||
| 324 | return NULL; | ||
| 325 | |||
| 326 | return bcom_gen_bd_rx_init(queue_len, fifo, | ||
| 327 | bcom_psc_params[psc_num].rx_initiator, | ||
| 328 | bcom_psc_params[psc_num].rx_ipr, | ||
| 329 | maxbufsize); | ||
| 330 | } | ||
| 331 | EXPORT_SYMBOL_GPL(bcom_psc_gen_bd_rx_init); | ||
| 332 | |||
| 333 | /** | ||
| 334 | * bcom_psc_gen_bd_tx_init - Allocate a transmit bcom_task for a PSC port | ||
| 335 | * @psc_num: Number of the PSC to allocate a task for | ||
| 336 | * @queue_len: number of buffer descriptors to allocate for the task | ||
| 337 | * @fifo: physical address of FIFO register | ||
| 338 | * | ||
| 339 | * Allocate a bestcomm task structure for transmitting data to a PSC. | ||
| 340 | */ | ||
| 341 | struct bcom_task * | ||
| 342 | bcom_psc_gen_bd_tx_init(unsigned psc_num, int queue_len, phys_addr_t fifo) | ||
| 343 | { | ||
| 344 | struct psc; | ||
| 345 | return bcom_gen_bd_tx_init(queue_len, fifo, | ||
| 346 | bcom_psc_params[psc_num].tx_initiator, | ||
| 347 | bcom_psc_params[psc_num].tx_ipr); | ||
| 348 | } | ||
| 349 | EXPORT_SYMBOL_GPL(bcom_psc_gen_bd_tx_init); | ||
| 350 | |||
| 256 | 351 | ||
| 257 | MODULE_DESCRIPTION("BestComm General Buffer Descriptor tasks driver"); | 352 | MODULE_DESCRIPTION("BestComm General Buffer Descriptor tasks driver"); |
| 258 | MODULE_AUTHOR("Jeff Gibbons <jeff.gibbons@appspec.com>"); | 353 | MODULE_AUTHOR("Jeff Gibbons <jeff.gibbons@appspec.com>"); |
diff --git a/arch/powerpc/sysdev/bestcomm/gen_bd.h b/arch/powerpc/sysdev/bestcomm/gen_bd.h index 5b6fa803c6aa..de47260e69da 100644 --- a/arch/powerpc/sysdev/bestcomm/gen_bd.h +++ b/arch/powerpc/sysdev/bestcomm/gen_bd.h | |||
| @@ -44,5 +44,10 @@ extern void | |||
| 44 | bcom_gen_bd_tx_release(struct bcom_task *tsk); | 44 | bcom_gen_bd_tx_release(struct bcom_task *tsk); |
| 45 | 45 | ||
| 46 | 46 | ||
| 47 | /* PSC support utility wrappers */ | ||
| 48 | struct bcom_task * bcom_psc_gen_bd_rx_init(unsigned psc_num, int queue_len, | ||
| 49 | phys_addr_t fifo, int maxbufsize); | ||
| 50 | struct bcom_task * bcom_psc_gen_bd_tx_init(unsigned psc_num, int queue_len, | ||
| 51 | phys_addr_t fifo); | ||
| 47 | #endif /* __BESTCOMM_GEN_BD_H__ */ | 52 | #endif /* __BESTCOMM_GEN_BD_H__ */ |
| 48 | 53 | ||
