Skip to content

Commit 2504754

Browse files
deadprogramaykevl
authored andcommitted
machine/samd21: use HasBits() method to simplify bit comparisons
Signed-off-by: Ron Evans <[email protected]>
1 parent be491ab commit 2504754

File tree

3 files changed

+63
-63
lines changed

3 files changed

+63
-63
lines changed

src/machine/machine_atsamd21.go

Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ func (a ADC) Get() uint16 {
201201
waitADCSync()
202202

203203
// Waiting for conversion to complete
204-
for (sam.ADC.INTFLAG.Get() & sam.ADC_INTFLAG_RESRDY) == 0 {
204+
for !sam.ADC.INTFLAG.HasBits(sam.ADC_INTFLAG_RESRDY) {
205205
}
206206
val := sam.ADC.RESULT.Get()
207207

@@ -242,7 +242,7 @@ func (a ADC) getADCChannel() uint8 {
242242
}
243243

244244
func waitADCSync() {
245-
for (sam.ADC.STATUS.Get() & sam.ADC_STATUS_SYNCBUSY) > 0 {
245+
for sam.ADC.STATUS.HasBits(sam.ADC_STATUS_SYNCBUSY) {
246246
}
247247
}
248248

@@ -325,8 +325,8 @@ func (uart UART) Configure(config UARTConfig) {
325325

326326
// reset SERCOM0
327327
uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_CTRLA_SWRST)
328-
for (uart.Bus.CTRLA.Get()&sam.SERCOM_USART_CTRLA_SWRST) > 0 ||
329-
(uart.Bus.SYNCBUSY.Get()&sam.SERCOM_USART_SYNCBUSY_SWRST) > 0 {
328+
for uart.Bus.CTRLA.HasBits(sam.SERCOM_USART_CTRLA_SWRST) ||
329+
uart.Bus.SYNCBUSY.HasBits(sam.SERCOM_USART_SYNCBUSY_SWRST) {
330330
}
331331

332332
// set UART mode/sample rate
@@ -365,7 +365,7 @@ func (uart UART) Configure(config UARTConfig) {
365365
// Enable USART1 port.
366366
// sercom->USART.CTRLA.bit.ENABLE = 0x1u;
367367
uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_CTRLA_ENABLE)
368-
for (uart.Bus.SYNCBUSY.Get() & sam.SERCOM_USART_SYNCBUSY_ENABLE) > 0 {
368+
for uart.Bus.SYNCBUSY.HasBits(sam.SERCOM_USART_SYNCBUSY_ENABLE) {
369369
}
370370

371371
// setup interrupt on receive
@@ -398,7 +398,7 @@ func (uart UART) SetBaudRate(br uint32) {
398398
// WriteByte writes a byte of data to the UART.
399399
func (uart UART) WriteByte(c byte) error {
400400
// wait until ready to receive
401-
for (uart.Bus.INTFLAG.Get() & sam.SERCOM_USART_INTFLAG_DRE) == 0 {
401+
for !uart.Bus.INTFLAG.HasBits(sam.SERCOM_USART_INTFLAG_DRE) {
402402
}
403403
uart.Bus.DATA.Set(uint16(c))
404404
return nil
@@ -454,8 +454,8 @@ func (i2c I2C) Configure(config I2CConfig) {
454454

455455
// reset SERCOM
456456
i2c.Bus.CTRLA.SetBits(sam.SERCOM_I2CM_CTRLA_SWRST)
457-
for (i2c.Bus.CTRLA.Get()&sam.SERCOM_I2CM_CTRLA_SWRST) > 0 ||
458-
(i2c.Bus.SYNCBUSY.Get()&sam.SERCOM_I2CM_SYNCBUSY_SWRST) > 0 {
457+
for i2c.Bus.CTRLA.HasBits(sam.SERCOM_I2CM_CTRLA_SWRST) ||
458+
i2c.Bus.SYNCBUSY.HasBits(sam.SERCOM_I2CM_SYNCBUSY_SWRST) {
459459
}
460460

461461
// Set i2c master mode
@@ -467,12 +467,12 @@ func (i2c I2C) Configure(config I2CConfig) {
467467
// Enable I2CM port.
468468
// sercom->USART.CTRLA.bit.ENABLE = 0x1u;
469469
i2c.Bus.CTRLA.SetBits(sam.SERCOM_I2CM_CTRLA_ENABLE)
470-
for (i2c.Bus.SYNCBUSY.Get() & sam.SERCOM_I2CM_SYNCBUSY_ENABLE) > 0 {
470+
for i2c.Bus.SYNCBUSY.HasBits(sam.SERCOM_I2CM_SYNCBUSY_ENABLE) {
471471
}
472472

473473
// set bus idle mode
474474
i2c.Bus.STATUS.SetBits(wireIdleState << sam.SERCOM_I2CM_STATUS_BUSSTATE_Pos)
475-
for (i2c.Bus.SYNCBUSY.Get() & sam.SERCOM_I2CM_SYNCBUSY_SYSOP) > 0 {
475+
for i2c.Bus.SYNCBUSY.HasBits(sam.SERCOM_I2CM_SYNCBUSY_SYSOP) {
476476
}
477477

478478
// enable pins
@@ -499,15 +499,15 @@ func (i2c I2C) Tx(addr uint16, w, r []byte) error {
499499

500500
// wait until transmission complete
501501
timeout := i2cTimeout
502-
for (i2c.Bus.INTFLAG.Get() & sam.SERCOM_I2CM_INTFLAG_MB) == 0 {
502+
for !i2c.Bus.INTFLAG.HasBits(sam.SERCOM_I2CM_INTFLAG_MB) {
503503
timeout--
504504
if timeout == 0 {
505505
return errors.New("I2C timeout on ready to write data")
506506
}
507507
}
508508

509509
// ACK received (0: ACK, 1: NACK)
510-
if (i2c.Bus.STATUS.Get() & sam.SERCOM_I2CM_STATUS_RXNACK) > 0 {
510+
if i2c.Bus.STATUS.HasBits(sam.SERCOM_I2CM_STATUS_RXNACK) {
511511
return errors.New("I2C write error: expected ACK not NACK")
512512
}
513513

@@ -529,17 +529,17 @@ func (i2c I2C) Tx(addr uint16, w, r []byte) error {
529529
i2c.sendAddress(addr, false)
530530

531531
// wait transmission complete
532-
for (i2c.Bus.INTFLAG.Get() & sam.SERCOM_I2CM_INTFLAG_SB) == 0 {
532+
for !i2c.Bus.INTFLAG.HasBits(sam.SERCOM_I2CM_INTFLAG_SB) {
533533
// If the slave NACKS the address, the MB bit will be set.
534534
// In that case, send a stop condition and return error.
535-
if (i2c.Bus.INTFLAG.Get() & sam.SERCOM_I2CM_INTFLAG_MB) > 0 {
535+
if i2c.Bus.INTFLAG.HasBits(sam.SERCOM_I2CM_INTFLAG_MB) {
536536
i2c.Bus.CTRLB.SetBits(wireCmdStop << sam.SERCOM_I2CM_CTRLB_CMD_Pos) // Stop condition
537537
return errors.New("I2C read error: expected ACK not NACK")
538538
}
539539
}
540540

541541
// ACK received (0: ACK, 1: NACK)
542-
if (i2c.Bus.STATUS.Get() & sam.SERCOM_I2CM_STATUS_RXNACK) > 0 {
542+
if i2c.Bus.STATUS.HasBits(sam.SERCOM_I2CM_STATUS_RXNACK) {
543543
return errors.New("I2C read error: expected ACK not NACK")
544544
}
545545

@@ -574,9 +574,9 @@ func (i2c I2C) WriteByte(data byte) error {
574574

575575
// wait until transmission successful
576576
timeout := i2cTimeout
577-
for (i2c.Bus.INTFLAG.Get() & sam.SERCOM_I2CM_INTFLAG_MB) == 0 {
577+
for !i2c.Bus.INTFLAG.HasBits(sam.SERCOM_I2CM_INTFLAG_MB) {
578578
// check for bus error
579-
if (sam.SERCOM3_I2CM.STATUS.Get() & sam.SERCOM_I2CM_STATUS_BUSERR) > 0 {
579+
if sam.SERCOM3_I2CM.STATUS.HasBits(sam.SERCOM_I2CM_STATUS_BUSERR) {
580580
return errors.New("I2C bus error")
581581
}
582582
timeout--
@@ -585,7 +585,7 @@ func (i2c I2C) WriteByte(data byte) error {
585585
}
586586
}
587587

588-
if (i2c.Bus.STATUS.Get() & sam.SERCOM_I2CM_STATUS_RXNACK) > 0 {
588+
if i2c.Bus.STATUS.HasBits(sam.SERCOM_I2CM_STATUS_RXNACK) {
589589
return errors.New("I2C write error: expected ACK not NACK")
590590
}
591591

@@ -601,8 +601,8 @@ func (i2c I2C) sendAddress(address uint16, write bool) error {
601601

602602
// wait until bus ready
603603
timeout := i2cTimeout
604-
for (i2c.Bus.STATUS.Get()&(wireIdleState<<sam.SERCOM_I2CM_STATUS_BUSSTATE_Pos)) == 0 &&
605-
(i2c.Bus.STATUS.Get()&(wireOwnerState<<sam.SERCOM_I2CM_STATUS_BUSSTATE_Pos)) == 0 {
604+
for !i2c.Bus.STATUS.HasBits(wireIdleState<<sam.SERCOM_I2CM_STATUS_BUSSTATE_Pos) &&
605+
!i2c.Bus.STATUS.HasBits(wireOwnerState<<sam.SERCOM_I2CM_STATUS_BUSSTATE_Pos) {
606606
timeout--
607607
if timeout == 0 {
608608
return errors.New("I2C timeout on bus ready")
@@ -616,7 +616,7 @@ func (i2c I2C) sendAddress(address uint16, write bool) error {
616616
func (i2c I2C) signalStop() error {
617617
i2c.Bus.CTRLB.SetBits(wireCmdStop << sam.SERCOM_I2CM_CTRLB_CMD_Pos) // Stop command
618618
timeout := i2cTimeout
619-
for (i2c.Bus.SYNCBUSY.Get() & sam.SERCOM_I2CM_SYNCBUSY_SYSOP) > 0 {
619+
for i2c.Bus.SYNCBUSY.HasBits(sam.SERCOM_I2CM_SYNCBUSY_SYSOP) {
620620
timeout--
621621
if timeout == 0 {
622622
return errors.New("I2C timeout on signal stop")
@@ -628,7 +628,7 @@ func (i2c I2C) signalStop() error {
628628
func (i2c I2C) signalRead() error {
629629
i2c.Bus.CTRLB.SetBits(wireCmdRead << sam.SERCOM_I2CM_CTRLB_CMD_Pos) // Read command
630630
timeout := i2cTimeout
631-
for (i2c.Bus.SYNCBUSY.Get() & sam.SERCOM_I2CM_SYNCBUSY_SYSOP) > 0 {
631+
for i2c.Bus.SYNCBUSY.HasBits(sam.SERCOM_I2CM_SYNCBUSY_SYSOP) {
632632
timeout--
633633
if timeout == 0 {
634634
return errors.New("I2C timeout on signal read")
@@ -638,7 +638,7 @@ func (i2c I2C) signalRead() error {
638638
}
639639

640640
func (i2c I2C) readByte() byte {
641-
for (i2c.Bus.INTFLAG.Get() & sam.SERCOM_I2CM_INTFLAG_SB) == 0 {
641+
for !i2c.Bus.INTFLAG.HasBits(sam.SERCOM_I2CM_INTFLAG_SB) {
642642
}
643643
return byte(i2c.Bus.DATA.Get())
644644
}
@@ -697,11 +697,11 @@ func (i2s I2S) Configure(config I2SConfig) {
697697

698698
// reset the device
699699
i2s.Bus.CTRLA.SetBits(sam.I2S_CTRLA_SWRST)
700-
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_SWRST) > 0 {
700+
for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_SWRST) {
701701
}
702702

703703
// disable device before continuing
704-
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_ENABLE) > 0 {
704+
for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_ENABLE) {
705705
}
706706
i2s.Bus.CTRLA.ClearBits(sam.I2S_CTRLA_ENABLE)
707707

@@ -797,17 +797,17 @@ func (i2s I2S) Configure(config I2SConfig) {
797797

798798
// re-enable
799799
i2s.Bus.CTRLA.SetBits(sam.I2S_CTRLA_ENABLE)
800-
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_ENABLE) > 0 {
800+
for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_ENABLE) {
801801
}
802802

803803
// enable i2s clock
804804
i2s.Bus.CTRLA.SetBits(sam.I2S_CTRLA_CKEN0)
805-
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_CKEN0) > 0 {
805+
for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_CKEN0) {
806806
}
807807

808808
// enable i2s serializer
809809
i2s.Bus.CTRLA.SetBits(sam.I2S_CTRLA_SEREN1)
810-
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_SEREN1) > 0 {
810+
for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_SEREN1) {
811811
}
812812
}
813813

@@ -817,10 +817,10 @@ func (i2s I2S) Read(p []uint32) (n int, err error) {
817817
i := 0
818818
for i = 0; i < len(p); i++ {
819819
// Wait until ready
820-
for (i2s.Bus.INTFLAG.Get() & sam.I2S_INTFLAG_RXRDY1) == 0 {
820+
for !i2s.Bus.INTFLAG.HasBits(sam.I2S_INTFLAG_RXRDY1) {
821821
}
822822

823-
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_DATA1) > 0 {
823+
for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_DATA1) {
824824
}
825825

826826
// read data
@@ -839,10 +839,10 @@ func (i2s I2S) Write(p []uint32) (n int, err error) {
839839
i := 0
840840
for i = 0; i < len(p); i++ {
841841
// Wait until ready
842-
for (i2s.Bus.INTFLAG.Get() & sam.I2S_INTFLAG_TXRDY1) == 0 {
842+
for !i2s.Bus.INTFLAG.HasBits(sam.I2S_INTFLAG_TXRDY1) {
843843
}
844844

845-
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_DATA1) > 0 {
845+
for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_DATA1) {
846846
}
847847

848848
// write data
@@ -858,7 +858,7 @@ func (i2s I2S) Write(p []uint32) (n int, err error) {
858858
// Close the I2S bus.
859859
func (i2s I2S) Close() error {
860860
// Sync wait
861-
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_ENABLE) > 0 {
861+
for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_ENABLE) {
862862
}
863863

864864
// disable I2S
@@ -868,7 +868,7 @@ func (i2s I2S) Close() error {
868868
}
869869

870870
func waitForSync() {
871-
for (sam.GCLK.STATUS.Get() & sam.GCLK_STATUS_SYNCBUSY) > 0 {
871+
for sam.GCLK.STATUS.HasBits(sam.GCLK_STATUS_SYNCBUSY) {
872872
}
873873
}
874874

@@ -903,7 +903,7 @@ func (spi SPI) Configure(config SPIConfig) {
903903

904904
// Disable SPI port.
905905
spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPI_CTRLA_ENABLE)
906-
for (spi.Bus.SYNCBUSY.Get() & sam.SERCOM_SPI_SYNCBUSY_ENABLE) > 0 {
906+
for spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_ENABLE) {
907907
}
908908

909909
// enable pins
@@ -913,8 +913,8 @@ func (spi SPI) Configure(config SPIConfig) {
913913

914914
// reset SERCOM
915915
spi.Bus.CTRLA.SetBits(sam.SERCOM_SPI_CTRLA_SWRST)
916-
for (spi.Bus.CTRLA.Get()&sam.SERCOM_SPI_CTRLA_SWRST) > 0 ||
917-
(spi.Bus.SYNCBUSY.Get()&sam.SERCOM_SPI_SYNCBUSY_SWRST) > 0 {
916+
for spi.Bus.CTRLA.HasBits(sam.SERCOM_SPI_CTRLA_SWRST) ||
917+
spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_SWRST) {
918918
}
919919

920920
// set bit transfer order
@@ -932,7 +932,7 @@ func (spi SPI) Configure(config SPIConfig) {
932932
spi.Bus.CTRLB.SetBits((0 << sam.SERCOM_SPI_CTRLB_CHSIZE_Pos) | // 8bit char size
933933
sam.SERCOM_SPI_CTRLB_RXEN) // receive enable
934934

935-
for (spi.Bus.SYNCBUSY.Get() & sam.SERCOM_SPI_SYNCBUSY_CTRLB) > 0 {
935+
for spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_CTRLB) {
936936
}
937937

938938
// set mode
@@ -959,7 +959,7 @@ func (spi SPI) Configure(config SPIConfig) {
959959

960960
// Enable SPI port.
961961
spi.Bus.CTRLA.SetBits(sam.SERCOM_SPI_CTRLA_ENABLE)
962-
for (spi.Bus.SYNCBUSY.Get() & sam.SERCOM_SPI_SYNCBUSY_ENABLE) > 0 {
962+
for spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_ENABLE) {
963963
}
964964
}
965965

@@ -969,7 +969,7 @@ func (spi SPI) Transfer(w byte) (byte, error) {
969969
spi.Bus.DATA.Set(uint32(w))
970970

971971
// wait for receive
972-
for (spi.Bus.INTFLAG.Get() & sam.SERCOM_SPI_INTFLAG_RXC) == 0 {
972+
for !spi.Bus.INTFLAG.HasBits(sam.SERCOM_SPI_INTFLAG_RXC) {
973973
}
974974

975975
// return data
@@ -988,14 +988,14 @@ func InitPWM() {
988988
sam.GCLK.CLKCTRL.Set((sam.GCLK_CLKCTRL_ID_TCC0_TCC1 << sam.GCLK_CLKCTRL_ID_Pos) |
989989
(sam.GCLK_CLKCTRL_GEN_GCLK0 << sam.GCLK_CLKCTRL_GEN_Pos) |
990990
sam.GCLK_CLKCTRL_CLKEN)
991-
for (sam.GCLK.STATUS.Get() & sam.GCLK_STATUS_SYNCBUSY) > 0 {
991+
for sam.GCLK.STATUS.HasBits(sam.GCLK_STATUS_SYNCBUSY) {
992992
}
993993

994994
// Use GCLK0 for TCC2/TC3
995995
sam.GCLK.CLKCTRL.Set((sam.GCLK_CLKCTRL_ID_TCC2_TC3 << sam.GCLK_CLKCTRL_ID_Pos) |
996996
(sam.GCLK_CLKCTRL_GEN_GCLK0 << sam.GCLK_CLKCTRL_GEN_Pos) |
997997
sam.GCLK_CLKCTRL_CLKEN)
998-
for (sam.GCLK.STATUS.Get() & sam.GCLK_STATUS_SYNCBUSY) > 0 {
998+
for sam.GCLK.STATUS.HasBits(sam.GCLK_STATUS_SYNCBUSY) {
999999
}
10001000
}
10011001

@@ -1007,20 +1007,20 @@ func (pwm PWM) Configure() {
10071007
// disable timer
10081008
timer.CTRLA.ClearBits(sam.TCC_CTRLA_ENABLE)
10091009
// Wait for synchronization
1010-
for (timer.SYNCBUSY.Get() & sam.TCC_SYNCBUSY_ENABLE) > 0 {
1010+
for timer.SYNCBUSY.HasBits(sam.TCC_SYNCBUSY_ENABLE) {
10111011
}
10121012

10131013
// Use "Normal PWM" (single-slope PWM)
10141014
timer.WAVE.SetBits(sam.TCC_WAVE_WAVEGEN_NPWM)
10151015
// Wait for synchronization
1016-
for (timer.SYNCBUSY.Get() & sam.TCC_SYNCBUSY_WAVE) > 0 {
1016+
for timer.SYNCBUSY.HasBits(sam.TCC_SYNCBUSY_WAVE) {
10171017
}
10181018

10191019
// Set the period (the number to count to (TOP) before resetting timer)
10201020
//TCC0->PER.reg = period;
10211021
timer.PER.Set(period)
10221022
// Wait for synchronization
1023-
for (timer.SYNCBUSY.Get() & sam.TCC_SYNCBUSY_PER) > 0 {
1023+
for timer.SYNCBUSY.HasBits(sam.TCC_SYNCBUSY_PER) {
10241024
}
10251025

10261026
// Set pin as output
@@ -1060,23 +1060,23 @@ func (pwm PWM) Set(value uint16) {
10601060
timer.CTRLA.ClearBits(sam.TCC_CTRLA_ENABLE)
10611061

10621062
// Wait for synchronization
1063-
for (timer.SYNCBUSY.Get() & sam.TCC_SYNCBUSY_ENABLE) > 0 {
1063+
for timer.SYNCBUSY.HasBits(sam.TCC_SYNCBUSY_ENABLE) {
10641064
}
10651065

10661066
// Set PWM signal to output duty cycle
10671067
pwm.setChannel(uint32(value))
10681068

10691069
// Wait for synchronization on all channels
1070-
for (timer.SYNCBUSY.Get() & (sam.TCC_SYNCBUSY_CC0 |
1070+
for timer.SYNCBUSY.HasBits(sam.TCC_SYNCBUSY_CC0 |
10711071
sam.TCC_SYNCBUSY_CC1 |
10721072
sam.TCC_SYNCBUSY_CC2 |
1073-
sam.TCC_SYNCBUSY_CC3)) > 0 {
1073+
sam.TCC_SYNCBUSY_CC3) {
10741074
}
10751075

10761076
// enable
10771077
timer.CTRLA.SetBits(sam.TCC_CTRLA_ENABLE)
10781078
// Wait for synchronization
1079-
for (timer.SYNCBUSY.Get() & sam.TCC_SYNCBUSY_ENABLE) > 0 {
1079+
for timer.SYNCBUSY.HasBits(sam.TCC_SYNCBUSY_ENABLE) {
10801080
}
10811081
}
10821082

@@ -1233,8 +1233,8 @@ var (
12331233
func (usbcdc USBCDC) Configure(config UARTConfig) {
12341234
// reset USB interface
12351235
sam.USB_DEVICE.CTRLA.SetBits(sam.USB_DEVICE_CTRLA_SWRST)
1236-
for (sam.USB_DEVICE.SYNCBUSY.Get()&sam.USB_DEVICE_SYNCBUSY_SWRST) > 0 ||
1237-
(sam.USB_DEVICE.SYNCBUSY.Get()&sam.USB_DEVICE_SYNCBUSY_ENABLE) > 0 {
1236+
for sam.USB_DEVICE.SYNCBUSY.HasBits(sam.USB_DEVICE_SYNCBUSY_SWRST) ||
1237+
sam.USB_DEVICE.SYNCBUSY.HasBits(sam.USB_DEVICE_SYNCBUSY_ENABLE) {
12381238
}
12391239

12401240
sam.USB_DEVICE.DESCADD.Set(uint32(uintptr(unsafe.Pointer(&usbEndpointDescriptors))))

0 commit comments

Comments
 (0)